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 / ArrayConverter.jsm next >
Text File  |  2007-12-21  |  6KB  |  202 lines

  1. /*
  2.  * NOTE: This was snagged from https://bugzilla.mozilla.org/show_bug.cgi?id=380839
  3.  * This will go away when this lands
  4.  */
  5.  
  6. /* ***** BEGIN LICENSE BLOCK *****
  7.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  8.  *
  9.  * The contents of this file are subject to the Mozilla Public License Version
  10.  * 1.1 (the "License"); you may not use this file except in compliance with
  11.  * the License. You may obtain a copy of the License at
  12.  * http://www.mozilla.org/MPL/
  13.  *
  14.  * Software distributed under the License is distributed on an "AS IS" basis,
  15.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  16.  * for the specific language governing rights and limitations under the
  17.  * License.
  18.  *
  19.  * The Original Code is Code modules: JavaScript array converter.
  20.  *
  21.  * The Initial Developer of the Original Code is
  22.  * Alexander J. Vincent <ajvincent@gmail.com>.
  23.  * Portions created by the Initial Developer are Copyright (C) 2007
  24.  * the Initial Developer. All Rights Reserved.
  25.  *
  26.  * Contributor(s):
  27.  *
  28.  * Alternatively, the contents of this file may be used under the terms of
  29.  * either the GNU General Public License Version 2 or later (the "GPL"), or
  30.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  31.  * in which case the provisions of the GPL or the LGPL are applicable instead
  32.  * of those above. If you wish to allow use of your version of this file only
  33.  * under the terms of either the GPL or the LGPL, and not to allow others to
  34.  * use your version of this file under the terms of the MPL, indicate your
  35.  * decision by deleting the provisions above and replace them with the notice
  36.  * and other provisions required by the GPL or the LGPL. If you do not delete
  37.  * the provisions above, a recipient may use your version of this file under
  38.  * the terms of any one of the MPL, the GPL or the LGPL.
  39.  *
  40.  * ***** END LICENSE BLOCK ***** */
  41.  
  42. /**
  43.  * Utilities for JavaScript components loaded by the JS component
  44.  * loader.
  45.  *
  46.  * Import into a JS component using
  47.  * 'Components.utils.import("rel:ArrayConverter.jsm");'
  48.  *
  49.  */
  50.  
  51. EXPORTED_SYMBOLS = [ "ArrayConverter" ];
  52.  
  53. debug("*** loading ArrayConverter\n");
  54.  
  55. /**
  56.  * Get a simple enumerator.
  57.  *
  58.  * @param aItemsList JavaScript array to enumerate.
  59.  */
  60. function Enumerator(aItemsList) {
  61.   this._itemsList = aItemsList;
  62.   this._iteratorPosition = 0;
  63. }
  64. Enumerator.prototype = {
  65.   // nsISimpleEnumerator
  66.   hasMoreElements: function hasMoreElements() {
  67.     return (this._iteratorPosition < this._itemsList.length);
  68.   },
  69.  
  70.   // nsISimpleEnumerator
  71.   getNext: function getNext() {
  72.     if (!(this.hasMoreElements())) {
  73.       throw Components.results.NS_ERROR_FAILURE;
  74.     }
  75.     var type = this._itemsList[this._iteratorPosition];
  76.     this._iteratorPosition++;
  77.     return type;
  78.   },
  79.  
  80.   // nsISupports
  81.   QueryInterface: function QueryInterface(aIID)
  82.   {
  83.     if (aIID.equals(Components.interfaces.nsISimpleEnumerator) ||
  84.         aIID.equals(Components.interfaces.nsISupports))
  85.       return this;
  86.  
  87.     throw Components.results.NS_ERROR_NO_INTERFACE;
  88.   }
  89. }
  90.  
  91. function NSArray(aItemsList) {
  92.   this._itemsList = aItemsList;
  93. }
  94. NSArray.prototype = {
  95.   // nsIArray
  96.   get length() {
  97.     return this._itemsList.length;
  98.   },
  99.  
  100.   // nsIArray
  101.   queryElementAt: function queryElementAt(aIndex, aIID) {
  102.     if (aIndex > this.length - 1) {
  103.       throw Components.results.NS_ERROR_ILLEGAL_VALUE;
  104.     }
  105.  
  106.     return this._itemsList[aIndex].QueryInterface(aIID);
  107.   },
  108.  
  109.   // nsIArray
  110.   indexOf: function indexOf(aIndex, aElement) {
  111.     for (var i = aIndex; i < this._itemsList.length; i++) {
  112.       if (this._itemsList[i] == aElement) {
  113.         return i;
  114.       }
  115.     }
  116.     throw Components.results.NS_ERROR_NOT_FOUND;
  117.   },
  118.  
  119.   // nsIArray
  120.   enumerate: function enumerate() {
  121.     return new Enumerator(this._itemsList);
  122.   },
  123.  
  124.   // nsISupports
  125.   QueryInterface: function QueryInterface(aIID)
  126.   {
  127.     if (aIID.equals(Components.interfaces.nsIArray) ||
  128.         aIID.equals(Components.interfaces.nsISupports))
  129.       return this;
  130.  
  131.     throw Components.results.NS_ERROR_NO_INTERFACE;
  132.   }
  133. }
  134.  
  135. var ArrayConverter = {
  136.   /**
  137.    * Get a JavaScript array for a nsIArray or nsISimpleEnumerator.
  138.    *
  139.    * @param aObject nsIArray or nsISimpleEnumerator to convert.
  140.    *
  141.    * @throws NS_ERROR_INVALID_ARG.
  142.    */
  143.   JSArray: function getJSArray(aObject) {
  144.     if (aObject instanceof Components.interfaces.nsIArray) {
  145.       aObject = aObject.enumerate();
  146.     }
  147.  
  148.     if (!(aObject instanceof Components.interfaces.nsISimpleEnumerator)) {
  149.       throw Components.results.NS_ERROR_INVALID_ARG;
  150.     }
  151.  
  152.     var array = [];
  153.     while (aObject.hasMoreElements()) {
  154.       array[array.length] = aObject.getNext();
  155.     }
  156.     return array;
  157.   },
  158.  
  159.   /**
  160.    * Return a nsIArray for a JavaScript array.
  161.    *
  162.    * @param aArray JavaScript array to convert.
  163.    */
  164.   nsIArray: function get_nsIArray(aArray) {
  165.     return new NSArray(aArray);
  166.   },
  167.  
  168.   /**
  169.    * Return a nsISimpleEnumerator for a JavaScript array.
  170.    *
  171.    * @param aArray JavaScript array to convert.
  172.    */
  173.   enumerator: function get_enumerator(/* in JSArray */ aArray) {
  174.     return new Enumerator(aArray);
  175.   },
  176.  
  177.   /**
  178.    * Return a method to convert a JavaScript array into a XPCOM array.
  179.    *
  180.    * @param aArrayName Name of JavaScript array property in "this" to convert.
  181.    */
  182.   xpcomArrayMethod: function getXPCOMMethod(aArrayName) {
  183.     /**
  184.      * Return a XPCOM array and count.
  185.      *
  186.      * @param (out) aCount The length of the array returned.
  187.      *
  188.      * @return The XPCOM array.
  189.      */
  190.     return function xpcomArray(aCount) {
  191.       var array = this[aArrayName];
  192.       aCount.value = array.length;
  193.       var rv = [];
  194.       for (var i = 0; i < array.length; i++) {
  195.         rv[i] = array[i];
  196.       }
  197.       return rv;
  198.     }
  199.   }
  200. };
  201.  
  202.