forked from mirrors/gecko-dev
Much like the component manager, many of the strings that we use for category manager entries are statically allocated. There's no need to duplicate these strings. This patch changes the category manager APIs to take nsACStrings rather than raw pointers, and to pass literal nsCStrings when we know we have a literal string to begin with. When adding the category entry, it then skips making copies of any strings with the LITERAL flag. MozReview-Commit-ID: EJEcYSdNMWs *** amend-catman --HG-- extra : source : aa9a8f18e98f930a3d8359565eef02f3f6efc5f9 extra : absorb_source : 81a22ab26ee8017ac43321ff2c987d8096182d37
88 lines
3.1 KiB
C++
88 lines
3.1 KiB
C++
/* -*- 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 "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() = default;
|
|
|
|
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);
|
|
|
|
nsDependentCString topic(aTopic);
|
|
|
|
nsCOMPtr<nsISimpleEnumerator> enumerator;
|
|
rv = categoryManager->EnumerateCategory(topic,
|
|
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);
|
|
|
|
nsCString contractId;
|
|
categoryManager->GetCategoryEntry(topic, categoryEntry,
|
|
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.get(), &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;
|
|
}
|