Sincronizzare il download di più URL

Descrizione

Effettuare il download di piu' URL ed eseguire un'azione solo quando tutti i download sono terminati

Esempio di utilizzo

// contiene le url da scaricare
var urls = new Array(
"http://repo.hyperstruct.net/suite/sameplace-suite-stable.xpi",                    
"http://dafizilla.sourceforge.net/viewsourcewith/index.php");

// contiene i path dove salvare le url
var fileNames = new Array(
"/home/dafi/sameplace.xpi",
"/home/dafi/vsw-index.php");

var ud = new UrlDownloader();
ud.onFinish = myOnFinishCallbackFunction;
ud.callbackObject = "Prova salvataggio";
ud.saveURIList(urls, fileNames);

// La funzione riceve in ingresso le url 
// ed i relativi filename, opzionalmente
// puo' ricevere un parametro applicativo
function myOnFinishCallbackFunctionfunction(urls, outFiles, callbackObject) {
    ...
}

Snippet

function UrlDownloader() {
    this.onFinish = null;
    this.count = 0;
    this.urls = [];
    this.outFiles = [];
    this.callbackObject = null;
}

UrlDownloader.prototype = {
    saveURIList : function(urls, outFiles) {
        if (!this.onFinish) {
            throw "UrlDownloader: the onFinish is not valid";
        }
        this.urls = urls;
        this.outFiles = outFiles;
        this.count = 0;

        for (var i = 0; i < urls.length; i++) {
            this.internalSaveURI(urls[i], outFiles[i]);
        }
    },

    onStateChange : function(webProgress, request, stateFlags, status) {
        const wpl = Components.interfaces.nsIWebProgressListener;
        var isLoadFinished = (stateFlags & wpl.STATE_STOP)
                             ;//&& (stateFlags & wpl.STATE_IS_NETWORK);

        if (isLoadFinished) {
            ++this.count;

            if (this.count == this.outFiles.length) {
                this.onFinish(this.urls, this.outFiles, this.callbackObject);
            }
        }
    },

    QueryInterface : function(iid) {
        if (iid.equals(Components.interfaces.nsIWebProgressListener) ||
            iid.equals(Components.interfaces.nsISupportsWeakReference) ||
            iid.equals(Components.interfaces.nsISupports)) {
            return this;
        }

        throw Components.results.NS_NOINTERFACE;
    },

    internalSaveURI : function(url, outFile) {
        const nsIWBP = Components.interfaces.nsIWebBrowserPersist;
        var persist = ViewSourceWithCommon.makeWebBrowserPersist();

        persist.progressListener = this;
        persist.persistFlags = nsIWBP.PERSIST_FLAGS_REPLACE_EXISTING_FILES
                               | nsIWBP.PERSIST_FLAGS_FROM_CACHE;

        var referrer = null;//ViewSourceWithBrowserHelper.getReferrer(document);
        var postData = null;//ViewSourceWithBrowserHelper.getPostData();

        var uri = ViewSourceWithCommon.makeURL(url);
        persist.saveURI(uri, null, referrer, postData, null, outFile);
    },

    onStatusChange : function(webProgress, request, status, message) {},
    onLocationChange : function(webProgress, request, location) {},
    onProgressChange : function(webProgress, request,
                                curSelfProgress, maxSelfProgress,
                                curTotalProgress, maxTotalProgress) {},
    onSecurityChange : function(webProgress, request, state) {}
}

Syndicate content