From df50cccf6ffe8ee3c1aeead92a02c869259ec035 Mon Sep 17 00:00:00 2001 From: "shaver%netscape.com" Date: Tue, 7 Sep 1999 23:18:47 +0000 Subject: [PATCH] teach component manager that there are non-native entries in the registry --- xpcom/components/nsComponentManager.cpp | 17 +++++++++++++---- xpcom/components/nsComponentManager.h | 17 +++++++++++------ xpcom/components/nsComponentManagerUtils.h | 6 ++++++ xpcom/glue/nsComponentManagerUtils.h | 6 ++++++ 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/xpcom/components/nsComponentManager.cpp b/xpcom/components/nsComponentManager.cpp index 94fc02432c6..cd91b5a0561 100644 --- a/xpcom/components/nsComponentManager.cpp +++ b/xpcom/components/nsComponentManager.cpp @@ -777,10 +777,18 @@ nsresult nsComponentManagerImpl::PlatformPrePopulateRegistry() nsCID aClass; if (!(aClass.Parse(cidString))) continue; + char *componentType; + if (NS_FAILED(mRegistry->GetString(cidKey, componentTypeValueName, + &componentType))) + continue; + nsFactoryEntry* entry = new nsFactoryEntry(aClass, PL_strdup(library), - PL_strdup(nativeComponentType), - mNativeComponentLoader); + /* hand off */ + componentType, + nsCRT::strcmp(componentType, + nativeComponentType) ? + 0 : mNativeComponentLoader); if (!entry) continue; @@ -962,7 +970,8 @@ nsComponentManagerImpl::LoadFactory(nsFactoryEntry *aEntry, return NS_ERROR_NULL_POINTER; *aFactory = NULL; - nsresult rv = aEntry->GetFactory(aFactory); + nsresult rv; + rv = aEntry->GetFactory(aFactory, this); if (NS_FAILED(rv)) { PR_LOG(nsComponentManagerLog, PR_LOG_ERROR, ("nsComponentManager: failed to load factory from %s (%s)\n", @@ -1034,7 +1043,7 @@ nsComponentManagerImpl::FindFactory(const nsCID &aClass, if (!entry) return NS_ERROR_FACTORY_NOT_REGISTERED; - return entry->GetFactory(aFactory); + return entry->GetFactory(aFactory, this); } /** diff --git a/xpcom/components/nsComponentManager.h b/xpcom/components/nsComponentManager.h index 5d1357a5a22..b2284bdaa39 100644 --- a/xpcom/components/nsComponentManager.h +++ b/xpcom/components/nsComponentManager.h @@ -40,10 +40,6 @@ class nsIServiceManager; // here rather than in nsIRegistry.h extern "C" NS_EXPORT nsresult NS_RegistryGetFactory(nsIFactory** aFactory); -extern const char xpcomBaseName[]; -extern const char xpcomKeyName[]; -extern const char lastModValueName[]; -extern const char fileSizeValueName[]; extern const char XPCOM_LIB_PREFIX[]; //////////////////////////////////////////////////////////////////////////////// @@ -61,6 +57,7 @@ public: nsresult Init(void); nsresult PlatformPrePopulateRegistry(); + friend class nsFactoryEntry; protected: nsresult RegistryNameForLib(const char *aLibName, char **aRegistryName); nsresult RegisterComponentCommon(const nsCID &aClass, @@ -178,13 +175,21 @@ public: nsFactoryEntry(const nsCID &aClass, nsIFactory *aFactory); ~nsFactoryEntry(); - nsresult GetFactory(nsIFactory **aFactory) { + nsresult GetFactory(nsIFactory **aFactory, + nsComponentManagerImpl * mgr) { if (factory) { *aFactory = factory.get(); NS_ADDREF(*aFactory); return NS_OK; } - nsresult rv = loader->GetFactory(cid, location, type, aFactory); + + nsresult rv; + if (!loader.get()) { + rv = mgr->GetLoaderForType(type, getter_AddRefs(loader)); + if(NS_FAILED(rv)) + return rv; + } + rv = loader->GetFactory(cid, location, type, aFactory); if (NS_SUCCEEDED(rv)) factory = do_QueryInterface(*aFactory); return rv; diff --git a/xpcom/components/nsComponentManagerUtils.h b/xpcom/components/nsComponentManagerUtils.h index 1a4dd1fbb25..f7573173651 100644 --- a/xpcom/components/nsComponentManagerUtils.h +++ b/xpcom/components/nsComponentManagerUtils.h @@ -171,4 +171,10 @@ public: }; +/* keys for registry use */ +extern const char xpcomBaseName[]; +extern const char xpcomKeyName[]; +extern const char lastModValueName[]; +extern const char fileSizeValueName[]; + #endif /* nsComponentManagerUtils_h__ */ diff --git a/xpcom/glue/nsComponentManagerUtils.h b/xpcom/glue/nsComponentManagerUtils.h index 1a4dd1fbb25..f7573173651 100644 --- a/xpcom/glue/nsComponentManagerUtils.h +++ b/xpcom/glue/nsComponentManagerUtils.h @@ -171,4 +171,10 @@ public: }; +/* keys for registry use */ +extern const char xpcomBaseName[]; +extern const char xpcomKeyName[]; +extern const char lastModValueName[]; +extern const char fileSizeValueName[]; + #endif /* nsComponentManagerUtils_h__ */