12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- #include "nsCOMPtr.h"
- #include "nsString.h"
- #include "nsXPIDLString.h"
- #include "nsIServiceManager.h"
- #include "nsICategoryManager.h"
- #include "nsXPCOM.h"
- #include "nsISupportsPrimitives.h"
- #include "nsAppStartupNotifier.h"
- #include "nsISimpleEnumerator.h"
- NS_IMPL_ISUPPORTS(nsAppStartupNotifier, nsIObserver)
- nsAppStartupNotifier::nsAppStartupNotifier()
- {
- }
- nsAppStartupNotifier::~nsAppStartupNotifier()
- {
- }
- NS_IMETHODIMP nsAppStartupNotifier::Observe(nsISupports *aSubject, const char *aTopic, const char16_t *someData)
- {
- 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;
- nsCOMPtr<nsISupports> entry;
- while (NS_SUCCEEDED(enumerator->GetNext(getter_AddRefs(entry)))) {
- nsCOMPtr<nsISupportsCString> category = do_QueryInterface(entry, &rv);
- if (NS_SUCCEEDED(rv)) {
- nsAutoCString 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(nullptr, aTopic, nullptr);
-
- // mainly for debugging if you want to know if your observer worked.
- NS_ASSERTION(NS_SUCCEEDED(rv), "Startup Observer failed!\n");
- }
- }
- else {
- #ifdef DEBUG
- nsAutoCString warnStr("Cannot create startup observer : ");
- warnStr += contractId.get();
- NS_WARNING(warnStr.get());
- #endif
- }
- }
- }
- }
- return NS_OK;
- }
|