summaryrefslogtreecommitdiffstats
path: root/mailnews/addrbook/src/nsMapiAddressBook.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mailnews/addrbook/src/nsMapiAddressBook.cpp')
-rw-r--r--mailnews/addrbook/src/nsMapiAddressBook.cpp147
1 files changed, 147 insertions, 0 deletions
diff --git a/mailnews/addrbook/src/nsMapiAddressBook.cpp b/mailnews/addrbook/src/nsMapiAddressBook.cpp
new file mode 100644
index 000000000..80d737fb2
--- /dev/null
+++ b/mailnews/addrbook/src/nsMapiAddressBook.cpp
@@ -0,0 +1,147 @@
+/* -*- 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 "nsMapiAddressBook.h"
+
+#include "mozilla/Logging.h"
+
+#ifdef PR_LOGGING
+static PRLogModuleInfo* gMapiAddressBookLog
+ = PR_NewLogModule("nsMapiAddressBookLog");
+#endif
+
+#define PRINTF(args) MOZ_LOG(gMapiAddressBookLog, mozilla::LogLevel::Debug, args)
+
+using namespace mozilla;
+
+HMODULE nsMapiAddressBook::mLibrary = NULL ;
+int32_t nsMapiAddressBook::mLibUsage = 0 ;
+LPMAPIINITIALIZE nsMapiAddressBook::mMAPIInitialize = NULL ;
+LPMAPIUNINITIALIZE nsMapiAddressBook::mMAPIUninitialize = NULL ;
+LPMAPIALLOCATEBUFFER nsMapiAddressBook::mMAPIAllocateBuffer = NULL ;
+LPMAPIFREEBUFFER nsMapiAddressBook::mMAPIFreeBuffer = NULL ;
+LPMAPILOGONEX nsMapiAddressBook::mMAPILogonEx = NULL ;
+
+BOOL nsMapiAddressBook::mInitialized = FALSE ;
+BOOL nsMapiAddressBook::mLogonDone = FALSE ;
+LPMAPISESSION nsMapiAddressBook::mRootSession = NULL ;
+LPADRBOOK nsMapiAddressBook::mRootBook = NULL ;
+
+BOOL nsMapiAddressBook::LoadMapiLibrary(void)
+{
+ if (mLibrary) { ++ mLibUsage ; return TRUE ; }
+ HMODULE libraryHandle = LoadLibrary("MAPI32.DLL") ;
+
+ if (!libraryHandle) { return FALSE ; }
+ FARPROC entryPoint = GetProcAddress(libraryHandle, "MAPIGetNetscapeVersion") ;
+
+ if (entryPoint) {
+ FreeLibrary(libraryHandle) ;
+ libraryHandle = LoadLibrary("MAPI32BAK.DLL") ;
+ if (!libraryHandle) { return FALSE ; }
+ }
+ mLibrary = libraryHandle ;
+ ++ mLibUsage ;
+ mMAPIInitialize = reinterpret_cast<LPMAPIINITIALIZE>(GetProcAddress(mLibrary, "MAPIInitialize")) ;
+ if (!mMAPIInitialize) { return FALSE ; }
+ mMAPIUninitialize = reinterpret_cast<LPMAPIUNINITIALIZE>(GetProcAddress(mLibrary, "MAPIUninitialize")) ;
+ if (!mMAPIUninitialize) { return FALSE ; }
+ mMAPIAllocateBuffer = reinterpret_cast<LPMAPIALLOCATEBUFFER>(GetProcAddress(mLibrary, "MAPIAllocateBuffer")) ;
+ if (!mMAPIAllocateBuffer) { return FALSE ; }
+ mMAPIFreeBuffer = reinterpret_cast<LPMAPIFREEBUFFER>(GetProcAddress(mLibrary, "MAPIFreeBuffer")) ;
+ if (!mMAPIFreeBuffer) { return FALSE ; }
+ mMAPILogonEx = reinterpret_cast<LPMAPILOGONEX>(GetProcAddress(mLibrary, "MAPILogonEx")) ;
+ if (!mMAPILogonEx) { return FALSE ; }
+ MAPIINIT_0 mapiInit = { MAPI_INIT_VERSION, MAPI_MULTITHREAD_NOTIFICATIONS } ;
+ HRESULT retCode = mMAPIInitialize(&mapiInit) ;
+
+ if (HR_FAILED(retCode)) {
+ PRINTF(("Cannot initialize MAPI %08x.\n", retCode)) ; return FALSE ;
+ }
+ mInitialized = TRUE ;
+ retCode = mMAPILogonEx(0, NULL, NULL,
+ MAPI_NO_MAIL |
+ MAPI_USE_DEFAULT |
+ MAPI_EXTENDED |
+ MAPI_NEW_SESSION,
+ &mRootSession) ;
+ if (HR_FAILED(retCode)) {
+ PRINTF(("Cannot logon to MAPI %08x.\n", retCode)) ; return FALSE ;
+ }
+ mLogonDone = TRUE ;
+ retCode = mRootSession->OpenAddressBook(0, NULL, 0, &mRootBook) ;
+ if (HR_FAILED(retCode)) {
+ PRINTF(("Cannot open MAPI address book %08x.\n", retCode)) ;
+ }
+ return HR_SUCCEEDED(retCode) ;
+}
+
+void nsMapiAddressBook::FreeMapiLibrary(void)
+{
+ if (mLibrary) {
+ if (-- mLibUsage == 0) {
+ {
+ if (mRootBook) { mRootBook->Release() ; }
+ if (mRootSession) {
+ if (mLogonDone) {
+ mRootSession->Logoff(NULL, 0, 0) ;
+ mLogonDone = FALSE ;
+ }
+ mRootSession->Release() ;
+ }
+ if (mInitialized) {
+ mMAPIUninitialize() ;
+ mInitialized = FALSE ;
+ }
+ }
+ FreeLibrary(mLibrary) ;
+ mLibrary = NULL ;
+ }
+ }
+}
+
+nsMapiAddressBook::nsMapiAddressBook(void)
+: nsAbWinHelper()
+{
+ BOOL result = Initialize() ;
+
+ NS_ASSERTION(result == TRUE, "Couldn't initialize Mapi Helper") ;
+ MOZ_COUNT_CTOR(nsMapiAddressBook) ;
+}
+
+nsMapiAddressBook::~nsMapiAddressBook(void)
+{
+ MutexAutoLock guard(*mMutex) ;
+
+ FreeMapiLibrary() ;
+ MOZ_COUNT_DTOR(nsMapiAddressBook) ;
+}
+
+BOOL nsMapiAddressBook::Initialize(void)
+{
+ if (mAddressBook) { return TRUE ; }
+ MutexAutoLock guard(*mMutex) ;
+
+ if (!LoadMapiLibrary()) {
+ PRINTF(("Cannot load library.\n")) ;
+ return FALSE ;
+ }
+ mAddressBook = mRootBook ;
+ return TRUE ;
+}
+
+void nsMapiAddressBook::AllocateBuffer(ULONG aByteCount, LPVOID *aBuffer)
+{
+ mMAPIAllocateBuffer(aByteCount, aBuffer) ;
+}
+
+void nsMapiAddressBook::FreeBuffer(LPVOID aBuffer)
+{
+ mMAPIFreeBuffer(aBuffer) ;
+}
+
+
+
+
+