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 / fil62B5A97911281DFBCC66BD4D5D6051CE < prev    next >
Text File  |  2010-07-12  |  18KB  |  691 lines

  1. if (typeof(Function.bind) == "undefined") {
  2.   Function.prototype.bind = function(object) {
  3.     var __ars = arguments, __me = this;
  4.     return function(arguments) {
  5.       arguments = [arguments];
  6.       for (var i = 0, len = __ars.length; ++i < len;)
  7.         arguments.push(__ars[i]);
  8.       return __me.apply(object, arguments);
  9.     }
  10.   }
  11. }
  12.  
  13. /** ================================================================================ **/
  14.  
  15. function getNCRndStr() {
  16.   return "ncrnd=" + (100000 + Math.floor(Math.random() * 899999));
  17. }
  18.  
  19. /** ================================================================================ **/
  20. var G_Profiler = {
  21.   add: function(aObject, aFunctionName) {
  22.     var orig = aObject[aFunctionName];
  23.     
  24.     aObject[aFunctionName] = function() {
  25.       let startTime = Date.now();
  26.       let result = orig.apply(this, arguments);
  27.       
  28.       if (gYaSearchService)
  29.         gYaSearchService.log("_profile_ [" + aFunctionName + "]: " + (Date.now() - startTime) + " msec.");
  30.       
  31.       return result;
  32.     }
  33.   }
  34. }
  35.  
  36. /** ================================================================================ **/
  37.  
  38. var G_DateUtils = {
  39.   get releasedTime() {
  40.     delete this.releasedTime;
  41.     
  42.     var versionStr = gYaSearchService.version;
  43.     var versionDate = new Date(parseInt(versionStr.substr(0,4), 10),
  44.                                parseInt(versionStr.substr(4,2), 10) - 1,
  45.                                parseInt(versionStr.substr(6,2), 10)).getTime();
  46.     
  47.     this.releasedTime = versionDate > 0 ? versionDate : null;
  48.     
  49.     if (!this.releasedTime)
  50.       gYaSearchService.log("Invalid nsIYaSearch::version value");
  51.     
  52.     return this.releasedTime;
  53.   },
  54.   
  55.   _lastServerTimeUpdate: 0,
  56.   
  57.   get serverTime() {
  58.     var res = gYaSearchService.getCharPref("yasearch.general.server.time");
  59.     return Math.max(0, gYaSearchService.parseIntFromStr(res));
  60.   },
  61.   
  62.   set serverTime(aValue) {
  63.     if (aValue && aValue > this.releasedTime) {
  64.       gYaSearchService.setCharPref("yasearch.general.server.time", aValue);
  65.       this._lastServerTimeUpdate = Date.now();
  66.     }
  67.   },
  68.   
  69.   updateServerTimeValue: function(aResponse) {
  70.     if (Math.abs(this._lastServerTimeUpdate - Date.now()) < DAY_SECS / 4)
  71.       return;
  72.     
  73.     this.serverTime = this.getTimeFromHttpResponse(aResponse);
  74.   },
  75.   
  76.   getTimeFromHttpResponse: function(aResponse, aValidate) {
  77.     var result = this.getDateFromHttpResponse(aResponse, aValidate);
  78.     return result ? result.getTime() : null;
  79.   },
  80.   
  81.   getDateFromHttpResponse: function(aResponse, aValidate) {
  82.     var result = null;
  83.     
  84.     try {
  85.       var serverDate = new Date(aResponse.target.getResponseHeader("Date"));
  86.       
  87.       if (serverDate != "Invalid Date" && serverDate.getTime() > 0)
  88.         serverDate = new Date(serverDate.getTime() +
  89.                               serverDate.getTimezoneOffset() * 60 * 1000 +
  90.                               3 * 60 * 60 * 1000);
  91.       
  92.       if (serverDate != "Invalid Date" && serverDate.getTime() > 0)
  93.         res = serverDate;
  94.     } catch(e) {}
  95.     
  96.     return res;
  97.   }
  98. }
  99.  
  100. /** ================================================================================ **/
  101.  
  102. var G_ObserverServiceWrapper = {
  103.   _observerService: Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService),
  104.   
  105.   addObserver: function(aObject, aTopic) {
  106.     return this._observerService.addObserver(aObject, aTopic, false);
  107.   },
  108.   
  109.   removeObserver: function(aObject, aTopic) {
  110.     return this._observerService.removeObserver(aObject, aTopic, false);
  111.   }
  112. };
  113.  
  114. /** ================================================================================ **/
  115.  
  116. function G_Timer(aCallback, aDelay, aRepeating, aMaxTimes) {
  117.   this.callback = aCallback;
  118.   this.repeating = !!aRepeating;
  119.   
  120.   this.maxTimes = (typeof aMaxTimes == "number" && aMaxTimes > 0) ? aMaxTimes : null;
  121.   this.timesCounter = 0;
  122.   
  123.   this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
  124.   var type = aRepeating ? this.timer.TYPE_REPEATING_SLACK :  this.timer.TYPE_ONE_SHOT;
  125.   
  126.   G_ObserverServiceWrapper.addObserver(this, "xpcom-shutdown");
  127.   
  128.   this.timer.initWithCallback(this, aDelay, type);
  129. }
  130.  
  131. G_Timer.prototype = {
  132.   observe: function(aSubject, aTopic, aData) {
  133.     if (aTopic === "xpcom-shutdown")
  134.       this.cancel();
  135.   },
  136.   
  137.   cancel: function() {
  138.     if (!this.timer)
  139.       return;
  140.     
  141.     this.timer.cancel();
  142.     this.timer = null;
  143.     this.callback = null;
  144.     
  145.     G_ObserverServiceWrapper.removeObserver(this, "xpcom-shutdown");
  146.   },
  147.   
  148.   notify: function(timer) {
  149.     var result = this.callback();
  150.     
  151.     this.timesCounter++;
  152.     
  153.     if (!this.repeating || (this.maxTimes && this.timesCounter >= this.maxTimes))
  154.       this.cancel();
  155.     
  156.     return result;
  157.   },
  158.   
  159.   set delay(val) {
  160.     if (this.timer)
  161.       this.timer.delay = val;
  162.   },
  163.   
  164.   QueryInterface: function(iid) {
  165.     if (iid.equals(Ci.nsISupports) ||
  166.         iid.equals(Ci.nsITimerCallback) ||
  167.         iid.equals(Ci.nsIObserver))
  168.       return this;
  169.     
  170.     throw Components.results.NS_ERROR_NO_INTERFACE;
  171.   }
  172. }
  173.  
  174. /** ================================================================================ **/
  175.  
  176. function G_TimedHTTPRequester(aPrefName, aURL, aFileName, aResponseCallback,
  177.                               aResponseExpiredDays, aRequestExpiredMinutes) {
  178.   
  179.   G_ObserverServiceWrapper.addObserver(this, "profile-before-change");
  180.   
  181.   this.request = null;
  182.   this.prefName = "yasearch.general.lastUpdate." + aPrefName;
  183.   this.url = aURL;
  184.   this.fileName = aFileName;
  185.   this.callback = aResponseCallback;
  186.   this.responseExpiredTime = DAY_SECS * (aResponseExpiredDays || 14);
  187.   this.requestExpiredTime = MIN_SEC * (aRequestExpiredMinutes || 60);
  188.   
  189.   this.timer = new G_Timer(this.checkURL.bind(this), Math.floor(Math.random() * MIN_SEC * 10));
  190. }
  191.  
  192. G_TimedHTTPRequester.prototype = {
  193.   observe: function(aSubject, aTopic, aData) {
  194.     if (aTopic === "profile-before-change")
  195.       this.cancel();
  196.   },
  197.   
  198.   cancel: function() {
  199.     if (this.timer) {
  200.       this.timer.cancel();
  201.       this.timer = null;
  202.     }
  203.     
  204.     if (this.request && this.request.channel.isPending())
  205.       this.request.channel.cancel(Components.results.NS_BINDING_ABORTED);
  206.     
  207.     this.callback = null;
  208.   },
  209.   
  210.   get prefArray() {
  211.     var pref = (gYaSearchService.getCharPref(this.prefName) || "").split("|");
  212.     return (pref.length == 2) ? pref : [0,0];
  213.   },
  214.   
  215.   getFromPref: function(aType) {
  216.     var res = 0;
  217.     
  218.     switch (aType) {
  219.       case "request":
  220.         res = this.prefArray[0];
  221.         break;
  222.       case "response":
  223.         res = this.prefArray[1];
  224.         break;
  225.     }
  226.     
  227.     return (new Date(parseInt(res, 10))).valueOf() || 0;
  228.   },
  229.   
  230.   putToPref: function(aType) {
  231.     var pref = this.prefArray;
  232.     
  233.     switch (aType) {
  234.       case "request":
  235.         pref[0] = Date.now();
  236.         break;
  237.       case "response":
  238.         pref[1] = Date.now();
  239.         break;
  240.     }
  241.     
  242.     gYaSearchService.setCharPref(this.prefName, pref.join("|"));
  243.   },
  244.   
  245.   get requestTime() {
  246.     return this.getFromPref("request");
  247.   },
  248.   
  249.   set requestTime() {
  250.     this.putToPref("request");
  251.     return this.requestTime;
  252.   },
  253.   
  254.   get responseTime() {
  255.     return this.getFromPref("response");
  256.   },
  257.   
  258.   set responseTime() {
  259.     this.putToPref("response");
  260.     return this.responseTime;
  261.   },
  262.   
  263.   get isResponseGood() {
  264.     return this.responseTime > (Date.now() - this.responseExpiredTime);
  265.   },
  266.   
  267.   get isRequestGood() {
  268.     return this.requestTime > (Date.now() - this.requestExpiredTime);
  269.   },
  270.   
  271.   checkURL: function() {
  272.     if (this.isResponseGood || this.isRequestGood)
  273.       return;
  274.     
  275.     this.requestTime = true;
  276.     
  277.     if (this.isRequestGood !== true)
  278.       return;
  279.     
  280.     this.request = gYaSearchService.xmlHttpRequest(this.url, { callbackFunc: this.checkURLCallback.bind(this) });
  281.   },
  282.   
  283.   checkURLCallback: function(aReq) {
  284.     if (!gYaSearchService.isReqError(aReq)) {
  285.       this.responseTime = true;
  286.       
  287.       var callbackResult = this.callback(gYaSearchService.safeUnicode(aReq.target.responseText));
  288.       
  289.       if (callbackResult) {
  290.         var file = gYaSearchService.getYandexDir();
  291.         file.append(this.fileName);
  292.         
  293.         if (!file.exists() || !file.isFile()) {
  294.           try {
  295.             file.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0755);
  296.           } catch(e) {}
  297.         }
  298.         
  299.         if (file.exists() && file.isFile() && file.isWritable())
  300.           gYaSearchService.writeFile(file, callbackResult);
  301.       }
  302.     }
  303.     
  304.     this.request = null;
  305.   },
  306.   
  307.   QueryInterface: function(iid) {
  308.     if (iid.equals(Ci.nsISupports) ||
  309.         iid.equals(Ci.nsIObserver))
  310.       return this;
  311.     
  312.     throw Components.results.NS_ERROR_NO_INTERFACE;
  313.   }
  314. }
  315.  
  316. function G_HTTPFileWrapper(aFileName, aXMLRootTagName) {
  317.   this.fileName = aFileName;
  318.   this.xmlRootTagName = aXMLRootTagName || null;
  319. }
  320.  
  321. G_HTTPFileWrapper.prototype = {
  322.   getFile: function(aPlace) {
  323.     var file = null;
  324.     
  325.     switch (aPlace) {
  326.       case "saved":
  327.         file = gYaSearchService.getYandexDir();
  328.         break;
  329.       
  330.       case "default":
  331.         file = gYaSearchService.getContentDir();
  332.         file.append("services");
  333.         break;
  334.       
  335.       default:
  336.         throw new Error("G_HTTPFileWrapper.getFile() wrong arguments");
  337.     }
  338.     
  339.     file.append(this.fileName);
  340.     
  341.     return file;
  342.   },
  343.   
  344.   getFileContent: function(aPlace) {
  345.     var file = this.getFile(aPlace);
  346.     if (!(file && file.exists() && file.isFile() && file.isReadable()))
  347.       return null;
  348.     
  349.     return gYaSearchService.safeE4Xml(gYaSearchService.readFile(file), null, this.xmlRootTagName);
  350.   },
  351.   
  352.   get defaultContent() {
  353.     return this.getFileContent("default");
  354.   },
  355.   
  356.   get savedContent() {
  357.     return this.getFileContent("saved");
  358.   },
  359.   
  360.   get anyContent() {
  361.     return this.savedContent || this.defaultContent;
  362.   },
  363.   
  364.   get mergedContent() {
  365.     var defaultContent = this.defaultContent;
  366.     var savedContent = this.savedContent;
  367.     
  368.     if (!savedContent)
  369.       return defaultContent;
  370.     
  371.     var savedRootTagName = savedContent.name().toString();
  372.     var defaultRootTagName = defaultContent.name().toString();
  373.     
  374.     if (savedRootTagName !== defaultRootTagName)
  375.       return defaultContent;
  376.     
  377.     for each (var tag in defaultContent.*) {
  378.       var tagName = tag.name().toString();
  379.       
  380.       for each (var attrName in ["id", "name"]) {
  381.         var attrValue = tag["@" + attrName].toString();
  382.         
  383.         if (attrValue && !savedContent[tagName].(function::attribute(attrName) == attrValue)[0]) {
  384.           savedContent[tagName] += tag;
  385.           break;
  386.         }
  387.       }
  388.     }
  389.     
  390.     return savedContent[0] || defaultContent;
  391.   }
  392. }
  393.  
  394. /** ================================================================================ **/
  395. function G_HashTable() {
  396.   this._hash = null;
  397.   this.clear();
  398. }
  399.  
  400. G_HashTable.prototype = {
  401.   clear: function() {
  402.     this._hash = {__proto__: null};
  403.   },
  404.   
  405.   put: function(key, value) {
  406.     this._hash[key] = value;
  407.   },
  408.   
  409.   get: function(key) {
  410.     return this._hash[key];
  411.   },
  412.   
  413.   remove: function(key) {
  414.     delete this._hash[key];
  415.   },
  416.   
  417.   __iterator__: function() {
  418.     for (let [key, value] in Iterator(this._hash))
  419.       yield [key, value];
  420.   },
  421.   
  422.   get keys() {
  423.     let keys = [];
  424.     for (let [key,] in this)
  425.       keys.push(key);
  426.     return keys;
  427.   },
  428.   
  429.   get values() {
  430.     let values = [];
  431.     for (let [,value] in this)
  432.       values.push(value);
  433.     return values;
  434.   }
  435. };
  436.  
  437. /** ================================================================================ **/
  438.  
  439. const gYaURLInfo = {
  440.   _data: { __proto__: null },
  441.   
  442.   CY_STATE_UNKNOWN:  1,
  443.   CY_STATE_REQUEST:  2,
  444.   CY_STATE_ERROR:    4,
  445.   CY_STATE_RESPONSE: 8,
  446.   
  447.   BLOGGERS_STATE_UNKNOWN:       1,
  448.   BLOGGERS_STATE_TIMED_REQUEST: 2,
  449.   BLOGGERS_STATE_REQUEST:       4,
  450.   BLOGGERS_STATE_ERROR:         8,
  451.   BLOGGERS_STATE_RESPONSE:      16,
  452.   
  453.   getURL: function(aURI) {
  454.     if (typeof(aURI) == "string")
  455.       aURI = gYaSearchService.makeURI(aURI);
  456.     
  457.     if (aURI) {
  458.       try {
  459.         if (/^https?$/.test(aURI.scheme) && aURI.host.length > 3) {
  460.           return {
  461.             prePath: aURI.prePath.replace(/(:\/\/)(.+@)/, "$1"),
  462.             path: aURI.path,
  463.             nonQueryPath: aURI.path.split(/\?|#/)[0],
  464.             toString: function() {
  465.               return this.prePath + this.path;
  466.             }
  467.           };
  468.         }
  469.       } catch(e) {}
  470.     }
  471.     
  472.     return null;
  473.   },
  474.   
  475.   clear: function() {
  476.     this._data = { __proto__: null };
  477.   },
  478.   
  479.   _cleanupTimer: (function() {
  480.     let cleanup = {
  481.       notify: function() {
  482.         if (!gYaURLInfo)
  483.           return;
  484.         
  485.         let data = gYaURLInfo._data,
  486.             minAccessTime = Date.now() - (MIN_SEC * 60);
  487.         
  488.         for (let prop in data)
  489.           if (data[prop]._lastAccessTime < minAccessTime)
  490.             delete data[prop];
  491.       }
  492.     };
  493.     
  494.     let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
  495.     timer.initWithCallback(cleanup, MIN_SEC * 60, Ci.nsITimer.TYPE_REPEATING_SLACK);
  496.     return timer;
  497.   })(),
  498.   
  499.   _setupData: function(aURL) {
  500.     let url = this.getURL(aURL);
  501.     if (!url)
  502.       return [];
  503.     
  504.     if (!this._data[url.prePath]) {
  505.       this._data[url.prePath] = {
  506.         bloggers: { __proto__: null },
  507.         cy: { __proto__: null }
  508.       }
  509.     }
  510.     
  511.     let data = this._data[url.prePath];
  512.     data._lastAccessTime = Date.now();
  513.     
  514.     return [url, data];
  515.   },
  516.   
  517.   getCYAndBloggers: function(aURL) {
  518.     let [url, data] = this._setupData(aURL);
  519.     if (!(url && data))
  520.       return [];
  521.     
  522.     return [data.cy[url.path], data.bloggers[url.nonQueryPath] || null];
  523.   },
  524.   
  525.   getBloggers: function(aURL) {
  526.     let [url, data] = this._setupData(aURL);
  527.     if (!(url && data))
  528.       return;
  529.     
  530.     return data.bloggers[url.nonQueryPath] || null;
  531.   },
  532.   
  533.   setBloggers: function(aURL, aData) {
  534.     let [url, data] = this._setupData(aURL);
  535.     if (!(url && data))
  536.       return;
  537.     
  538.     if (!data.bloggers[url.nonQueryPath]) {
  539.       data.bloggers[url.nonQueryPath] = {
  540.         url: url.prePath + url.nonQueryPath,
  541.         windowState: this.BLOGGERS_STATE_UNKNOWN,
  542.         buttonState: this.BLOGGERS_STATE_UNKNOWN,
  543.         content: null,
  544.         value: 0,
  545.         manual: false
  546.       }
  547.     }
  548.     
  549.     let bloggersData = data.bloggers[url.nonQueryPath];
  550.     if (aData) {
  551.       for (var [propName, propValue] in Iterator(aData)) {
  552.         bloggersData[propName] = propValue;
  553.       }
  554.     }
  555.     
  556.     return bloggersData;
  557.   },
  558.   
  559.   getCY: function(aURL) {
  560.     let [url, data] = this._setupData(aURL);
  561.     if (!(url && data))
  562.       return;
  563.     
  564.     return data.cy[url.path];
  565.   },
  566.   
  567.   setCY: function(aURL, aData) {
  568.     let [url, data] = this._setupData(aURL);
  569.     if (!(url && data))
  570.       return;
  571.     
  572.     if (!data.cy[url.path]) {
  573.       data.cy[url.path] = {
  574.         state: this.CY_STATE_UNKNOWN,
  575.         theme: "",
  576.         domain: "",
  577.         region: "",
  578.         rang: 0,
  579.         value: 0,
  580.         spam: null,
  581.         post: false,
  582.         original: null,
  583.         referrer: null
  584.       }
  585.     }
  586.     
  587.     let cyData = data.cy[url.path];
  588.     if (aData) {
  589.       for (var [propName, propValue] in Iterator(aData)) {
  590.         cyData[propName] = propValue;
  591.       }
  592.     }
  593.     
  594.     return cyData;
  595.   },
  596.   
  597.   _dnsCache: {
  598.     MAX_CACHED_COUNT: 100,
  599.     
  600.     _cached: [],
  601.     
  602.     clear: function() {
  603.       this._cached = [];
  604.     },
  605.     
  606.     put: function(aHost, aData) {
  607.       let cached = {
  608.         host: aHost,
  609.         data: aData
  610.       };
  611.       
  612.       if (this._cached.unshift(cached) > this.MAX_CACHED_COUNT)
  613.         this._cached.splice(-this.MAX_CACHED_COUNT/2);
  614.     },
  615.     
  616.     get: function(aHost) {
  617.       let cached;
  618.       
  619.       this._cached.some(function(aRecord) {
  620.         return (aHost === aRecord.host) && (cached = aRecord.data);
  621.       });
  622.       
  623.       return cached;
  624.     }
  625.   },
  626.   
  627.   asyncGetIPsForURL: function(aURL, aCallback) {
  628.     let cachedData;
  629.     
  630.     let uri = gYaSearchService.makeURI(aURL);
  631.     if (uri && /^https?$/.test(uri.scheme) && uri.host.length > 3) {
  632.       
  633.       cachedData = this._dnsCache.get(uri.host);
  634.       
  635.       if (!cachedData) {
  636.         try {
  637.           const dnsService = Cc["@mozilla.org/network/dns-service;1"].getService(Ci.nsIDNSService);
  638.           
  639.           let dnsListener = new this.DNSListener(uri.host, aCallback);
  640.           dnsService.asyncResolve(uri.host, 0, dnsListener, this._currentThread);
  641.           return;
  642.           
  643.         } catch (e) {}
  644.       }
  645.     }
  646.     
  647.     if (aCallback)
  648.       aCallback(cachedData);
  649.   },
  650.   
  651.   get _currentThread() {
  652.     delete this._currentThread;
  653.     
  654.     const threadManager = Cc["@mozilla.org/thread-manager;1"].getService();
  655.     this.__defineGetter__("_currentThread", function() { return threadManager.currentThread; });
  656.     
  657.     return this._currentThread;
  658.   },
  659.   
  660.   get DNSListener() {
  661.     function DNSListener(aHost, aCallback) {
  662.       this.host = aHost;
  663.       this.callback = aCallback;
  664.     }
  665.     
  666.     DNSListener.prototype = {
  667.       host: null,
  668.       callback: null,
  669.       
  670.       onLookupComplete: function(aRequest, aRecord, aStatus) {
  671.         let ip = [];
  672.         
  673.         if (aStatus == 0 && aRecord) {
  674.           while (aRecord.hasMore())
  675.             ip.push(aRecord.getNextAddrAsString());
  676.         }
  677.         
  678.         if (ip.length)
  679.           gYaURLInfo._dnsCache.put(this.host, ip);
  680.         
  681.         if (this.callback)
  682.           this.callback(ip);
  683.       },
  684.       
  685.       QueryInterface: XPCOMUtils.generateQI([Ci.nsIDNSListener, Ci.nsISupports])
  686.     }
  687.     
  688.     delete this.DNSListener;
  689.     return (this.DNSListener = DNSListener);
  690.   }
  691. };