/* 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 "objbase.h" #include "nsISupports.h" #include "mozilla/ModuleUtils.h" #include "mozilla/Services.h" #include "nsIObserverService.h" #include "nsIAppStartupNotifier.h" #include "Registry.h" #include "msgMapiSupport.h" #include "msgMapiImp.h" /** Implementation of the nsIMapiSupport interface. * Use standard implementation of nsISupports stuff. */ NS_IMPL_ISUPPORTS(nsMapiSupport, nsIMapiSupport, nsIObserver) NS_IMETHODIMP nsMapiSupport::Observe(nsISupports* aSubject, const char* aTopic, const char16_t* aData) { nsresult rv = NS_OK; if (!strcmp(aTopic, "profile-after-change")) return InitializeMAPISupport(); if (!strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID)) return ShutdownMAPISupport(); nsCOMPtr observerService = mozilla::services::GetObserverService(); NS_ENSURE_TRUE(observerService, NS_ERROR_UNEXPECTED); rv = observerService->AddObserver(this, "profile-after-change", false); if (NS_FAILED(rv)) return rv; rv = observerService->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false); if (NS_FAILED(rv)) return rv; return rv; } nsMapiSupport::nsMapiSupport() : m_dwRegister(0), m_nsMapiFactory(nullptr) {} nsMapiSupport::~nsMapiSupport() {} NS_IMETHODIMP nsMapiSupport::InitializeMAPISupport() { ::OleInitialize(nullptr); if (m_nsMapiFactory == nullptr) // No Registering if already done. Sanity Check!! { m_nsMapiFactory = new CMapiFactory(); if (m_nsMapiFactory != nullptr) { HRESULT hr = ::CoRegisterClassObject(CLSID_CMapiImp, m_nsMapiFactory, CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &m_dwRegister); if (FAILED(hr)) { m_nsMapiFactory->Release(); m_nsMapiFactory = nullptr; return NS_ERROR_FAILURE; } } } return NS_OK; } NS_IMETHODIMP nsMapiSupport::ShutdownMAPISupport() { if (m_dwRegister != 0) ::CoRevokeClassObject(m_dwRegister); if (m_nsMapiFactory != nullptr) { m_nsMapiFactory->Release(); m_nsMapiFactory = nullptr; } ::OleUninitialize(); return NS_OK; } NS_IMETHODIMP nsMapiSupport::RegisterServer() { // TODO: Figure out what kind of error propagation to pass back ::RegisterServer(CLSID_CMapiImp, L"Mozilla MAPI", L"MozillaMapi", L"MozillaMapi.1"); return NS_OK; } NS_IMETHODIMP nsMapiSupport::UnRegisterServer() { // TODO: Figure out what kind of error propagation to pass back ::UnregisterServer(CLSID_CMapiImp, L"MozillaMapi", L"MozillaMapi.1"); return NS_OK; } NS_DEFINE_NAMED_CID(NS_IMAPISUPPORT_CID); NS_GENERIC_FACTORY_CONSTRUCTOR(nsMapiSupport) static const mozilla::Module::CategoryEntry kMAPICategories[] = { { APPSTARTUP_CATEGORY, "Mapi Support", "service," NS_IMAPISUPPORT_CONTRACTID, }, {NULL}}; const mozilla::Module::CIDEntry kMAPICIDs[] = { {&kNS_IMAPISUPPORT_CID, false, NULL, nsMapiSupportConstructor}, {NULL}}; const mozilla::Module::ContractIDEntry kMAPIContracts[] = { {NS_IMAPISUPPORT_CONTRACTID, &kNS_IMAPISUPPORT_CID}, {NULL}}; extern const mozilla::Module kMAPIModule = { mozilla::Module::kVersion, kMAPICIDs, kMAPIContracts, kMAPICategories};