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