Changeset 836

Show
Ignore:
Timestamp:
2008-03-04 03:25:28 (9 months ago)
Author:
MaierMan
Message:

#168: import/export multiple links at a once
WIP: Export for text and metalink

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/chrome/content/dta/manager.js

    r828 r836  
    554554                return this._urls.length; 
    555555        }, 
     556        get all() { 
     557                for (let i = 0, e = this._urls.length; i < e; ++i) { 
     558                        yield this._urls[i]; 
     559                } 
     560        }, 
    556561        markBad: function um_markBad(url) { 
    557562                if (this._urls.length > 1) { 
  • trunk/chrome/content/dta/manager.xul

    r813 r836  
    102102                                        <menuitem id="force" class="menuitem-iconic" label="&force.label;" image="chrome://dta/skin/manager/force.png" oncommand="Tree.force()" />                                       
    103103                                        <menuseparator /> 
     104                                        <menuitem id="export" class="menuitem-iconic" label="&export.label;" image="chrome://dta/skin/manager/export.png" oncommand="Tree.export();"/> 
     105                                        <menuseparator /> 
    104106                                        <menuitem id="prefs" class="menuitem-iconic" label="&options.label;" image="chrome://dta/skin/common/prefs.png" onclick="DTA_showPreferences();" /> 
    105107                                </menupopup> 
  • trunk/chrome/content/dta/manager/tree.js

    r834 r836  
    3535 * ***** END LICENSE BLOCK ***** */ 
    3636  
     37const FilePicker = Construct('@mozilla.org/filepicker;1', 'nsIFilePicker', 'init'); 
     38const ConverterOutputStream = Construct('@mozilla.org/intl/converter-output-stream;1', 'nsIConverterOutputStream', 'init'); 
     39 
     40const NS_DTA = 'http://www.downthemall.net/properties#'; 
     41const NS_METALINKER = 'http://www.metalinker.org/'; 
     42 
     43DTA_include("common/verinfo.js"); 
    3744  
    3845var Tree = { 
     
    436443                } 
    437444        }, 
     445        export: function T_export() { 
     446                try { 
     447                        if (!this._export()) { 
     448                                throw new Exception("Cannot export"); 
     449                        } 
     450                } 
     451                catch (ex) { 
     452                        Debug.log("Cannot export downloads", ex);                
     453                        DTA_alert(_('exporttitle'), _('exportfailed')); 
     454                } 
     455        }, 
     456        _export: function T_export() { 
     457                let fp = new FilePicker(window, _('exporttitle'), Ci.nsIFilePicker.modeSave); 
     458                fp.appendFilters(Ci.nsIFilePicker.filterHTML | Ci.nsIFilePicker.filterText); 
     459                fp.appendFilter(_('exportfiltermetalink'), '*.metalink'); 
     460                fp.defaultExtension = "metalink"; 
     461                fp.filterIndex = 2; 
     462                 
     463                let rv = fp.show(); 
     464                if (rv == Ci.nsIFilePicker.returnOK || rv == Ci.nsIFilePicker.returnReplace) { 
     465                        switch (fp.filterIndex) { 
     466                                case 0: return this._exportHTML(fp.file); 
     467                                case 1: return this._exportText(fp.file); 
     468                                case 2: return this._exportMetalink(fp.file); 
     469                        }  
     470                } 
     471                return false; 
     472        }, 
     473        // i.e. one url per line 
     474        // exports hash fragments as well. 
     475        _exportText: function T__exportText(file) { 
     476                let cs = ConverterOutputStream( 
     477                        new FileOutputStream(file, 0x02 | 0x08 | 0x20, Prefs.permissions, 0), 
     478                        null, 
     479                        0, 
     480                        null 
     481                ); 
     482                for (let d in this.selected) { 
     483                        let url = d.urlManager.url; 
     484                        if (d.hash) { 
     485                                url += '#hash(' + d.hash.type + ":" + d.hash.sum + ")"; 
     486                        } 
     487                        url += "\r\n"; 
     488                        cs.writeString(url);  
     489                } 
     490                cs.close(); 
     491                return true; 
     492        }, 
     493        _exportMetalink: function T__exportMetalink(file) { 
     494                let doc = document.implementation.createDocument(NS_METALINKER, 'metalink', null); 
     495                let root = doc.documentElement; 
     496                root.setAttribute('type', 'static'); 
     497                root.setAttribute('version', '3.0'); 
     498                root.setAttribute('generator', 'DownThemAll! ' + DTA_VERSION + ' <http://downthemall.net/>'); 
     499                root.setAttributeNS(NS_DTA, 'version', DTA_VERSION); 
     500                root.setAttribute('pubdate', new Date().toUTCString()); 
     501                 
     502                root.appendChild(doc.createComment("metalink as exported by DownThemAll!\r\nmay contain DownThemAll! specific information in the DownThemAll! namespace: " + NS_DTA));   
     503                 
     504                let files = doc.createElement('files'); 
     505                for (let d in this.selected) { 
     506                        let f = doc.createElement('file'); 
     507                        f.setAttribute('name', d.fileName); 
     508                        f.setAttributeNS(NS_DTA, 'num', d.numIstance); 
     509                        f.setAttributeNS(NS_DTA, 'startDate', d.startDate.getTime()); 
     510                        if (d.referrer) { 
     511                                f.setAttributeNS(NS_DTA, 'referrer', d.referrer.spec); 
     512                        } 
     513                         
     514                        if (d.description) { 
     515                                let n = doc.createElement('description'); 
     516                                n.textContent = d.description; 
     517                                f.appendChild(n); 
     518                        }  
     519                        let r = doc.createElement('resources'); 
     520                        for (let u in d.urlManager.all) { 
     521                                let n = doc.createElement('url'); 
     522                                let t = u.url.match(/^(\w+):/); 
     523                                n.setAttribute('type', t[1]); 
     524                                n.setAttribute('preference', u.preference); 
     525                                n.setAttributeNS(NS_DTA, 'usable', u.usable); 
     526                                n.setAttributeNS(NS_DTA, 'charset', u.charset); 
     527                                n.textContent = u.url; 
     528                                r.appendChild(n); 
     529                        } 
     530                        if (d.hash) { 
     531                                let v = doc.createElement('verification'); 
     532                                let h = doc.createElement('hash'); 
     533                                h.setAttribute('type', d.hash.type.toLowerCase()); 
     534                                h.textContent = d.hash.sum.toLowerCase(); 
     535                                v.appendChild(h); 
     536                                f.appendChild(v); 
     537                        } 
     538                        f.appendChild(r); 
     539                        files.appendChild(f); 
     540                } 
     541                root.appendChild(files); 
     542                 
     543                let fs = new FileOutputStream(file, 0x02 | 0x08 | 0x20, Prefs.permissions, 0); 
     544                let xml = '<?xml version="1.0"?>\r\n'; 
     545                fs.write(xml, xml.length); 
     546                new XMLSerializer().serializeToStream(doc, fs, 'utf-8'); 
     547                fs.close(); 
     548                 
     549                return true; 
     550        }, 
    438551        showInfo: function T_showInfo() { 
    439552                this.beginUpdate(); 
     
    493606                                state: 0, 
    494607                                resumable: false, 
    495                                 is: QueueItem.prototype.is 
     608                                is: QueueItem.prototype.is, 
     609                                count: this.selection.count 
    496610                        }; 
    497611                        for (let d in this.selected) { 
     
    526640                        modifySome($('folder'), function(d) { return d.curFolder; }); 
    527641                        modifySome($('delete'), function(d) { return d.is(COMPLETE); }); 
     642                        modifySome($('export'), function(d) { return d.count != 0; }); 
    528643                        modifySome($('addchunk', 'removechunk', 'force'), function(d) { return d.is(QUEUED, RUNNING, PAUSED); }); 
    529644                } 
  • trunk/chrome/locale/en-US/manager.dtd

    r718 r836  
    3939<!ENTITY removechunk.label "One less chunk"> 
    4040<!ENTITY force.label "Force start"> 
     41<!ENTITY export.label "Export selected"> 
    4142 
    4243<!ENTITY options.caption "Options"> 
  • trunk/chrome/locale/en-US/manager.properties

    r813 r836  
    5555removequestion=Are you sure to remove selected downloads? 
    5656removecheck=Do not ask again 
     57exporttitle=Export downloads 
     58exportfiltermetalink=Metalink (XML) 
     59exportfailed=Failed to export downloads