home *** CD-ROM | disk | FTP | other *** search
/ Hackers Magazine 57 / CdHackersMagazineNr57.iso / Software / Copy / Alcohol120_trial_1.9.8.7612.exe / $TEMP / free-downloads.xpi / components / Conduit.js next >
Text File  |  2009-01-15  |  11KB  |  340 lines

  1. const Cc = Components.classes;
  2. const Ci = Components.interfaces;
  3.  
  4. function loadJSFile(strFileName, bIsFromLibrary)
  5. {
  6.     var oFile;
  7.     if(bIsFromLibrary)
  8.     {
  9.         oFile = __LOCATION__.clone().parent.parent;
  10.         oFile.append("lib");
  11.         oFile.append(strFileName);
  12.     }
  13.     else
  14.     {
  15.         oFile = __LOCATION__.clone().parent;
  16.         oFile.append(strFileName);
  17.     }
  18.     
  19.     var oFilePath = Cc["@mozilla.org/network/protocol;1?name=file"].getService(Ci.nsIFileProtocolHandler).getURLSpecFromFile(oFile);
  20.     Cc["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader).loadSubScript(oFilePath);
  21. }
  22.  
  23. loadJSFile("xpcom.js", true);
  24.  
  25. function Fix404Obj(strUrl, strCTID)
  26. {
  27.     this.url = strUrl;
  28.     this.CTID = strCTID;
  29. }
  30.  
  31. const EB_FLAG = "EBMainListenerSet";
  32.  
  33. //Browser Progress Listener
  34. var XPCOMEBBrowserProgressListener =
  35. {
  36.   QueryInterface: function(aIID)
  37.   {
  38.    if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
  39.        aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
  40.        aIID.equals(Components.interfaces.nsISupports))
  41.      return this;
  42.    throw Components.results.NS_NOINTERFACE;
  43.   },
  44.  
  45.   onStateChange: function(aProgress, aRequest, aFlag, aStatus)
  46.   { 
  47.        var strURL = (aRequest) ? aRequest.name : "";
  48.  
  49.        if(aFlag & Components.interfaces.nsIWebProgressListener.STATE_STOP)
  50.        {
  51.             var oWindow = aProgress.DOMWindow;
  52.  
  53.             var bIsSuccess  = Components.isSuccessCode(aStatus);
  54.             var responseStatus = 200;
  55.             var iContentLength = 0;
  56.             try
  57.             {
  58.                 httpChannel = aRequest.QueryInterface(Components.interfaces.nsIHttpChannel);
  59.                 responseStatus = httpChannel.responseStatus;
  60.                 iContentLength = aRequest.QueryInterface(Components.interfaces.nsIChannel).contentLength;
  61.             }
  62.  
  63.             catch(ex){}
  64.  
  65.             var objConduit = Components.classes["@conduit.com/helper;4"]
  66.                                     .getService(Components.interfaces.nsIConduit);
  67.                 
  68.             var strRedirectUrl = objConduit.retrieve404redirectUrl();
  69.             var strPreservedUrl = oWindow.document.baseURI;
  70.                         
  71.             if(responseStatus != 404 || iContentLength == -1 || iContentLength > 512 || !strRedirectUrl) return;
  72.             
  73.             var oCallback = function(strResponse)
  74.             {
  75.                 //check if the page is legal
  76.                 if(strResponse.substring(0,35).indexOf("<!--FIX_PAGE_NOT_FOUND_REMARK-->") == -1)
  77.                     return;
  78.                 
  79.                 try
  80.                 {
  81.                     strResponse = strResponse.replace(/<!--FIX_PAGE_NOT_FOUND_REMARK-->/,'');
  82.                     strResponse = strResponse.replace(/<!--/g,'');
  83.                     strResponse = strResponse.replace(/-->/g,'');
  84.                     strResponse = strResponse.replace(/\'/g,"\\'");
  85.                     strResponse = strResponse.replace(/\r\n/g,"");
  86.                     strResponse = strResponse.replace(/\/\/\<\!\[CDATA\[/g,'');
  87.                     strResponse = strResponse.replace(/\/\/]]>/g,'');
  88.                        
  89.                     var strJSInnerHTML = "document.write('"+strResponse+"')";
  90.  
  91.                     var oScript = oWindow.document.createElement('script');
  92.                     oScript.setAttribute('type','text/javascript');
  93.                     oScript.innerHTML = strJSInnerHTML;
  94.                     
  95.                     oWindow.document.getElementsByTagName('head')[0].appendChild(oScript);
  96.                 }
  97.                 catch(e) {}
  98.             };
  99.                 
  100.             try
  101.             {
  102.                 aRequest.cancel(aRequest.NS_ERROR_FAILURE);
  103.                 strRedirectUrl = strRedirectUrl.replace(/EB_MAIN_FRAME_URL/g, strPreservedUrl);
  104.                 EBServerDataURL.HTTPServerRequest(strRedirectUrl, null, false, oCallback, true);
  105.             }
  106.             catch(ex) {}
  107.        }
  108.       
  109.       return 0;
  110.   },
  111.   
  112.   onLocationChange: function(aProgress, aRequest, aURI) {return 0;},
  113.   onProgressChange: function() {return 0;},
  114.   onStatusChange: function() {return 0;},
  115.   onSecurityChange: function(aProgress, aRequest, aState) {return 0;},
  116.   onLinkIconAvailable: function() {return 0;}
  117. }
  118.  
  119. //XPCOM
  120. function ConduitHelperObject() {
  121.     this.Data = new Array();
  122.     this.RedirectArr = new Array();
  123.     this.isListenerAttached = false;
  124. }
  125.  
  126. ConduitHelperObject.prototype = {
  127.     
  128.     //Global key - value storage
  129.     storeKey : function(strCTID, strKey, strValue)
  130.     {
  131.         if(!this.Data[strCTID])
  132.             this.Data[strCTID] = new Array();
  133.             
  134.         this.Data[strCTID][strKey] = strValue;
  135.     },
  136.     
  137.     retrieveKey : function(strCTID, strKey)
  138.     {
  139.         return this.Data[strCTID][strKey];
  140.     },
  141.     
  142.     deleteKey : function(strCTID, strKey)
  143.     {
  144.         delete this.Data[strCTID][strKey];
  145.     },
  146.     
  147.     // Fix not found page functions
  148.     registerSingleWindow404redirectUrl : function(strUrl, strCTID)
  149.     {
  150.         this._addUrlToList(strUrl, strCTID);
  151.         this._addProgressListener(false);
  152.     },
  153.     
  154.     unregisterSingleWindow404redirectUrl : function(strUrl, strCTID)
  155.     {
  156.         this._removeUrlFromList(strUrl, strCTID);
  157.         if(this.RedirectArr.length == 0)
  158.             this._removeProgressListener(false);
  159.     },
  160.     
  161.     registerAllWindows404redirectUrl : function(strUrl, strCTID)
  162.     {
  163.         this._addUrlToList(strUrl, strCTID);
  164.         this._addProgressListener(true);
  165.     },
  166.     
  167.     unregisterAllWindows404redirectUrl : function(strUrl, strCTID)
  168.     {
  169.         this._removeUrlFromList(strUrl, strCTID);
  170.         if(this.RedirectArr.length == 0)
  171.              this._removeProgressListener(true);
  172.     },
  173.     
  174.     retrieve404redirectUrl : function()
  175.     {
  176.         if(this.RedirectArr.length == 0)
  177.             return "";
  178.         else
  179.             return this.RedirectArr[this.RedirectArr.length-1].url;
  180.     },
  181.     
  182.     _addUrlToList : function(strUrl, strCTID)
  183.     {
  184.         if(this.RedirectArr.length == 0)
  185.             this.RedirectArr.push(new Fix404Obj(strUrl, strCTID));
  186.         else
  187.         {
  188.             var bIsFound = false;
  189.             
  190.             for(var i=0; i<this.RedirectArr.length; i++)
  191.                 if(this.RedirectArr[i].CTID == strCTID)
  192.                 {
  193.                     bIsFound = true;
  194.                     //update the url
  195.                     this.RedirectArr[i].url = strUrl;
  196.                     break;
  197.                 }
  198.             
  199.             if(!bIsFound)
  200.                 this.RedirectArr.push(new Fix404Obj(strUrl, strCTID));
  201.         }
  202.     },
  203.     
  204.     _removeUrlFromList : function(strUrl, strCTID)
  205.     {
  206.         if(this.RedirectArr.length == 0)
  207.             return;
  208.         
  209.         var iIndexToRemove = -1;
  210.         for(var i=0; i<this.RedirectArr.length; i++)
  211.             if(this.RedirectArr[i].CTID == strCTID)
  212.             {
  213.                 iIndexToRemove = i;
  214.                 break;
  215.             }
  216.  
  217.         if(iIndexToRemove != -1)
  218.             this.RedirectArr.splice(iIndexToRemove, 1);
  219.     },
  220.     
  221.     _addProgressListener : function(bIsAll)
  222.     {
  223.         if(bIsAll)
  224.         {
  225.             var objWindowsManager = Components.classes['@mozilla.org/appshell/window-mediator;1']
  226.                             .getService(Components.interfaces.nsIWindowMediator);
  227.             
  228.             var objEnumerator = objWindowsManager.getEnumerator('navigator:browser');    
  229.             while(objEnumerator.hasMoreElements()) 
  230.             {
  231.                 var oWindow = objEnumerator.getNext();
  232.                 this._addProgressListenerToWindow(oWindow);
  233.             }
  234.         }
  235.         else {
  236.             oWindow = getWindow();
  237.             this._addProgressListenerToWindow(oWindow);
  238.         }
  239.     },
  240.     
  241.      _removeProgressListener : function(bIsAll)
  242.     {
  243.         if(bIsAll)
  244.         {
  245.             var objWindowsManager = Components.classes['@mozilla.org/appshell/window-mediator;1']
  246.                             .getService(Components.interfaces.nsIWindowMediator);
  247.             
  248.             var objEnumerator = objWindowsManager.getEnumerator('navigator:browser');    
  249.             while(objEnumerator.hasMoreElements()) 
  250.             {
  251.                 var oWindow = objEnumerator.getNext();
  252.                 this._removeProgressListenerFromWindow(oWindow);
  253.             }
  254.         }
  255.         else {
  256.             oWindow = getWindow();
  257.             this._removeProgressListenerFromWindow(oWindow);
  258.         }
  259.     },
  260.     
  261.     _addProgressListenerToWindow: function(oWindow)
  262.     {
  263.         if(!oWindow) return;
  264.         
  265.         var oBrowser = oWindow.getBrowser();
  266.         if(!oBrowser) return;
  267.         
  268.         if(!oBrowser.hasAttribute(EB_FLAG))
  269.         {
  270.             oBrowser.setAttribute(EB_FLAG,true);
  271.             oBrowser.addProgressListener(XPCOMEBBrowserProgressListener, Components.interfaces.nsIWebProgress.NOTIFY_STATE_STOP);
  272.         }
  273.     },
  274.     
  275.     _removeProgressListenerFromWindow: function(oWindow)
  276.     {
  277.         if(!oWindow) return;
  278.         
  279.         var oBrowser = oWindow.getBrowser();
  280.         if(!oBrowser) return;
  281.         
  282.         if(oBrowser.hasAttribute(EB_FLAG))
  283.         {
  284.             oBrowser.removeAttribute(EB_FLAG);
  285.             oBrowser.removeProgressListener(XPCOMEBBrowserProgressListener, Components.interfaces.nsIWebProgress.NOTIFY_STATE_STOP);
  286.         }
  287.     },
  288.     
  289.     QueryInterface: function (uuid) {
  290.         if (uuid.equals(Components.interfaces.nsIConduit) ||
  291.             uuid.equals(Components.interfaces.nsISupports)) {
  292.             return this;
  293.         }
  294.         
  295.         Components.returnCode = Components.results.NS_ERROR_NO_INTERFACE;
  296.         return null;
  297.     }
  298. }
  299.  
  300. const COMPONENT_ID = Components.ID("{B009C480-CA54-4483-BA59-5505DD98BE40}");
  301.  
  302. var ConduitHelperObjectModule = {
  303.     registerSelf: function (compMgr, fileSpec, location, type) {
  304.         compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
  305.         compMgr.registerFactoryLocation(COMPONENT_ID,
  306.                                         "Conduit Helper Object",
  307.                                         "@conduit.com/helper;4",
  308.                                         fileSpec,
  309.                                         location,
  310.                                         type);
  311.     },
  312.  
  313.     getClassObject: function (compMgr, cid, iid) {
  314.         if (!cid.equals(COMPONENT_ID))
  315.             throw Components.results.NS_ERROR_NO_INTERFACE;
  316.         if (!iid.equals(Components.interfaces.nsIFactory))
  317.             throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
  318.  
  319.         return ConduitHelperObjectFactory;
  320.     },
  321.  
  322.     canUnload: function(compMgr) {
  323.         return true;
  324.     }
  325. };
  326.  
  327. var ConduitHelperObjectFactory = {
  328.     createInstance: function (outer, iid) {
  329.         if (outer != null)
  330.             throw Components.results.NS_ERROR_NO_AGGREGATION;
  331.         return new ConduitHelperObject().QueryInterface(iid);
  332.     }
  333. };
  334.  
  335. function NSGetModule(compMgr, fileSpec) {
  336.     return ConduitHelperObjectModule;
  337. }
  338.  
  339.  
  340.