home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 February / PCWorld_2008-02_cd.bin / temacd / songbird / Songbird_0.4_windows-i686.exe / components / sbAutoDownloader.js < prev    next >
Text File  |  2007-12-21  |  8KB  |  260 lines

  1. /*
  2. //
  3. // BEGIN SONGBIRD GPL
  4. //
  5. // This file is part of the Songbird web player.
  6. //
  7. // Copyright(c) 2005-2008 POTI, Inc.
  8. // http://songbirdnest.com
  9. //
  10. // This file may be licensed under the terms of of the
  11. // GNU General Public License Version 2 (the "GPL").
  12. //
  13. // Software distributed under the License is distributed
  14. // on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
  15. // express or implied. See the GPL for the specific language
  16. // governing rights and limitations.
  17. //
  18. // You should have received a copy of the GPL along with this
  19. // program. If not, go to http://www.gnu.org/licenses/gpl.html
  20. // or write to the Free Software Foundation, Inc.,
  21. // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  22. //
  23. // END SONGBIRD GPL
  24. //
  25. */
  26.  
  27. Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
  28. Components.utils.import("resource://app/components/sbProperties.jsm");
  29.  
  30. var Ci = Components.interfaces;
  31. var Cc = Components.classes;
  32. var Cr = Components.results;
  33.  
  34. // big-ass debug function
  35. function DEBUG(msg) {
  36.   return;
  37.  
  38.   function repr(x) {
  39.     if (x == undefined) {
  40.       return 'undefined';
  41.     } else if (x == null) {
  42.       return 'null';
  43.     } else if (typeof x == 'function') {
  44.       return x.name+'(...)';
  45.     } else if (typeof x == 'string') {
  46.       return x.toSource().match(/^\(new String\((.*)\)\)$/)[1];
  47.     } else if (typeof x == 'number') {
  48.       return x.toSource().match(/^\(new Number\((.*)\)\)$/)[1];
  49.     } else if (typeof x == 'object' && x instanceof Array) {
  50.       var value = '';
  51.       for (var i=0; i<x.length; i++) {
  52.         if (i) value = value + ', ';
  53.         value = value + repr(x[i]);
  54.       }
  55.       return '['+value+']';
  56.     } else if (x instanceof Ci.nsISupports) {
  57.       return x.toString();
  58.     } else {
  59.       return x.toSource();
  60.     }
  61.   }
  62.   dump('DEBUG '+DEBUG.caller.name);
  63.   if (msg == undefined) {
  64.     // when nothing is passed in, print the arguments
  65.     dump('(');
  66.     for (var i=0; i<DEBUG.caller.length; i++) {
  67.       if (i) dump(', ');
  68.       dump(repr(DEBUG.caller.arguments[i]));
  69.     }
  70.     dump(')');
  71.   } else {
  72.     dump(': ');
  73.     if (typeof msg != 'object' || msg instanceof Array) {
  74.       dump(repr(msg));
  75.     } else {
  76.       dump(msg.toSource());
  77.     }
  78.   }
  79.   dump('\n');
  80. }
  81.  
  82.  
  83.   ////////////////////
  84.  // Initialization //
  85. ////////////////////
  86. function sbAutoDownloader() {
  87.   DEBUG();
  88.  
  89.   var obs = Cc["@mozilla.org/observer-service;1"]
  90.               .getService(Ci.nsIObserverService);
  91.   obs.addObserver(this, 'songbird-library-manager-ready', false);
  92. }
  93. sbAutoDownloader.prototype._libraryManager = null;
  94. sbAutoDownloader.prototype._library = null;
  95. sbAutoDownloader.prototype._helper = null;
  96. sbAutoDownloader.prototype._queue = [];
  97. sbAutoDownloader.prototype._timer = null;
  98.  
  99.   ///////////
  100.  // XPCOM //
  101. ///////////
  102. sbAutoDownloader.prototype.classDescription =
  103.     'Songbird Auto Downloader Service';
  104. sbAutoDownloader.prototype.classID =
  105.     Components.ID("{a3d7426b-0b22-4f07-b72c-e44bab0759f7}");
  106. sbAutoDownloader.prototype.contractID = '@songbirdnest.com/autodownloader;1';
  107. sbAutoDownloader.prototype.flags = Ci.nsIClassInfo.SINGLETON;
  108. sbAutoDownloader.prototype.interfaces =
  109.     [Ci.nsISupports, Ci.nsIClassInfo, Ci.nsIObserver, Ci.sbIMediaListListener];
  110. sbAutoDownloader.prototype.getHelperForLanguage = function(x) { return null; }
  111. sbAutoDownloader.prototype.getInterfaces =
  112. function sbAutoDownloader_getInterfaces(count, array) {
  113.   array.value = this.interfaces;
  114.   count.value = array.value.length;
  115. }
  116. sbAutoDownloader.prototype.QueryInterface =
  117.     XPCOMUtils.generateQI(sbAutoDownloader.prototype.interfaces);
  118.  
  119.  
  120.   /////////////////
  121.  // nsIObserver //
  122. /////////////////
  123. sbAutoDownloader.prototype.observe =
  124. function sbAutoDownloader_observe(subject, topic, data) {
  125.   DEBUG();
  126.  
  127.   var obs = Cc["@mozilla.org/observer-service;1"]
  128.               .getService(Ci.nsIObserverService);
  129.  
  130.   if (topic == "songbird-library-manager-ready") {
  131.     obs.removeObserver(this, "songbird-library-manager-ready");
  132.     obs.addObserver(this, "songbird-library-manager-before-shutdown", false);
  133.  
  134.     // get the library manager
  135.     this._libraryManager = Cc['@songbirdnest.com/Songbird/library/Manager;1']
  136.                              .getService(Ci.sbILibraryManager);
  137.  
  138.     // get the main library
  139.     this._library = this._libraryManager.mainLibrary;
  140.  
  141.     // watch for added items
  142.     this._library.addListener(this, false,
  143.         Ci.sbIMediaList.LISTENER_FLAGS_ITEMADDED);
  144.  
  145.     this._helper = Cc["@songbirdnest.com/Songbird/DownloadDeviceHelper;1"]
  146.                      .getService(Ci.sbIDownloadDeviceHelper);
  147.  
  148.   } else if (topic == "songbird-library-manager-before-shutdown") {
  149.     obs.removeObserver(this, "songbird-library-manager-before-shutdown");
  150.  
  151.     if (this._library) {
  152.       this._library.removeListener(this);
  153.     }
  154.  
  155.     if (this._timer) {
  156.       this._clearTimer();
  157.     }
  158.   } else if (topic == 'timer-callback') {
  159.     while (this._queue.length) {
  160.       var item = this._queue.shift();
  161.       var playlist = this._helper.getDownloadMediaList();
  162.       if (!this._library.contains(item)) {
  163.         // it's been removed from the library
  164.         continue;
  165.       }
  166.       if (playlist.contains(item)) {
  167.         // it's already in the download playlist
  168.         continue;
  169.       }
  170.       if (item.getProperty(SBProperties.destination)) {
  171.         // it's already been processed by the download device
  172.         continue;
  173.       }
  174.       this._helper.downloadItem(item);
  175.     }
  176.     this._clearTimer();
  177.   }
  178. }
  179.  
  180.  
  181.   //////////////////////////
  182.  // sbIMediaListListener //
  183. //////////////////////////
  184. sbAutoDownloader.prototype.onItemAdded =
  185. function sbAutoDownloader_onItemAdded(aMediaList, aMediaItem) {
  186.   DEBUG();
  187.   if ((aMediaItem.getProperty(SBProperties.enableAutoDownload) == "1") &&
  188.       aMediaItem.contentSrc.scheme.match(/^http/)) {
  189.     // Don't download items already in the download medialist.
  190.     if (!this._helper.getDownloadMediaList().contains(aMediaItem)) {
  191.       this._queue.push(aMediaItem);
  192.       if (!this._timer) {
  193.         this._setUpTimer();
  194.       }
  195.     }
  196.   }
  197. }
  198. sbAutoDownloader.prototype.onBeforeItemRemoved =
  199. function sbAutoDownloader_onBeforeItemRemoved(aMediaList, aMediaItem) {
  200.   DEBUG();
  201. }
  202. sbAutoDownloader.prototype.onAfterItemRemoved =
  203. function sbAutoDownloader_onAfterItemRemoved(aMediaList, aMediaItem) {
  204.   DEBUG();
  205. }
  206. sbAutoDownloader.prototype.onItemUpdated =
  207. function sbAutoDownloader_onItemUpdated(aMediaList, aMediaItem, aProperties) {
  208.   DEBUG();
  209. }
  210. sbAutoDownloader.prototype.onListCleared =
  211. function sbAutoDownloader_onListCleared(aMediaList) {
  212.   DEBUG();
  213. }
  214. sbAutoDownloader.prototype.onBatchBegin =
  215. function sbAutoDownloader_onBatchBegin(aMediaList) {
  216.   DEBUG();
  217. }
  218. sbAutoDownloader.prototype.onBatchEnd =
  219. function sbAutoDownloader_onBatchEnd(aMediaList) {
  220.   DEBUG();
  221. }
  222.  
  223.  
  224.   /////////////////////
  225.  // Private Methods //
  226. /////////////////////
  227. sbAutoDownloader.prototype._setUpTimer =
  228. function sbAutoDownloader__setUpTimer() {
  229.   DEBUG();
  230.   if (!this._timer) {
  231.     // set up the timer
  232.     this._timer = Cc['@mozilla.org/timer;1'].createInstance(Ci.nsITimer);
  233.     this._timer.init(this, 500, Ci.nsITimer.TYPE_REPEATING_SLACK);
  234.   }
  235. }
  236. sbAutoDownloader.prototype._clearTimer =
  237. function sbAutoDownloader__clearTimer() {
  238.   DEBUG();
  239.   if (this._timer) {
  240.     this._timer.cancel();
  241.     this._timer = null;
  242.   }
  243. }
  244.  
  245.  
  246.  
  247. var NSGetModule = XPCOMUtils.generateNSGetModule(
  248.   [
  249.     sbAutoDownloader,
  250.   ],
  251.   function(aCompMgr, aFileSpec, aLocation) {
  252.     XPCOMUtils.categoryManager.addCategoryEntry(
  253.       "app-startup",
  254.       sbAutoDownloader.prototype.classDescription,
  255.       "service," + sbAutoDownloader.prototype.contractID,
  256.       true,
  257.       true);
  258.   }
  259. );
  260.