Applies patch proposed by Ingo Bauersachs for jmsoutlookaddrbook.dkk to lock the MAPI session, correct mixing of char/wchar_t and set to NULL deleted pointers. Removes names (surname, firstname, company name, etc.) from the contact call items. The dll will be generated in the following commit.

cusax-fix
Vincent Lucas 13 years ago
parent a1dcd0fcb7
commit 8437c5cc06

@ -169,7 +169,7 @@ STDAPICALLTYPE MAPINotification_onNotify
{
if(lpvContext != NULL)
{
char entryIdStr[lpNotifications[i].info.obj.cbEntryID * 2 + 1];
LPSTR entryIdStr = (LPSTR)::malloc(lpNotifications[i].info.obj.cbEntryID * 2 + 1);
HexFromBin(
(LPBYTE) lpNotifications[i].info.obj.lpEntryID,
@ -180,6 +180,9 @@ STDAPICALLTYPE MAPINotification_onNotify
{
MAPINotification_callDeletedMethod(entryIdStr);
}
::free(entryIdStr);
entryIdStr = NULL;
}
}
// A contact has been deleted (moved to trash).
@ -187,13 +190,14 @@ STDAPICALLTYPE MAPINotification_onNotify
{
if(lpvContext != NULL)
{
char entryIdStr[lpNotifications[i].info.obj.cbEntryID * 2 + 1];
LPSTR entryIdStr
= (LPSTR)::malloc(lpNotifications[i].info.obj.cbEntryID * 2 + 1);
HexFromBin(
(LPBYTE) lpNotifications[i].info.obj.lpEntryID,
lpNotifications[i].info.obj.cbEntryID,
entryIdStr);
char parentEntryIdStr[
lpNotifications[i].info.obj.cbParentID * 2 + 1];
LPSTR parentEntryIdStr
= (LPSTR)::malloc(lpNotifications[i].info.obj.cbParentID * 2 + 1);
HexFromBin(
(LPBYTE) lpNotifications[i].info.obj.lpParentID,
lpNotifications[i].info.obj.cbParentID,
@ -206,8 +210,8 @@ STDAPICALLTYPE MAPINotification_onNotify
MAPI_UNICODE,
&wasteBasketNbValues,
&wasteBasketProps);
char wasteBasketEntryIdStr[
wasteBasketProps[0].Value.bin.cb * 2 + 1];
LPSTR wasteBasketEntryIdStr
= (LPSTR)::malloc(wasteBasketProps[0].Value.bin.cb * 2 + 1);
HexFromBin(
(LPBYTE) wasteBasketProps[0].Value.bin.lpb,
wasteBasketProps[0].Value.bin.cb,
@ -224,6 +228,13 @@ STDAPICALLTYPE MAPINotification_onNotify
{
MAPINotification_callDeletedMethod(entryIdStr);
}
::free(entryIdStr);
entryIdStr = NULL;
::free(parentEntryIdStr);
parentEntryIdStr = NULL;
::free(wasteBasketEntryIdStr);
wasteBasketEntryIdStr = NULL;
}
}
@ -493,7 +504,8 @@ void MAPINotification_unregisterNotificationsDelegate(JNIEnv *jniEnv)
MAPINotification_unregisterNotifyAllMsgStores();
if(MAPINotification_notificationsDelegateObject != NULL)
{
jniEnv->DeleteGlobalRef( MAPINotification_notificationsDelegateObject);
jniEnv->DeleteGlobalRef(MAPINotification_notificationsDelegateObject);
MAPINotification_notificationsDelegateObject = NULL;
MAPINotification_notificationsDelegateMethodIdInserted = NULL;
MAPINotification_notificationsDelegateMethodIdUpdated = NULL;
MAPINotification_notificationsDelegateMethodIdDeleted = NULL;
@ -517,7 +529,9 @@ void MAPINotification_unregisterNotifyAllMsgStores(void)
}
}
free(MAPINotification_msgStoresConnection);
MAPINotification_msgStoresConnection = NULL;
}
if(MAPINotification_msgStores != NULL)
{
for(unsigned int i = 0; i < MAPINotification_nbMsgStores; ++i)
@ -528,12 +542,14 @@ void MAPINotification_unregisterNotifyAllMsgStores(void)
}
}
free(MAPINotification_msgStores);
MAPINotification_msgStores = NULL;
}
if(MAPINotification_msgStoresTable != NULL)
{
MAPINotification_msgStoresTable->Unadvise(
MAPINotification_msgStoresTableConnection);
MAPINotification_msgStoresTable->Release();
MAPINotification_msgStoresTable = NULL;
}
}

@ -7,6 +7,7 @@
#include "MAPISession.h"
static LPMAPISESSION MAPISession_mapiSession = NULL;
static CRITICAL_SECTION MAPISession_mapiSessionCriticalSection;
/**
* Returns the current mapi session which have been created using the
@ -31,3 +32,23 @@ void MAPISession_setMapiSession(LPMAPISESSION mapiSession)
{
MAPISession_mapiSession = mapiSession;
}
void MAPISession_initLock()
{
InitializeCriticalSection(&MAPISession_mapiSessionCriticalSection);
}
void MAPISession_lock()
{
EnterCriticalSection(&MAPISession_mapiSessionCriticalSection);
}
void MAPISession_unlock()
{
LeaveCriticalSection(&MAPISession_mapiSessionCriticalSection);
}
void MAPISession_freeLock()
{
DeleteCriticalSection(&MAPISession_mapiSessionCriticalSection);
}

@ -14,4 +14,9 @@ LPMAPISESSION MAPISession_getMapiSession(void);
void MAPISession_setMapiSession(LPMAPISESSION mapiSession);
void MAPISession_initLock();
void MAPISession_lock();
void MAPISession_unlock();
void MAPISession_freeLock();
#endif /* #ifndef _NET_JAVA_SIP_COMMUNICATOR_PLUGIN_ADDRBOOK_MSOUTLOOK_MAPISESSION_H_ */

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MsOutlookAddrBook", "MsOutlookAddrBook.vcxproj", "{75EE17D1-65A7-4693-8774-FCBA8AF491A9}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{75EE17D1-65A7-4693-8774-FCBA8AF491A9}.Debug|Win32.ActiveCfg = Debug|Win32
{75EE17D1-65A7-4693-8774-FCBA8AF491A9}.Debug|Win32.Build.0 = Debug|Win32
{75EE17D1-65A7-4693-8774-FCBA8AF491A9}.Release|Win32.ActiveCfg = Release|Win32
{75EE17D1-65A7-4693-8774-FCBA8AF491A9}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

@ -0,0 +1,105 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{75EE17D1-65A7-4693-8774-FCBA8AF491A9}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>MsOutlookAddrBook</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v110</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v110</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<OutDir>$(SolutionDir)../../../../lib/native/windows/</OutDir>
<IntDir>$(SolutionDir)../../native_obj/</IntDir>
<IncludePath>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include;%JDK_HOME%\include;%JDK_HOME%\include\Win32;$(IncludePath)</IncludePath>
<TargetName>jmsoutlookaddrbook</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;MSOUTLOOKADDRBOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>mapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;MSOUTLOOKADDRBOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="..\AddrBookContactQuery.h" />
<ClInclude Include="MAPINotification.h" />
<ClInclude Include="MAPISession.h" />
<ClInclude Include="MsOutlookDll.h" />
<ClInclude Include="MsOutlookMAPI.h" />
<ClInclude Include="MsOutlookMAPIHResultException.h" />
<ClInclude Include="net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContactQuery.h" />
<ClInclude Include="net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContactSourceService.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\AddrBookContactQuery.c" />
<ClCompile Include="MAPINotification.cxx" />
<ClCompile Include="MAPISession.cxx" />
<ClCompile Include="MsOutlookDll.cxx" />
<ClCompile Include="MsOutlookMAPIHResultException.cxx" />
<ClCompile Include="net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContactQuery.cxx" />
<ClCompile Include="net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContactSourceService.cxx" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

@ -0,0 +1,28 @@
/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
#include "MsOutlookDll.h"
#include "MAPISession.h"
#include <jni.h>
JNIEXPORT BOOL APIENTRY DllMain(
HINSTANCE /*hDLL*/,
DWORD dwReason,
LPVOID /*lpReserved*/)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
MAPISession_initLock();
break;
case DLL_PROCESS_DETACH:
MAPISession_freeLock();
break;
}
return TRUE;
}

@ -0,0 +1,26 @@
/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
#ifndef _MSOUTLOOKDLL_H
#define _MSOUTLOOKDLL_H
#include <windows.h>
#include <jni.h>
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT BOOL APIENTRY DllMain(
HINSTANCE hDLL,
DWORD dwReason,
LPVOID lpReserved);
#ifdef __cplusplus
}
#endif
#endif //_MSOUTLOOKDLL_H

@ -28,13 +28,13 @@
#include <mapitags.h>
#include <mapix.h>
WINBOOL MsOutlookAddrBook_fBinFromHex(LPTSTR lpsz, LPBYTE lpb);
BOOL MsOutlookAddrBook_fBinFromHex(LPSTR lpsz, LPBYTE lpb);
#define FBinFromHex MsOutlookAddrBook_fBinFromHex
void MsOutlookAddrBook_freeProws(LPSRowSet lpRows);
#define FreeProws MsOutlookAddrBook_freeProws
void MsOutlookAddrBook_hexFromBin(LPBYTE pb, int cb, LPTSTR sz);
void MsOutlookAddrBook_hexFromBin(LPBYTE pb, int cb, LPSTR sz);
#define HexFromBin MsOutlookAddrBook_hexFromBin
void MsOutlookAddrBook_hrAllocAdviseSink
@ -56,7 +56,7 @@ ULONG MsOutlookAddrBook_mapiFreeBuffer(LPVOID buffer);
HRESULT MsOutlookAddrBook_mapiLogonEx
(ULONG_PTR uiParam,
LPSTR profileName, LPSTR password,
LPTSTR profileName, LPTSTR password,
FLAGS flags,
LPMAPISESSION FAR *mapiSession);
#define MAPILogonEx MsOutlookAddrBook_mapiLogonEx

@ -9,7 +9,7 @@
void
MsOutlookMAPIHResultException_throwNew
(JNIEnv *jniEnv, HRESULT hResult, LPCTSTR file, ULONG line)
(JNIEnv *jniEnv, HRESULT hResult, LPCSTR file, ULONG line)
{
jclass clazz;
@ -18,42 +18,42 @@ MsOutlookMAPIHResultException_throwNew
"net/java/sip/communicator/plugin/addrbook/msoutlook/MsOutlookMAPIHResultException");
if (clazz)
{
LPCTSTR message;
LPCSTR message;
switch (hResult)
{
case MAPI_E_LOGON_FAILED:
message = _T("MAPI_E_LOGON_FAILED");
message = "MAPI_E_LOGON_FAILED";
break;
case MAPI_E_NO_ACCESS:
message = _T("MAPI_E_NO_ACCESS");
message = "MAPI_E_NO_ACCESS";
break;
case MAPI_E_NO_SUPPORT:
message = _T("MAPI_E_NO_SUPPORT");
message = "MAPI_E_NO_SUPPORT";
break;
case MAPI_E_NOT_ENOUGH_MEMORY:
message = _T("MAPI_E_NOT_ENOUGH_MEMORY");
message = "MAPI_E_NOT_ENOUGH_MEMORY";
break;
case MAPI_E_NOT_FOUND:
message = _T("MAPI_E_NOT_FOUND");
message = "MAPI_E_NOT_FOUND";
break;
case MAPI_E_NOT_INITIALIZED:
message = _T("MAPI_E_NOT_INITIALIZED");
message = "MAPI_E_NOT_INITIALIZED";
break;
case MAPI_E_TIMEOUT:
message = _T("MAPI_E_TIMEOUT");
message = "MAPI_E_TIMEOUT";
break;
case MAPI_E_UNKNOWN_ENTRYID:
message = _T("MAPI_E_UNKNOWN_ENTRYID");
message = "MAPI_E_UNKNOWN_ENTRYID";
break;
case MAPI_E_USER_CANCEL:
message = _T("MAPI_E_USER_CANCEL");
message = "MAPI_E_USER_CANCEL";
break;
case MAPI_W_ERRORS_RETURNED:
message = _T("MAPI_W_ERRORS_RETURNED");
message = "MAPI_W_ERRORS_RETURNED";
break;
case S_OK:
message = _T("S_OK");
message = "S_OK";
break;
default:
message = NULL;

@ -17,7 +17,7 @@ extern "C" {
#endif /* #ifdef __cplusplus */
void MsOutlookMAPIHResultException_throwNew
(JNIEnv *jniEnv, HRESULT hResult, LPCTSTR file, ULONG line);
(JNIEnv *jniEnv, HRESULT hResult, LPCSTR file, ULONG line);
#ifdef __cplusplus
}

@ -87,32 +87,39 @@ Java_net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContac
{
jmethodID callbackMethodID;
MAPISession_lock();
LPMAPISESSION mapiSession = MAPISession_getMapiSession();
if (!mapiSession)
{
MAPISession_unlock();
return;
}
callbackMethodID
= AddrBookContactQuery_getPtrCallbackMethodID(jniEnv, callback);
if (!callbackMethodID || jniEnv->ExceptionCheck())
return;
if (mapiSession)
{
jboolean proceed
= MsOutlookAddrBookContactQuery_foreachContactInMsgStoresTable(
mapiSession,
jniEnv,
query,
callback, callbackMethodID);
MAPISession_unlock();
return;
}
if (proceed && !(jniEnv->ExceptionCheck()))
{
MsOutlookAddrBookContactQuery_foreachMailUserInAddressBook(
mapiSession,
jniEnv,
query,
callback, callbackMethodID);
}
jboolean proceed
= MsOutlookAddrBookContactQuery_foreachContactInMsgStoresTable(
mapiSession,
jniEnv,
query,
callback, callbackMethodID);
if (proceed && !(jniEnv->ExceptionCheck()))
{
MsOutlookAddrBookContactQuery_foreachMailUserInAddressBook(
mapiSession,
jniEnv,
query,
callback, callbackMethodID);
}
MAPISession_unlock();
}
/**
@ -274,7 +281,7 @@ Java_net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContac
propTag
= MsOutlookAddrBookContactQuery_getPropTagFromLid(
(LPMAPIPROP) mapiProp,
propId);
(LONG)propId);
}
*(propTagArray->aulPropTag + i) = propTag;
}
@ -410,7 +417,7 @@ Java_net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContac
case PT_BINARY:
{
char entryIdStr[prop->Value.bin.cb * 2 + 1];
LPSTR entryIdStr = (LPSTR)::malloc(prop->Value.bin.cb * 2 + 1);
HexFromBin(
prop->Value.bin.lpb,
@ -427,6 +434,9 @@ Java_net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContac
if (jniEnv->ExceptionCheck())
props = NULL;
}
::free(entryIdStr);
entryIdStr = NULL;
break;
}
}
@ -484,7 +494,7 @@ Java_net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContac
const char *nativeValue = jniEnv->GetStringUTFChars(value, NULL);
size_t valueLength = strlen(nativeValue);
wchar_t wCharValue[valueLength + 1];
LPWSTR wCharValue = (LPWSTR)::malloc((valueLength + 1) * sizeof(wchar_t));
if(mbstowcs(wCharValue, nativeValue, valueLength + 1)
!= valueLength)
{
@ -493,6 +503,8 @@ Java_net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContac
\n\tmbstowcs\n");
fflush(stderr);
jniEnv->ReleaseStringUTFChars(value, nativeValue);
::free(wCharValue);
wCharValue = NULL;
return JNI_FALSE;
}
jniEnv->ReleaseStringUTFChars(value, nativeValue);
@ -594,11 +606,15 @@ Java_net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContac
if (HR_SUCCEEDED(hResult))
{
((LPMAPIPROP) mapiProp)->Release();
::free(wCharValue);
wCharValue = NULL;
return JNI_TRUE;
}
}
((LPMAPIPROP) mapiProp)->Release();
::free(wCharValue);
wCharValue = NULL;
return JNI_FALSE;
}
@ -858,7 +874,7 @@ MsOutlookAddrBookContactQuery_foreachRowInTable
if (objType && entryIDBinary.cb && entryIDBinary.lpb)
{
LPENTRYID entryID;
LPENTRYID entryID = NULL;
if (S_OK
== MAPIAllocateBuffer(
@ -1128,9 +1144,9 @@ MsOutlookAddrBookContactQuery_onForeachContactInMsgStoresTableRow
&msgStore);
if (HR_SUCCEEDED(hResult))
{
LPENTRYID receiveFolderEntryID;
ULONG contactsFolderEntryIDByteCount;
LPENTRYID contactsFolderEntryID;
LPENTRYID receiveFolderEntryID = NULL;
ULONG contactsFolderEntryIDByteCount = 0;
LPENTRYID contactsFolderEntryID = NULL;
hResult
= msgStore->GetReceiveFolder(
@ -1259,11 +1275,12 @@ LPUNKNOWN MsOutlookAddrBookContactQuery_openEntryId(const char* entryId)
&iUnknown);
if(hResult == S_OK)
{
free(tmpEntryId);
::free(tmpEntryId);
return iUnknown;
}
}
free(tmpEntryId);
::free(tmpEntryId);
return NULL;
}
@ -1281,7 +1298,7 @@ MsOutlookAddrBookContactQuery_readAttachment
hResult = message->OpenAttach(num, NULL, 0, &attach);
if (HR_SUCCEEDED(hResult))
{
IStream *stream;
IStream *stream = NULL;
if (PT_BOOLEAN == PROP_TYPE(cond))
{
@ -1309,7 +1326,7 @@ MsOutlookAddrBookContactQuery_readAttachment
0,
(LPUNKNOWN *) &stream);
}
if (HR_SUCCEEDED(hResult))
if (HR_SUCCEEDED(hResult) && stream)
{
STATSTG statstg;
ULONGLONG length;

@ -17,9 +17,9 @@
#include <stdlib.h>
#include <string.h>
typedef BOOL (STDAPICALLTYPE *LPFBINFROMHEX)(LPTSTR, LPBYTE);
typedef BOOL (STDAPICALLTYPE *LPFBINFROMHEX)(LPSTR, LPBYTE);
typedef void (STDAPICALLTYPE *LPFREEPROWS)(LPSRowSet);
typedef void (STDAPICALLTYPE *LPHEXFROMBIN)(LPBYTE, int, LPTSTR);
typedef void (STDAPICALLTYPE *LPHEXFROMBIN)(LPBYTE, int, LPSTR);
typedef HRESULT (STDAPICALLTYPE *LPHRALLOCADVISESINK)(LPNOTIFCALLBACK, LPVOID, LPMAPIADVISESINK FAR *);
typedef HRESULT (STDAPICALLTYPE *LPHRQUERYALLROWS)(LPMAPITABLE, LPSPropTagArray, LPSRestriction, LPSSortOrderSet, LONG, LPSRowSet FAR *);
@ -35,8 +35,7 @@ static LPMAPIINITIALIZE MsOutlookAddrBookContactSourceService_mapiInitialize;
static LPMAPILOGONEX MsOutlookAddrBookContactSourceService_mapiLogonEx;
static LPMAPIUNINITIALIZE
MsOutlookAddrBookContactSourceService_mapiUninitialize;
static CRITICAL_SECTION
MsOutlookAddrBookContactSourceService_mapiSessionCriticalSection;
static HMODULE hMapiLib = NULL;
static jboolean
MsOutlookAddrBookContactSourceService_isValidDefaultMailClient
@ -44,7 +43,7 @@ MsOutlookAddrBookContactSourceService_isValidDefaultMailClient
JNIEXPORT void JNICALL
Java_net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContactSourceService_MAPIInitialize
(JNIEnv *jniEnv, jclass clazz, jlong version, jlong flags,
(JNIEnv *jniEnv, jclass /*clazz*/, jlong version, jlong flags,
jobject notificationsDelegate)
{
HKEY regKey;
@ -129,7 +128,7 @@ Java_net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContac
pathValue = installRootKeyName;
else
{
pathValue = (TCHAR *) malloc(pathValueSize);
pathValue = (LPTSTR)::malloc(pathValueSize);
if (!pathValue)
continue;
}
@ -151,7 +150,7 @@ Java_net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContac
str = pathValue + (pathValueLength - 1);
if (*str)
str++;
memcpy(str, "\\Outlook.exe", 12 * sizeof(TCHAR));
memcpy(str, _T("\\Outlook.exe"), 12 * sizeof(TCHAR));
*(str + 12) = 0;
fileAttributes = GetFileAttributes(pathValue);
@ -280,21 +279,52 @@ Java_net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContac
// If we've determined that we'd like to go on with MAPI, try to load it.
if (HR_SUCCEEDED(hResult))
{
HMODULE lib = ::LoadLibrary(_T("mapi32.dll"));
hMapiLib = ::LoadLibrary(_T("mapi32.dll"));
hResult = MAPI_E_NO_SUPPORT;
if (lib)
if(hMapiLib)
{
// get and check function pointers
MsOutlookAddrBookContactSourceService_mapiInitialize
= (LPMAPIINITIALIZE) GetProcAddress(lib, "MAPIInitialize");
= (LPMAPIINITIALIZE) GetProcAddress(hMapiLib, "MAPIInitialize");
MsOutlookAddrBookContactSourceService_mapiUninitialize
= (LPMAPIUNINITIALIZE) GetProcAddress(lib, "MAPIUninitialize");
= (LPMAPIUNINITIALIZE)
GetProcAddress(hMapiLib, "MAPIUninitialize");
MsOutlookAddrBookContactSourceService_mapiAllocateBuffer
= (LPMAPIALLOCATEBUFFER)
GetProcAddress(hMapiLib, "MAPIAllocateBuffer");
MsOutlookAddrBookContactSourceService_mapiFreeBuffer
= (LPMAPIFREEBUFFER) GetProcAddress(hMapiLib, "MAPIFreeBuffer");
MsOutlookAddrBookContactSourceService_mapiLogonEx
= (LPMAPILOGONEX) GetProcAddress(hMapiLib, "MAPILogonEx");
MsOutlookAddrBookContactSourceService_fBinFromHex
= (LPFBINFROMHEX) GetProcAddress(hMapiLib, "FBinFromHex@8");
MsOutlookAddrBookContactSourceService_freeProws
= (LPFREEPROWS) GetProcAddress(hMapiLib, "FreeProws@4");
MsOutlookAddrBookContactSourceService_hexFromBin
= (LPHEXFROMBIN) GetProcAddress(hMapiLib, "HexFromBin@12");
MsOutlookAddrBookContactSourceService_hrAllocAdviseSink
= (LPHRALLOCADVISESINK)
GetProcAddress(hMapiLib, "HrAllocAdviseSink@12");
MsOutlookAddrBookContactSourceService_hrQueryAllRows
= (LPHRQUERYALLROWS)
GetProcAddress(hMapiLib, "HrQueryAllRows@24");
if (MsOutlookAddrBookContactSourceService_mapiInitialize
&& MsOutlookAddrBookContactSourceService_mapiUninitialize)
&& MsOutlookAddrBookContactSourceService_mapiUninitialize
&& MsOutlookAddrBookContactSourceService_mapiAllocateBuffer
&& MsOutlookAddrBookContactSourceService_mapiFreeBuffer
&& MsOutlookAddrBookContactSourceService_mapiLogonEx
&& MsOutlookAddrBookContactSourceService_fBinFromHex
&& MsOutlookAddrBookContactSourceService_freeProws
&& MsOutlookAddrBookContactSourceService_hexFromBin
&& MsOutlookAddrBookContactSourceService_hrAllocAdviseSink
&& MsOutlookAddrBookContactSourceService_hrQueryAllRows)
{
MAPIINIT_0 mapiInit = { (ULONG) version, (ULONG) flags };
// Opening MAPI changes the working directory. Make a backup of
// the current directory, login to MAPI and restore it
DWORD dwSize = ::GetCurrentDirectory(0, NULL);
if (dwSize > 0)
{
@ -304,93 +334,53 @@ Java_net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContac
= ::GetCurrentDirectory(dwSize, lpszWorkingDir);
if (dwResult != 0)
{
MAPISession_lock();
hResult
= MsOutlookAddrBookContactSourceService_mapiInitialize(
&mapiInit);
::SetCurrentDirectory(lpszWorkingDir);
if(HR_SUCCEEDED(hResult)
&& MAPISession_getMapiSession() == NULL)
{
LPMAPISESSION mapiSession = NULL;
hResult = MsOutlookAddrBook_mapiLogonEx(
0,
NULL, NULL,
MAPI_EXTENDED
| MAPI_NO_MAIL
| MAPI_USE_DEFAULT,
&mapiSession);
MAPINotification_registerNotificationsDelegate(
jniEnv,
mapiSession,
notificationsDelegate);
}
MAPISession_unlock();
}
else
{
hResult = HRESULT_FROM_WIN32(::GetLastError());
}
::free(lpszWorkingDir);
}
else
{
hResult = HRESULT_FROM_WIN32(::GetLastError());
}
if (HR_SUCCEEDED(hResult))
{
MsOutlookAddrBookContactSourceService_mapiAllocateBuffer
= (LPMAPIALLOCATEBUFFER)
GetProcAddress(lib, "MAPIAllocateBuffer");
MsOutlookAddrBookContactSourceService_mapiFreeBuffer
= (LPMAPIFREEBUFFER)
GetProcAddress(lib, "MAPIFreeBuffer");
MsOutlookAddrBookContactSourceService_mapiLogonEx
= (LPMAPILOGONEX) GetProcAddress(lib, "MAPILogonEx");
MsOutlookAddrBookContactSourceService_fBinFromHex
= (LPFBINFROMHEX) GetProcAddress(lib, "FBinFromHex@8");
MsOutlookAddrBookContactSourceService_freeProws
= (LPFREEPROWS) GetProcAddress(lib, "FreeProws@4");
MsOutlookAddrBookContactSourceService_hexFromBin
= (LPHEXFROMBIN) GetProcAddress(lib, "HexFromBin@12");
MsOutlookAddrBookContactSourceService_hrAllocAdviseSink
= (LPHRALLOCADVISESINK)
GetProcAddress(lib, "HrAllocAdviseSink@12");
MsOutlookAddrBookContactSourceService_hrQueryAllRows
= (LPHRQUERYALLROWS)
GetProcAddress(lib, "HrQueryAllRows@24");
InitializeCriticalSection(
&MsOutlookAddrBookContactSourceService_mapiSessionCriticalSection);
if (MsOutlookAddrBookContactSourceService_mapiAllocateBuffer
&& MsOutlookAddrBookContactSourceService_mapiFreeBuffer
&& MsOutlookAddrBookContactSourceService_mapiLogonEx
&& MsOutlookAddrBookContactSourceService_fBinFromHex
&& MsOutlookAddrBookContactSourceService_freeProws
&& MsOutlookAddrBookContactSourceService_hexFromBin
&& MsOutlookAddrBookContactSourceService_hrAllocAdviseSink
&&
MsOutlookAddrBookContactSourceService_hrQueryAllRows)
{
hResult = S_OK;
}
else
{
MsOutlookAddrBookContactSourceService_mapiUninitialize();
hResult = MAPI_E_NO_SUPPORT;
}
}
}
if (HR_FAILED(hResult))
FreeLibrary(lib);
}
}
if(HR_SUCCEEDED(hResult) && MAPISession_getMapiSession() == NULL)
{
LPMAPISESSION mapiSession = NULL;
hResult
= MsOutlookAddrBook_mapiLogonEx(
0,
NULL, NULL,
MAPI_EXTENDED | MAPI_NO_MAIL | MAPI_USE_DEFAULT,
&mapiSession);
MAPINotification_registerNotificationsDelegate(
jniEnv,
mapiSession,
notificationsDelegate);
}
/* Report any possible error regardless of where it has come from. */
if (HR_FAILED(hResult))
{
if (hMapiLib)
{
FreeLibrary(hMapiLib);
hMapiLib = NULL;
}
/* Report any possible error regardless of where it has come from. */
MsOutlookMAPIHResultException_throwNew(
jniEnv,
hResult,
@ -400,28 +390,37 @@ Java_net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContac
JNIEXPORT void JNICALL
Java_net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContactSourceService_MAPIUninitialize
(JNIEnv *jniEnv, jclass clazz)
(JNIEnv *jniEnv, jclass /*clazz*/)
{
EnterCriticalSection(
&MsOutlookAddrBookContactSourceService_mapiSessionCriticalSection);
MAPISession_lock();
LPMAPISESSION mapiSession = MAPISession_getMapiSession();
if(mapiSession != NULL)
{
MAPINotification_unregisterNotificationsDelegate(jniEnv);
mapiSession->Logoff(0, 0, 0);
mapiSession->Release();
mapiSession = NULL;
MAPISession_setMapiSession(NULL);
}
LeaveCriticalSection(
&MsOutlookAddrBookContactSourceService_mapiSessionCriticalSection);
MsOutlookAddrBookContactSourceService_mapiUninitialize();
DeleteCriticalSection(
&MsOutlookAddrBookContactSourceService_mapiSessionCriticalSection);
MsOutlookAddrBookContactSourceService_mapiInitialize = NULL;
MsOutlookAddrBookContactSourceService_mapiUninitialize = NULL;
MsOutlookAddrBookContactSourceService_mapiAllocateBuffer = NULL;
MsOutlookAddrBookContactSourceService_mapiFreeBuffer = NULL;
MsOutlookAddrBookContactSourceService_mapiLogonEx = NULL;
MsOutlookAddrBookContactSourceService_fBinFromHex = NULL;
MsOutlookAddrBookContactSourceService_freeProws = NULL;
MsOutlookAddrBookContactSourceService_hexFromBin = NULL;
MsOutlookAddrBookContactSourceService_hrAllocAdviseSink = NULL;
MsOutlookAddrBookContactSourceService_hrQueryAllRows = NULL;
::FreeLibrary(hMapiLib);
hMapiLib = NULL;
MAPISession_unlock();
}
WINBOOL MsOutlookAddrBook_fBinFromHex(LPTSTR lpsz, LPBYTE lpb)
BOOL MsOutlookAddrBook_fBinFromHex(LPSTR lpsz, LPBYTE lpb)
{
return MsOutlookAddrBookContactSourceService_fBinFromHex(lpsz, lpb);
}
@ -431,7 +430,7 @@ void MsOutlookAddrBook_freeProws(LPSRowSet lpRows)
MsOutlookAddrBookContactSourceService_freeProws(lpRows);
}
void MsOutlookAddrBook_hexFromBin(LPBYTE pb, int cb, LPTSTR sz)
void MsOutlookAddrBook_hexFromBin(LPBYTE pb, int cb, LPSTR sz)
{
return MsOutlookAddrBookContactSourceService_hexFromBin(pb, cb, sz);
}
@ -478,14 +477,13 @@ MsOutlookAddrBook_mapiFreeBuffer(LPVOID buffer)
HRESULT
MsOutlookAddrBook_mapiLogonEx
(ULONG_PTR uiParam,
LPSTR profileName, LPSTR password,
LPTSTR profileName, LPTSTR password,
FLAGS flags,
LPMAPISESSION FAR *mapiSession)
{
HRESULT hResult;
EnterCriticalSection(
&MsOutlookAddrBookContactSourceService_mapiSessionCriticalSection);
MAPISession_lock();
LPMAPISESSION currentMapiSession = MAPISession_getMapiSession();
if (currentMapiSession != NULL)
hResult = S_OK;
@ -519,15 +517,14 @@ MsOutlookAddrBook_mapiLogonEx
{
hResult = HRESULT_FROM_WIN32(::GetLastError());
}
}
if (HR_SUCCEEDED(hResult))
{
*mapiSession = currentMapiSession;
LeaveCriticalSection(
&MsOutlookAddrBookContactSourceService_mapiSessionCriticalSection);
}
MAPISession_unlock();
return hResult;
}

@ -258,6 +258,29 @@ public class MsOutlookAddrBookContactQuery
//dispidOtherAddress
};
/**
* The indexes in {@link #MAPI_MAILUSER_PROP_IDS} of the property IDs which
* represent an identifier which can be used for telephony or persistent
* presence.
*/
private static final int[] CONTACT_OPERATION_SET_ABLE_PROP_INDEXES
= new int[]
{
PR_EMAIL_ADDRESS,
PR_BUSINESS_TELEPHONE_NUMBER,
PR_BUSINESS2_TELEPHONE_NUMBER,
PR_HOME_TELEPHONE_NUMBER,
PR_HOME2_TELEPHONE_NUMBER,
PR_MOBILE_TELEPHONE_NUMBER,
dispidEmail1EmailAddress,
dispidEmail2EmailAddress,
dispidEmail3EmailAddress,
dispidFax1EmailAddress,
dispidFax2EmailAddress,
dispidFax3EmailAddress
//dispidInstMsg
};
static
{
System.loadLibrary("jmsoutlookaddrbook");
@ -704,7 +727,20 @@ private List<ContactDetail> getContactDetails(Object[] values)
getSubCategories(property),
MAPI_MAILUSER_PROP_IDS[property]);
contactDetail.setSupportedOpSets(supportedOpSets);
// Check if this contact detail support the telephony and
// the persistent presence operation set.
for(int j = 0;
j < CONTACT_OPERATION_SET_ABLE_PROP_INDEXES.length;
++j)
{
if(property
== CONTACT_OPERATION_SET_ABLE_PROP_INDEXES[j])
{
contactDetail.setSupportedOpSets(supportedOpSets);
// Found, then break the loop.
j = CONTACT_OPERATION_SET_ABLE_PROP_INDEXES.length;
}
}
contactDetails.add(contactDetail);
}
}

Loading…
Cancel
Save