Changeset 1009
- Timestamp:
- 07/31/08 04:33:49 (1 month ago)
- Files:
-
- trunk/chrome/content/dta/manager.js (modified) (27 diffs)
- trunk/chrome/content/dta/manager.xul (modified) (1 diff)
- trunk/chrome/content/dta/manager/info.js (modified) (3 diffs)
- trunk/chrome/content/dta/manager/sessionmanager.js (modified) (3 diffs)
- trunk/chrome/content/dta/manager/tree.js (modified) (7 diffs)
- trunk/chrome/locale/en-US/manager.properties (modified) (1 diff)
- trunk/chrome/skin/manager/style.css (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/chrome/content/dta/manager.js
r993 r1009 86 86 Components.utils.import('resource://dta/prompts.jsm', Prompts); 87 87 88 var TEXT_PAUSED; 89 var TEXT_QUEUED; 90 var TEXT_COMPLETE; 91 var TEXT_CANCELED; 92 88 93 var Dialog = { 89 94 _observes: [ … … 116 121 totalbytes: 0, 117 122 init: function D_init() { 123 124 TEXT_PAUSED = _('paused'); 125 TEXT_QUEUED = _('queued'); 126 TEXT_COMPLETE = _('complete'); 127 TEXT_CANCELED = _('canceled'); 128 118 129 Tree.init($("downloads")); 119 130 SessionManager.init(); … … 136 147 137 148 document.getElementById("dtaHelp").hidden = !("openHelp" in window); 149 }, 138 150 139 151 start: function() { 140 152 if ("arguments" in window) { 141 153 startDownloads(window.arguments[0], window.arguments[1]); 142 154 } 143 155 144 Tree.invalidate();145 156 this._initialized = true; 146 157 for (let d in Tree.all) { … … 152 163 new Timer("Dialog.refreshWritten();", 100, true, true); 153 164 new Timer("Dialog.saveRunning();", 10000, true); 154 }, 165 166 $('mainstack').selectedIndex++; 167 }, 168 155 169 observe: function D_observe(subject, topic, data) { 156 170 if (topic == 'quit-application-requested') { … … 177 191 let sum = 0; 178 192 const now = Utils.getTimestamp(); 179 this._running.forEach( 180 function(i) { 181 let d = i.d; 182 183 let advanced = (d.partialSize - i.lastBytes); 184 sum += advanced; 185 186 let elapsed = (now - i.lastTime) / 1000; 187 if (elapsed < 1) { 188 return; 189 } 190 191 let speed = Math.round(advanced / elapsed); 192 193 i.lastBytes = d.partialSize; 194 i.lastTime = now; 195 196 // Refresh item speed 197 d.speeds.push(speed > 0 ? speed : 0); 198 if (d.speeds.length > SPEED_COUNT) { 199 d.speeds.shift(); 193 for each (i in this._running) { 194 let d = i.d; 195 196 let advanced = (d.partialSize - i.lastBytes); 197 sum += advanced; 198 199 let elapsed = (now - i.lastTime) / 1000; 200 if (elapsed < 1) { 201 return; 202 } 203 204 let speed = Math.round(advanced / elapsed); 205 206 i.lastBytes = d.partialSize; 207 i.lastTime = now; 208 209 // Refresh item speed 210 d.speeds.push(speed > 0 ? speed : 0); 211 if (d.speeds.length > SPEED_COUNT) { 212 d.speeds.shift(); 213 } 214 i.lastBytes = d.partialSize; 215 i.lastTime = now; 216 217 speed = 0; 218 d.speeds.forEach( 219 function(s) { 220 speed += s; 200 221 } 201 i.lastBytes = d.partialSize; 202 i.lastTime = now; 203 204 speed = 0; 205 d.speeds.forEach( 206 function(s) { 207 speed += s; 208 } 209 ); 210 speed /= d.speeds.length; 211 212 // Calculate estimated time 213 if (advanced != 0 && d.totalSize > 0) { 214 let remaining = Math.ceil((d.totalSize - d.partialSize) / speed); 215 if (!isFinite(remaining)) { 216 d.status = _("unknown"); 217 } 218 else { 219 d.status = Utils.formatTimeDelta(remaining); 220 } 222 ); 223 speed /= d.speeds.length; 224 225 // Calculate estimated time 226 if (advanced != 0 && d.totalSize > 0) { 227 let remaining = Math.ceil((d.totalSize - d.partialSize) / speed); 228 if (!isFinite(remaining)) { 229 d.status = _("unknown"); 221 230 } 222 d.speed = Utils.formatBytes(speed) + "/s"; 223 } 224 ); 231 else { 232 d.status = Utils.formatTimeDelta(remaining); 233 } 234 } 235 d.speed = Utils.formatBytes(speed) + "/s"; 236 } 225 237 let elapsed = (now - this._lastTime) / 1000; 226 238 this._lastTime = now; … … 304 316 } 305 317 306 if (!this.offline) { 318 if (!this.offline) { 319 // XXX Improve 307 320 if (Prefs.autoRetryInterval) { 308 321 for (let d in Tree.all) { … … 403 416 try { 404 417 // check if there is something running or scheduled 405 if (this.startNext() || Tree.some(function(d) { return d.is (FINISHING, RUNNING, QUEUED); } )) {418 if (this.startNext() || Tree.some(function(d) { return d.isOf(FINISHING, RUNNING, QUEUED); } )) { 406 419 return; 407 420 } … … 435 448 }, 436 449 _canClose: function D__canClose() { 437 if (Tree.some(function(d) { return d.started && !d.resumable && d.is (RUNNING); })) {450 if (Tree.some(function(d) { return d.started && !d.resumable && d.isOf(RUNNING); })) { 438 451 var rv = Prompts.confirmYN( 439 452 window, … … 465 478 Tree.updateAll( 466 479 function(d) { 467 if (d.is (RUNNING, QUEUED)) {480 if (d.isOf(RUNNING, QUEUED)) { 468 481 // enumerate all running chunks 469 482 d.chunks.forEach( … … 667 680 fileName: null, 668 681 acceptRanges: 'bytes', 669 content length: 0,682 contentLength: 0, 670 683 time: null, 671 684 … … 703 716 704 717 case 'content-length': 705 this.contentlength = Number(aValue); 718 let contentLength = new Number(aValue); 719 if (contentLength > 0 && !isNaN(contentLength)) { 720 this.ccontentLength = Math.floor(contentLength); 721 } 706 722 break; 707 723 708 724 case 'content-range': { 709 let c l= new Number(aValue.split('/').pop());710 if (c l> 0) {711 this.content length = cl;725 let contentLength = new Number(aValue.split('/').pop()); 726 if (contentLength > 0) { 727 this.contentLength = Math.floor(contentLength); 712 728 } 713 729 } … … 892 908 }, 893 909 set state(nv) { 894 if (this._state != nv) { 895 if (this._state == RUNNING) { 896 // remove ourself from inprogresslist 897 Dialog.wasStopped(this); 898 } 899 this._state = nv; 900 this.invalidate(); 901 Tree.refreshTools(); 902 Dialog.signal(this); 903 } 910 if (this._state == nv) { 911 return nv; 912 } 913 if (this._state == RUNNING) { 914 // remove ourself from inprogresslist 915 Dialog.wasStopped(this); 916 } 917 this._state = nv; 918 this.invalidate(); 919 Dialog.signal(this); 920 Tree.refreshTools(); 921 return nv; 904 922 }, 905 923 … … 911 929 }, 912 930 set fileName(nv) { 931 if (this._fileName == nv) { 932 return nv; 933 } 913 934 this._fileName = nv; 914 935 this.rebuildDestination(); … … 975 996 }, 976 997 set conflicts(nv) { 977 if (t ypeof(nv) != 'number') {978 return this._conflicts;998 if (this._conflicts == nv) { 999 return nv; 979 1000 } 980 1001 this._conflicts = nv; … … 1014 1035 *Takes one or more state indicators and returns if this download is in state of any of them 1015 1036 */ 1016 is: function QI_is() { 1017 let state = this.state; 1037 is: function QI_is(state) { 1038 return this._state == state; 1039 }, 1040 isOf: function QI_isOf() { 1041 let state = this._state; 1018 1042 for (let i = 0, e = arguments.length; i < e; ++i) { 1019 1043 if (state == arguments[i]) { … … 1021 1045 } 1022 1046 } 1023 return false; 1047 return false; 1024 1048 }, 1025 1049 … … 1066 1090 get totalSize() { return this._totalSize; }, 1067 1091 set totalSize(nv) { 1068 this._totalSize = nv; 1092 if (this._totalSize == nv) { 1093 return nv; 1094 } 1095 if (nv >= 0 && !isNaN(nv)) { 1096 this._totalSize = Math.floor(nv); 1097 } 1069 1098 this.invalidate(); 1070 1099 return this._totalSize; … … 1155 1184 _status : '', 1156 1185 get status() { 1157 if (Dialog.offline && this.is (QUEUED, PAUSED)) {1186 if (Dialog.offline && this.isOf(QUEUED, PAUSED)) { 1158 1187 return _('offline'); 1159 1188 } … … 1350 1379 this.activeChunks = 0; 1351 1380 this.state = COMPLETE; 1352 this.status = _("complete");1381 this.status = TEXT_COMPLETE; 1353 1382 }, 1354 1383 rebuildDestination: function QI_rebuildDestination() { … … 1550 1579 this._autoRetryTime = 0; 1551 1580 this.state = QUEUED; 1552 this.status = _('queued');1581 this.status = TEXT_QUEUED; 1553 1582 }, 1554 1583 resumeDownload: function QI_resumeDownload() { … … 1643 1672 dumpScoreboard: function QI_dumpScoreboard() { 1644 1673 let scoreboard = ''; 1645 let len = String(this.totalSize).length;1674 let len = this.totalSize.toString().length; 1646 1675 this.chunks.forEach( 1647 1676 function(c,i) { … … 1698 1727 } 1699 1728 // Store this so we can later resume. 1700 if (!this.is (CANCELED, COMPLETE) && this.partialSize) {1729 if (!this.isOf(CANCELED, COMPLETE) && this.partialSize) { 1701 1730 e.tmpFile = this.tmpFile.path; 1702 1731 } … … 1715 1744 e.chunks = []; 1716 1745 1717 if (this.is(RUNNING, PAUSED, QUEUED) && this.resumable) { 1718 this.chunks.forEach( 1719 function(c) { 1720 e.chunks.push({start: c.start, end: c.end, written: c.safeBytes}); 1721 } 1722 ); 1746 if (this.isOf(RUNNING, PAUSED, QUEUED) && this.resumable) { 1747 for each (let c in this.chunks) { 1748 e.chunks.push({start: c.start, end: c.end, written: c.safeBytes}); 1749 } 1723 1750 } 1724 1751 return Serializer.encode(e); … … 2242 2269 } 2243 2270 2244 if (visitor.contentlength > 0) { 2245 d.totalSize = visitor.contentlength; 2246 } else { 2271 if (visitor.contentLength > 0) { 2272 d.totalSize = visitor.contentLength; 2273 } 2274 else { 2247 2275 d.totalSize = 0; 2248 2276 } … … 2459 2487 } 2460 2488 2461 if (!d.is (PAUSED, CANCELED, FINISHING) && d.chunks.length == 1 && d.chunks[0] == c) {2489 if (!d.isOf(PAUSED, CANCELED, FINISHING) && d.chunks.length == 1 && d.chunks[0] == c) { 2462 2490 if (d.resumable) { 2463 2491 d.pause(); … … 2474 2502 return; 2475 2503 } 2476 if (!d.is (PAUSED, CANCELED)) {2504 if (!d.isOf(PAUSED, CANCELED)) { 2477 2505 d.resumeDownload(); 2478 2506 } … … 2609 2637 qi.state = start ? QUEUED : PAUSED; 2610 2638 if (qi.is(QUEUED)) { 2611 qi.status = _('queued');2639 qi.status = TEXT_QUEUED; 2612 2640 } 2613 2641 else { 2614 qi.status = _('paused');2642 qi.status = TEXT_PAUSED; 2615 2643 } 2616 2644 qi.save(); trunk/chrome/content/dta/manager.xul
r968 r1009 120 120 </popupset> 121 121 122 <vbox flex="1"> 123 <toolbox chromedir="&locale.dir;"> 124 <toolbar id="tools"> 125 <spacer/> 126 <toolbarbutton label="&tooladd.label;" id="tooladd" onclick="window.openDialog('chrome://dta/content/dta/addurl.xul','_blank','chrome, centerscreen, dialog=no, dependent=yes');" tooltiptext="&tooladd.tooltip;" /> 127 <spacer class="visible" /> 128 <toolbarbutton label="&resume.label;" id="toolplay" onclick="Tree.resume();"/> 129 <toolbarbutton label="&pause.label;" id="toolpause" onclick="Tree.pause();"/> 130 <toolbarbutton label="&cancel.label;" id="toolcancel" onclick="Tree.cancel();"/> 131 <spacer class="visible" /> 132 <toolbarbutton label="&movetop.label;" id="toolmovetop" onclick="Tree.top();" /> 133 <toolbarbutton label="&moveup.label;" id="toolmoveup" onclick="Tree.up();"/> 134 <toolbarbutton label="&movedown.label;" id="toolmovedown" onclick="Tree.down();"/> 135 <toolbarbutton label="&movebottom.label;" id="toolmovebottom" onclick="Tree.bottom();" /> 136 <spacer flex="1" /> 137 <spacer chromedir="&locale.dir;" id="tooldonate" onclick="DTA_Mediator.openTab('http://www.downthemall.net/howto/donate/');" tooltiptext="&tooldonate.tooltiptext;" /> 138 </toolbar> 139 </toolbox> 140 141 <tree 142 id="downloads" 143 flex="1" 144 hidecolumnpicker="false" 145 context="popup" 146 seltype="multiple" 147 enableColumnDrag="true" 148 style="margin:0px;" 149 ondblclick="FileHandling.openFile();" 150 onselect="Tree.selectionChanged();" 151 onmousemove="Tree.hovering(event);" 152 ondraggesture="if (event.originalTarget.localName == 'treechildren') nsDragAndDrop.startDrag(event, Tree);" 153 chromedir="&locale.dir;" 154 > 155 <treecols> 156 <treecol id="task" label="&task.label;" ordinal="1" flex="30" crop="center" persist="width ordinal hidden"/> 157 <splitter class="tree-splitter"/> 158 <treecol id="pct" label="&pct.label;" ordinal="2" type="progressmeter" flex="20" persist="width ordinal hidden"/> 159 <splitter class="tree-splitter"/> 160 <treecol id="per" label="&per.label;" ordinal="3" flex="4" persist="width ordinal hidden"/> 161 <splitter class="tree-splitter"/> 162 <treecol id="dim" label="&dim.label;" ordinal="4" flex="10" persist="width ordinal hidden"/> 163 <splitter class="tree-splitter"/> 164 <treecol id="status" label="&time.label;" ordinal="5" flex="7" persist="width ordinal hidden"/> 165 <splitter class="tree-splitter"/> 166 <treecol id="speed" label="&speed.label;" ordinal="6" flex="7" persist="width ordinal hidden"/> 167 <splitter class="tree-splitter"/> 168 <treecol id="parts" label="&parts.label;" ordinal="7" flex="4" hidden="true" persist="width ordinal hidden" style="text-align:center;" /> 169 <splitter class="tree-splitter"/> 170 <treecol id="mask" label="&mask.label;" ordinal="8" hidden="true" crop="left" flex="8" persist="width ordinal hidden" /> 171 <splitter class="tree-splitter"/> 172 <treecol id="path" label="&path.label;" ordinal="9" hidden="true" crop="center" flex="10" persist="width ordinal hidden" /> 173 <splitter class="tree-splitter"/> 174 <treecol id="hash" label="&hash.label;" ordinal="10" hidden="true" flex="6" persist="width ordinal hidden"/> 175 </treecols> 176 <treechildren tooltip="tooltip"> 177 </treechildren> 178 </tree> 179 180 </vbox> 122 <deck flex="1" id="mainstack"> 123 <hbox align="center"> 124 <label flex="1" align="center" id="loading"/> 125 </hbox> 126 <vbox flex="1"> 127 <toolbox chromedir="&locale.dir;"> 128 <toolbar id="tools"> 129 <spacer/> 130 <toolbarbutton label="&tooladd.label;" id="tooladd" onclick="window.openDialog('chrome://dta/content/dta/addurl.xul','_blank','chrome, centerscreen, dialog=no, dependent=yes');" tooltiptext="&tooladd.tooltip;" /> 131 <spacer class="visible" /> 132 <toolbarbutton label="&resume.label;" id="toolplay" onclick="Tree.resume();"/> 133 <toolbarbutton label="&pause.label;" id="toolpause" onclick="Tree.pause();"/> 134 <toolbarbutton label="&cancel.label;" id="toolcancel" onclick="Tree.cancel();"/> 135 <spacer class="visible" /> 136 <toolbarbutton label="&movetop.label;" id="toolmovetop" onclick="Tree.top();" /> 137 <toolbarbutton label="&moveup.label;" id="toolmoveup" onclick="Tree.up();"/> 138 <toolbarbutton label="&movedown.label;" id="toolmovedown" onclick="Tree.down();"/> 139 <toolbarbutton label="&movebottom.label;" id="toolmovebottom" onclick="Tree.bottom();" /> 140 <spacer flex="1" /> 141 <spacer chromedir="&locale.dir;" id="tooldonate" onclick="DTA_Mediator.openTab('http://www.downthemall.net/howto/donate/');" tooltiptext="&tooldonate.tooltiptext;" /> 142 </toolbar> 143 </toolbox> 144 145 <tree 146 id="downloads" 147 flex="1" 148 hidecolumnpicker="false" 149 context="popup" 150 seltype="multiple" 151 enableColumnDrag="true" 152 style="margin:0px;" 153 ondblclick="FileHandling.openFile();" 154 onselect="Tree.selectionChanged();" 155 onmousemove="Tree.hovering(event);" 156 ondraggesture="if (event.originalTarget.localName == 'treechildren') nsDragAndDrop.startDrag(event, Tree);" 157 chromedir="&locale.dir;" 158 > 159 <treecols> 160 <treecol id="task" label="&task.label;" ordinal="1" flex="30" crop="center" persist="width ordinal hidden"/> 161 <splitter class="tree-splitter"/> 162 <treecol id="pct" label="&pct.label;" ordinal="2" type="progressmeter" flex="20" persist="width ordinal hidden"/> 163 <splitter class="tree-splitter"/> 164 <treecol id="per" label="&per.label;" ordinal="3" flex="4" persist="width ordinal hidden"/> 165 <splitter class="tree-splitter"/> 166 <treecol id="dim" label="&dim.label;" ordinal="4" flex="10" persist="width ordinal hidden"/> 167 <splitter class="tree-splitter"/> 168 <treecol id="status" label="&time.label;" ordinal="5" flex="7" persist="width ordinal hidden"/> 169 <splitter class="tree-splitter"/> 170 <treecol id="speed" label="&speed.label;" ordinal="6" flex="7" persist="width ordinal hidden"/> 171 <splitter class="tree-splitter"/> 172 <treecol id="parts" label="&parts.label;" ordinal="7" flex="4" hidden="true" persist="width ordinal hidden" style="text-align:center;" /> 173 <splitter class="tree-splitter"/> 174 <treecol id="mask" label="&mask.label;" ordinal="8" hidden="true" crop="left" flex="8" persist="width ordinal hidden" /> 175 <splitter class="tree-splitter"/> 176 <treecol id="path" label="&path.label;" ordinal="9" hidden="true" crop="center" flex="10" persist="width ordinal hidden" /> 177 <splitter class="tree-splitter"/> 178 <treecol id="hash" label="&hash.label;" ordinal="10" hidden="true" flex="6" persist="width ordinal hidden"/> 179 </treecols> 180 <treechildren tooltip="tooltip"> 181 </treechildren> 182 </tree> 183 </vbox> 184 </deck> 181 185 182 186 <statusbar id="footer" chromedir="&locale.dir;"> trunk/chrome/content/dta/manager/info.js
r970 r1009 59 59 $('sourcePage')._value = $("sourcePage").value = d.referrer.spec; 60 60 } 61 if (!d.is (FINISHING, COMPLETE)) {61 if (!d.isOf(FINISHING, COMPLETE)) { 62 62 $('sourcePage').removeAttribute('readonly'); 63 63 } … … 92 92 $('canvasGrid').hidden = true; 93 93 } 94 if (downloads.every(function(d) { return d.is (COMPLETE, FINISHING); })) {94 if (downloads.every(function(d) { return d.isOf(COMPLETE, FINISHING); })) { 95 95 for each (let e in $('directory', 'renaming', 'mask', 'browsedir')) { 96 96 e.setAttribute('readonly', 'true'); … … 148 148 149 149 for each (let d in t) { 150 if (d.is (COMPLETE, FINISHING)) {150 if (d.isOf(COMPLETE, FINISHING)) { 151 151 return; 152 152 } trunk/chrome/content/dta/manager/sessionmanager.js
r976 r1009 41 41 const DB_VERSION = 1; 42 42 43 Components.utils.import('resource://dta/cothread.jsm'); 44 43 45 var SessionManager = { 44 46 init: function() { … … 76 78 shutdown: function() { 77 79 try { 78 ['_addStmt', '_saveStmt', '_savePosStmt', '_delStmt'].forEach( 79 function(e) { 80 try { this[e].finalize(); } catch (ex) { /* no op */ } 81 }, 82 this 83 ); 80 for each (let e in ['_addStmt', '_saveStmt', '_savePosStmt', '_delStmt']) { 81 try { 82 this[e].finalize(); 83 delete this[e]; 84 } 85 catch (ex) { 86 // no-op 87 } 88 } 89 this._con.executeSimpleSQL('VACUUM'); 90 try { 91 this._con.close(); 92 delete this._con; 93 } 94 catch (ex) { 95 Debug.log("Cannot close!", ex); 96 } 84 97 } 85 98 catch (ex) { 86 99 Debug.log("SessionManager::shutdown", ex); 87 }88 this._con.executeSimpleSQL('VACUUM');89 if ('close' in this._con) {90 try {91 this._con.close();92 }93 catch (ex) {94 //95 }96 100 } 97 101 }, … … 154 158 155 159 load: function() { 156 return Tree.update(this._load, this); 157 }, 158 _load: function() { 159 160 var stmt = this._con.createStatement('SELECT uuid, item FROM queue ORDER BY pos'); 160 this._loaded = false; 161 162 let stmt = this._con.createStatement('SELECT COUNT(*) FROM queue'); 163 stmt.executeStep(); 164 let count = stmt.getInt64(0); 165 stmt.finalize(); 166 let loading = $('loading'); 167 168 stmt = this._con.createStatement('SELECT uuid, item FROM queue ORDER BY pos'); 169 this.beginUpdate(); 161 170 Tree.beginUpdate(); 162 this.beginUpdate(); 163 while (stmt.executeStep()) { 164 try { 165 let dbId = stmt.getInt64(0); 166 let down = Serializer.decode(stmt.getUTF8String(1)); 167 let get = function(attr) { 168 if (attr in down) { 169 return down[attr]; 170 } 171 return null; 172 } 173 174 let d = new QueueItem(); 175 d.dbId = dbId; 176 d.urlManager = new UrlManager(down.urlManager); 177 d.numIstance = get("numIstance"); 178 179 let referrer = get('referrer'); 180 if (referrer) { 181 try { 182 d.referrer = referrer.toURL(); 183 } 184 catch (ex) { 185 // We might have been fed with about:blank or other crap. so ignore. 186 } 187 } 188 189 // only access the setter of the last so that we don't generate stuff trice. 190 d._pathName = get('pathName'); 191 d._description = get('description'); 192 d._mask = get('mask'); 193 d.fileName = get('fileName'); 171 new CoThread( 172 function(idx) { 173 loading.value = _('loading', [++idx, count]); 174 // Are we done? 175 if (!stmt || !stmt.executeStep()) { 176 this.endUpdate(); 177 Tree.endUpdate(); 178 Tree.invalidate(); 179 Dialog.start(); 180 return false; 181 } 194 182 195 let tmpFile = get('tmpFile'); 196 if (tmpFile) { 197 try { 198 tmpFile = new FileFactory(tmpFile); 199 if (tmpFile.exists()) { 200 d._tmpFile = tmpFile; 201 } 202 else { 203 // Download partfile is gone! 204 // XXX find appropriate error message! 205 d.fail(_("accesserror"), _("permissions") + " " + _("destpath") + ". " + _("checkperm"), _("accesserror")); 206 } 207 } 208 catch (ex) { 209 Debug.log("tried to construct with invalid tmpFile", ex); 210 d.cancel(); 211 } 212 } 213 214 d.startDate = new Date(get("startDate")); 215 d.visitors = new VisitorManager(down.visitors); 216 217 [ 218 'contentType', 219 'conflicts', 220 'postData', 221 'destinationName', 222 'resumable', 223 'totalSize', 224 'compression', 225 'fromMetalink', 226
