if (registryFile && registryFile->IsFile())
if (binDirectory && binDirectory->IsDirectory())
nsresult NS_COM NS_InitXPCOM(nsIServiceManager* *result,                             nsFileSpec *registryFile, nsFileSpec *componentDir){    nsresult rv = NS_OK;	// Establish the main thread here.    rv = nsIThread::SetMainThread();	if (NS_FAILED(rv)) return rv;    // 1. Create the Global Service Manager    nsIServiceManager* servMgr = NULL;    if (gServiceManager == NULL)    {        rv = NS_NewServiceManager(&servMgr);        if (NS_FAILED(rv)) return rv;        gServiceManager = servMgr;        if (result)		{	        NS_ADDREF(servMgr);			*result = servMgr;		}    }    // 2. Create the Component Manager and register with global service manager    //    It is understood that the component manager can use the global service manager.    nsComponentManagerImpl *compMgr = NULL;    if (nsComponentManagerImpl::gComponentManager == NULL)    {        compMgr = new nsComponentManagerImpl();        if (compMgr == NULL)            return NS_ERROR_OUT_OF_MEMORY;        NS_ADDREF(compMgr);        // Set the registry file        if (registryFile && registryFile->IsFile())        {            nsSpecialSystemDirectory::Set(nsSpecialSystemDirectory::XPCOM_CurrentProcessComponentRegistry,                                          registryFile);        }        if (componentDir && componentDir->IsDirectory())        {            nsSpecialSystemDirectory::Set(nsSpecialSystemDirectory::XPCOM_CurrentProcessComponentDirectory,                                          componentDir);        }        rv = compMgr->Init();        if (NS_FAILED(rv))        {            NS_RELEASE(compMgr);            return rv;        }        nsComponentManagerImpl::gComponentManager = compMgr;    }        rv = servMgr->RegisterService(kComponentManagerCID, NS_STATIC_CAST(nsIComponentManager*, compMgr));    if (NS_FAILED(rv)) return rv;    // 3. Register the global services with the component manager so that    //    clients can create new objects.    // Registry    nsIFactory *registryFactory = NULL;    rv = NS_RegistryGetFactory(&registryFactory);    if (NS_FAILED(rv)) return rv;    NS_DEFINE_CID(kRegistryCID, NS_REGISTRY_CID);    rv = compMgr->RegisterFactory(kRegistryCID,                                  NS_REGISTRY_CLASSNAME,                                  NS_REGISTRY_PROGID,                                  registryFactory, PR_TRUE);    NS_RELEASE(registryFactory);    if (NS_FAILED(rv)) return rv;#ifdef GC_LEAK_DETECTOR	rv = NS_InitLeakDetector();    if (NS_FAILED(rv)) return rv;#endif    rv = RegisterGenericFactory(compMgr, kAllocatorCID,                                NS_ALLOCATOR_CLASSNAME,                                NS_ALLOCATOR_PROGID,                                nsAllocatorImpl::Create);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kArenaCID,                                NS_ARENA_CLASSNAME,                                NS_ARENA_PROGID,                                ArenaImpl::Create);    if (NS_FAILED(rv)) return rv;#if 0    rv = RegisterGenericFactory(compMgr, kBufferCID,                                NS_BUFFER_CLASSNAME,                                NS_BUFFER_PROGID,                                nsBuffer::Create);    if (NS_FAILED(rv)) return rv;#endif    rv = RegisterGenericFactory(compMgr, kByteBufferCID,                                NS_BYTEBUFFER_CLASSNAME,                                NS_BYTEBUFFER_PROGID,                                ByteBufferImpl::Create);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kFileSpecCID,                                NS_FILESPEC_CLASSNAME,                                NS_FILESPEC_PROGID,                                nsFileSpecImpl::Create);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kDirectoryIteratorCID,                                NS_DIRECTORYITERATOR_CLASSNAME,                                NS_DIRECTORYITERATOR_PROGID,                                nsDirectoryIteratorImpl::Create);    if (NS_FAILED(rv)) return rv;        rv = RegisterGenericFactory(compMgr, kScriptableInputStreamCID,                                NS_SCRIPTABLEINPUTSTREAM_CLASSNAME,                                NS_SCRIPTABLEINPUTSTREAM_PROGID,                                nsScriptableInputStream::Create);    if (NS_FAILED(rv)) return rv;#ifdef PAGE_MANAGER    rv = RegisterGenericFactory(compMgr, kPageManagerCID,                                NS_PAGEMANAGER_CLASSNAME,                                NS_PAGEMANAGER_PROGID,                                nsPageMgr::Create);    if (NS_FAILED(rv)) return rv;#endif    rv = RegisterGenericFactory(compMgr, kPropertiesCID,                                NS_PROPERTIES_CLASSNAME,                                NS_PROPERTIES_PROGID,                                nsProperties::Create);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kPersistentPropertiesCID,                                NS_PERSISTENTPROPERTIES_CLASSNAME,                                NS_PERSISTENTPROPERTIES_PROGID,                                nsPersistentProperties::Create);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kSupportsArrayCID,                                NS_SUPPORTSARRAY_CLASSNAME,                                NS_SUPPORTSARRAY_PROGID,                                nsSupportsArray::Create);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, nsObserver::GetCID(),                                 NS_OBSERVER_CLASSNAME,                                NS_OBSERVER_PROGID,                                nsObserver::Create);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, nsObserverService::GetCID(),                                NS_OBSERVERSERVICE_CLASSNAME,                                NS_OBSERVERSERVICE_PROGID,                                nsObserverService::Create);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kGenericFactoryCID,                                NS_GENERICFACTORY_CLASSNAME,                                NS_GENERICFACTORY_PROGID,                                nsGenericFactory::Create);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kEventQueueServiceCID,                                NS_EVENTQUEUESERVICE_CLASSNAME,                                NS_EVENTQUEUESERVICE_PROGID,                                nsEventQueueServiceImpl::Create);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kEventQueueCID,                                NS_EVENTQUEUE_CLASSNAME,                                NS_EVENTQUEUE_PROGID,                                nsEventQueueImpl::Create);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kThreadCID,                                NS_THREAD_CLASSNAME,                                NS_THREAD_PROGID,                                nsThread::Create);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kThreadPoolCID,                                NS_THREADPOOL_CLASSNAME,                                NS_THREADPOOL_PROGID,                                nsThreadPool::Create);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr,                                 kProxyObjectManagerCID,                                 NS_XPCOMPROXY_CLASSNAME,                                NS_XPCOMPROXY_PROGID,                                nsProxyObjectManager::Create);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kSupportsIDCID,                                NS_SUPPORTS_ID_CLASSNAME,                                NS_SUPPORTS_ID_PROGID,                                nsSupportsIDImplConstructor);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kSupportsStringCID,                                NS_SUPPORTS_STRING_CLASSNAME,                                NS_SUPPORTS_STRING_PROGID,                                nsSupportsStringImplConstructor);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kSupportsWStringCID,                                NS_SUPPORTS_WSTRING_CLASSNAME,                                NS_SUPPORTS_WSTRING_PROGID,                                nsSupportsWStringImplConstructor);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kSupportsPRBoolCID,                                NS_SUPPORTS_PRBOOL_CLASSNAME,                                NS_SUPPORTS_PRBOOL_PROGID,                                nsSupportsPRBoolImplConstructor);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kSupportsPRUint8CID,                                NS_SUPPORTS_PRUINT8_CLASSNAME,                                NS_SUPPORTS_PRUINT8_PROGID,                                nsSupportsPRUint8ImplConstructor);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kSupportsPRUint16CID,                                NS_SUPPORTS_PRUINT16_CLASSNAME,                                NS_SUPPORTS_PRUINT16_PROGID,                                nsSupportsPRUint16ImplConstructor);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kSupportsPRUint32CID,                                NS_SUPPORTS_PRUINT32_CLASSNAME,                                NS_SUPPORTS_PRUINT32_PROGID,                                nsSupportsPRUint32ImplConstructor);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kSupportsPRUint64CID,                                NS_SUPPORTS_PRUINT64_CLASSNAME,                                NS_SUPPORTS_PRUINT64_PROGID,                                nsSupportsPRUint64ImplConstructor);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kSupportsPRTimeCID,                                NS_SUPPORTS_PRTIME_CLASSNAME,                                NS_SUPPORTS_PRTIME_PROGID,                                nsSupportsPRTimeImplConstructor);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kSupportsCharCID,                                NS_SUPPORTS_CHAR_CLASSNAME,                                NS_SUPPORTS_CHAR_PROGID,                                nsSupportsCharImplConstructor);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kSupportsPRInt16CID,                                NS_SUPPORTS_PRINT16_CLASSNAME,                                NS_SUPPORTS_PRINT16_PROGID,                                nsSupportsPRInt16ImplConstructor);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kSupportsPRInt32CID,                                NS_SUPPORTS_PRINT32_CLASSNAME,                                NS_SUPPORTS_PRINT32_PROGID,                                nsSupportsPRInt32ImplConstructor);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kSupportsPRInt64CID,                                NS_SUPPORTS_PRINT64_CLASSNAME,                                NS_SUPPORTS_PRINT64_PROGID,                                nsSupportsPRInt64ImplConstructor);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kSupportsFloatCID,                                NS_SUPPORTS_FLOAT_CLASSNAME,                                NS_SUPPORTS_FLOAT_PROGID,                                nsSupportsFloatImplConstructor);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kSupportsDoubleCID,                                NS_SUPPORTS_DOUBLE_CLASSNAME,                                NS_SUPPORTS_DOUBLE_PROGID,                                nsSupportsDoubleImplConstructor);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, kSupportsVoidCID,                                NS_SUPPORTS_VOID_CLASSNAME,                                NS_SUPPORTS_VOID_PROGID,                                nsSupportsVoidImplConstructor);    if (NS_FAILED(rv)) return rv;#ifdef _NEW_NSIFILE    rv = RegisterGenericFactory(compMgr, nsIFileImpl::GetCID(),                                NS_FILE_CLASSNAME,                                NS_FILE_PROGID,                                nsIFileImpl::Create);    if (NS_FAILED(rv)) return rv;    rv = RegisterGenericFactory(compMgr, nsIDirEnumeratorImpl::GetCID(),                                NS_DIRECTORY_ENUMERATOR_CLASS,                                NS_DIRECTORY_ENUMERATOR_PROGID,                                nsIDirEnumeratorImpl::Create);    if (NS_FAILED(rv)) return rv;#endif    // Prepopulate registry for performance    // Ignore return value. It is ok if this fails.    nsComponentManagerImpl::gComponentManager->PlatformPrePopulateRegistry();    return rv;}