diff options
author | Vincent Lucas <chenzo@jitsi.org> | 2013-03-02 20:30:39 +0000 |
---|---|---|
committer | Vincent Lucas <chenzo@jitsi.org> | 2013-03-02 20:30:39 +0000 |
commit | 8437c5cc0636009e0e88e3f18e4e2492abcad7e3 (patch) | |
tree | 8d7a1eb4def8b1ba4dc74f568ef15acce82b0108 /src/native/addrbook/msoutlook | |
parent | a1dcd0fcb7291620f665736954113c166eb0feec (diff) | |
download | jitsi-8437c5cc0636009e0e88e3f18e4e2492abcad7e3.zip jitsi-8437c5cc0636009e0e88e3f18e4e2492abcad7e3.tar.gz jitsi-8437c5cc0636009e0e88e3f18e4e2492abcad7e3.tar.bz2 |
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.
Diffstat (limited to 'src/native/addrbook/msoutlook')
12 files changed, 384 insertions, 149 deletions
diff --git a/src/native/addrbook/msoutlook/MAPINotification.cxx b/src/native/addrbook/msoutlook/MAPINotification.cxx index eed80e0..78c039f 100644 --- a/src/native/addrbook/msoutlook/MAPINotification.cxx +++ b/src/native/addrbook/msoutlook/MAPINotification.cxx @@ -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;
}
}
-
diff --git a/src/native/addrbook/msoutlook/MAPISession.cxx b/src/native/addrbook/msoutlook/MAPISession.cxx index 23b46b4..fb672b4 100644 --- a/src/native/addrbook/msoutlook/MAPISession.cxx +++ b/src/native/addrbook/msoutlook/MAPISession.cxx @@ -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);
+}
diff --git a/src/native/addrbook/msoutlook/MAPISession.h b/src/native/addrbook/msoutlook/MAPISession.h index f4676cb..080435b 100644 --- a/src/native/addrbook/msoutlook/MAPISession.h +++ b/src/native/addrbook/msoutlook/MAPISession.h @@ -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_ */
diff --git a/src/native/addrbook/msoutlook/MsOutlookAddrBook.sln b/src/native/addrbook/msoutlook/MsOutlookAddrBook.sln new file mode 100644 index 0000000..e9e795e --- /dev/null +++ b/src/native/addrbook/msoutlook/MsOutlookAddrBook.sln @@ -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 diff --git a/src/native/addrbook/msoutlook/MsOutlookAddrBook.vcxproj b/src/native/addrbook/msoutlook/MsOutlookAddrBook.vcxproj new file mode 100644 index 0000000..73d3d94 --- /dev/null +++ b/src/native/addrbook/msoutlook/MsOutlookAddrBook.vcxproj @@ -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>
\ No newline at end of file diff --git a/src/native/addrbook/msoutlook/MsOutlookDll.cxx b/src/native/addrbook/msoutlook/MsOutlookDll.cxx new file mode 100644 index 0000000..c3f10a3 --- /dev/null +++ b/src/native/addrbook/msoutlook/MsOutlookDll.cxx @@ -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; +} diff --git a/src/native/addrbook/msoutlook/MsOutlookDll.h b/src/native/addrbook/msoutlook/MsOutlookDll.h new file mode 100644 index 0000000..97f8bc4 --- /dev/null +++ b/src/native/addrbook/msoutlook/MsOutlookDll.h @@ -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
\ No newline at end of file diff --git a/src/native/addrbook/msoutlook/MsOutlookMAPI.h b/src/native/addrbook/msoutlook/MsOutlookMAPI.h index 7cf055f..29fc4a2 100644 --- a/src/native/addrbook/msoutlook/MsOutlookMAPI.h +++ b/src/native/addrbook/msoutlook/MsOutlookMAPI.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
diff --git a/src/native/addrbook/msoutlook/MsOutlookMAPIHResultException.cxx b/src/native/addrbook/msoutlook/MsOutlookMAPIHResultException.cxx index 8123b2a..9bb591c 100644 --- a/src/native/addrbook/msoutlook/MsOutlookMAPIHResultException.cxx +++ b/src/native/addrbook/msoutlook/MsOutlookMAPIHResultException.cxx @@ -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;
diff --git a/src/native/addrbook/msoutlook/MsOutlookMAPIHResultException.h b/src/native/addrbook/msoutlook/MsOutlookMAPIHResultException.h index c0f7742..e84a7b1 100644 --- a/src/native/addrbook/msoutlook/MsOutlookMAPIHResultException.h +++ b/src/native/addrbook/msoutlook/MsOutlookMAPIHResultException.h @@ -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
}
diff --git a/src/native/addrbook/msoutlook/net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContactQuery.cxx b/src/native/addrbook/msoutlook/net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContactQuery.cxx index 48e0394..5eae7ed 100644 --- a/src/native/addrbook/msoutlook/net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContactQuery.cxx +++ b/src/native/addrbook/msoutlook/net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContactQuery.cxx @@ -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;
diff --git a/src/native/addrbook/msoutlook/net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContactSourceService.cxx b/src/native/addrbook/msoutlook/net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContactSourceService.cxx index 0624357..fa37e95 100644 --- a/src/native/addrbook/msoutlook/net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContactSourceService.cxx +++ b/src/native/addrbook/msoutlook/net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContactSourceService.cxx @@ -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;
}
|