diff options
Diffstat (limited to 'mailnews/addrbook/src/nsWabAddressBook.cpp')
-rw-r--r-- | mailnews/addrbook/src/nsWabAddressBook.cpp | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/mailnews/addrbook/src/nsWabAddressBook.cpp b/mailnews/addrbook/src/nsWabAddressBook.cpp new file mode 100644 index 000000000..9c991ddf5 --- /dev/null +++ b/mailnews/addrbook/src/nsWabAddressBook.cpp @@ -0,0 +1,128 @@ +/* -*- 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 <tchar.h> +#include "nsWabAddressBook.h" +#include "mozilla/Logging.h" +#include <algorithm> + +#ifdef PR_LOGGING +static PRLogModuleInfo* gWabAddressBookLog + = PR_NewLogModule("nsWabAddressBookLog"); +#endif + +#define PRINTF(args) MOZ_LOG(gWabAddressBookLog, mozilla::LogLevel::Debug, args) + +using namespace mozilla; + +HMODULE nsWabAddressBook::mLibrary = NULL ; +int32_t nsWabAddressBook::mLibUsage = 0 ; +LPWABOPEN nsWabAddressBook::mWABOpen = NULL ; +LPWABOBJECT nsWabAddressBook::mRootSession = NULL ; +LPADRBOOK nsWabAddressBook::mRootBook = NULL ; + +BOOL nsWabAddressBook::LoadWabLibrary(void) +{ + if (mLibrary) { ++ mLibUsage ; return TRUE ; } + // We try to fetch the location of the WAB DLL from the registry + TCHAR wabDLLPath [MAX_PATH] ; + DWORD keyType = 0 ; + ULONG byteCount = sizeof(wabDLLPath) ; + HKEY keyHandle = NULL ; + wabDLLPath [MAX_PATH - 1] = 0 ; + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WAB_DLL_PATH_KEY, 0, KEY_READ, &keyHandle) == ERROR_SUCCESS) { + RegQueryValueEx(keyHandle, "", NULL, &keyType, (LPBYTE) wabDLLPath, &byteCount) ; + if (keyType == REG_EXPAND_SZ) { + // Expand the environment variables + DWORD bufferSize = ExpandEnvironmentStrings(wabDLLPath, NULL, 0); + if (bufferSize && bufferSize < MAX_PATH) { + TCHAR tmp[MAX_PATH]; + ExpandEnvironmentStrings(wabDLLPath, tmp, bufferSize); + _tcscpy(wabDLLPath, tmp); + } + else { + return FALSE; + } + } + } + else { + if (GetSystemDirectory(wabDLLPath, MAX_PATH)) { + _tcsncat(wabDLLPath, WAB_DLL_NAME, + std::min(_tcslen(WAB_DLL_NAME), MAX_PATH - _tcslen(wabDLLPath) - 1)); + } + else { + return FALSE; + } + } + if (keyHandle) { RegCloseKey(keyHandle) ; } + mLibrary = LoadLibrary( (lstrlen(wabDLLPath)) ? wabDLLPath : WAB_DLL_NAME ); + if (!mLibrary) { return FALSE ; } + ++ mLibUsage ; + mWABOpen = reinterpret_cast<LPWABOPEN>(GetProcAddress(mLibrary, "WABOpen")) ; + if (!mWABOpen) { return FALSE ; } + HRESULT retCode = mWABOpen(&mRootBook, &mRootSession, NULL, 0) ; + + if (HR_FAILED(retCode)) { + PRINTF(("Cannot initialize WAB %08x.\n", retCode)) ; return FALSE ; + } + return TRUE ; +} + +void nsWabAddressBook::FreeWabLibrary(void) +{ + if (mLibrary) { + if (-- mLibUsage == 0) { + if (mRootBook) { mRootBook->Release() ; } + if (mRootSession) { mRootSession->Release() ; } + FreeLibrary(mLibrary) ; + mLibrary = NULL ; + } + } +} + +nsWabAddressBook::nsWabAddressBook(void) +: nsAbWinHelper() +{ + BOOL result = Initialize() ; + + NS_ASSERTION(result == TRUE, "Couldn't initialize Wab Helper") ; + MOZ_COUNT_CTOR(nsWabAddressBook) ; +} + +nsWabAddressBook::~nsWabAddressBook(void) +{ + MutexAutoLock guard(*mMutex) ; + FreeWabLibrary() ; + MOZ_COUNT_DTOR(nsWabAddressBook) ; +} + +BOOL nsWabAddressBook::Initialize(void) +{ + if (mAddressBook) { return TRUE ; } + MutexAutoLock guard(*mMutex) ; + + if (!LoadWabLibrary()) { + PRINTF(("Cannot load library.\n")) ; + return FALSE ; + } + mAddressBook = mRootBook ; + return TRUE ; +} + +void nsWabAddressBook::AllocateBuffer(ULONG aByteCount, LPVOID *aBuffer) +{ + mRootSession->AllocateBuffer(aByteCount, aBuffer) ; +} + +void nsWabAddressBook::FreeBuffer(LPVOID aBuffer) +{ + mRootSession->FreeBuffer(aBuffer) ; +} + + + + + + |