- major cleanup of progressdialog.js, all those set* functions left over from editor publishing
- s/filei/filenr/g git-svn-id: svn://10.0.0.236/branches/BEONEX_0_8_BRANCH@143779 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
todo:
|
||||
- nsiprogresseventsink comment
|
||||
- license headers
|
||||
- nsresult for internal functions, clean up interfaces
|
||||
@@ -5,9 +6,7 @@
|
||||
- alert() -> nsiprompt or dialog
|
||||
- remove printfs
|
||||
- XXXs
|
||||
- clean up progressdialog
|
||||
- firebird/thunderbird extension
|
||||
- listing progressmeter doesn't work
|
||||
|
||||
don't care (for now):
|
||||
- conflict
|
||||
@@ -18,6 +17,7 @@ don't care (for now):
|
||||
workaround: gTimeout
|
||||
- problem: cancel by user in progress dialog: xpconnect errors
|
||||
solution: prevent dialog closure (even if cancel pressed) until we're done.
|
||||
- listing progressmeter doesn't work
|
||||
|
||||
Enhance
|
||||
- protocols
|
||||
|
||||
@@ -34,23 +34,15 @@ var gTransfer; // main |Transfer| object, for the main files to be tranferred
|
||||
e.g. listing files. Needed for Cancel.
|
||||
XXX bad solution. too bad. don't care for,
|
||||
let the XPCOM excpetion fly! ;-P */
|
||||
var gDialog = {};
|
||||
var gInProgress = true;
|
||||
var gTotalFileCount = 0;
|
||||
var gSucceededCount = 0;
|
||||
var gFinished = false;
|
||||
var gTransferingFailed = false;
|
||||
var gFileNotFound = false;
|
||||
var gStatusMessage="";
|
||||
var gDialog = new Object(); // references to widgets
|
||||
var gFinished = false; // all files finished (done or failed)
|
||||
var gTransferFailed = false; // any file failed
|
||||
var gResults = ""; /* stores the transfer result messages (in human language)
|
||||
to be later displayed to the user on his request. */
|
||||
var gRanFinishedAll = false; // gee, what a hack. this is all a big shit here.
|
||||
var gTimerID;
|
||||
var gTimeout = 1000;
|
||||
var gAllowEnterKey = false;
|
||||
|
||||
const XUL_NS ="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
|
||||
|
||||
function Startup()
|
||||
{
|
||||
ddump("In sroaming/transfer/progressDialog::Startup()");
|
||||
@@ -75,7 +67,6 @@ function Startup()
|
||||
return;
|
||||
}
|
||||
|
||||
SetWindowLocation();
|
||||
window.title = GetString("TransferProgressCaption");
|
||||
|
||||
var directionString = gTransfer.download
|
||||
@@ -87,12 +78,11 @@ function Startup()
|
||||
// Show transfering destination URL
|
||||
document.getElementById("TransferUrl").value = gTransfer.remoteDir;
|
||||
|
||||
// Add the files to the "transfer to" list as quick as possible!
|
||||
// Add the files to the UI as quickly as possible
|
||||
gDialog.FileList.setAttribute("rows", gTransfer.files.length);
|
||||
for (var i = 0; i < gTransfer.files.length; i++)
|
||||
SetProgressStatus(i);
|
||||
window.sizeToContent();
|
||||
ddump("resized");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -208,31 +198,30 @@ function PassBackParams()
|
||||
/* Add filename to list of files to transfer
|
||||
or set status for file already in the list.
|
||||
|
||||
@param filei integer index of file in gTransfer
|
||||
@param filenr integer index of file in gTransfer
|
||||
@return boolean if file was in the list
|
||||
*/
|
||||
function SetProgressStatus(filei)
|
||||
function SetProgressStatus(filenr)
|
||||
{
|
||||
ddumpCont("SetProgressStatus(" + filei + "): ");
|
||||
var filename = gTransfer.files[filei].filename;
|
||||
var status = gTransfer.files[filei].status;
|
||||
var statusCode = gTransfer.files[filei].statusCode;
|
||||
ddump(filename + ", " + status + ", " + NameForStatusCode(statusCode));
|
||||
|
||||
if (!filename)
|
||||
ddumpCont("SetProgressStatus(" + filenr + "): ");
|
||||
if (!gTransfer || !gTransfer.files[filenr])
|
||||
{
|
||||
dumpError("no such file");
|
||||
return false;
|
||||
}
|
||||
var file = gTransfer.files[filenr];
|
||||
var filename = file.filename;
|
||||
var status = file.status;
|
||||
ddump(filename + ", " + status + ", " + NameForStatusCode(file.statusCode));
|
||||
|
||||
if (status == "busy" &&
|
||||
gDialog.FinalStatusMessage.value == "")
|
||||
gDialog.FinalStatusMessage.value = GetString("Transfering");
|
||||
else if (status == "failed")
|
||||
// Output error msg, if apppropriate
|
||||
SetFileStatusMessage(filei, ErrorMessageForFile(gTransfer.files[filei]));
|
||||
if (status == "busy")
|
||||
SetStatusMessage(GetString("Transfering"));
|
||||
|
||||
// Just set attribute for status icon
|
||||
// if we already have this filename
|
||||
// update file listbox
|
||||
// if we already have this file's item, just set attribute for status icon
|
||||
found = false;
|
||||
var listitems = document.getElementsByTagName("listitem");
|
||||
for (var i = 0; i < listitems.length; i++)
|
||||
for (var i = 0, l = listitems.length; i < l; i++)
|
||||
{
|
||||
var li = listitems[i];
|
||||
if (li.getAttribute("filename") == filename)
|
||||
@@ -242,142 +231,48 @@ function SetProgressStatus(filei)
|
||||
var oldstat = li.getAttribute("progress");
|
||||
ddump(" Setting "+filename+" from "+oldstat+" to "+status);
|
||||
li.setAttribute("progress", status);
|
||||
CheckDone(false);
|
||||
}
|
||||
return true;
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
|
||||
// If we didn't return yet, we're adding a new file item to list
|
||||
gTotalFileCount++;
|
||||
|
||||
var listitem = document.createElementNS(XUL_NS, "listitem");
|
||||
if (listitem)
|
||||
// otherwise, add the item
|
||||
if (!found)
|
||||
{
|
||||
var listitem = document.createElement("listitem");
|
||||
listitem.setAttribute("class", "listitem-iconic progressitem");
|
||||
// This triggers CSS to show icon for each status state
|
||||
// The progress attribute triggers CSS to show icon for each status state
|
||||
listitem.setAttribute("progress", status);
|
||||
listitem.setAttribute("filename", filename);
|
||||
listitem.setAttribute("filename", filename); // bookkeeping
|
||||
listitem.setAttribute("label", GetFileDescription(filename));
|
||||
gDialog.FileList.appendChild(listitem);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function SetProgressFinished(filei)
|
||||
{
|
||||
ddumpCont("SetProgressFinished(" + filei + "): ");
|
||||
var filename = gTransfer.files[filei].filename;
|
||||
var networkStatus = gTransfer.files[filei].statusCode;
|
||||
var status = gTransfer.files[filei].status;
|
||||
ddump(filename + ", " + status);
|
||||
CheckDone(false);
|
||||
|
||||
SetProgressStatus(filei);
|
||||
|
||||
if (status == "done")
|
||||
gSucceededCount++;
|
||||
else // Error condition
|
||||
{
|
||||
// Mark all remaining files as "failed" XXX wrong
|
||||
gTransferingFailed = true;
|
||||
SetProgressStatusCancel();
|
||||
gDialog.FinalStatusMessage.value = GetString("TransferFailed");
|
||||
|
||||
gStatusMessage = ErrorMessageForFile(gTransfer.files[filei]);
|
||||
}
|
||||
|
||||
if (gStatusMessage)
|
||||
SetFileStatusMessage(filei, gStatusMessage);
|
||||
return found;
|
||||
}
|
||||
|
||||
function SetProgressFinishedAll()
|
||||
{
|
||||
if (gRanFinishedAll)
|
||||
return;
|
||||
gRanFinishedAll = true;
|
||||
|
||||
gDialog.Close.setAttribute("label", GetString("Close"));
|
||||
if (!gStatusMessage)
|
||||
gStatusMessage = GetString(gTransferingFailed
|
||||
? "UnknownTransferError" :
|
||||
"AllFilesTransfered");
|
||||
|
||||
// Now allow "Enter/Return" key to close the dialog
|
||||
AllowDefaultButton();
|
||||
|
||||
if (gTransferingFailed || gFileNotFound)
|
||||
{
|
||||
// Show "Troubleshooting" button to help solving problems
|
||||
// and key for successful / failed files
|
||||
document.getElementById("failureBox").hidden = false;
|
||||
window.sizeToContent();
|
||||
}
|
||||
SetStatusMessage(GetString(gTransferFailed
|
||||
? "UnknownTransferError"
|
||||
: "TransferCompleted"));
|
||||
|
||||
for (var i = 0, l = gTransfer.files.length; i < l; i++)
|
||||
{
|
||||
addFileStatus(gTransfer.files[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// set to on, if a listing.xml file is being transferred (and off afterwards)
|
||||
function SetListingTransfer(on)
|
||||
{
|
||||
gDialog.ListingProgress.setAttribute("hidden", on ? "false" : "true");
|
||||
//gDialog.ListingProgress.setAttribute("value", on ? "1" : "0");
|
||||
gDialog.FinalStatusMessage.value = on ? GetString("TransferingListing") : "";
|
||||
}
|
||||
|
||||
// this function is to be used when we cancel persist's saving,
|
||||
// because not all messages will be returned to us, if we cancel.
|
||||
// this function changes status for all non-done/non-failure to failure.
|
||||
function SetProgressStatusCancel()
|
||||
{
|
||||
var listitems = document.getElementsByTagName("listitem"); if (!listitems)
|
||||
return;
|
||||
|
||||
for (var i=0; i < listitems.length; i++)
|
||||
if (gTransferFailed)
|
||||
{
|
||||
var attr = listitems[i].getAttribute("progress");
|
||||
if (attr != "done" && attr != "failed")
|
||||
listitems[i].setAttribute("progress", "failed");
|
||||
}
|
||||
}
|
||||
|
||||
function SetGlobalStatusMessage(message)
|
||||
{
|
||||
alert(message); // XXX
|
||||
CloseDialog(); // XXX
|
||||
//SetFileStatusMessage(-1, message)
|
||||
}
|
||||
|
||||
function SetFileStatusMessage(filei, message)
|
||||
{
|
||||
if (gTransfer.files[filei].status == "failed")
|
||||
{
|
||||
gTransferingFailed = true;
|
||||
gDialog.FinalStatusMessage.value = GetString("TransferFailed");
|
||||
/* Show "Troubleshooting" button to help solving problems
|
||||
and legend for successful / failed icons */
|
||||
document.getElementById("failureBox").hidden = false;
|
||||
window.sizeToContent();
|
||||
}
|
||||
return;//XXX
|
||||
// Status message is a child of <description> element
|
||||
// so text can wrap to multiple lines if necessary
|
||||
var textNode = document.createTextNode(message);
|
||||
if (textNode)
|
||||
gDialog.StatusMessage.appendChild(textNode);
|
||||
|
||||
/*
|
||||
if (gDialog.StatusMessage.firstChild)
|
||||
{
|
||||
gDialog.StatusMessage.firstChild.data = message;
|
||||
}
|
||||
else
|
||||
{
|
||||
var textNode = document.createTextNode(message);
|
||||
if (textNode)
|
||||
gDialog.StatusMessage.appendChild(textNode);
|
||||
}
|
||||
*/
|
||||
window.sizeToContent();
|
||||
gDialog.Close.setAttribute("label", GetString("Close"));
|
||||
// Now allow "Enter/Return" key to close the dialog
|
||||
gDialog.Close.setAttribute("default","true");
|
||||
gAllowEnterKey = true;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -393,32 +288,17 @@ function CheckDone(close)
|
||||
ddumpCont(" Checking " + i + ", " + file.filename + ", ");
|
||||
ddump(file.status);
|
||||
if (file.status == "failed")
|
||||
gTransferingFailed = true;
|
||||
gTransferFailed = true;
|
||||
else if (file.status != "done")
|
||||
return;
|
||||
}
|
||||
ddump(" Yes, we're done");
|
||||
gFinished = true;
|
||||
|
||||
// Finish progress messages, settings buttons etc.
|
||||
SetProgressFinishedAll();
|
||||
|
||||
// Set "completed" message if we succeeded
|
||||
if (!gTransferingFailed)
|
||||
{
|
||||
gDialog.FinalStatusMessage.value = GetString("TransferCompleted");
|
||||
if (gFileNotFound && gTotalFileCount - gSucceededCount)
|
||||
{
|
||||
// Show number of files that failed to upload
|
||||
gStatusMessage = GetString("FailedFileMsg");
|
||||
gStatusMessage = gStatusMessage.replace(/%x%/,
|
||||
gTotalFileCount - gSucceededCount);
|
||||
gStatusMessage = gStatusMessage.replace(/%total%/, gTotalFileCount);
|
||||
|
||||
SetGlobalStatusMessage(gStatusMessage);
|
||||
}
|
||||
}
|
||||
|
||||
if (!close || gTransferingFailed)
|
||||
if (!close || gTransferFailed)
|
||||
return;
|
||||
ddump(" Closing");
|
||||
|
||||
@@ -429,28 +309,8 @@ function CheckDone(close)
|
||||
CloseDialog();
|
||||
}
|
||||
|
||||
function CleanUpDialog()
|
||||
{
|
||||
if (gTimerID)
|
||||
{
|
||||
clearTimeout(gTimerID);
|
||||
gTimerID = null;
|
||||
}
|
||||
if (!gFinished)
|
||||
{
|
||||
gTransfer.cancel();
|
||||
}
|
||||
SaveWindowLocation();
|
||||
PassBackParams();
|
||||
}
|
||||
|
||||
function CloseDialog()
|
||||
{
|
||||
CleanUpDialog();
|
||||
try {
|
||||
window.close();
|
||||
} catch (e) {}
|
||||
}
|
||||
// Close stuff
|
||||
|
||||
function onClose()
|
||||
{
|
||||
@@ -464,20 +324,6 @@ function onCancel()
|
||||
CloseDialog();
|
||||
}
|
||||
|
||||
function SetWindowLocation()
|
||||
{
|
||||
}
|
||||
|
||||
function SaveWindowLocation()
|
||||
{
|
||||
}
|
||||
|
||||
function AllowDefaultButton()
|
||||
{
|
||||
gDialog.Close.setAttribute("default","true");
|
||||
gAllowEnterKey = true;
|
||||
}
|
||||
|
||||
function onEnterKey()
|
||||
{
|
||||
if (gAllowEnterKey)
|
||||
@@ -486,6 +332,47 @@ function onEnterKey()
|
||||
return false;
|
||||
}
|
||||
|
||||
function CloseDialog()
|
||||
{
|
||||
CleanUpDialog();
|
||||
try {
|
||||
window.close();
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
function CleanUpDialog()
|
||||
{
|
||||
if (gTimerID)
|
||||
{
|
||||
clearTimeout(gTimerID);
|
||||
gTimerID = null;
|
||||
}
|
||||
if (!gFinished)
|
||||
{
|
||||
gTransfer.cancel();
|
||||
}
|
||||
PassBackParams();
|
||||
}
|
||||
|
||||
|
||||
// UI stuff
|
||||
|
||||
// Sets the text in the prominent center of the dialog
|
||||
function SetStatusMessage(message)
|
||||
{
|
||||
if (!message)
|
||||
message = "";
|
||||
if (!gTransferFailed)
|
||||
gDialog.FinalStatusMessage.value = message;
|
||||
}
|
||||
|
||||
// For fatal errors like unexpected exceptions. Bail and go home.
|
||||
function GlobalError(message)
|
||||
{
|
||||
alert(message); // XXX
|
||||
CloseDialog(); // XXX
|
||||
}
|
||||
|
||||
/*
|
||||
Records the transfer result of a file, to be alter displayed to the user
|
||||
on request.
|
||||
@@ -502,3 +389,11 @@ function showErrors()
|
||||
{
|
||||
alert(gResults);
|
||||
}
|
||||
|
||||
// set to on, if a listing.xml file is being transferred (and off afterwards)
|
||||
function SetListingTransfer(on)
|
||||
{
|
||||
gDialog.ListingProgress.setAttribute("hidden", on ? "false" : "true");
|
||||
//gDialog.ListingProgress.setAttribute("value", on ? "1" : "0");
|
||||
SetStatusMessage(on ? GetString("TransferingListing") : null);
|
||||
}
|
||||
|
||||
@@ -342,11 +342,11 @@ Transfer.prototype =
|
||||
},
|
||||
|
||||
// called when an individual file transfer completed or failed
|
||||
fileFinished : function(filei)
|
||||
fileFinished : function(filenr)
|
||||
{
|
||||
ddump("file " + filei + " finished");
|
||||
ddump("file " + filenr + " finished");
|
||||
|
||||
var file = this.files[filei];
|
||||
var file = this.files[filenr];
|
||||
|
||||
// flush
|
||||
if (file.fos) // only for download
|
||||
@@ -412,7 +412,7 @@ Transfer.prototype =
|
||||
/* Hack.
|
||||
We need to change the list of files (add or remove files) after
|
||||
the Transfer object was created. However, in that case, the internal
|
||||
bookkeeping stuff (filei of TransferFile) won't match anymore, so this
|
||||
bookkeeping stuff (filenr of TransferFile) won't match anymore, so this
|
||||
function fixes that.
|
||||
Note: If you add files, create them using new TransferFile(). If you
|
||||
remove files, do that best using splice or readd the remaining files to a
|
||||
@@ -422,7 +422,7 @@ Transfer.prototype =
|
||||
{
|
||||
for (var i = 0, l = this.files.length; i < l; i++)
|
||||
{
|
||||
this.files[i].filei = i;
|
||||
this.files[i].filenr = i;
|
||||
}
|
||||
},
|
||||
|
||||
@@ -442,30 +442,26 @@ Transfer.prototype =
|
||||
|
||||
SLOW! :-(
|
||||
|
||||
@param filei int index of the file whose progress changed
|
||||
@param filenr int index of the file whose progress changed
|
||||
@param aProgress float 0..1 progress of that file
|
||||
*/
|
||||
progressChanged : function(filei, aProgress)
|
||||
progressChanged : function(filenr, aProgress)
|
||||
{
|
||||
if (!this.progressCalculate)
|
||||
return;
|
||||
|
||||
ddump("Transfer.progressChanged(" + filei + ", " + aProgress + ")");
|
||||
ddump("Transfer.progressChanged(" + filenr + ", " + aProgress + ")");
|
||||
|
||||
var file = this.files[filei];
|
||||
var file = this.files[filenr];
|
||||
file.progress = aProgress;
|
||||
//this.files[filei].progress = aProgress;
|
||||
|
||||
if (this.progressSizeAll == 0) // undetermined mode
|
||||
return;
|
||||
|
||||
//var file = this.files[filei]; // don't move up
|
||||
|
||||
// avoid too many updates
|
||||
if (file.progress - file.progressPrevious < 0.01)
|
||||
return;
|
||||
else
|
||||
//this.files[filei].progressPrevious = file.progress;
|
||||
file.progressPrevious = file.progress;
|
||||
|
||||
|
||||
@@ -500,8 +496,8 @@ Transfer.prototype =
|
||||
ddump(" update serial mode");
|
||||
ddump(" progressSizeAll: " + this.progressSizeAll);
|
||||
ddump(" progressSizeCompletedFiles: "+this.progressSizeCompletedFiles);
|
||||
ddump(" files[filei].size: " + file.size);
|
||||
ddump(" files[filei].progress: " + file.progress);
|
||||
ddump(" files[filenr].size: " + file.size);
|
||||
ddump(" files[filenr].progress: " + file.progress);
|
||||
|
||||
progressSize = this.progressSizeCompletedFiles
|
||||
+ file.size * file.progress;
|
||||
@@ -529,7 +525,7 @@ Transfer.prototype =
|
||||
// I protected at the very beginning against this.progressSizeAll == 0
|
||||
|
||||
for (var i = 0, l = this.progressCallbacks.length; i < l; i++)
|
||||
this.progressCallbacks[i](filei);
|
||||
this.progressCallbacks[i](filenr);
|
||||
},
|
||||
|
||||
|
||||
@@ -634,11 +630,11 @@ Transfer.prototype =
|
||||
|
||||
/*
|
||||
@param transfer Transfer the owner
|
||||
@param filei int index of this file in the transfer's files array
|
||||
@param filenr int index of this file in the transfer's files array
|
||||
|
||||
@param filename, mimetype, size see Transfer
|
||||
*/
|
||||
function TransferFile(transfer, filei, // hooks to owner
|
||||
function TransferFile(transfer, filenr, // hooks to owner
|
||||
filename, mimetype, size)
|
||||
{
|
||||
// sanitize input
|
||||
@@ -662,7 +658,7 @@ function TransferFile(transfer, filei, // hooks to owner
|
||||
this.localFile = null;
|
||||
|
||||
this.transfer = transfer;
|
||||
this.filei = filei;
|
||||
this.filenr = filenr;
|
||||
}
|
||||
TransferFile.prototype =
|
||||
{
|
||||
@@ -728,13 +724,13 @@ TransferFile.prototype =
|
||||
this.statusText = aMessage;
|
||||
|
||||
for (var i = 0, l = this.transfer.progressCallbacks.length; i < l; i++)
|
||||
this.transfer.progressCallbacks[i](this.filei);
|
||||
this.transfer.progressCallbacks[i](this.filenr);
|
||||
}
|
||||
if (
|
||||
!(was_done || was_failed)
|
||||
&& (aStatus == "done" || aStatus == "failed")
|
||||
) // file just completed or failed
|
||||
this.transfer.fileFinished(this.filei);
|
||||
this.transfer.fileFinished(this.filenr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -742,14 +738,14 @@ TransferFile.prototype =
|
||||
|
||||
|
||||
/* Use one object per file to be downloaded.
|
||||
@param filei integer index of file in transfer.files
|
||||
@param filenr integer index of file in transfer.files
|
||||
@param transfer Transfer the context
|
||||
*/
|
||||
function TransferProgressListener(transfer, filei)
|
||||
function TransferProgressListener(transfer, filenr)
|
||||
{
|
||||
this.transfer = transfer; // this creates a cyclic reference :-(
|
||||
this.filei = filei;
|
||||
this.file = this.transfer.files[this.filei];
|
||||
this.filenr = filenr;
|
||||
this.file = this.transfer.files[this.filenr];
|
||||
|
||||
/*
|
||||
|
||||
@@ -964,7 +960,7 @@ TransferProgressListener.prototype =
|
||||
if (aProgressMax > 0 && aProgress > 0)
|
||||
// WORKAROUND Necko sometimes sends crap like 397/0 or 0/4294967295
|
||||
{
|
||||
this.transfer.progressChanged(this.filei, aProgress / aProgressMax);
|
||||
this.transfer.progressChanged(this.filenr, aProgress / aProgressMax);
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -32,7 +32,6 @@ NoUsername=No username given.
|
||||
#results
|
||||
TransferFailed=Transfer failed.
|
||||
TransferCompleted=Transfer completed successfully
|
||||
AllFilesTransfered=All files were transfered.
|
||||
TransferSomeFileFailed=Some files failed to transfer
|
||||
FailedFileMsg=%x% of %total% files failed to transfer.
|
||||
# End-Transfering error strings
|
||||
|
||||
Reference in New Issue
Block a user