aboutsummaryrefslogtreecommitdiffstats
path: root/src/native/addrbook/msoutlook
diff options
context:
space:
mode:
authorVincent Lucas <chenzo@jitsi.org>2013-03-02 20:30:39 +0000
committerVincent Lucas <chenzo@jitsi.org>2013-03-02 20:30:39 +0000
commit8437c5cc0636009e0e88e3f18e4e2492abcad7e3 (patch)
tree8d7a1eb4def8b1ba4dc74f568ef15acce82b0108 /src/native/addrbook/msoutlook
parenta1dcd0fcb7291620f665736954113c166eb0feec (diff)
downloadjitsi-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')
-rw-r--r--src/native/addrbook/msoutlook/MAPINotification.cxx32
-rw-r--r--src/native/addrbook/msoutlook/MAPISession.cxx21
-rw-r--r--src/native/addrbook/msoutlook/MAPISession.h5
-rw-r--r--src/native/addrbook/msoutlook/MsOutlookAddrBook.sln20
-rw-r--r--src/native/addrbook/msoutlook/MsOutlookAddrBook.vcxproj105
-rw-r--r--src/native/addrbook/msoutlook/MsOutlookDll.cxx28
-rw-r--r--src/native/addrbook/msoutlook/MsOutlookDll.h26
-rw-r--r--src/native/addrbook/msoutlook/MsOutlookMAPI.h6
-rw-r--r--src/native/addrbook/msoutlook/MsOutlookMAPIHResultException.cxx26
-rw-r--r--src/native/addrbook/msoutlook/MsOutlookMAPIHResultException.h2
-rw-r--r--src/native/addrbook/msoutlook/net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContactQuery.cxx73
-rw-r--r--src/native/addrbook/msoutlook/net_java_sip_communicator_plugin_addrbook_msoutlook_MsOutlookAddrBookContactSourceService.cxx189
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;
}