Home | History | Annotate | Download | only in patches
      1  10324    hawklu --- mozilla/xpcom/components/nsComponentManager.cpp.old	2007-01-18 15:56:15.059579000 +0800
      2  10324    hawklu +++ mozilla/xpcom/components/nsComponentManager.cpp	2007-01-18 16:00:53.028417000 +0800
      3   9846  dcarbery @@ -47,6 +47,7 @@
      4   9846  dcarbery   * 04/20/2000       IBM Corp.      Added PR_CALLBACK for Optlink use in OS2
      5   9846  dcarbery   */
      6   9846  dcarbery  #include <stdlib.h>
      7   9846  dcarbery +#include "plstr.h"
      8   9846  dcarbery  #include "nscore.h"
      9   9846  dcarbery  #include "nsISupports.h"
     10   9846  dcarbery  #include "nspr.h"
     11  10324    hawklu @@ -111,6 +112,8 @@
     12  10324    hawklu  // 512K is big enough to allow for some future growth in the registry.
     13  10324    hawklu  #define BIG_REGISTRY_BUFLEN   (512*1024)
     14  10324    hawklu  
     15  10324    hawklu +static PRBool apocRead = PR_FALSE;
     16  10324    hawklu +
     17  10324    hawklu  // Common Key Names
     18  10324    hawklu  const char classIDKeyName[]="classID";
     19  10324    hawklu  const char classesKeyName[]="contractID";
     20  10324    hawklu @@ -1328,6 +1331,7 @@
     21   9846  dcarbery                   PRUint32 number,
     22   9846  dcarbery                   void *arg)
     23   9846  dcarbery  {
     24   9846  dcarbery +    static char apocCIDString[UID_STRING_LENGTH] = "{833fbe65-5a14-4634-8387-fcf47e24c9ca}";
     25   9846  dcarbery      char *contractID   = ((nsContractIDTableEntry*)hdr)->mContractID;
     26   9846  dcarbery      nsFactoryEntry *factoryEntry = ((nsContractIDTableEntry*)hdr)->mFactoryEntry;
     27   9846  dcarbery  
     28  10324    hawklu @@ -1342,7 +1346,22 @@
     29   9846  dcarbery  
     30   9846  dcarbery      char cidString[UID_STRING_LENGTH];
     31   9846  dcarbery      GetIDString(factoryEntry->mCid, cidString);
     32   9846  dcarbery -    PR_fprintf(fd, "%s,%s\n", contractID, cidString); // what if this fails?
     33   9846  dcarbery +
     34   9846  dcarbery +    // cid,contract_id,type,class_name,inproc_server
     35   9846  dcarbery +    // Because libmozapoc.so shares a same contractID (@mozilla.org/preferences-service;1)
     36   9846  dcarbery +    // with libpref.so. To prevent libpref.so from bundling to that contractID
     37   9846  dcarbery +    // do the following tricky operation.
     38   9846  dcarbery +    char* location = factoryEntry->mLocation;
     39   9846  dcarbery +
     40  10324    hawklu +    if (apocRead && contractID && location
     41   9846  dcarbery +        && !strcmp(contractID,"@mozilla.org/preferences-service;1")
     42   9846  dcarbery +        && !strcmp(location,"rel:libpref.so"))
     43   9846  dcarbery +    {
     44   9846  dcarbery +        PR_fprintf(fd, "%s,%s\n", contractID, apocCIDString);
     45   9846  dcarbery +    } else {
     46   9846  dcarbery +        PR_fprintf(fd, "%s,%s\n", contractID, cidString); // what if this fails?
     47   9846  dcarbery +    }
     48   9846  dcarbery +
     49   9846  dcarbery      return PL_DHASH_NEXT;
     50   9846  dcarbery  }
     51   9846  dcarbery  
     52  10324    hawklu @@ -1352,6 +1371,8 @@
     53   9846  dcarbery                PRUint32 number,
     54   9846  dcarbery                void *arg)
     55   9846  dcarbery  {
     56   9846  dcarbery +    static char apocCIDString[UID_STRING_LENGTH] = "{833fbe65-5a14-4634-8387-fcf47e24c9ca}";
     57   9846  dcarbery +    static PRBool prefRead = PR_FALSE;
     58   9846  dcarbery      nsFactoryEntry *factoryEntry = ((nsFactoryTableEntry*)hdr)->mFactoryEntry;
     59   9846  dcarbery      PRFileDesc* fd = ((PersistentWriterArgs*)arg)->mFD;
     60   9846  dcarbery      nsLoaderdata *loaderData = ((PersistentWriterArgs*)arg)->mLoaderData;
     61  10324    hawklu @@ -1383,6 +1404,22 @@
     62   9846  dcarbery      char* location = factoryEntry->mLocation;
     63   9846  dcarbery  
     64   9846  dcarbery      // cid,contract_id,type,class_name,inproc_server
     65   9846  dcarbery +    // Because libmozapoc.so shares a same contractID (@mozilla.org/preferences-service;1)
     66   9846  dcarbery +    // with libpref.so. To prevent libpref.so from bundling to that contractID 
     67   9846  dcarbery +    // do the following tricky operation.
     68   9846  dcarbery +    if (location
     69   9846  dcarbery +        && !strcmp(location,"rel:libmozapoc.so"))
     70   9846  dcarbery +    {
     71   9846  dcarbery +        apocRead = PR_TRUE;
     72   9846  dcarbery +        if (!prefRead) {
     73   9846  dcarbery +            if (contractID)
     74   9846  dcarbery +                PR_Free(contractID);
     75   9846  dcarbery +            if (className)
     76   9846  dcarbery +                PR_Free(className);
     77   9846  dcarbery +            return PL_DHASH_NEXT;
     78   9846  dcarbery +        }
     79   9846  dcarbery +    }
     80   9846  dcarbery +
     81   9846  dcarbery      PR_fprintf(fd,
     82   9846  dcarbery                 "%s,%s,%s,%s,%s\n",
     83   9846  dcarbery                 cidString,
     84  10324    hawklu @@ -1391,6 +1428,16 @@
     85   9846  dcarbery                 (className  ? className  : ""),
     86   9846  dcarbery                 (location   ? location   : ""));
     87   9846  dcarbery  
     88   9846  dcarbery +    if (contractID && location 
     89   9846  dcarbery +        && !strcmp(contractID,"@mozilla.org/preferences-service;1")
     90   9846  dcarbery +        && !strcmp(location,"rel:libpref.so"))
     91   9846  dcarbery +    {
     92   9846  dcarbery +        prefRead = PR_TRUE;
     93   9846  dcarbery +        if (apocRead)
     94   9846  dcarbery +             PR_fprintf(fd, "%s,%s,%s,%s,%s\n", 
     95   9846  dcarbery +               apocCIDString, (contractID ? contractID : ""), "", "", "rel:libmozapoc.so"); 
     96   9846  dcarbery +    }
     97   9846  dcarbery +
     98   9846  dcarbery      if (contractID)
     99   9846  dcarbery          PR_Free(contractID);
    100   9846  dcarbery      if (className)
    101