nsresult nsAppStartup::Init() { NS_TIME_FUNCTION; nsresult rv; // Create widget application shell mAppShell = do_GetService(kAppShellCID, &rv); NS_ENSURE_SUCCESS(rv, rv); NS_TIME_FUNCTION_MARK("Got AppShell service"); nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService(); if (!os) return NS_ERROR_FAILURE; NS_TIME_FUNCTION_MARK("Got Observer service"); os->AddObserver(this, "quit-application-forced", PR_TRUE); os->AddObserver(this, "sessionstore-windows-restored", PR_TRUE); os->AddObserver(this, "profile-change-teardown", PR_TRUE); os->AddObserver(this, "xul-window-registered", PR_TRUE); os->AddObserver(this, "xul-window-destroyed", PR_TRUE); return NS_OK; }
NS_IMETHODIMP nsAppStartupNotifier::Observe(nsISupports *aSubject, const char *aTopic, const PRUnichar *someData) { NS_TIME_FUNCTION; NS_ENSURE_ARG(aTopic); nsresult rv; // now initialize all startup listeners nsCOMPtr<nsICategoryManager> categoryManager = do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsISimpleEnumerator> enumerator; rv = categoryManager->EnumerateCategory(aTopic, getter_AddRefs(enumerator)); if (NS_FAILED(rv)) return rv; NS_TIME_FUNCTION_MARK("EnumerateCategory"); nsCOMPtr<nsISupports> entry; while (NS_SUCCEEDED(enumerator->GetNext(getter_AddRefs(entry)))) { nsCOMPtr<nsISupportsCString> category = do_QueryInterface(entry, &rv); if (NS_SUCCEEDED(rv)) { nsCAutoString categoryEntry; rv = category->GetData(categoryEntry); nsXPIDLCString contractId; categoryManager->GetCategoryEntry(aTopic, categoryEntry.get(), getter_Copies(contractId)); if (NS_SUCCEEDED(rv)) { // If we see the word "service," in the beginning // of the contractId then we create it as a service // if not we do a createInstance nsCOMPtr<nsISupports> startupInstance; if (Substring(contractId, 0, 8).EqualsLiteral("service,")) startupInstance = do_GetService(contractId.get() + 8, &rv); else startupInstance = do_CreateInstance(contractId, &rv); if (NS_SUCCEEDED(rv)) { // Try to QI to nsIObserver nsCOMPtr<nsIObserver> startupObserver = do_QueryInterface(startupInstance, &rv); if (NS_SUCCEEDED(rv)) { rv = startupObserver->Observe(nsnull, aTopic, nsnull); // mainly for debugging if you want to know if your observer worked. NS_ASSERTION(NS_SUCCEEDED(rv), "Startup Observer failed!\n"); } } else { #ifdef DEBUG nsCAutoString warnStr("Cannot create startup observer : "); warnStr += contractId.get(); NS_WARNING(warnStr.get()); #endif } NS_TIME_FUNCTION_MARK("observer: category: %s cid: %s", categoryEntry.get(), nsPromiseFlatCString(contractId).get()); } } } return NS_OK; }
nsresult nsIOService::Init() { NS_TIME_FUNCTION; nsresult rv; // We need to get references to the DNS service so that we can shut it // down later. If we wait until the nsIOService is being shut down, // GetService will fail at that point. mDNSService = do_GetService(NS_DNSSERVICE_CONTRACTID, &rv); if (NS_FAILED(rv)) { NS_WARNING("failed to get DNS service"); return rv; } NS_TIME_FUNCTION_MARK("got DNS Service"); // XXX hack until xpidl supports error info directly (bug 13423) nsCOMPtr<nsIErrorService> errorService = do_GetService(NS_ERRORSERVICE_CONTRACTID); if (errorService) { errorService->RegisterErrorStringBundle(NS_ERROR_MODULE_NETWORK, NECKO_MSGS_URL); } else NS_WARNING("failed to get error service"); NS_TIME_FUNCTION_MARK("got Error Service"); // setup our bad port list stuff for(int i=0; gBadPortList[i]; i++) mRestrictedPortList.AppendElement(gBadPortList[i]); // Further modifications to the port list come from prefs nsCOMPtr<nsIPrefBranch2> prefBranch; GetPrefBranch(getter_AddRefs(prefBranch)); if (prefBranch) { prefBranch->AddObserver(PORT_PREF_PREFIX, this, true); prefBranch->AddObserver(AUTODIAL_PREF, this, true); prefBranch->AddObserver(MANAGE_OFFLINE_STATUS_PREF, this, true); PrefsChanged(prefBranch); } // Register for profile change notifications nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService(); if (observerService) { observerService->AddObserver(this, kProfileChangeNetTeardownTopic, true); observerService->AddObserver(this, kProfileChangeNetRestoreTopic, true); observerService->AddObserver(this, kProfileDoChange, true); observerService->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, true); observerService->AddObserver(this, NS_NETWORK_LINK_TOPIC, true); } else NS_WARNING("failed to get observer service"); NS_TIME_FUNCTION_MARK("Registered observers"); gIOService = this; InitializeNetworkLinkService(); NS_TIME_FUNCTION_MARK("Set up network link service"); return NS_OK; }