zotero/chrome/content/zotero/xpcom/storage.js

181 lines
5.1 KiB
JavaScript

/*
***** BEGIN LICENSE BLOCK *****
Copyright © 2009 Center for History and New Media
George Mason University, Fairfax, Virginia, USA
http://zotero.org
This file is part of Zotero.
Zotero is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Zotero is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with Zotero. If not, see <http://www.gnu.org/licenses/>.
***** END LICENSE BLOCK *****
*/
Zotero.Sync.Storage = new function () {
// TEMP
this.__defineGetter__("defaultError", function () { return Zotero.getString('sync.storage.error.default', Zotero.appName); });
this.__defineGetter__("defaultErrorRestart", function () { return Zotero.getString('sync.storage.error.defaultRestart', Zotero.appName); });
var _itemDownloadPercentages = {};
//
// Public properties
//
this.compressionTracker = {
compressed: 0,
uncompressed: 0,
get ratio() {
return (Zotero.Sync.Storage.compressionTracker.uncompressed -
Zotero.Sync.Storage.compressionTracker.compressed) /
Zotero.Sync.Storage.compressionTracker.uncompressed;
}
}
/**
* Check if modification time of file on disk matches the mod time
* in the database
*
* @param {Integer} itemID
* @return {Boolean}
*/
this.isFileModified = function (itemID) {
var item = Zotero.Items.get(itemID);
var file = item.getFile();
if (!file) {
return false;
}
var fileModTime = item.attachmentModificationTime;
if (!fileModTime) {
return false;
}
var syncModTime = item.attachmentSyncedModificationTime;
if (fileModTime != syncModTime) {
var syncHash = item.attachmentSyncedHash;
if (syncHash) {
var fileHash = item.attachmentHash;
if (fileHash && fileHash == syncHash) {
Zotero.debug("Mod time didn't match (" + fileModTime + "!=" + syncModTime + ") "
+ "but hash did for " + file.leafName + " -- ignoring");
return false;
}
}
return true;
}
return false;
}
this.getItemDownloadImageNumber = function (item) {
var numImages = 64;
var lk = item.libraryID + "/" + item.key;
if (typeof _itemDownloadPercentages[lk] == 'undefined') {
return false;
}
var percentage = _itemDownloadPercentages[lk];
return Math.round(percentage / 100 * (numImages - 1)) + 1;
}
this.setItemDownloadPercentage = function (libraryKey, percentage) {
Zotero.debug("Setting image download percentage to " + percentage
+ " for item " + libraryKey);
if (percentage !== false) {
_itemDownloadPercentages[libraryKey] = percentage;
}
else {
delete _itemDownloadPercentages[libraryKey];
}
var libraryID, key;
[libraryID, key] = libraryKey.split("/");
var item = Zotero.Items.getByLibraryAndKey(libraryID, key);
// TODO: yield or switch to queue
Zotero.Notifier.trigger('redraw', 'item', item.id, { column: "hasAttachment" });
var parent = item.parentItemKey;
if (parent) {
var parentItem = Zotero.Items.getByLibraryAndKey(libraryID, parent);
var parentLibraryKey = libraryID + "/" + parentItem.key;
if (percentage !== false) {
_itemDownloadPercentages[parentLibraryKey] = percentage;
}
else {
delete _itemDownloadPercentages[parentLibraryKey];
}
Zotero.Notifier.trigger('redraw', 'item', parentItem.id, { column: "hasAttachment" });
}
}
function error(e) {
if (_syncInProgress) {
Zotero.Sync.Storage.QueueManager.cancel(true);
_syncInProgress = false;
}
Zotero.DB.rollbackAllTransactions();
if (e) {
Zotero.debug(e, 1);
}
else {
e = Zotero.Sync.Storage.defaultError;
}
if (e.error && e.error == Zotero.Error.ERROR_ZFS_FILE_EDITING_DENIED) {
setTimeout(function () {
var group = Zotero.Groups.get(e.data.groupID);
var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Components.interfaces.nsIPromptService);
var buttonFlags = (ps.BUTTON_POS_0) * (ps.BUTTON_TITLE_IS_STRING)
+ (ps.BUTTON_POS_1) * (ps.BUTTON_TITLE_CANCEL)
+ ps.BUTTON_DELAY_ENABLE;
var index = ps.confirmEx(
null,
Zotero.getString('general.warning'),
Zotero.getString('sync.storage.error.fileEditingAccessLost', group.name) + "\n\n"
+ Zotero.getString('sync.error.groupWillBeReset') + "\n\n"
+ Zotero.getString('sync.error.copyChangedItems'),
buttonFlags,
Zotero.getString('sync.resetGroupAndSync'),
null, null, null, {}
);
if (index == 0) {
// TODO: transaction
group.erase();
Zotero.Sync.Server.resetClient();
Zotero.Sync.Storage.resetAllSyncStates();
Zotero.Sync.Runner.sync();
return;
}
}, 1);
}
}
}