Merge branch 'attachment-progress'

This commit is contained in:
Simon Kornblith 2012-06-10 22:36:40 -04:00
commit 83aeae942c
2 changed files with 78 additions and 6 deletions

View file

@ -79,10 +79,23 @@ Zotero.Translate.ItemSaver.prototype = {
payload.cookie = this._cookie;
}
Zotero.Connector.callMethod("saveItems", payload, function(success, status) {
if(success !== false) {
Zotero.Connector.callMethod("saveItems", payload, function(data, status) {
if(data !== false) {
Zotero.debug("Translate: Save via Standalone succeeded");
var haveAttachments = false;
if(data.items) {
for(var i=0; i<data.items.length; i++) {
var attachments = items[i].attachments = data.items[i].attachments;
for(var j=0; j<attachments.length; j++) {
if(attachments[j].id) {
attachmentCallback(attachments[j], 0);
haveAttachments = true;
}
}
}
}
callback(true, items);
if(haveAttachments) me._pollForProgress(items, attachmentCallback);
} else if(Zotero.isFx) {
callback(false, new Error("Save via Standalone failed with "+status));
} else {
@ -91,6 +104,60 @@ Zotero.Translate.ItemSaver.prototype = {
});
},
/**
* Polls for updates to attachment progress
* @param items Items in Zotero.Item.toArray() format
* @param {Function} attachmentCallback A callback that receives information about attachment
* save progress. The callback will be called as attachmentCallback(attachment, false, error)
* on failure or attachmentCallback(attachment, progressPercent) periodically during saving.
* attachmentCallback() will be called with all attachments that will be saved
*/
"_pollForProgress":function(items, attachmentCallback) {
var attachments = [];
var progressIDs = [];
var previousStatus = [];
for(var i=0; i<items.length; i++) {
var itemAttachments = items[i].attachments;
for(var j=0; j<itemAttachments.length; j++) {
if(itemAttachments[j].id) {
attachments.push(itemAttachments[j]);
progressIDs.push(itemAttachments[j].id);
previousStatus.push(0);
}
}
}
var nPolls = 0;
var poll = function() {
Zotero.Connector.callMethod("attachmentProgress", progressIDs, function(currentStatus, status) {
if(currentStatus) {
for(var i=0; i<attachments.length; i++) {
if(currentStatus[i] === 100 || currentStatus[i] === false) {
attachmentCallback(attachments[i], currentStatus[i]);
attachments.splice(i, 1);
progressIDs.splice(i, 1);
previousStatus.splice(i, 1);
currentStatus.splice(i, 1);
i--;
} else if(currentStatus[i] !== previousStatus[i]) {
attachmentCallback(attachments[i], currentStatus[i]);
previousStatus[i] = currentStatus[i];
}
}
if(nPolls++ < 60 && attachments.length) {
setTimeout(poll, 1000);
}
} else {
for(var i=0; i<attachments.length; i++) {
attachmentCallback(attachments[i], false, "Lost connection to Zotero Standalone");
}
}
});
};
poll();
},
/**
* Saves items to server
* @param items Items in Zotero.Item.toArray() format
@ -101,6 +168,7 @@ Zotero.Translate.ItemSaver.prototype = {
* @param {Function} attachmentCallback A callback that receives information about attachment
* save progress. The callback will be called as attachmentCallback(attachment, false, error)
* on failure or attachmentCallback(attachment, progressPercent) periodically during saving.
* attachmentCallback() will be called with all attachments that will be saved
*/
"_saveToServer":function(items, callback, attachmentCallback) {
var newItems = [], typedArraysSupported = false;
@ -115,7 +183,7 @@ Zotero.Translate.ItemSaver.prototype = {
if(typedArraysSupported) {
// Get rid of attachments that we won't be able to save properly and add ids
for(var j=0; j<item.attachments.length; j++) {
if(item.attachments[j].url && item.attachments[j].mimeType !== "text/html") {
if(!item.attachments[j].url || item.attachments[j].mimeType === "text/html") {
item.attachments.splice(j--, 1);
} else {
item.attachments[j].id = Zotero.Utilities.randomString();

View file

@ -30,7 +30,7 @@ Zotero.Server.Connector.Data = {};
Zotero.Server.Connector.AttachmentProgressManager = new function() {
var attachmentsInProgress = new WeakMap(),
attachmentProgress = {},
i = 1;
id = 1;
/**
* Adds attachments to attachment progress manager
@ -38,9 +38,9 @@ Zotero.Server.Connector.AttachmentProgressManager = new function() {
this.add = function(attachments) {
for(var i=0; i<attachments.length; i++) {
var attachment = attachments[i];
attachmentsInProgress.set(attachment, (attachment.id = i++));
attachmentsInProgress.set(attachment, (attachment.id = id++));
}
}
};
/**
* Called on attachment progress
@ -275,6 +275,7 @@ Zotero.Server.Connector.SavePage.prototype = {
if(collection) {
collection.addItem(item.id);
}
Zotero.Server.Connector.AttachmentProgressManager.add(jsonItem.attachments);
jsonItems.push(jsonItem);
});
@ -329,6 +330,9 @@ Zotero.Server.Connector.SaveItem.prototype = {
var cookieSandbox = data["uri"] && data["cookie"] ? new Zotero.CookieSandbox(null, data["uri"],
data["cookie"]) : null;
for(var i=0; i<data.items.length; i++) {
Zotero.Server.Connector.AttachmentProgressManager.add(data.items[i].attachments);
}
// save items
var itemSaver = new Zotero.Translate.ItemSaver(libraryID,