In my work I’m currently working on an application based on Mozilla’s XULRunner and I need to implement downloading of blank form (DOC file from remote URI) and I spent with it over one hour – I finally succeeded after I read this page on MXR.
So here are is some code I used and I hope that will be usefull for someone:
// Got instance of download manager
var dm = Components.classes["@mozilla.org/download-manager;1"].
createInstance(Components.interfaces.nsIDownloadManager);
// Create URI from which we want to download file
var ios = Components.classes["@mozilla.org/network/io-service;1"].
getService(Components.interfaces.nsIIOService);
var uri1 = ios.newURI("http://www.test.com/empty_form.doc", null, null);
// Set to where we want to save downloaded file (user's desktop)
var file = Components.classes["@mozilla.org/file/directory_service;1"].
getService(Components.interfaces.nsIProperties).
get("Desk", Components.interfaces.nsIFile);
file.append("empty_form.doc");
var uri2 = ios.newFileURI(file);
// Set up correct MIME type
var msrv = Components.classes["@mozilla.org/mime;1"].
getService(Components.interfaces.nsIMIMEService);
var type = msrv.getTypeFromURI(uri1);
var mime = msrv.getFromTypeAndExtension(type, "");
// Observer for download
var nsIWBP = Components.interfaces.nsIWebBrowserPersist;
var pers = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].
createInstance(nsIWBP);
pers.persistFlags = nsIWBP.PERSIST_FLAGS_REPLACE_EXISTING_FILES |
nsIWBP.PERSIST_FLAGS_BYPASS_CACHE |
nsIWBP.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION;
// Start download
var dl = dm.addDownload(dm.DOWNLOAD_TYPE_DOWNLOAD, uri1, uri2,
"Eforms - blank form", mime, Math.round(Date.now() * 1000),
null, pers);
pers.progressListener = dl.QueryInterface(Components.interfaces.nsIWebProgressListener);
pers.saveURI(dl.source, null, null, null, null, dl.targetFile);
// And finally show download manager
var dm_ui = Components.classes["@mozilla.org/download-manager-ui;1"].
createInstance(Components.interfaces.nsIDownloadManagerUI);
dm_ui.show(window, dl.id, Components.interfaces.nsIDownloadManagerUI.REASON_NEW_DOWNLOAD);
PS: don’t forget to set up properly preferences of your XULRunner-based application – see this for details.
