DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Header

Mercurial (1aeaa33a64f9)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
/* -*- 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);

  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);

      nsCString 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.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;
}