Changeset 844

Show
Ignore:
Timestamp:
2008-03-04 20:31:01 (10 months ago)
Author:
MaierMan
Message:

#168: import/export multiple links at a once
WIP: Import for metalink

Files:

Legend:

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

    r837 r844  
    3737 * ***** END LICENSE BLOCK ***** */ 
    3838  
     39const NS_DTA = 'http://www.downthemall.net/properties#'; 
     40const NS_METALINKER = 'http://www.metalinker.org/'; 
     41  
     42  
    3943const NS_ERROR_MODULE_NETWORK = 0x804B0000; 
    4044const NS_ERROR_BINDING_ABORTED = NS_ERROR_MODULE_NETWORK + 2; 
     
    24732477                        e.referrer 
    24742478                ); 
     2479                if (e.startDate) { 
     2480                        d.startDate = e.startDate; 
     2481                } 
    24752482                if (e.url.hash) { 
    24762483                        d.hash = e.url.hash; 
  • trunk/chrome/content/dta/manager.xul

    r836 r844  
    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="import" class="menuitem-iconic" label="&import.label;" image="chrome://dta/skin/manager/import.png" oncommand="Tree.import();"/> 
    104105                                        <menuitem id="export" class="menuitem-iconic" label="&export.label;" image="chrome://dta/skin/manager/export.png" oncommand="Tree.export();"/> 
    105106                                        <menuseparator /> 
  • trunk/chrome/content/dta/manager/metalinker.js

    r835 r844  
    102102        }, 
    103103        handleDownload: function ML_handleDownload(download) { 
    104                 try { 
    105                         download.state = CANCELED; 
    106                         Tree.remove(download, false); 
    107                         var file = new FileFactory(download.destinationFile); 
    108  
    109                         var fiStream = new FileInputStream(file, 1, 0, false); 
     104                download.state = CANCELED; 
     105                Tree.remove(download, false); 
     106                var file = new FileFactory(download.destinationFile); 
     107                 
     108                this.handleFile(file, download.referrer); 
     109                 
     110                try { 
     111                        file.remove(false); 
     112                } catch (ex) { 
     113                        Debug.log("failed to remove metalink file!", ex); 
     114                } 
     115        }, 
     116        handleFile: function ML_handleFile(aFile, aReferrer) { 
     117                try { 
     118                         
     119                        if (aReferrer && 'spec' in aReferrer) { 
     120                                aReferrer = aReferrer.spec; 
     121                        }                
     122                 
     123                        var fiStream = new FileInputStream(aFile, 1, 0, false); 
    110124                        var domParser = new DOMParser(); 
    111                         var doc = domParser.parseFromStream(fiStream, null, file.fileSize, "application/xml"); 
     125                        var doc = domParser.parseFromStream(fiStream, null, aFile.fileSize, "application/xml"); 
    112126                        var root = doc.documentElement; 
    113127                        fiStream.close(); 
    114128                         
    115                         try { 
    116                                 file.remove(false); 
    117                         } catch (ex) { 
    118                                 Debug.log("failed to remove metalink file!", ex); 
    119                         } 
    120                          
    121                          
    122129                        if (root.nodeName != 'metalink' || root.getAttribute('version') != '3.0') { 
    123130                                throw new Error(_('mlinvalid')); 
    124131                        } 
     132         
     133                        var aNum = Preferences.getDTA('numistance', 0); 
     134                        if (++aNum > 999) { 
     135                                aNum = 1; 
     136                        } 
     137                        Preferences.setDTA('numistance', aNum); 
     138         
     139         
    125140                        var locale = this.locale.split('-').map(function(l) { return l.slice(0, 2).toLowerCase(); }).reverse(); 
    126141                        var downloads = []; 
     
    128143                        for (var i = 0; i < files.length; ++i) { 
    129144                                var file = files[i]; 
     145                                var referrer = null; 
     146                                if (file.hasAttributeNS(NS_DTA, 'referrer')) { 
     147                                        referrer = file.getAttributeNS(NS_DTA, 'referrer'); 
     148                                } 
     149                                else { 
     150                                        referrer = aReferrer; 
     151                                } 
     152                                var num = aNum; 
     153                                if (file.hasAttributeNS(NS_DTA, 'num')) { 
     154                                        try { 
     155                                                num = parseInt(file.getAttributeNS(NS_DTA, 'num')); 
     156                                        } catch (ex) { /* no-op */ } 
     157                                } 
     158                                var startDate = new Date(); 
     159                                if (file.hasAttributeNS(NS_DTA, 'date')) { 
     160                                        try { 
     161                                                startDate = new Date(parseInt(file.getAttributeNS(NS_DTA, 'num'))); 
     162                                        } catch (ex) { /* no-op */ } 
     163                                }                                
     164                                         
    130165                                var urls = []; 
    131166                                var urlNodes = this._getNodes(file, 'ml:resources/ml:url'); 
     
    182217                                downloads.push({ 
    183218                                        'url': new UrlManager(urls), 
    184                                         'referrer': download.referrer ? download.referrer.spec : null, 
    185                                         'numIstance': 0, 
    186                                         'mask': download.mask, 
    187                                         'dirSave': download.pathName, 
     219                                        'referrer': referrer ? referrer : null, 
     220                                        'numIstance': num, 
    188221                                        'description': desc, 
     222                                        'startDate': startDate, 
    189223                                        'ultDescription': '', 
    190224                                        'hash': hash, 
     
    294328                }                
    295329        }, 
     330        browseDir: function() { 
     331 
     332                // get a new directory 
     333                var newDir = Utils.askForDir( 
     334                        $('directory').value, // initialize dialog with the current directory 
     335                        _("validdestination") 
     336                ); 
     337                // alright, we got something new, so lets set it. 
     338                if (newDir) { 
     339                        $('directory').value = newDir; 
     340                } 
     341        },       
    296342        accept: function ML_accept() { 
    297                 var nodes = document.getElementsByTagName('richlistitem'); 
    298                 for (var i = 0; i < nodes.length; ++i) { 
    299                         nodes[i].download.selected = nodes[i].checked; 
    300                 } 
     343                if ($('directory', 'renaming').some( 
     344                        function(e) { 
     345                                if (!e.value) { 
     346                                        e.focus(); 
     347                                        e.style.border = "1px solid red"; 
     348                                        return true; 
     349                                } 
     350                                return false; 
     351                        } 
     352                )) { 
     353                        return false; 
     354                } 
     355 
     356                Array.forEach( 
     357                        document.getElementsByTagName('richlistitem'), 
     358                        function(n) { 
     359                                n.download.dirSave =  $('directory').value; 
     360                                n.download.mask =  $('renaming').value;          
     361                                n.download.selected = n.checked; 
     362                        }, 
     363                        this 
     364                ); 
     365                return true; 
    301366        }, 
    302367        cancel: function ML_cancel() { 
  • trunk/chrome/content/dta/manager/metaselect.xul

    r654 r844  
    110110         
    111111        <richlistbox context="context" id="downloads" class="metalinker" flex="1" suppressonselect="true"/> 
     112         
     113        <hbox style="margin:7px 7px 3px 7px;" > 
     114                <vbox autostretch="never" flex="1"> 
     115                        <caption label="&dest.caption;" /> 
     116                        <hbox> 
     117                                <saveddropdown id="directory" preference="directory" flex="1"/> 
     118                                <toolbarbutton id="browsedir" oncommand="Metalinker.browseDir();" tooltiptext="&browse.tip;" /> 
     119                        </hbox> 
     120                </vbox> 
     121                <vbox id="renamingbox"> 
     122                        <caption label="&mask.label;:" /> 
     123                        <hbox> 
     124                                <saveddropdown id="renaming" preference="renaming" flex="1" tooltiptext="&mask.tip;"/> 
     125                                <maskbutton/> 
     126                        </hbox> 
     127                </vbox> 
     128        </hbox>  
     129         
    112130</dialog> 
  • trunk/chrome/content/dta/manager/tree.js

    r836 r844  
    3838const ConverterOutputStream = Construct('@mozilla.org/intl/converter-output-stream;1', 'nsIConverterOutputStream', 'init'); 
    3939 
    40 const NS_DTA = 'http://www.downthemall.net/properties#'; 
    41 const NS_METALINKER = 'http://www.metalinker.org/'; 
    42  
    4340DTA_include("common/verinfo.js"); 
    4441  
     
    457454                let fp = new FilePicker(window, _('exporttitle'), Ci.nsIFilePicker.modeSave); 
    458455                fp.appendFilters(Ci.nsIFilePicker.filterHTML | Ci.nsIFilePicker.filterText); 
    459                 fp.appendFilter(_('exportfiltermetalink'), '*.metalink'); 
     456                fp.appendFilter(_('filtermetalink'), '*.metalink'); 
    460457                fp.defaultExtension = "metalink"; 
    461458                fp.filterIndex = 2; 
     
    548545                 
    549546                return true; 
     547        }, 
     548        import: function T_import() { 
     549                try { 
     550                        if (!this._import()) { 
     551                                throw new Exception("Cannot import"); 
     552                        } 
     553                } 
     554                catch (ex) { 
     555                        Debug.log("Cannot import downloads", ex);                
     556                        DTA_alert(_('importtitle'), _('importfailed')); 
     557                } 
     558        }, 
     559        _import: function T_import() { 
     560                let fp = new FilePicker(window, _('importtitle'), Ci.nsIFilePicker.modeOpen); 
     561                fp.appendFilters(Ci.nsIFilePicker.filterText); 
     562                fp.appendFilter(_('filtermetalink'), '*.metalink'); 
     563                fp.defaultExtension = "metalink"; 
     564                fp.filterIndex = 1; 
     565                 
     566                let rv = fp.show(); 
     567                if (rv == Ci.nsIFilePicker.returnOK) { 
     568                        switch (fp.filterIndex) { 
     569                                case 0: return this._importText(fp.file); 
     570                                case 1: return this._importMetalink(fp.file); 
     571                        }  
     572                } 
     573                return false;    
     574        }, 
     575        _importText: function T__importText() { 
     576         
     577        }, 
     578        _importMetalink: function T__importMetalink(file) { 
     579                try { 
     580                        DTA_include("dta/manager/metalinker.js"); 
     581                        Metalinker.handleFile(file); 
     582                        return true; 
     583                } 
     584                catch (ex) { 
     585                        Debug.log("T__importMetalink", ex); 
     586                }        
     587                return false; 
    550588        }, 
    551589        showInfo: function T_showInfo() {