home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / AIMP2 / aimp_2.61.583.exe / $TEMP / YandexPackSetup.msi / fil26DA2E9042FFB9D78F04746B1F57B984 < prev    next >
Text File  |  2010-07-12  |  6KB  |  166 lines

  1. XB.Preset = function(content, address) {
  2.     this._widgetsInfo = [];
  3.     
  4.     if (content instanceof Ci.nsIFile) {
  5.         this._loadFromFile(content);
  6.     } else if (content instanceof Ci.nsIDOMDocument) {
  7.         this._loadFromDocument(content);
  8.     } else
  9.         throw new CustomErrors.EArgType("content", "nsIFile|nsIDOMDocument", typeof content);
  10.     
  11.     if (!sysutils.isString(address))
  12.         throw new CustomErrors.EArgType("address", "String", typeof address);
  13.     this._address = address;
  14. };
  15.  
  16. XB.Preset.EPresetSyntax = CustomErrors.ECustom.extend({
  17.     $name: "EPresetSyntax",
  18.     
  19.     constructor: function EPresetSyntax_constructor(elementName) {
  20.         this.base("XB preset parse error");
  21.         this._elementName = elementName.toString();
  22.     },
  23.     
  24.     get _details() {
  25.         return [this._elementName];
  26.     },
  27.     
  28.     _elementName: undefined
  29. });
  30.  
  31. XB.Preset.prototype = {
  32.     constructor: XB.Preset,
  33.     
  34.     get address() {
  35.         return this._address;
  36.     },
  37.     
  38.     get name() {
  39.         return this._name;
  40.     },
  41.     
  42.     get version() {
  43.         return this._version;
  44.     },
  45.     
  46.     get author() {
  47.         return this._author;
  48.     },
  49.     
  50.     get icon() {
  51.         return this._icon;
  52.     },
  53.     
  54.     get widgetsInfo() {
  55.         return sysutils.copyObj(this._widgetsInfo, true);
  56.     },
  57.     get content () {
  58.         return this._content;
  59.     },
  60.     
  61.     _consts: {
  62.         STR_PRESET_ELEMENT_NAME: "preset",
  63.         STR_SETTING_ELEMENT_NAME: "setting",
  64.         
  65.         WARN_WIDGET_IGNORED: "Widget was ignored because of syntax errors",
  66.         WARN_SETTING_IGNORED: "Widget setting was ignored because of syntax errors",
  67.         
  68.         ERR_NO_NAME: "No preset name",
  69.         ERR_NO_AUTHOR: "No preset author",
  70.         ERR_PKG_BINDING: "Invalid package manifest binding",
  71.         ERR_INVALID_ADDRESS: "Invalid preset address"
  72.     },
  73.     
  74.     _address: undefined,
  75.     _author: undefined,
  76.     _name: undefined,
  77.     _version: "1.0",
  78.     _icon: undefined,
  79.     _widgetsInfo: undefined,
  80.     
  81.     
  82.     _loadFromFile: function XBPreset_loadFromFile(presetFile) {
  83.         this._loadFromDocument( sysutils.xmlDocFromFile(presetFile) );
  84.     },
  85.     
  86.     _loadFromDocument: function XBPreset_loadFromDocument(XMLDocument) {
  87.         let rootName = XMLDocument.documentElement.localName;
  88.         if (rootName != this._consts.STR_PRESET_ELEMENT_NAME)
  89.             throw new XB.Preset.EPresetSyntax(rootName);
  90.         this._parsePreset(XMLDocument.documentElement);
  91.         XB._base.logger.debug("Preset loaded");
  92.         
  93.         var serializer = Components.classes["@mozilla.org/xmlextras/xmlserializer;1"].createInstance(Components.interfaces.nsIDOMSerializer);
  94.         this._content = serializer.serializeToString(XMLDocument);
  95.     },
  96.     
  97.     _parsePreset: function XBPreset_parsePreset(presetElement) {
  98.         function findBestMatch(elementsArray, appLang) {
  99.             for each (let element in elementsArray) {
  100.                 if (element.getAttribute("lang") == appLang) {
  101.                     return element.textContent;
  102.                 }
  103.             }
  104.             if (elementsArray.length > 0) {
  105.                 return elementsArray[0].textContent;
  106.             }
  107.         }
  108.         
  109.         this._version = presetElement.getAttribute("version") || "1.0";
  110.         
  111.         let appLang = misc.parseLocale(XB._base.application.localeString).language;
  112.         let authorNodes = XB._base.runtime.queryXMLDoc("./author", presetElement);
  113.         this._author = findBestMatch(authorNodes, appLang);
  114.         if (!this._author)
  115.             throw new XB.Preset.EPresetSyntax("author");
  116.         
  117.         let nameNodes = XB._base.runtime.queryXMLDoc("./name", presetElement);
  118.         this._name = findBestMatch(nameNodes, appLang);
  119.         if (!this._name)
  120.             throw new XB.Preset.EPresetSyntax("name");
  121.         
  122.         let iconNodes = XB._base.runtime.queryXMLDoc("./icon", presetElement);
  123.         this._icon = findBestMatch(iconNodes, appLang);
  124.         
  125.         let widgetNodes = XB._base.runtime.queryXMLDoc("./widget", presetElement);
  126.         for each (let widgetNode in widgetNodes) {
  127.             let widgetInfo = this._parseWidgetElement(widgetNode);
  128.             if (widgetInfo)
  129.                 this._widgetsInfo.push(widgetInfo);
  130.         }
  131.     },
  132.     
  133.     _parseWidgetElement: function XBPreset_parseWidgetElement(widgetElement) {
  134.         let protoID = widgetElement.getAttribute("id");
  135.         if (!protoID) {
  136.             XB._base.logger.warn(this._consts.WARN_WIDGET_IGNORED);
  137.             return null;
  138.         }
  139.         
  140.         let separatorPos = protoID.indexOf("#");
  141.         let packageURI = protoID.substring(0, separatorPos);
  142.         let widgetInfo = {
  143.             protoID: protoID,
  144.             packageID: packageURI,
  145.             packageURI: packageURI,
  146.             name: protoID.substring(separatorPos + 1),
  147.             settings: {}
  148.         };
  149.         
  150.         for (let settingIndex = widgetElement.childNodes.length; settingIndex--; ) {
  151.             let settingElement = widgetElement.childNodes[settingIndex];
  152.             if (settingElement.nodeType != settingElement.ELEMENT_NODE ||
  153.                 settingElement.localName != this._consts.STR_SETTING_ELEMENT_NAME)
  154.                 continue;
  155.             
  156.             let settingName = settingElement.getAttribute("name");
  157.             if (!settingName) {
  158.                 XB._base.logger.warn(this._consts.WARN_SETTING_IGNORED);
  159.                 continue;
  160.             }
  161.             widgetInfo.settings[settingName] = settingElement.textContent;
  162.         }
  163.         
  164.         return widgetInfo;
  165.     }
  166. };