mirror of
https://github.com/reactos/reactos.git
synced 2025-06-10 20:34:59 +00:00
-sync mapi32 with wine 1.1.31
svn path=/trunk/; revision=43660
This commit is contained in:
parent
84b898626f
commit
7ed3595ed8
10 changed files with 1143 additions and 46 deletions
|
@ -15,6 +15,7 @@
|
||||||
<library>wine</library>
|
<library>wine</library>
|
||||||
<library>shlwapi</library>
|
<library>shlwapi</library>
|
||||||
<library>shell32</library>
|
<library>shell32</library>
|
||||||
|
<library>advapi32</library>
|
||||||
<library>kernel32</library>
|
<library>kernel32</library>
|
||||||
<library>uuid</library>
|
<library>uuid</library>
|
||||||
<library>ntdll</library>
|
<library>ntdll</library>
|
||||||
|
|
|
@ -145,17 +145,17 @@
|
||||||
205 stub FDecodeID@12
|
205 stub FDecodeID@12
|
||||||
206 stub CchOfEncoding@4
|
206 stub CchOfEncoding@4
|
||||||
207 stdcall CbOfEncoded@4(ptr) CbOfEncoded
|
207 stdcall CbOfEncoded@4(ptr) CbOfEncoded
|
||||||
208 stub MAPISendDocuments
|
208 stdcall MAPISendDocuments(ptr ptr ptr ptr long)
|
||||||
209 stdcall MAPILogon(long ptr ptr long long ptr)
|
209 stdcall MAPILogon(long ptr ptr long long ptr)
|
||||||
210 stdcall MAPILogoff(long long long long)
|
210 stdcall MAPILogoff(long long long long)
|
||||||
211 stdcall MAPISendMail(long long ptr long long)
|
211 stdcall MAPISendMail(long long ptr long long)
|
||||||
212 stub MAPISaveMail
|
212 stdcall MAPISaveMail(ptr ptr ptr long long ptr)
|
||||||
213 stub MAPIReadMail
|
213 stdcall MAPIReadMail(ptr ptr ptr long long ptr)
|
||||||
214 stub MAPIFindNext
|
214 stdcall MAPIFindNext(ptr ptr ptr ptr long long ptr)
|
||||||
215 stub MAPIDeleteMail
|
215 stdcall MAPIDeleteMail(ptr ptr ptr long long)
|
||||||
217 stub MAPIAddress
|
217 stdcall MAPIAddress(ptr ptr ptr long ptr long long ptr long ptr ptr)
|
||||||
218 stub MAPIDetails
|
218 stdcall MAPIDetails(ptr ptr ptr long long)
|
||||||
219 stub MAPIResolveName
|
219 stdcall MAPIResolveName(ptr ptr ptr long long ptr)
|
||||||
220 stub BMAPISendMail
|
220 stub BMAPISendMail
|
||||||
221 stub BMAPISaveMail
|
221 stub BMAPISaveMail
|
||||||
222 stub BMAPIReadMail
|
222 stub BMAPIReadMail
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* MAPI basics
|
* MAPI basics
|
||||||
*
|
*
|
||||||
* Copyright 2001 CodeWeavers Inc.
|
* Copyright 2001, 2009 CodeWeavers Inc.
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -29,6 +29,7 @@
|
||||||
#include "mapiform.h"
|
#include "mapiform.h"
|
||||||
#include "mapi.h"
|
#include "mapi.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(mapi);
|
WINE_DEFAULT_DEBUG_CHANNEL(mapi);
|
||||||
|
|
||||||
|
@ -45,9 +46,11 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
|
||||||
{
|
{
|
||||||
case DLL_PROCESS_ATTACH:
|
case DLL_PROCESS_ATTACH:
|
||||||
DisableThreadLibraryCalls(hinstDLL);
|
DisableThreadLibraryCalls(hinstDLL);
|
||||||
|
load_mapi_providers();
|
||||||
break;
|
break;
|
||||||
case DLL_PROCESS_DETACH:
|
case DLL_PROCESS_DETACH:
|
||||||
TRACE("DLL_PROCESS_DETACH: %d objects remaining\n", MAPI_ObjectCount);
|
TRACE("DLL_PROCESS_DETACH: %d objects remaining\n", MAPI_ObjectCount);
|
||||||
|
unload_mapi_providers();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -58,8 +61,17 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
|
||||||
*/
|
*/
|
||||||
HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
|
HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
|
||||||
{
|
{
|
||||||
*ppv = NULL;
|
if (mapiFunctions.DllGetClassObject)
|
||||||
|
{
|
||||||
|
HRESULT ret = mapiFunctions.DllGetClassObject(rclsid, iid, ppv);
|
||||||
|
|
||||||
|
TRACE("ret: %x\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
FIXME("\n\tCLSID:\t%s,\n\tIID:\t%s\n", debugstr_guid(rclsid), debugstr_guid(iid));
|
FIXME("\n\tCLSID:\t%s,\n\tIID:\t%s\n", debugstr_guid(rclsid), debugstr_guid(iid));
|
||||||
|
|
||||||
|
*ppv = NULL;
|
||||||
return CLASS_E_CLASSNOTAVAILABLE;
|
return CLASS_E_CLASSNOTAVAILABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,36 +92,77 @@ HRESULT WINAPI DllCanUnloadNow(void)
|
||||||
return MAPI_ObjectCount == 0 ? S_OK : S_FALSE;
|
return MAPI_ObjectCount == 0 ? S_OK : S_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MAPIInitialize
|
||||||
|
*
|
||||||
|
* Initialises the MAPI library. In our case, we pass through to the
|
||||||
|
* loaded Extended MAPI provider.
|
||||||
|
*/
|
||||||
HRESULT WINAPI MAPIInitialize(LPVOID init)
|
HRESULT WINAPI MAPIInitialize(LPVOID init)
|
||||||
{
|
{
|
||||||
FIXME("(%p) Stub\n", init);
|
TRACE("(%p)\n", init);
|
||||||
return SUCCESS_SUCCESS;
|
|
||||||
|
if (mapiFunctions.MAPIInitialize)
|
||||||
|
return mapiFunctions.MAPIInitialize(init);
|
||||||
|
|
||||||
|
return MAPI_E_NOT_INITIALIZED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MAPILogon
|
||||||
|
*
|
||||||
|
* Logs on to a MAPI provider. If available, we pass this through to a
|
||||||
|
* Simple MAPI provider. Otherwise, we maintain basic functionality
|
||||||
|
* ourselves.
|
||||||
|
*/
|
||||||
ULONG WINAPI MAPILogon(ULONG_PTR uiparam, LPSTR profile, LPSTR password,
|
ULONG WINAPI MAPILogon(ULONG_PTR uiparam, LPSTR profile, LPSTR password,
|
||||||
FLAGS flags, ULONG reserved, LPLHANDLE session)
|
FLAGS flags, ULONG reserved, LPLHANDLE session)
|
||||||
{
|
{
|
||||||
FIXME("(0x%08lx %s %p 0x%08x 0x%08x %p) Stub\n", uiparam,
|
TRACE("(0x%08lx %s %p 0x%08x 0x%08x %p)\n", uiparam,
|
||||||
debugstr_a(profile), password, flags, reserved, session);
|
debugstr_a(profile), password, flags, reserved, session);
|
||||||
|
|
||||||
|
if (mapiFunctions.MAPILogon)
|
||||||
|
return mapiFunctions.MAPILogon(uiparam, profile, password, flags, reserved, session);
|
||||||
|
|
||||||
if (session) *session = 1;
|
if (session) *session = 1;
|
||||||
return SUCCESS_SUCCESS;
|
return SUCCESS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MAPILogoff
|
||||||
|
*
|
||||||
|
* Logs off from a MAPI provider. If available, we pass this through to a
|
||||||
|
* Simple MAPI provider. Otherwise, we maintain basic functionality
|
||||||
|
* ourselves.
|
||||||
|
*/
|
||||||
ULONG WINAPI MAPILogoff(LHANDLE session, ULONG_PTR uiparam, FLAGS flags,
|
ULONG WINAPI MAPILogoff(LHANDLE session, ULONG_PTR uiparam, FLAGS flags,
|
||||||
ULONG reserved )
|
ULONG reserved )
|
||||||
{
|
{
|
||||||
FIXME("(0x%08lx 0x%08lx 0x%08x 0x%08x) Stub\n", session,
|
TRACE("(0x%08lx 0x%08lx 0x%08x 0x%08x)\n", session,
|
||||||
uiparam, flags, reserved);
|
uiparam, flags, reserved);
|
||||||
|
|
||||||
|
if (mapiFunctions.MAPILogoff)
|
||||||
|
return mapiFunctions.MAPILogoff(session, uiparam, flags, reserved);
|
||||||
|
|
||||||
return SUCCESS_SUCCESS;
|
return SUCCESS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MAPILogonEx
|
||||||
|
*
|
||||||
|
* Logs on to a MAPI provider. If available, we pass this through to an
|
||||||
|
* Extended MAPI provider. Otherwise, we return an error.
|
||||||
|
*/
|
||||||
HRESULT WINAPI MAPILogonEx(ULONG_PTR uiparam, LPWSTR profile,
|
HRESULT WINAPI MAPILogonEx(ULONG_PTR uiparam, LPWSTR profile,
|
||||||
LPWSTR password, ULONG flags, LPMAPISESSION *session)
|
LPWSTR password, ULONG flags, LPMAPISESSION *session)
|
||||||
{
|
{
|
||||||
FIXME("(0x%08lx %s %p 0x%08x %p) Stub\n", uiparam,
|
TRACE("(0x%08lx %s %p 0x%08x %p)\n", uiparam,
|
||||||
debugstr_w(profile), password, flags, session);
|
debugstr_w(profile), password, flags, session);
|
||||||
return SUCCESS_SUCCESS;
|
|
||||||
|
if (mapiFunctions.MAPILogonEx)
|
||||||
|
return mapiFunctions.MAPILogonEx(uiparam, profile, password, flags, session);
|
||||||
|
|
||||||
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT WINAPI MAPIOpenLocalFormContainer(LPVOID *ppfcnt)
|
HRESULT WINAPI MAPIOpenLocalFormContainer(LPVOID *ppfcnt)
|
||||||
|
@ -118,9 +171,20 @@ HRESULT WINAPI MAPIOpenLocalFormContainer(LPVOID *ppfcnt)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MAPIUninitialize
|
||||||
|
*
|
||||||
|
* Uninitialises the MAPI library. In our case, we pass through to the
|
||||||
|
* loaded Extended MAPI provider.
|
||||||
|
*
|
||||||
|
*/
|
||||||
VOID WINAPI MAPIUninitialize(void)
|
VOID WINAPI MAPIUninitialize(void)
|
||||||
{
|
{
|
||||||
FIXME("Stub\n");
|
TRACE("()\n");
|
||||||
|
|
||||||
|
/* Try to uninitialise the Extended MAPI library */
|
||||||
|
if (mapiFunctions.MAPIUninitialize)
|
||||||
|
mapiFunctions.MAPIUninitialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT WINAPI MAPIAdminProfiles(ULONG ulFlags, LPPROFADMIN *lppProfAdmin)
|
HRESULT WINAPI MAPIAdminProfiles(ULONG ulFlags, LPPROFADMIN *lppProfAdmin)
|
||||||
|
@ -129,3 +193,68 @@ HRESULT WINAPI MAPIAdminProfiles(ULONG ulFlags, LPPROFADMIN *lppProfAdmin)
|
||||||
*lppProfAdmin = NULL;
|
*lppProfAdmin = NULL;
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ULONG WINAPI MAPIAddress(LHANDLE session, ULONG_PTR uiparam, LPSTR caption,
|
||||||
|
ULONG editfields, LPSTR labels, ULONG nRecips, lpMapiRecipDesc lpRecips,
|
||||||
|
FLAGS flags, ULONG reserved, LPULONG newRecips, lpMapiRecipDesc * lppNewRecips)
|
||||||
|
{
|
||||||
|
if (mapiFunctions.MAPIAddress)
|
||||||
|
return mapiFunctions.MAPIAddress(session, uiparam, caption, editfields, labels,
|
||||||
|
nRecips, lpRecips, flags, reserved, newRecips, lppNewRecips);
|
||||||
|
|
||||||
|
return MAPI_E_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG WINAPI MAPIDeleteMail(LHANDLE session, ULONG_PTR uiparam, LPSTR msg_id,
|
||||||
|
FLAGS flags, ULONG reserved)
|
||||||
|
{
|
||||||
|
if (mapiFunctions.MAPIDeleteMail)
|
||||||
|
return mapiFunctions.MAPIDeleteMail(session, uiparam, msg_id, flags, reserved);
|
||||||
|
|
||||||
|
return MAPI_E_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG WINAPI MAPIDetails(LHANDLE session, ULONG_PTR uiparam, lpMapiRecipDesc recip,
|
||||||
|
FLAGS flags, ULONG reserved)
|
||||||
|
{
|
||||||
|
if (mapiFunctions.MAPIDetails)
|
||||||
|
return mapiFunctions.MAPIDetails(session, uiparam, recip, flags, reserved);
|
||||||
|
|
||||||
|
return MAPI_E_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG WINAPI MAPIFindNext(LHANDLE session, ULONG_PTR uiparam, LPSTR msg_type,
|
||||||
|
LPSTR seed_msg_id, FLAGS flags, ULONG reserved, LPSTR msg_id)
|
||||||
|
{
|
||||||
|
if (mapiFunctions.MAPIFindNext)
|
||||||
|
return mapiFunctions.MAPIFindNext(session, uiparam, msg_type, seed_msg_id, flags, reserved, msg_id);
|
||||||
|
|
||||||
|
return MAPI_E_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG WINAPI MAPIReadMail(LHANDLE session, ULONG_PTR uiparam, LPSTR msg_id,
|
||||||
|
FLAGS flags, ULONG reserved, lpMapiMessage msg)
|
||||||
|
{
|
||||||
|
if (mapiFunctions.MAPIReadMail)
|
||||||
|
return mapiFunctions.MAPIReadMail(session, uiparam, msg_id, flags, reserved, msg);
|
||||||
|
|
||||||
|
return MAPI_E_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG WINAPI MAPIResolveName(LHANDLE session, ULONG_PTR uiparam, LPSTR name,
|
||||||
|
FLAGS flags, ULONG reserved, lpMapiRecipDesc *recip)
|
||||||
|
{
|
||||||
|
if (mapiFunctions.MAPIResolveName)
|
||||||
|
return mapiFunctions.MAPIResolveName(session, uiparam, name, flags, reserved, recip);
|
||||||
|
|
||||||
|
return MAPI_E_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG WINAPI MAPISaveMail(LHANDLE session, ULONG_PTR uiparam, lpMapiMessage msg,
|
||||||
|
FLAGS flags, ULONG reserved, LPSTR msg_id)
|
||||||
|
{
|
||||||
|
if (mapiFunctions.MAPISaveMail)
|
||||||
|
return mapiFunctions.MAPISaveMail(session, uiparam, msg, flags, reserved, msg_id);
|
||||||
|
|
||||||
|
return MAPI_E_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* MAPISendMail implementation
|
* MAPISendMail implementation
|
||||||
*
|
*
|
||||||
* Copyright 2005 Hans Leidekker
|
* Copyright 2005 Hans Leidekker
|
||||||
|
* Copyright 2009 Owen Rudge for CodeWeavers
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -24,18 +25,347 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#define COBJMACROS
|
||||||
|
|
||||||
#include "windef.h"
|
#include "windef.h"
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "winerror.h"
|
#include "winerror.h"
|
||||||
#include "objbase.h"
|
#include "objbase.h"
|
||||||
|
#include "objidl.h"
|
||||||
#include "mapi.h"
|
#include "mapi.h"
|
||||||
|
#include "mapix.h"
|
||||||
|
#include "mapiutil.h"
|
||||||
|
#include "mapidefs.h"
|
||||||
#include "winreg.h"
|
#include "winreg.h"
|
||||||
#include "shellapi.h"
|
#include "shellapi.h"
|
||||||
#include "shlwapi.h"
|
#include "shlwapi.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(mapi);
|
WINE_DEFAULT_DEBUG_CHANNEL(mapi);
|
||||||
|
|
||||||
|
#define READ_BUF_SIZE 4096
|
||||||
|
|
||||||
|
/*
|
||||||
|
Internal function to send a message via Extended MAPI. Wrapper around the Simple
|
||||||
|
MAPI function MAPISendMail.
|
||||||
|
*/
|
||||||
|
static ULONG sendmail_extended_mapi(LHANDLE mapi_session, ULONG_PTR uiparam, lpMapiMessage message,
|
||||||
|
FLAGS flags, ULONG reserved)
|
||||||
|
{
|
||||||
|
ULONG tags[] = {1, PR_IPM_DRAFTS_ENTRYID};
|
||||||
|
ULONG retval = MAPI_E_FAILURE;
|
||||||
|
IMAPISession *session = NULL;
|
||||||
|
IMAPITable* msg_table;
|
||||||
|
LPSRowSet rows = NULL;
|
||||||
|
IMsgStore* msg_store;
|
||||||
|
IMAPIFolder* folder = NULL;
|
||||||
|
LPENTRYID entry_id;
|
||||||
|
LPSPropValue props;
|
||||||
|
ULONG entry_len;
|
||||||
|
DWORD obj_type;
|
||||||
|
IMessage* msg;
|
||||||
|
ULONG values;
|
||||||
|
HRESULT ret;
|
||||||
|
|
||||||
|
TRACE("Using Extended MAPI wrapper for MAPISendMail\n");
|
||||||
|
|
||||||
|
/* Attempt to log on via Extended MAPI */
|
||||||
|
|
||||||
|
ret = MAPILogonEx(0, NULL, NULL, MAPI_EXTENDED | MAPI_USE_DEFAULT | MAPI_NEW_SESSION, &session);
|
||||||
|
TRACE("MAPILogonEx: %x\n", ret);
|
||||||
|
|
||||||
|
if (ret != S_OK)
|
||||||
|
{
|
||||||
|
retval = MAPI_E_LOGIN_FAILURE;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Open the default message store */
|
||||||
|
|
||||||
|
if (IMAPISession_GetMsgStoresTable(session, 0, &msg_table) == S_OK)
|
||||||
|
{
|
||||||
|
/* We want the default store */
|
||||||
|
SizedSPropTagArray(2, columns) = {2, {PR_ENTRYID, PR_DEFAULT_STORE}};
|
||||||
|
|
||||||
|
/* Set the columns we want */
|
||||||
|
if (IMAPITable_SetColumns(msg_table, (LPSPropTagArray) &columns, 0) == S_OK)
|
||||||
|
{
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
if (IMAPITable_QueryRows(msg_table, 1, 0, &rows) != S_OK)
|
||||||
|
{
|
||||||
|
MAPIFreeBuffer(rows);
|
||||||
|
rows = NULL;
|
||||||
|
}
|
||||||
|
else if (rows->cRows != 1)
|
||||||
|
{
|
||||||
|
FreeProws(rows);
|
||||||
|
rows = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* If it's not the default store, try the next row */
|
||||||
|
if (!rows->aRow[0].lpProps[1].Value.b)
|
||||||
|
{
|
||||||
|
FreeProws(rows);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMAPITable_Release(msg_table);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Did we manage to get the right store? */
|
||||||
|
if (!rows)
|
||||||
|
goto logoff;
|
||||||
|
|
||||||
|
/* Open the message store */
|
||||||
|
IMAPISession_OpenMsgStore(session, 0, rows->aRow[0].lpProps[0].Value.bin.cb,
|
||||||
|
(ENTRYID *) rows->aRow[0].lpProps[0].Value.bin.lpb, NULL,
|
||||||
|
MDB_NO_DIALOG | MAPI_BEST_ACCESS, &msg_store);
|
||||||
|
|
||||||
|
/* We don't need this any more */
|
||||||
|
FreeProws(rows);
|
||||||
|
|
||||||
|
/* First open the inbox, from which the drafts folder can be opened */
|
||||||
|
if (IMsgStore_GetReceiveFolder(msg_store, NULL, 0, &entry_len, &entry_id, NULL) == S_OK)
|
||||||
|
{
|
||||||
|
IMsgStore_OpenEntry(msg_store, entry_len, entry_id, NULL, 0, &obj_type, (LPUNKNOWN*) &folder);
|
||||||
|
MAPIFreeBuffer(entry_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Open the drafts folder, or failing that, try asking the message store for the outbox */
|
||||||
|
if ((folder == NULL) || ((ret = IMAPIFolder_GetProps(folder, (LPSPropTagArray) tags, 0, &values, &props)) != S_OK))
|
||||||
|
{
|
||||||
|
TRACE("Unable to open Drafts folder; opening Outbox instead\n");
|
||||||
|
tags[1] = PR_IPM_OUTBOX_ENTRYID;
|
||||||
|
ret = IMsgStore_GetProps(msg_store, (LPSPropTagArray) tags, 0, &values, &props);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret != S_OK)
|
||||||
|
goto logoff;
|
||||||
|
|
||||||
|
IMsgStore_OpenEntry(msg_store, props[0].Value.bin.cb, (LPENTRYID) props[0].Value.bin.lpb,
|
||||||
|
NULL, MAPI_MODIFY, &obj_type, (LPUNKNOWN *) &folder);
|
||||||
|
|
||||||
|
/* Create a new message */
|
||||||
|
if (IMAPIFolder_CreateMessage(folder, NULL, 0, &msg) == S_OK)
|
||||||
|
{
|
||||||
|
ULONG token;
|
||||||
|
SPropValue p;
|
||||||
|
|
||||||
|
/* Define message properties */
|
||||||
|
p.ulPropTag = PR_MESSAGE_FLAGS;
|
||||||
|
p.Value.l = MSGFLAG_FROMME | MSGFLAG_UNSENT;
|
||||||
|
|
||||||
|
IMessage_SetProps(msg, 1, &p, NULL);
|
||||||
|
|
||||||
|
p.ulPropTag = PR_SENTMAIL_ENTRYID;
|
||||||
|
p.Value.bin.cb = props[0].Value.bin.cb;
|
||||||
|
p.Value.bin.lpb = props[0].Value.bin.lpb;
|
||||||
|
IMessage_SetProps(msg, 1,&p, NULL);
|
||||||
|
|
||||||
|
/* Set message subject */
|
||||||
|
if (message->lpszSubject)
|
||||||
|
{
|
||||||
|
p.ulPropTag = PR_SUBJECT_A;
|
||||||
|
p.Value.lpszA = message->lpszSubject;
|
||||||
|
IMessage_SetProps(msg, 1, &p, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set message body */
|
||||||
|
if (message->lpszNoteText)
|
||||||
|
{
|
||||||
|
LPSTREAM stream = NULL;
|
||||||
|
|
||||||
|
if (IMessage_OpenProperty(msg, PR_BODY_A, &IID_IStream, 0,
|
||||||
|
MAPI_MODIFY | MAPI_CREATE, (LPUNKNOWN*) &stream) == S_OK)
|
||||||
|
{
|
||||||
|
IStream_Write(stream, message->lpszNoteText, strlen(message->lpszNoteText)+1, NULL);
|
||||||
|
IStream_Release(stream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add message attachments */
|
||||||
|
if (message->nFileCount > 0)
|
||||||
|
{
|
||||||
|
ULONG num_attach = 0;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < message->nFileCount; i++)
|
||||||
|
{
|
||||||
|
IAttach* attachment = NULL;
|
||||||
|
SPropValue prop[4];
|
||||||
|
LPCSTR filename;
|
||||||
|
HANDLE file;
|
||||||
|
|
||||||
|
if (!message->lpFiles[i].lpszPathName)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Open the attachment for reading */
|
||||||
|
file = CreateFileA(message->lpFiles[i].lpszPathName, GENERIC_READ, FILE_SHARE_READ,
|
||||||
|
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
|
|
||||||
|
if (file == INVALID_HANDLE_VALUE)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Check if a display filename has been given; if not, get one ourselves from path name */
|
||||||
|
filename = message->lpFiles[i].lpszFileName;
|
||||||
|
|
||||||
|
if (!filename)
|
||||||
|
{
|
||||||
|
filename = message->lpFiles[i].lpszPathName;
|
||||||
|
|
||||||
|
for (j = strlen(message->lpFiles[i].lpszPathName)-1; j >= 0; j--)
|
||||||
|
{
|
||||||
|
if (message->lpFiles[i].lpszPathName[i] == '\\' ||
|
||||||
|
message->lpFiles[i].lpszPathName[i] == '/')
|
||||||
|
{
|
||||||
|
filename = &message->lpFiles[i].lpszPathName[i+1];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE("Attachment %d path: '%s'; filename: '%s'\n", i, debugstr_a(message->lpFiles[i].lpszPathName),
|
||||||
|
debugstr_a(filename));
|
||||||
|
|
||||||
|
/* Create the attachment */
|
||||||
|
if (IMessage_CreateAttach(msg, NULL, 0, &num_attach, &attachment) != S_OK)
|
||||||
|
{
|
||||||
|
TRACE("Unable to create attachment\n");
|
||||||
|
CloseHandle(file);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the attachment properties */
|
||||||
|
ZeroMemory(prop, sizeof(prop));
|
||||||
|
|
||||||
|
prop[0].ulPropTag = PR_ATTACH_METHOD;
|
||||||
|
prop[0].Value.ul = ATTACH_BY_VALUE;
|
||||||
|
prop[1].ulPropTag = PR_ATTACH_LONG_FILENAME_A;
|
||||||
|
prop[1].Value.lpszA = (LPSTR) filename;
|
||||||
|
prop[2].ulPropTag = PR_ATTACH_FILENAME_A;
|
||||||
|
prop[2].Value.lpszA = (LPSTR) filename;
|
||||||
|
prop[3].ulPropTag = PR_RENDERING_POSITION;
|
||||||
|
prop[3].Value.l = -1;
|
||||||
|
|
||||||
|
if (IAttach_SetProps(attachment, 4, prop, NULL) == S_OK)
|
||||||
|
{
|
||||||
|
LPSTREAM stream = NULL;
|
||||||
|
|
||||||
|
if (IAttach_OpenProperty(attachment, PR_ATTACH_DATA_BIN, &IID_IStream, 0,
|
||||||
|
MAPI_MODIFY | MAPI_CREATE, (LPUNKNOWN*) &stream) == S_OK)
|
||||||
|
{
|
||||||
|
BYTE data[READ_BUF_SIZE];
|
||||||
|
DWORD size = 0, read, written;
|
||||||
|
|
||||||
|
while (ReadFile(file, data, READ_BUF_SIZE, &read, NULL) && (read != 0))
|
||||||
|
{
|
||||||
|
IStream_Write(stream, data, read, &written);
|
||||||
|
size += read;
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE("%d bytes read, %d bytes written of attachment\n", read, written);
|
||||||
|
|
||||||
|
IStream_Commit(stream, STGC_DEFAULT);
|
||||||
|
IStream_Release(stream);
|
||||||
|
|
||||||
|
prop[0].ulPropTag = PR_ATTACH_SIZE;
|
||||||
|
prop[0].Value.ul = size;
|
||||||
|
IAttach_SetProps(attachment, 1, prop, NULL);
|
||||||
|
|
||||||
|
IAttach_SaveChanges(attachment, KEEP_OPEN_READONLY);
|
||||||
|
num_attach++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseHandle(file);
|
||||||
|
IAttach_Release(attachment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMessage_SaveChanges(msg, KEEP_OPEN_READWRITE);
|
||||||
|
|
||||||
|
/* Prepare the message form */
|
||||||
|
|
||||||
|
if (IMAPISession_PrepareForm(session, NULL, msg, &token) == S_OK)
|
||||||
|
{
|
||||||
|
ULONG access = 0, status = 0, flags = 0, pc = 0;
|
||||||
|
ULONG pT[2] = {1, PR_MSG_STATUS};
|
||||||
|
|
||||||
|
/* Retrieve message status, flags, access rights and class */
|
||||||
|
|
||||||
|
if (IMessage_GetProps(msg, (LPSPropTagArray) pT, 0, &pc, &props) == S_OK)
|
||||||
|
{
|
||||||
|
status = props->Value.ul;
|
||||||
|
MAPIFreeBuffer(props);
|
||||||
|
}
|
||||||
|
|
||||||
|
pT[1] = PR_MESSAGE_FLAGS;
|
||||||
|
|
||||||
|
if (IMessage_GetProps(msg, (LPSPropTagArray) pT, 0, &pc, &props) == S_OK)
|
||||||
|
{
|
||||||
|
flags = props->Value.ul;
|
||||||
|
MAPIFreeBuffer(props);
|
||||||
|
}
|
||||||
|
|
||||||
|
pT[1] = PR_ACCESS;
|
||||||
|
|
||||||
|
if (IMessage_GetProps(msg, (LPSPropTagArray) pT, 0, &pc, &props) == S_OK)
|
||||||
|
{
|
||||||
|
access = props->Value.ul;
|
||||||
|
MAPIFreeBuffer(props);
|
||||||
|
}
|
||||||
|
|
||||||
|
pT[1] = PR_MESSAGE_CLASS_A;
|
||||||
|
|
||||||
|
if (IMessage_GetProps(msg, (LPSPropTagArray) pT, 0, &pc, &props) == S_OK)
|
||||||
|
{
|
||||||
|
/* Show the message form (edit window) */
|
||||||
|
|
||||||
|
ret = IMAPISession_ShowForm(session, 0, msg_store, folder, NULL,
|
||||||
|
token, NULL, 0, status, flags, access,
|
||||||
|
props->Value.lpszA);
|
||||||
|
|
||||||
|
switch (ret)
|
||||||
|
{
|
||||||
|
case S_OK:
|
||||||
|
retval = SUCCESS_SUCCESS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MAPI_E_USER_CANCEL:
|
||||||
|
retval = MAPI_E_USER_ABORT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
TRACE("ShowForm failure: %x\n", ret);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMessage_Release(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free up the resources we've used */
|
||||||
|
IMAPIFolder_Release(folder);
|
||||||
|
IMsgStore_Release(msg_store);
|
||||||
|
|
||||||
|
logoff: ;
|
||||||
|
IMAPISession_Logoff(session, 0, 0, 0);
|
||||||
|
IMAPISession_Release(session);
|
||||||
|
|
||||||
|
cleanup: ;
|
||||||
|
MAPIUninitialize();
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* MAPISendMail (MAPI32.211)
|
* MAPISendMail (MAPI32.211)
|
||||||
*
|
*
|
||||||
|
@ -53,7 +383,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mapi);
|
||||||
* Failure: MAPI_E_FAILURE
|
* Failure: MAPI_E_FAILURE
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* This is a temporary hack.
|
* The fallback procedure is a temporary hack.
|
||||||
*/
|
*/
|
||||||
ULONG WINAPI MAPISendMail( LHANDLE session, ULONG_PTR uiparam,
|
ULONG WINAPI MAPISendMail( LHANDLE session, ULONG_PTR uiparam,
|
||||||
lpMapiMessage message, FLAGS flags, ULONG reserved )
|
lpMapiMessage message, FLAGS flags, ULONG reserved )
|
||||||
|
@ -74,6 +404,15 @@ ULONG WINAPI MAPISendMail( LHANDLE session, ULONG_PTR uiparam,
|
||||||
TRACE( "(0x%08x 0x%08lx %p 0x%08x 0x%08x)\n", session, uiparam,
|
TRACE( "(0x%08x 0x%08lx %p 0x%08x 0x%08x)\n", session, uiparam,
|
||||||
message, flags, reserved );
|
message, flags, reserved );
|
||||||
|
|
||||||
|
/* Check to see if we have a Simple MAPI provider loaded */
|
||||||
|
if (mapiFunctions.MAPISendMail)
|
||||||
|
return mapiFunctions.MAPISendMail(session, uiparam, message, flags, reserved);
|
||||||
|
|
||||||
|
/* Check if we have an Extended MAPI provider - if so, use our wrapper */
|
||||||
|
if (MAPIInitialize(NULL) == S_OK)
|
||||||
|
return sendmail_extended_mapi(session, uiparam, message, flags, reserved);
|
||||||
|
|
||||||
|
/* Fall back on our own implementation */
|
||||||
if (!message) return MAPI_E_FAILURE;
|
if (!message) return MAPI_E_FAILURE;
|
||||||
|
|
||||||
for (i = 0; i < message->nRecipCount; i++)
|
for (i = 0; i < message->nRecipCount; i++)
|
||||||
|
@ -201,3 +540,12 @@ exit:
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ULONG WINAPI MAPISendDocuments(ULONG_PTR uiparam, LPSTR delim, LPSTR paths,
|
||||||
|
LPSTR filenames, ULONG reserved)
|
||||||
|
{
|
||||||
|
if (mapiFunctions.MAPISendDocuments)
|
||||||
|
return mapiFunctions.MAPISendDocuments(uiparam, delim, paths, filenames, reserved);
|
||||||
|
|
||||||
|
return MAPI_E_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* MAPI Utility functions
|
* MAPI Utility functions
|
||||||
*
|
*
|
||||||
* Copyright 2004 Jon Griffiths
|
* Copyright 2004 Jon Griffiths
|
||||||
|
* Copyright 2009 Owen Rudge for CodeWeavers
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -37,6 +38,7 @@
|
||||||
#include "mapival.h"
|
#include "mapival.h"
|
||||||
#include "xcmc.h"
|
#include "xcmc.h"
|
||||||
#include "msi.h"
|
#include "msi.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(mapi);
|
WINE_DEFAULT_DEBUG_CHANNEL(mapi);
|
||||||
|
|
||||||
|
@ -46,6 +48,8 @@ static const BYTE digitsToHex[] = {
|
||||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,10,11,12,13,
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,10,11,12,13,
|
||||||
14,15 };
|
14,15 };
|
||||||
|
|
||||||
|
MAPI_FUNCTIONS mapiFunctions;
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* ScInitMapiUtil (MAPI32.33)
|
* ScInitMapiUtil (MAPI32.33)
|
||||||
*
|
*
|
||||||
|
@ -858,8 +862,9 @@ BOOL WINAPI FGetComponentPath(LPCSTR component, LPCSTR qualifier, LPSTR dll_path
|
||||||
hmsi = LoadLibraryA("msi.dll");
|
hmsi = LoadLibraryA("msi.dll");
|
||||||
if (hmsi)
|
if (hmsi)
|
||||||
{
|
{
|
||||||
FARPROC pMsiProvideQualifiedComponentA = GetProcAddress(hmsi, "MsiProvideQualifiedComponentA");
|
UINT (WINAPI *pMsiProvideQualifiedComponentA)(LPCSTR, LPCSTR, DWORD, LPSTR, LPDWORD);
|
||||||
|
|
||||||
|
pMsiProvideQualifiedComponentA = (void *)GetProcAddress(hmsi, "MsiProvideQualifiedComponentA");
|
||||||
if (pMsiProvideQualifiedComponentA)
|
if (pMsiProvideQualifiedComponentA)
|
||||||
{
|
{
|
||||||
static const char * const fmt[] = { "%d\\NT", "%d\\95", "%d" };
|
static const char * const fmt[] = { "%d\\NT", "%d\\95", "%d" };
|
||||||
|
@ -902,3 +907,174 @@ HRESULT WINAPI HrQueryAllRows(LPMAPITABLE lpTable, LPSPropTagArray lpPropTags,
|
||||||
*lppRows = NULL;
|
*lppRows = NULL;
|
||||||
return MAPI_E_CALL_FAILED;
|
return MAPI_E_CALL_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HMODULE mapi_provider;
|
||||||
|
static HMODULE mapi_ex_provider;
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* load_mapi_provider
|
||||||
|
*
|
||||||
|
* Attempts to load a MAPI provider from the specified registry key.
|
||||||
|
*
|
||||||
|
* Returns a handle to the loaded module in `mapi_provider' if successful.
|
||||||
|
*/
|
||||||
|
static void load_mapi_provider(HKEY hkeyMail, LPCWSTR valueName, HMODULE *mapi_provider)
|
||||||
|
{
|
||||||
|
static const WCHAR mapi32_dll[] = {'m','a','p','i','3','2','.','d','l','l',0 };
|
||||||
|
|
||||||
|
DWORD dwType, dwLen = 0;
|
||||||
|
LPWSTR dllPath;
|
||||||
|
|
||||||
|
/* Check if we have a value set for DLLPath */
|
||||||
|
if ((RegQueryValueExW(hkeyMail, valueName, NULL, &dwType, NULL, &dwLen) == ERROR_SUCCESS) &&
|
||||||
|
((dwType == REG_SZ) || (dwType == REG_EXPAND_SZ)) && (dwLen > 0))
|
||||||
|
{
|
||||||
|
dllPath = HeapAlloc(GetProcessHeap(), 0, dwLen);
|
||||||
|
|
||||||
|
if (dllPath)
|
||||||
|
{
|
||||||
|
RegQueryValueExW(hkeyMail, valueName, NULL, NULL, (LPBYTE)dllPath, &dwLen);
|
||||||
|
|
||||||
|
/* Check that this value doesn't refer to mapi32.dll (eg, as Outlook does) */
|
||||||
|
if (lstrcmpiW(dllPath, mapi32_dll) != 0)
|
||||||
|
{
|
||||||
|
if (dwType == REG_EXPAND_SZ)
|
||||||
|
{
|
||||||
|
DWORD dwExpandLen;
|
||||||
|
LPWSTR dllPathExpanded;
|
||||||
|
|
||||||
|
/* Expand the path if necessary */
|
||||||
|
dwExpandLen = ExpandEnvironmentStringsW(dllPath, NULL, 0);
|
||||||
|
dllPathExpanded = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * dwExpandLen + 1);
|
||||||
|
|
||||||
|
if (dllPathExpanded)
|
||||||
|
{
|
||||||
|
ExpandEnvironmentStringsW(dllPath, dllPathExpanded, dwExpandLen + 1);
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, dllPath);
|
||||||
|
dllPath = dllPathExpanded;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Load the DLL */
|
||||||
|
TRACE("loading %s\n", debugstr_w(dllPath));
|
||||||
|
*mapi_provider = LoadLibraryW(dllPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, dllPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* load_mapi_providers
|
||||||
|
*
|
||||||
|
* Scans the registry for MAPI providers and attempts to load a Simple and
|
||||||
|
* Extended MAPI library.
|
||||||
|
*
|
||||||
|
* Returns TRUE if at least one library loaded, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
void load_mapi_providers(void)
|
||||||
|
{
|
||||||
|
static const WCHAR regkey_mail[] = {
|
||||||
|
'S','o','f','t','w','a','r','e','\\','C','l','i','e','n','t','s','\\',
|
||||||
|
'M','a','i','l',0 };
|
||||||
|
|
||||||
|
static const WCHAR regkey_dllpath[] = {'D','L','L','P','a','t','h',0 };
|
||||||
|
static const WCHAR regkey_dllpath_ex[] = {'D','L','L','P','a','t','h','E','x',0 };
|
||||||
|
static const WCHAR regkey_backslash[] = { '\\', 0 };
|
||||||
|
|
||||||
|
HKEY hkeyMail;
|
||||||
|
DWORD dwType, dwLen = 0;
|
||||||
|
LPWSTR appName = NULL, appKey = NULL;
|
||||||
|
|
||||||
|
TRACE("()\n");
|
||||||
|
|
||||||
|
/* Open the Mail key */
|
||||||
|
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, regkey_mail, 0, KEY_READ, &hkeyMail) != ERROR_SUCCESS)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Check if we have a default value set, and the length of it */
|
||||||
|
if ((RegQueryValueExW(hkeyMail, NULL, NULL, &dwType, NULL, &dwLen) != ERROR_SUCCESS) ||
|
||||||
|
!((dwType == REG_SZ) || (dwType == REG_EXPAND_SZ)) || (dwLen == 0))
|
||||||
|
goto cleanUp;
|
||||||
|
|
||||||
|
appName = HeapAlloc(GetProcessHeap(), 0, dwLen);
|
||||||
|
|
||||||
|
if (!appName)
|
||||||
|
goto cleanUp;
|
||||||
|
|
||||||
|
/* Get the value, and get the path to the app key */
|
||||||
|
RegQueryValueExW(hkeyMail, NULL, NULL, NULL, (LPBYTE)appName, &dwLen);
|
||||||
|
|
||||||
|
TRACE("appName: %s\n", debugstr_w(appName));
|
||||||
|
|
||||||
|
appKey = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * (lstrlenW(regkey_mail) +
|
||||||
|
lstrlenW(regkey_backslash) + lstrlenW(appName)));
|
||||||
|
|
||||||
|
if (!appKey)
|
||||||
|
goto cleanUp;
|
||||||
|
|
||||||
|
lstrcpyW(appKey, regkey_mail);
|
||||||
|
lstrcatW(appKey, regkey_backslash);
|
||||||
|
lstrcatW(appKey, appName);
|
||||||
|
|
||||||
|
RegCloseKey(hkeyMail);
|
||||||
|
|
||||||
|
TRACE("appKey: %s\n", debugstr_w(appKey));
|
||||||
|
|
||||||
|
/* Open the app's key */
|
||||||
|
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, appKey, 0, KEY_READ, &hkeyMail) != ERROR_SUCCESS)
|
||||||
|
goto cleanUp;
|
||||||
|
|
||||||
|
/* Try to load the providers */
|
||||||
|
load_mapi_provider(hkeyMail, regkey_dllpath, &mapi_provider);
|
||||||
|
load_mapi_provider(hkeyMail, regkey_dllpath_ex, &mapi_ex_provider);
|
||||||
|
|
||||||
|
/* Now try to load our function pointers */
|
||||||
|
ZeroMemory(&mapiFunctions, sizeof(mapiFunctions));
|
||||||
|
|
||||||
|
/* Simple MAPI functions */
|
||||||
|
if (mapi_provider)
|
||||||
|
{
|
||||||
|
mapiFunctions.MAPIAddress = (void*) GetProcAddress(mapi_provider, "MAPIAddress");
|
||||||
|
mapiFunctions.MAPIDeleteMail = (void*) GetProcAddress(mapi_provider, "MAPIDeleteMail");
|
||||||
|
mapiFunctions.MAPIDetails = (void*) GetProcAddress(mapi_provider, "MAPIDetails");
|
||||||
|
mapiFunctions.MAPIFindNext = (void*) GetProcAddress(mapi_provider, "MAPIFindNext");
|
||||||
|
mapiFunctions.MAPILogoff = (void*) GetProcAddress(mapi_provider, "MAPILogoff");
|
||||||
|
mapiFunctions.MAPILogon = (void*) GetProcAddress(mapi_provider, "MAPILogon");
|
||||||
|
mapiFunctions.MAPIReadMail = (void*) GetProcAddress(mapi_provider, "MAPIReadMail");
|
||||||
|
mapiFunctions.MAPIResolveName = (void*) GetProcAddress(mapi_provider, "MAPIResolveName");
|
||||||
|
mapiFunctions.MAPISaveMail = (void*) GetProcAddress(mapi_provider, "MAPISaveMail");
|
||||||
|
mapiFunctions.MAPISendDocuments = (void*) GetProcAddress(mapi_provider, "MAPISendDocuments");
|
||||||
|
mapiFunctions.MAPISendMail = (void*) GetProcAddress(mapi_provider, "MAPISendMail");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Extended MAPI functions */
|
||||||
|
if (mapi_ex_provider)
|
||||||
|
{
|
||||||
|
mapiFunctions.MAPIInitialize = (void*) GetProcAddress(mapi_ex_provider, "MAPIInitialize");
|
||||||
|
mapiFunctions.MAPILogonEx = (void*) GetProcAddress(mapi_ex_provider, "MAPILogonEx");
|
||||||
|
mapiFunctions.MAPIUninitialize = (void*) GetProcAddress(mapi_ex_provider, "MAPIUninitialize");
|
||||||
|
|
||||||
|
mapiFunctions.DllGetClassObject = (void*) GetProcAddress(mapi_ex_provider, "DllGetClassObject");
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanUp:
|
||||||
|
RegCloseKey(hkeyMail);
|
||||||
|
HeapFree(GetProcessHeap(), 0, appKey);
|
||||||
|
HeapFree(GetProcessHeap(), 0, appName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* unload_mapi_providers
|
||||||
|
*
|
||||||
|
* Unloads any loaded MAPI libraries.
|
||||||
|
*/
|
||||||
|
void unload_mapi_providers(void)
|
||||||
|
{
|
||||||
|
TRACE("()\n");
|
||||||
|
|
||||||
|
FreeLibrary(mapi_provider);
|
||||||
|
FreeLibrary(mapi_ex_provider);
|
||||||
|
}
|
||||||
|
|
52
reactos/dll/win32/mapi32/util.h
Normal file
52
reactos/dll/win32/mapi32/util.h
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* MAPI utility header file
|
||||||
|
*
|
||||||
|
* Copyright 2009 Owen Rudge for CodeWeavers
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MAPI_UTIL_H
|
||||||
|
|
||||||
|
#define _MAPI_UTIL_H
|
||||||
|
|
||||||
|
#include <mapi.h>
|
||||||
|
#include <mapix.h>
|
||||||
|
|
||||||
|
extern void load_mapi_providers(void);
|
||||||
|
extern void unload_mapi_providers(void);
|
||||||
|
|
||||||
|
typedef struct MAPI_FUNCTIONS {
|
||||||
|
LPMAPIADDRESS MAPIAddress;
|
||||||
|
LPMAPIDELETEMAIL MAPIDeleteMail;
|
||||||
|
LPMAPIDETAILS MAPIDetails;
|
||||||
|
LPMAPIFINDNEXT MAPIFindNext;
|
||||||
|
LPMAPIINITIALIZE MAPIInitialize;
|
||||||
|
LPMAPILOGOFF MAPILogoff;
|
||||||
|
LPMAPILOGON MAPILogon;
|
||||||
|
LPMAPILOGONEX MAPILogonEx;
|
||||||
|
LPMAPIREADMAIL MAPIReadMail;
|
||||||
|
LPMAPIRESOLVENAME MAPIResolveName;
|
||||||
|
LPMAPISAVEMAIL MAPISaveMail;
|
||||||
|
LPMAPISENDMAIL MAPISendMail;
|
||||||
|
LPMAPISENDDOCUMENTS MAPISendDocuments;
|
||||||
|
LPMAPIUNINITIALIZE MAPIUninitialize;
|
||||||
|
|
||||||
|
HRESULT (WINAPI *DllGetClassObject)(REFCLSID, REFIID, LPVOID *);
|
||||||
|
} MAPI_FUNCTIONS;
|
||||||
|
|
||||||
|
extern MAPI_FUNCTIONS mapiFunctions;
|
||||||
|
|
||||||
|
#endif
|
|
@ -18,5 +18,9 @@
|
||||||
|
|
||||||
#define WINE_FILEDESCRIPTION_STR "Wine Messaging API"
|
#define WINE_FILEDESCRIPTION_STR "Wine Messaging API"
|
||||||
#define WINE_FILENAME_STR "mapi32.dll"
|
#define WINE_FILENAME_STR "mapi32.dll"
|
||||||
|
#define WINE_FILEVERSION 1,0,0,0
|
||||||
|
#define WINE_FILEVERSION_STR "1.0.0.0"
|
||||||
|
#define WINE_PRODUCTVERSION 1,0,0,0
|
||||||
|
#define WINE_PRODUCTVERSION_STR "1.0.0.0"
|
||||||
|
|
||||||
#include "wine/wine_common_ver.rc"
|
#include "wine/wine_common_ver.rc"
|
||||||
|
|
|
@ -3365,6 +3365,12 @@ MenuTrackMenu(HMENU Menu, UINT Flags, INT x, INT y,
|
||||||
Menu, Flags, x, y, Wnd, Rect ? Rect->left : 0, Rect ? Rect->top : 0,
|
Menu, Flags, x, y, Wnd, Rect ? Rect->left : 0, Rect ? Rect->top : 0,
|
||||||
Rect ? Rect->right : 0, Rect ? Rect->bottom : 0);
|
Rect ? Rect->right : 0, Rect ? Rect->bottom : 0);
|
||||||
|
|
||||||
|
if (!IsMenu(Menu))
|
||||||
|
{
|
||||||
|
SetLastError( ERROR_INVALID_MENU_HANDLE );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
fEndMenu = FALSE;
|
fEndMenu = FALSE;
|
||||||
if (! MenuGetRosMenuInfo(&MenuInfo, Menu))
|
if (! MenuGetRosMenuInfo(&MenuInfo, Menu))
|
||||||
{
|
{
|
||||||
|
@ -3516,17 +3522,12 @@ MenuTrackMenu(HMENU Menu, UINT Flags, INT x, INT y,
|
||||||
{
|
{
|
||||||
MenuSelectItem(Mt.OwnerWnd, &MenuInfo, NO_SELECTED_ITEM,
|
MenuSelectItem(Mt.OwnerWnd, &MenuInfo, NO_SELECTED_ITEM,
|
||||||
FALSE, 0 );
|
FALSE, 0 );
|
||||||
}
|
|
||||||
/* fall through */
|
|
||||||
|
|
||||||
case VK_UP:
|
|
||||||
if (MenuGetRosMenuInfo(&MenuInfo, Mt.CurrentMenu))
|
|
||||||
{
|
|
||||||
MenuMoveSelection(Mt.OwnerWnd, &MenuInfo,
|
MenuMoveSelection(Mt.OwnerWnd, &MenuInfo,
|
||||||
VK_HOME == Msg.wParam ? ITEM_NEXT : ITEM_PREV);
|
VK_HOME == Msg.wParam ? ITEM_NEXT : ITEM_PREV);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case VK_UP:
|
||||||
case VK_DOWN: /* If on menu bar, pull-down the menu */
|
case VK_DOWN: /* If on menu bar, pull-down the menu */
|
||||||
if (MenuGetRosMenuInfo(&MenuInfo, Mt.CurrentMenu))
|
if (MenuGetRosMenuInfo(&MenuInfo, Mt.CurrentMenu))
|
||||||
{
|
{
|
||||||
|
@ -3682,6 +3683,11 @@ MenuTrackMenu(HMENU Menu, UINT Flags, INT x, INT y,
|
||||||
{
|
{
|
||||||
DestroyWindow(MenuInfo.Wnd);
|
DestroyWindow(MenuInfo.Wnd);
|
||||||
MenuInfo.Wnd = NULL;
|
MenuInfo.Wnd = NULL;
|
||||||
|
|
||||||
|
if (!(MenuInfo.Flags & TPM_NONOTIFY))
|
||||||
|
SendMessageW( Mt.OwnerWnd, WM_UNINITMENUPOPUP, (WPARAM)Mt.TopMenu,
|
||||||
|
MAKELPARAM(0, IS_SYSTEM_MENU(&MenuInfo)) );
|
||||||
|
|
||||||
}
|
}
|
||||||
MenuSelectItem(Mt.OwnerWnd, &MenuInfo, NO_SELECTED_ITEM, FALSE, NULL);
|
MenuSelectItem(Mt.OwnerWnd, &MenuInfo, NO_SELECTED_ITEM, FALSE, NULL);
|
||||||
}
|
}
|
||||||
|
@ -5183,6 +5189,12 @@ TrackPopupMenu(
|
||||||
{
|
{
|
||||||
BOOL ret = FALSE;
|
BOOL ret = FALSE;
|
||||||
|
|
||||||
|
if (!IsMenu(Menu))
|
||||||
|
{
|
||||||
|
SetLastError( ERROR_INVALID_MENU_HANDLE );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
MenuInitTracking(Wnd, Menu, TRUE, Flags);
|
MenuInitTracking(Wnd, Menu, TRUE, Flags);
|
||||||
|
|
||||||
/* Send WM_INITMENUPOPUP message only if TPM_NONOTIFY flag is not specified */
|
/* Send WM_INITMENUPOPUP message only if TPM_NONOTIFY flag is not specified */
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 1998 Justin Bradford
|
* Copyright (C) 1998 Justin Bradford
|
||||||
|
* Copyright (c) 2009 Owen Rudge for CodeWeavers
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -83,25 +84,19 @@ typedef struct IAddrBook IAddrBook;
|
||||||
typedef IAddrBook *LPADRBOOK;
|
typedef IAddrBook *LPADRBOOK;
|
||||||
typedef struct IABContainer IABContainer;
|
typedef struct IABContainer IABContainer;
|
||||||
typedef IABContainer *LPABCONT;
|
typedef IABContainer *LPABCONT;
|
||||||
typedef struct IAttach IAttach;
|
typedef struct IAttach *LPATTACH;
|
||||||
typedef IAttach *LPATTACH;
|
|
||||||
typedef struct IDistList IDistList;
|
typedef struct IDistList IDistList;
|
||||||
typedef IDistList *LPDISTLIST;
|
typedef IDistList *LPDISTLIST;
|
||||||
typedef struct IMailUser IMailUser;
|
typedef struct IMailUser IMailUser;
|
||||||
typedef IMailUser *LPMAILUSER;
|
typedef IMailUser *LPMAILUSER;
|
||||||
typedef struct IMAPIAdviseSink *LPMAPIADVISESINK;
|
typedef struct IMAPIAdviseSink *LPMAPIADVISESINK;
|
||||||
typedef struct IMAPIContainer IMAPIContainer;
|
typedef struct IMAPIContainer *LPMAPICONTAINER;
|
||||||
typedef IMAPIContainer *LPMAPICONTAINER;
|
typedef struct IMAPIFolder *LPMAPIFOLDER;
|
||||||
typedef struct IMAPIFolder IMAPIFolder;
|
|
||||||
typedef IMAPIFolder *LPMAPIFOLDER;
|
|
||||||
typedef struct IMAPIProgress IMAPIProgress;
|
typedef struct IMAPIProgress IMAPIProgress;
|
||||||
typedef IMAPIProgress *LPMAPIPROGRESS;
|
typedef IMAPIProgress *LPMAPIPROGRESS;
|
||||||
typedef struct IMAPIStatus IMAPIStatus;
|
typedef struct IMAPIStatus IMAPIStatus;
|
||||||
typedef IMAPIStatus *LPMAPISTATUS;
|
typedef IMAPIStatus *LPMAPISTATUS;
|
||||||
typedef struct IMessage IMessage;
|
typedef struct IMessage *LPMESSAGE;
|
||||||
typedef IMessage *LPMESSAGE;
|
|
||||||
typedef struct IMsgStore IMsgStore;
|
|
||||||
typedef IMsgStore *LPMDB;
|
|
||||||
typedef struct IProfSect IProfSect;
|
typedef struct IProfSect IProfSect;
|
||||||
typedef IProfSect *LPPROFSECT;
|
typedef IProfSect *LPPROFSECT;
|
||||||
typedef struct IProviderAdmin IProviderAdmin;
|
typedef struct IProviderAdmin IProviderAdmin;
|
||||||
|
@ -156,12 +151,14 @@ typedef struct _MAPIUID
|
||||||
|
|
||||||
/* Flags for various calls */
|
/* Flags for various calls */
|
||||||
#define MAPI_MODIFY 0x00000001U /* Object can be modified */
|
#define MAPI_MODIFY 0x00000001U /* Object can be modified */
|
||||||
|
#define MAPI_CREATE 0x00000002U /* Object can be created */
|
||||||
#define MAPI_ACCESS_MODIFY MAPI_MODIFY /* Want write access */
|
#define MAPI_ACCESS_MODIFY MAPI_MODIFY /* Want write access */
|
||||||
#define MAPI_ACCESS_READ 0x00000002U /* Want read access */
|
#define MAPI_ACCESS_READ 0x00000002U /* Want read access */
|
||||||
#define MAPI_ACCESS_DELETE 0x00000004U /* Want delete access */
|
#define MAPI_ACCESS_DELETE 0x00000004U /* Want delete access */
|
||||||
#define MAPI_ACCESS_CREATE_HIERARCHY 0x00000008U
|
#define MAPI_ACCESS_CREATE_HIERARCHY 0x00000008U
|
||||||
#define MAPI_ACCESS_CREATE_CONTENTS 0x00000010U
|
#define MAPI_ACCESS_CREATE_CONTENTS 0x00000010U
|
||||||
#define MAPI_ACCESS_CREATE_ASSOCIATED 0x00000020U
|
#define MAPI_ACCESS_CREATE_ASSOCIATED 0x00000020U
|
||||||
|
#define MAPI_USE_DEFAULT 0x00000040U
|
||||||
#define MAPI_UNICODE 0x80000000U /* Strings in this call are Unicode */
|
#define MAPI_UNICODE 0x80000000U /* Strings in this call are Unicode */
|
||||||
|
|
||||||
#if defined (UNICODE) || defined (__WINESRC__)
|
#if defined (UNICODE) || defined (__WINESRC__)
|
||||||
|
@ -170,6 +167,9 @@ typedef struct _MAPIUID
|
||||||
#define fMapiUnicode 0U
|
#define fMapiUnicode 0U
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* IMAPISession::OpenMessageStore() flags */
|
||||||
|
#define MDB_NO_DIALOG 0x00000001
|
||||||
|
|
||||||
/* Types of message receivers */
|
/* Types of message receivers */
|
||||||
#ifndef MAPI_ORIG
|
#ifndef MAPI_ORIG
|
||||||
#define MAPI_ORIG 0 /* The original author */
|
#define MAPI_ORIG 0 /* The original author */
|
||||||
|
@ -761,6 +761,9 @@ typedef struct _NOTIFICATION
|
||||||
typedef LONG (WINAPI NOTIFCALLBACK)(LPVOID,ULONG,LPNOTIFICATION);
|
typedef LONG (WINAPI NOTIFCALLBACK)(LPVOID,ULONG,LPNOTIFICATION);
|
||||||
typedef NOTIFCALLBACK *LPNOTIFCALLBACK;
|
typedef NOTIFCALLBACK *LPNOTIFCALLBACK;
|
||||||
|
|
||||||
|
/* IMAPIContainer::OpenEntry flags */
|
||||||
|
#define MAPI_BEST_ACCESS 0x00000010
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* IMAPITable interface
|
* IMAPITable interface
|
||||||
*
|
*
|
||||||
|
@ -895,21 +898,263 @@ DECLARE_INTERFACE_(IMAPIProp,IUnknown)
|
||||||
#define IMAPIProp_AddRef(p) (p)->lpVtbl->AddRef(p)
|
#define IMAPIProp_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||||
#define IMAPIProp_Release(p) (p)->lpVtbl->Release(p)
|
#define IMAPIProp_Release(p) (p)->lpVtbl->Release(p)
|
||||||
/*** IMAPIProp methods ***/
|
/*** IMAPIProp methods ***/
|
||||||
#define IMAPIProp_GetLastError(p,a,b,c) (p)->lpVtbl->GetLastError(p,a,b,c)
|
#define IMAPIProp_GetLastError(p,a,b,c) (p)->lpVtbl->GetLastError(p,a,b,c)
|
||||||
#define IMAPIProp_SaveChanges(p,a) (p)->lpVtbl->SaveChanges(p,a)
|
#define IMAPIProp_SaveChanges(p,a) (p)->lpVtbl->SaveChanges(p,a)
|
||||||
#define IMAPIProp_GetProps(p,a,b,c,d) (p)->lpVtbl->GetProps(p,a,b,c,d)
|
#define IMAPIProp_GetProps(p,a,b,c,d) (p)->lpVtbl->GetProps(p,a,b,c,d)
|
||||||
#define IMAPIProp_GetPropList(p,a,b) (p)->lpVtbl->GetPropList(p,a,b)
|
#define IMAPIProp_GetPropList(p,a,b) (p)->lpVtbl->GetPropList(p,a,b)
|
||||||
#define IMAPIProp_OpenProperty(p,a,b,c,d,e) (p)->lpVtbl->OpenProperty(p,a,b,c,d,e)
|
#define IMAPIProp_OpenProperty(p,a,b,c,d,e) (p)->lpVtbl->OpenProperty(p,a,b,c,d,e)
|
||||||
#define IMAPIProp_SetProps(p,a,b,c) (p)->lpVtbl->SetProps(p,a,b,c)
|
#define IMAPIProp_SetProps(p,a,b,c) (p)->lpVtbl->SetProps(p,a,b,c)
|
||||||
#define IMAPIProp_DeleteProps(p,a,b) (p)->lpVtbl->DeleteProps(p,a,b)
|
#define IMAPIProp_DeleteProps(p,a,b) (p)->lpVtbl->DeleteProps(p,a,b)
|
||||||
#define IMAPIProp_CopyTo(p,a,b,c,d,e,f,g,h,i) (p)->lpVtbl->CopyTo(p,a,b,c,d,e,f,g,h,i)
|
#define IMAPIProp_CopyTo(p,a,b,c,d,e,f,g,h,i) (p)->lpVtbl->CopyTo(p,a,b,c,d,e,f,g,h,i)
|
||||||
#define IMAPIProp_CopyProps(p,a,b,c,d,e,f,g) (p)->lpVtbl->CopyProps(p,a,b,c,d,e,f,g)
|
#define IMAPIProp_CopyProps(p,a,b,c,d,e,f,g) (p)->lpVtbl->CopyProps(p,a,b,c,d,e,f,g)
|
||||||
#define IMAPIProp_GetNamesFromIDs(p,a,b,c,d,e) (p)->lpVtbl->GetNamesFromIDs(p,a,b,c,d,e)
|
#define IMAPIProp_GetNamesFromIDs(p,a,b,c,d,e) (p)->lpVtbl->GetNamesFromIDs(p,a,b,c,d,e)
|
||||||
#define IMAPIProp_GetIDsFromNames(p,a,b,c,d) (p)->lpVtbl->GetIDsFromNames(p,a,b,c,d)
|
#define IMAPIProp_GetIDsFromNames(p,a,b,c,d) (p)->lpVtbl->GetIDsFromNames(p,a,b,c,d)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef IMAPIProp *LPMAPIPROP;
|
typedef IMAPIProp *LPMAPIPROP;
|
||||||
|
|
||||||
|
#define KEEP_OPEN_READONLY (0x00000001U)
|
||||||
|
#define KEEP_OPEN_READWRITE (0x00000002U)
|
||||||
|
#define FORCE_SAVE (0x00000004U)
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* IMsgStore interface
|
||||||
|
*/
|
||||||
|
#define INTERFACE IMsgStore
|
||||||
|
DECLARE_INTERFACE_(IMsgStore,IMAPIProp)
|
||||||
|
{
|
||||||
|
/*** IUnknown methods ***/
|
||||||
|
STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
|
||||||
|
STDMETHOD_(ULONG,AddRef)(THIS) PURE;
|
||||||
|
STDMETHOD_(ULONG,Release)(THIS) PURE;
|
||||||
|
/*** IMAPIProp methods ***/
|
||||||
|
STDMETHOD(GetLastError)(THIS_ HRESULT hRes, ULONG ulFlags, LPMAPIERROR *lppErr) PURE;
|
||||||
|
STDMETHOD(SaveChanges)(THIS_ ULONG ulFlags) PURE;
|
||||||
|
STDMETHOD(GetProps)(THIS_ LPSPropTagArray lpPropTags, ULONG ulFlags, ULONG *lpValues, LPSPropValue *lppProps) PURE;
|
||||||
|
STDMETHOD(GetPropList)(THIS_ ULONG ulFlags, LPSPropTagArray *lppPropTagArray) PURE;
|
||||||
|
STDMETHOD(OpenProperty)(THIS_ ULONG ulPropTag, LPCIID lpIid, ULONG ulOpts, ULONG ulFlags, LPUNKNOWN *lppUnk) PURE;
|
||||||
|
STDMETHOD(SetProps)(THIS_ ULONG cValues, LPSPropValue lpProps, LPSPropProblemArray *lppProbs) PURE;
|
||||||
|
STDMETHOD(DeleteProps)(THIS_ LPSPropTagArray lpPropTags, LPSPropProblemArray *lppProbs) PURE;
|
||||||
|
STDMETHOD(CopyTo)(THIS_ ULONG ciidExclude, LPCIID lpIid, LPSPropTagArray lpProps, ULONG ulParam,
|
||||||
|
LPMAPIPROGRESS lpProgress, LPCIID lpIface,LPVOID lpDest, ULONG ulFlags,
|
||||||
|
LPSPropProblemArray *lppProbs) PURE;
|
||||||
|
STDMETHOD(CopyProps)(THIS_ LPSPropTagArray lpIncludeProps, ULONG ulParam, LPMAPIPROGRESS lpProgress,
|
||||||
|
LPCIID lpIid, LPVOID lpDestObj, ULONG ulFlags, LPSPropProblemArray *lppProblems) PURE;
|
||||||
|
STDMETHOD(GetNamesFromIDs)(THIS_ LPSPropTagArray *lppPropTags, LPGUID lpIid, ULONG ulFlags, ULONG *lpCount,
|
||||||
|
LPMAPINAMEID **lpppNames) PURE;
|
||||||
|
STDMETHOD(GetIDsFromNames)(THIS_ ULONG cPropNames, LPMAPINAMEID *lppNames, ULONG ulFlags, LPSPropTagArray *lppPropTags) PURE;
|
||||||
|
/*** IMsgStore methods ***/
|
||||||
|
STDMETHOD(Advise)(THIS_ ULONG cbEntryID, LPENTRYID lpEntryID, ULONG ulEventMask, LPMAPIADVISESINK lpAdviseSink,
|
||||||
|
ULONG * lpulConnection) PURE;
|
||||||
|
STDMETHOD(Unadvise)(THIS_ ULONG ulConnection) PURE;
|
||||||
|
STDMETHOD(CompareEntryIDs)(THIS_ ULONG cbEntryID1, LPENTRYID lpEntryID1, ULONG cbEntryID2, LPENTRYID lpEntryID2,
|
||||||
|
ULONG ulFlags, ULONG * lpulResult) PURE;
|
||||||
|
STDMETHOD(OpenEntry)(THIS_ ULONG cbEntryID, LPENTRYID lpEntryID, LPCIID lpInterface, ULONG ulFlags, ULONG *lpulObjType,
|
||||||
|
LPUNKNOWN *lppUnk) PURE;
|
||||||
|
STDMETHOD(SetReceiveFolder)(THIS_ LPSTR lpszMessageClass, ULONG ulFlags, ULONG cbEntryID, LPENTRYID lpEntryID) PURE;
|
||||||
|
STDMETHOD(GetReceiveFolder)(THIS_ LPSTR lpszMessageClass, ULONG ulFlags, ULONG * lpcbEntryID, LPENTRYID *lppEntryID,
|
||||||
|
LPSTR *lppszExplicitClass) PURE;
|
||||||
|
STDMETHOD(GetReceiveFolderTable)(THIS_ ULONG ulFlags, LPMAPITABLE * lppTable) PURE;
|
||||||
|
STDMETHOD(StoreLogoff)(THIS_ ULONG * lpulFlags) PURE;
|
||||||
|
STDMETHOD(AbortSubmit)(THIS_ ULONG cbEntryID, LPENTRYID lpEntryID, ULONG ulFlags) PURE;
|
||||||
|
STDMETHOD(GetOutgoingQueue)(THIS_ ULONG ulFlags, LPMAPITABLE * lppTable) PURE;
|
||||||
|
STDMETHOD(SetLockState)(THIS_ LPMESSAGE lpMessage, ULONG ulLockState) PURE;
|
||||||
|
STDMETHOD(FinishedMsg)(THIS_ ULONG ulFlags, ULONG cbEntryID, LPENTRYID lpEntryID) PURE;
|
||||||
|
STDMETHOD(NotifyNewMail)(THIS_ LPNOTIFICATION lpNotification) PURE;
|
||||||
|
};
|
||||||
|
#undef INTERFACE
|
||||||
|
|
||||||
|
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||||
|
/*** IUnknown methods ***/
|
||||||
|
#define IMsgStore_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
|
||||||
|
#define IMsgStore_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||||
|
#define IMsgStore_Release(p) (p)->lpVtbl->Release(p)
|
||||||
|
/*** IMAPIProp methods ***/
|
||||||
|
#define IMsgStore_GetLastError(p,a,b,c) (p)->lpVtbl->GetLastError(p,a,b,c)
|
||||||
|
#define IMsgStore_SaveChanges(p,a) (p)->lpVtbl->SaveChanges(p,a)
|
||||||
|
#define IMsgStore_GetProps(p,a,b,c,d) (p)->lpVtbl->GetProps(p,a,b,c,d)
|
||||||
|
#define IMsgStore_GetPropList(p,a,b) (p)->lpVtbl->GetPropList(p,a,b)
|
||||||
|
#define IMsgStore_OpenProperty(p,a,b,c,d,e) (p)->lpVtbl->OpenProperty(p,a,b,c,d,e)
|
||||||
|
#define IMsgStore_SetProps(p,a,b,c) (p)->lpVtbl->SetProps(p,a,b,c)
|
||||||
|
#define IMsgStore_DeleteProps(p,a,b) (p)->lpVtbl->DeleteProps(p,a,b)
|
||||||
|
#define IMsgStore_CopyTo(p,a,b,c,d,e,f,g,h,i) (p)->lpVtbl->CopyTo(p,a,b,c,d,e,f,g,h,i)
|
||||||
|
#define IMsgStore_CopyProps(p,a,b,c,d,e,f,g) (p)->lpVtbl->CopyProps(p,a,b,c,d,e,f,g)
|
||||||
|
#define IMsgStore_GetNamesFromIDs(p,a,b,c,d,e) (p)->lpVtbl->GetNamesFromIDs(p,a,b,c,d,e)
|
||||||
|
#define IMsgStore_GetIDsFromNames(p,a,b,c,d) (p)->lpVtbl->GetIDsFromNames(p,a,b,c,d)
|
||||||
|
/*** IMsgStore methods ***/
|
||||||
|
#define IMsgStore_Advise(p,a,b,c,d,e) (p)->lpVtbl->Advise(p,a,b,c,d,e)
|
||||||
|
#define IMsgStore_Unadvise(p,a) (p)->lpVtbl->Unadvise(p,a)
|
||||||
|
#define IMsgStore_CompareEntryIDs(p,a,b,c,d,e,f) (p)->lpVtbl->CompareEntryIDs(p,a,b,c,d,e,f)
|
||||||
|
#define IMsgStore_OpenEntry(p,a,b,c,d,e,f) (p)->lpVtbl->OpenEntry(p,a,b,c,d,e,f)
|
||||||
|
#define IMsgStore_SetReceiveFolder(p,a,b,c,d) (p)->lpVtbl->SetReceiveFolder(p,a,b,c,d)
|
||||||
|
#define IMsgStore_GetReceiveFolder(p,a,b,c,d,e) (p)->lpVtbl->GetReceiveFolder(p,a,b,c,d,e)
|
||||||
|
#define IMsgStore_GetReceiveFolderTable(p,a,b) (p)->lpVtbl->GetReceiveFolderTable(p,a,b)
|
||||||
|
#define IMsgStore_StoreLogoff(p,a) (p)->lpVtbl->StoreLogoff(p,a)
|
||||||
|
#define IMsgStore_AbortSubmit(p,a,b,c) (p)->lpVtbl->AbortSubmit(p,a,b,c)
|
||||||
|
#define IMsgStore_GetOutgoingQueue(p,a,b) (p)->lpVtbl->GetOutgoingQueue(p,a,b)
|
||||||
|
#define IMsgStore_SetLockState(p,a,b) (p)->lpVtbl->SetLockState(p,a,b)
|
||||||
|
#define IMsgStore_FinishedMsg(p,a,b,c) (p)->lpVtbl->FinishedMsg(p,a,b,c)
|
||||||
|
#define IMsgStore_NotifyNewMail(p,a) (p)->lpVtbl->NotifyNewMail(p,a)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef IMsgStore *LPMDB;
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* IMAPIContainer interface
|
||||||
|
*/
|
||||||
|
#define INTERFACE IMAPIContainer
|
||||||
|
DECLARE_INTERFACE_(IMAPIContainer,IMAPIProp)
|
||||||
|
{
|
||||||
|
/*** IUnknown methods ***/
|
||||||
|
STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
|
||||||
|
STDMETHOD_(ULONG,AddRef)(THIS) PURE;
|
||||||
|
STDMETHOD_(ULONG,Release)(THIS) PURE;
|
||||||
|
/*** IMAPIProp methods ***/
|
||||||
|
STDMETHOD(GetLastError)(THIS_ HRESULT hRes, ULONG ulFlags, LPMAPIERROR *lppErr) PURE;
|
||||||
|
STDMETHOD(SaveChanges)(THIS_ ULONG ulFlags) PURE;
|
||||||
|
STDMETHOD(GetProps)(THIS_ LPSPropTagArray lpPropTags, ULONG ulFlags, ULONG *lpValues, LPSPropValue *lppProps) PURE;
|
||||||
|
STDMETHOD(GetPropList)(THIS_ ULONG ulFlags, LPSPropTagArray *lppPropTagArray) PURE;
|
||||||
|
STDMETHOD(OpenProperty)(THIS_ ULONG ulPropTag, LPCIID lpIid, ULONG ulOpts, ULONG ulFlags, LPUNKNOWN *lppUnk) PURE;
|
||||||
|
STDMETHOD(SetProps)(THIS_ ULONG cValues, LPSPropValue lpProps, LPSPropProblemArray *lppProbs) PURE;
|
||||||
|
STDMETHOD(DeleteProps)(THIS_ LPSPropTagArray lpPropTags, LPSPropProblemArray *lppProbs) PURE;
|
||||||
|
STDMETHOD(CopyTo)(THIS_ ULONG ciidExclude, LPCIID lpIid, LPSPropTagArray lpProps, ULONG ulParam,
|
||||||
|
LPMAPIPROGRESS lpProgress, LPCIID lpIface,LPVOID lpDest, ULONG ulFlags,
|
||||||
|
LPSPropProblemArray *lppProbs) PURE;
|
||||||
|
STDMETHOD(CopyProps)(THIS_ LPSPropTagArray lpIncludeProps, ULONG ulParam, LPMAPIPROGRESS lpProgress,
|
||||||
|
LPCIID lpIid, LPVOID lpDestObj, ULONG ulFlags, LPSPropProblemArray *lppProblems) PURE;
|
||||||
|
STDMETHOD(GetNamesFromIDs)(THIS_ LPSPropTagArray *lppPropTags, LPGUID lpIid, ULONG ulFlags, ULONG *lpCount,
|
||||||
|
LPMAPINAMEID **lpppNames) PURE;
|
||||||
|
STDMETHOD(GetIDsFromNames)(THIS_ ULONG cPropNames, LPMAPINAMEID *lppNames, ULONG ulFlags, LPSPropTagArray *lppPropTags) PURE;
|
||||||
|
/*** IMAPIContainer methods ***/
|
||||||
|
STDMETHOD(GetContentsTable)(THIS_ ULONG ulFlags, LPMAPITABLE * lppTable) PURE;
|
||||||
|
STDMETHOD(GetHierarchyTable)(THIS_ ULONG ulFlags, LPMAPITABLE * lppTable) PURE;
|
||||||
|
STDMETHOD(OpenEntry)(THIS_ ULONG cbEntryID, LPENTRYID lpEntryID, LPCIID lpInterface, ULONG ulFlags,
|
||||||
|
ULONG * lpulObjType, LPUNKNOWN * lppUnk) PURE;
|
||||||
|
STDMETHOD(SetSearchCriteria)(THIS_ LPSRestriction lpRestriction, LPENTRYLIST lpContainerList, ULONG ulSearchFlags) PURE;
|
||||||
|
STDMETHOD(GetSearchCriteria)(THIS_ ULONG ulFlags, LPSRestriction * lppRestriction, LPENTRYLIST * lppContainerList,
|
||||||
|
ULONG * lpulSearchState) PURE;
|
||||||
|
};
|
||||||
|
#undef INTERFACE
|
||||||
|
|
||||||
|
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||||
|
/*** IUnknown methods ***/
|
||||||
|
#define IMAPIContainer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
|
||||||
|
#define IMAPIContainer_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||||
|
#define IMAPIContainer_Release(p) (p)->lpVtbl->Release(p)
|
||||||
|
/*** IMAPIProp methods ***/
|
||||||
|
#define IMAPIContainer_GetLastError(p,a,b,c) (p)->lpVtbl->GetLastError(p,a,b,c)
|
||||||
|
#define IMAPIContainer_SaveChanges(p,a) (p)->lpVtbl->SaveChanges(p,a)
|
||||||
|
#define IMAPIContainer_GetProps(p,a,b,c,d) (p)->lpVtbl->GetProps(p,a,b,c,d)
|
||||||
|
#define IMAPIContainer_GetPropList(p,a,b) (p)->lpVtbl->GetPropList(p,a,b)
|
||||||
|
#define IMAPIContainer_OpenProperty(p,a,b,c,d,e) (p)->lpVtbl->OpenProperty(p,a,b,c,d,e)
|
||||||
|
#define IMAPIContainer_SetProps(p,a,b,c) (p)->lpVtbl->SetProps(p,a,b,c)
|
||||||
|
#define IMAPIContainer_DeleteProps(p,a,b) (p)->lpVtbl->DeleteProps(p,a,b)
|
||||||
|
#define IMAPIContainer_CopyTo(p,a,b,c,d,e,f,g,h,i) (p)->lpVtbl->CopyTo(p,a,b,c,d,e,f,g,h,i)
|
||||||
|
#define IMAPIContainer_CopyProps(p,a,b,c,d,e,f,g) (p)->lpVtbl->CopyProps(p,a,b,c,d,e,f,g)
|
||||||
|
#define IMAPIContainer_GetNamesFromIDs(p,a,b,c,d,e) (p)->lpVtbl->GetNamesFromIDs(p,a,b,c,d,e)
|
||||||
|
#define IMAPIContainer_GetIDsFromNames(p,a,b,c,d) (p)->lpVtbl->GetIDsFromNames(p,a,b,c,d)
|
||||||
|
/*** IMAPIContainer methods ***/
|
||||||
|
#define IMAPIContainer_GetContentsTable(p,a,b) (p)->lpVtbl->GetContentsTable(p,a,b)
|
||||||
|
#define IMAPIContainer_GetHierarchyTable(p,a,b) (p)->lpVtbl->GetHierarchyTable(p,a,b)
|
||||||
|
#define IMAPIContainer_OpenEntry(p,a,b,c,d,e,f) (p)->lpVtbl->OpenEntry(p,a,b,c,d,e,f)
|
||||||
|
#define IMAPIContainer_SetSearchCriteria(p,a,b,c) (p)->lpVtbl->SetSearchCriteria(p,a,b,c)
|
||||||
|
#define IMAPIContainer_GetSearchCriteria(p,a,b,c,d) (p)->lpVtbl->GetSearchCriteria(p,a,b,c,d)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* IMAPIFolder interface
|
||||||
|
*/
|
||||||
|
#define INTERFACE IMAPIFolder
|
||||||
|
DECLARE_INTERFACE_(IMAPIFolder,IMAPIContainer)
|
||||||
|
{
|
||||||
|
/*** IUnknown methods ***/
|
||||||
|
STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
|
||||||
|
STDMETHOD_(ULONG,AddRef)(THIS) PURE;
|
||||||
|
STDMETHOD_(ULONG,Release)(THIS) PURE;
|
||||||
|
/*** IMAPIProp methods ***/
|
||||||
|
STDMETHOD(GetLastError)(THIS_ HRESULT hRes, ULONG ulFlags, LPMAPIERROR *lppErr) PURE;
|
||||||
|
STDMETHOD(SaveChanges)(THIS_ ULONG ulFlags) PURE;
|
||||||
|
STDMETHOD(GetProps)(THIS_ LPSPropTagArray lpPropTags, ULONG ulFlags, ULONG *lpValues, LPSPropValue *lppProps) PURE;
|
||||||
|
STDMETHOD(GetPropList)(THIS_ ULONG ulFlags, LPSPropTagArray *lppPropTagArray) PURE;
|
||||||
|
STDMETHOD(OpenProperty)(THIS_ ULONG ulPropTag, LPCIID lpIid, ULONG ulOpts, ULONG ulFlags, LPUNKNOWN *lppUnk) PURE;
|
||||||
|
STDMETHOD(SetProps)(THIS_ ULONG cValues, LPSPropValue lpProps, LPSPropProblemArray *lppProbs) PURE;
|
||||||
|
STDMETHOD(DeleteProps)(THIS_ LPSPropTagArray lpPropTags, LPSPropProblemArray *lppProbs) PURE;
|
||||||
|
STDMETHOD(CopyTo)(THIS_ ULONG ciidExclude, LPCIID lpIid, LPSPropTagArray lpProps, ULONG ulParam,
|
||||||
|
LPMAPIPROGRESS lpProgress, LPCIID lpIface,LPVOID lpDest, ULONG ulFlags,
|
||||||
|
LPSPropProblemArray *lppProbs) PURE;
|
||||||
|
STDMETHOD(CopyProps)(THIS_ LPSPropTagArray lpIncludeProps, ULONG ulParam, LPMAPIPROGRESS lpProgress,
|
||||||
|
LPCIID lpIid, LPVOID lpDestObj, ULONG ulFlags, LPSPropProblemArray *lppProblems) PURE;
|
||||||
|
STDMETHOD(GetNamesFromIDs)(THIS_ LPSPropTagArray *lppPropTags, LPGUID lpIid, ULONG ulFlags, ULONG *lpCount,
|
||||||
|
LPMAPINAMEID **lpppNames) PURE;
|
||||||
|
STDMETHOD(GetIDsFromNames)(THIS_ ULONG cPropNames, LPMAPINAMEID *lppNames, ULONG ulFlags, LPSPropTagArray *lppPropTags) PURE;
|
||||||
|
/*** IMAPIContainer methods ***/
|
||||||
|
STDMETHOD(GetContentsTable)(THIS_ ULONG ulFlags, LPMAPITABLE * lppTable) PURE;
|
||||||
|
STDMETHOD(GetHierarchyTable)(THIS_ ULONG ulFlags, LPMAPITABLE * lppTable) PURE;
|
||||||
|
STDMETHOD(OpenEntry)(THIS_ ULONG cbEntryID, LPENTRYID lpEntryID, LPCIID lpInterface, ULONG ulFlags,
|
||||||
|
ULONG * lpulObjType, LPUNKNOWN * lppUnk) PURE;
|
||||||
|
STDMETHOD(SetSearchCriteria)(THIS_ LPSRestriction lpRestriction, LPENTRYLIST lpContainerList, ULONG ulSearchFlags) PURE;
|
||||||
|
STDMETHOD(GetSearchCriteria)(THIS_ ULONG ulFlags, LPSRestriction * lppRestriction, LPENTRYLIST * lppContainerList,
|
||||||
|
ULONG * lpulSearchState) PURE;
|
||||||
|
/*** IMAPIFolder methods ***/
|
||||||
|
STDMETHOD(CreateMessage)(THIS_ LPCIID lpInterface, ULONG ulFlags, LPMESSAGE *lppMessage) PURE;
|
||||||
|
STDMETHOD(CopyMessages)(THIS_ LPENTRYLIST lpMsgList, LPCIID lpInterface, LPVOID lpDestFolder, ULONG ulUIParam,
|
||||||
|
LPMAPIPROGRESS lpProgress, ULONG ulFlags) PURE;
|
||||||
|
STDMETHOD(DeleteMessages)(THIS_ LPENTRYLIST lpMsgList, ULONG ulUIParam, LPMAPIPROGRESS lpProgress, ULONG ulFlags) PURE;
|
||||||
|
STDMETHOD(CreateFolder)(THIS_ ULONG ulFolderType, LPSTR lpszFolderName, LPSTR lpszFolderComment, LPCIID lpInterface,
|
||||||
|
ULONG ulFlags, LPMAPIFOLDER lppFolder) PURE;
|
||||||
|
STDMETHOD(CopyFolder)(THIS_ ULONG cbEntryID, LPENTRYID lpEntryID, LPCIID lpInterface, LPVOID lpDestFolder,
|
||||||
|
LPSTR lpszNewFolderName, ULONG ulUIParam, LPMAPIPROGRESS lpProgress, ULONG ulFlags) PURE;
|
||||||
|
STDMETHOD(DeleteFolder)(THIS_ ULONG cbEntryID, LPENTRYID lpEntryID, ULONG ulUIParam, LPMAPIPROGRESS lpProgress,
|
||||||
|
ULONG ulFlags) PURE;
|
||||||
|
STDMETHOD(SetReadFlags)(THIS_ LPENTRYLIST lpMsgList, ULONG ulUIParam, LPMAPIPROGRESS lpProgress, ULONG ulFlags) PURE;
|
||||||
|
STDMETHOD(GetMessageStatus)(THIS_ ULONG cbEntryID, LPENTRYID lpEntryID, ULONG ulFlags, ULONG * lpulMessageStatus) PURE;
|
||||||
|
STDMETHOD(SetMessageStatus)(THIS_ ULONG cbEntryID, LPENTRYID lpEntryID, ULONG ulNewStatus,
|
||||||
|
ULONG ulNewStatusMask, ULONG * lpulOldStatus) PURE;
|
||||||
|
STDMETHOD(SaveContentsSort)(THIS_ LPSSortOrderSet lpSortCriteria, ULONG ulFlags) PURE;
|
||||||
|
STDMETHOD(EmptyFolder) (THIS_ ULONG ulUIParam, LPMAPIPROGRESS lpProgress, ULONG ulFlags) PURE;
|
||||||
|
};
|
||||||
|
#undef INTERFACE
|
||||||
|
|
||||||
|
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||||
|
/*** IUnknown methods ***/
|
||||||
|
#define IMAPIFolder_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
|
||||||
|
#define IMAPIFolder_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||||
|
#define IMAPIFolder_Release(p) (p)->lpVtbl->Release(p)
|
||||||
|
/*** IMAPIProp methods ***/
|
||||||
|
#define IMAPIFolder_GetLastError(p,a,b,c) (p)->lpVtbl->GetLastError(p,a,b,c)
|
||||||
|
#define IMAPIFolder_SaveChanges(p,a) (p)->lpVtbl->SaveChanges(p,a)
|
||||||
|
#define IMAPIFolder_GetProps(p,a,b,c,d) (p)->lpVtbl->GetProps(p,a,b,c,d)
|
||||||
|
#define IMAPIFolder_GetPropList(p,a,b) (p)->lpVtbl->GetPropList(p,a,b)
|
||||||
|
#define IMAPIFolder_OpenProperty(p,a,b,c,d,e) (p)->lpVtbl->OpenProperty(p,a,b,c,d,e)
|
||||||
|
#define IMAPIFolder_SetProps(p,a,b,c) (p)->lpVtbl->SetProps(p,a,b,c)
|
||||||
|
#define IMAPIFolder_DeleteProps(p,a,b) (p)->lpVtbl->DeleteProps(p,a,b)
|
||||||
|
#define IMAPIFolder_CopyTo(p,a,b,c,d,e,f,g,h,i) (p)->lpVtbl->CopyTo(p,a,b,c,d,e,f,g,h,i)
|
||||||
|
#define IMAPIFolder_CopyProps(p,a,b,c,d,e,f,g) (p)->lpVtbl->CopyProps(p,a,b,c,d,e,f,g)
|
||||||
|
#define IMAPIFolder_GetNamesFromIDs(p,a,b,c,d,e) (p)->lpVtbl->GetNamesFromIDs(p,a,b,c,d,e)
|
||||||
|
#define IMAPIFolder_GetIDsFromNames(p,a,b,c,d) (p)->lpVtbl->GetIDsFromNames(p,a,b,c,d)
|
||||||
|
/*** IMAPIContainer methods ***/
|
||||||
|
#define IMAPIFolder_GetContentsTable(p,a,b) (p)->lpVtbl->GetContentsTable(p,a,b)
|
||||||
|
#define IMAPIFolder_GetHierarchyTable(p,a,b) (p)->lpVtbl->GetHierarchyTable(p,a,b)
|
||||||
|
#define IMAPIFolder_OpenEntry(p,a,b,c,d,e,f) (p)->lpVtbl->OpenEntry(p,a,b,c,d,e,f)
|
||||||
|
#define IMAPIFolder_SetSearchCriteria(p,a,b,c) (p)->lpVtbl->SetSearchCriteria(p,a,b,c)
|
||||||
|
#define IMAPIFolder_GetSearchCriteria(p,a,b,c,d) (p)->lpVtbl->GetSearchCriteria(p,a,b,c,d)
|
||||||
|
/*** IMAPIFolder methods ***/
|
||||||
|
#define IMAPIFolder_CreateMessage(p,a,b,c) (p)->lpVtbl->CreateMessage(p,a,b,c)
|
||||||
|
#define IMAPIFolder_CopyMessages(p,a,b,c,d,e,f) (p)->lpVtbl->CopyMessages(p,a,b,c,d,e,f)
|
||||||
|
#define IMAPIFolder_DeleteMessages(p,a,b,c,d) (p)->lpVtbl->DeleteMessages(p,a,b,c,d)
|
||||||
|
#define IMAPIFolder_CreateFolder(p,a,b,c,d,e,f) (p)->lpVtbl->CreateFolder(p,a,b,c,d,e,f)
|
||||||
|
#define IMAPIFolder_CopyFolder(p,a,b,c,d,e,f,g,h) (p)->lpVtbl->CopyFolder(p,a,b,c,d,e,f,g,h)
|
||||||
|
#define IMAPIFolder_DeleteFolder(p,a,b,c,d,e) (p)->lpVtbl->CreateFolder(p,a,b,c,d,e)
|
||||||
|
#define IMAPIFolder_SetReadFlags(p,a,b,c,d) (p)->lpVtbl->SetReadFlags(p,a,b,c,d)
|
||||||
|
#define IMAPIFolder_GetMessageStatus(p,a,b,c,d) (p)->lpVtbl->GetMessageStatus(p,a,b,c,d)
|
||||||
|
#define IMAPIFolder_SetMessageStatus(p,a,b,c,d,e) (p)->lpVtbl->SetMessageStatus(p,a,b,c,d,e)
|
||||||
|
#define IMAPIFolder_SaveContentsSort(p,a,b) (p)->lpVtbl->SaveContentsSort(p,a,b)
|
||||||
|
#define IMAPIFolder_EmptyFolder(p,a,b,c) (p)->lpVtbl->EmptyFolder(p,a,b,c)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
ULONG cb;
|
ULONG cb;
|
||||||
|
@ -949,4 +1194,133 @@ typedef struct _ADRLIST
|
||||||
ADRENTRY aEntries[MAPI_DIM];
|
ADRENTRY aEntries[MAPI_DIM];
|
||||||
} ADRLIST, *LPADRLIST;
|
} ADRLIST, *LPADRLIST;
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* IMessage interface
|
||||||
|
*/
|
||||||
|
#define INTERFACE IMessage
|
||||||
|
DECLARE_INTERFACE_(IMessage,IMAPIProp)
|
||||||
|
{
|
||||||
|
/*** IUnknown methods ***/
|
||||||
|
STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
|
||||||
|
STDMETHOD_(ULONG,AddRef)(THIS) PURE;
|
||||||
|
STDMETHOD_(ULONG,Release)(THIS) PURE;
|
||||||
|
/*** IMAPIProp methods ***/
|
||||||
|
STDMETHOD(GetLastError)(THIS_ HRESULT hRes, ULONG ulFlags, LPMAPIERROR *lppErr) PURE;
|
||||||
|
STDMETHOD(SaveChanges)(THIS_ ULONG ulFlags) PURE;
|
||||||
|
STDMETHOD(GetProps)(THIS_ LPSPropTagArray lpPropTags, ULONG ulFlags, ULONG *lpValues, LPSPropValue *lppProps) PURE;
|
||||||
|
STDMETHOD(GetPropList)(THIS_ ULONG ulFlags, LPSPropTagArray *lppPropTagArray) PURE;
|
||||||
|
STDMETHOD(OpenProperty)(THIS_ ULONG ulPropTag, LPCIID lpIid, ULONG ulOpts, ULONG ulFlags, LPUNKNOWN *lppUnk) PURE;
|
||||||
|
STDMETHOD(SetProps)(THIS_ ULONG cValues, LPSPropValue lpProps, LPSPropProblemArray *lppProbs) PURE;
|
||||||
|
STDMETHOD(DeleteProps)(THIS_ LPSPropTagArray lpPropTags, LPSPropProblemArray *lppProbs) PURE;
|
||||||
|
STDMETHOD(CopyTo)(THIS_ ULONG ciidExclude, LPCIID lpIid, LPSPropTagArray lpProps, ULONG ulParam,
|
||||||
|
LPMAPIPROGRESS lpProgress, LPCIID lpIface,LPVOID lpDest, ULONG ulFlags,
|
||||||
|
LPSPropProblemArray *lppProbs) PURE;
|
||||||
|
STDMETHOD(CopyProps)(THIS_ LPSPropTagArray lpIncludeProps, ULONG ulParam, LPMAPIPROGRESS lpProgress,
|
||||||
|
LPCIID lpIid, LPVOID lpDestObj, ULONG ulFlags, LPSPropProblemArray *lppProblems) PURE;
|
||||||
|
STDMETHOD(GetNamesFromIDs)(THIS_ LPSPropTagArray *lppPropTags, LPGUID lpIid, ULONG ulFlags, ULONG *lpCount,
|
||||||
|
LPMAPINAMEID **lpppNames) PURE;
|
||||||
|
STDMETHOD(GetIDsFromNames)(THIS_ ULONG cPropNames, LPMAPINAMEID *lppNames, ULONG ulFlags, LPSPropTagArray *lppPropTags) PURE;
|
||||||
|
/*** IMessage methods ***/
|
||||||
|
STDMETHOD(GetAttachmentTable)(THIS_ ULONG ulFlags, LPMAPITABLE *lppTable) PURE;
|
||||||
|
STDMETHOD(OpenAttach)(THIS_ ULONG ulAttachmentNum, LPCIID lpInterface, ULONG ulFlags, LPATTACH *lppAttach) PURE;
|
||||||
|
STDMETHOD(CreateAttach)(THIS_ LPCIID lpInterface, ULONG ulFlags, ULONG *lpulAttachmentNum, LPATTACH *lppAttach) PURE;
|
||||||
|
STDMETHOD(DeleteAttach)(THIS_ ULONG ulAttachmentNum, ULONG ulUIParam, LPMAPIPROGRESS lpProgress, ULONG ulFlags) PURE;
|
||||||
|
STDMETHOD(GetRecipientTable)(THIS_ ULONG ulFlags, LPMAPITABLE *lppTable) PURE;
|
||||||
|
STDMETHOD(ModifyRecipients)(THIS_ ULONG ulFlags, LPADRLIST lpMods) PURE;
|
||||||
|
STDMETHOD(SubmitMessage)(THIS_ ULONG ulFlags) PURE;
|
||||||
|
STDMETHOD(SetReadFlag)(THIS_ ULONG ulFlags) PURE;
|
||||||
|
};
|
||||||
|
#undef INTERFACE
|
||||||
|
|
||||||
|
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||||
|
/*** IUnknown methods ***/
|
||||||
|
#define IMessage_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
|
||||||
|
#define IMessage_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||||
|
#define IMessage_Release(p) (p)->lpVtbl->Release(p)
|
||||||
|
/*** IMAPIProp methods ***/
|
||||||
|
#define IMessage_GetLastError(p,a,b,c) (p)->lpVtbl->GetLastError(p,a,b,c)
|
||||||
|
#define IMessage_SaveChanges(p,a) (p)->lpVtbl->SaveChanges(p,a)
|
||||||
|
#define IMessage_GetProps(p,a,b,c,d) (p)->lpVtbl->GetProps(p,a,b,c,d)
|
||||||
|
#define IMessage_GetPropList(p,a,b) (p)->lpVtbl->GetPropList(p,a,b)
|
||||||
|
#define IMessage_OpenProperty(p,a,b,c,d,e) (p)->lpVtbl->OpenProperty(p,a,b,c,d,e)
|
||||||
|
#define IMessage_SetProps(p,a,b,c) (p)->lpVtbl->SetProps(p,a,b,c)
|
||||||
|
#define IMessage_DeleteProps(p,a,b) (p)->lpVtbl->DeleteProps(p,a,b)
|
||||||
|
#define IMessage_CopyTo(p,a,b,c,d,e,f,g,h,i) (p)->lpVtbl->CopyTo(p,a,b,c,d,e,f,g,h,i)
|
||||||
|
#define IMessage_CopyProps(p,a,b,c,d,e,f,g) (p)->lpVtbl->CopyProps(p,a,b,c,d,e,f,g)
|
||||||
|
#define IMessage_GetNamesFromIDs(p,a,b,c,d,e) (p)->lpVtbl->GetNamesFromIDs(p,a,b,c,d,e)
|
||||||
|
#define IMessage_GetIDsFromNames(p,a,b,c,d) (p)->lpVtbl->GetIDsFromNames(p,a,b,c,d)
|
||||||
|
/*** IMessage methods ***/
|
||||||
|
#define IMessage_GetAttachmentTable(p,a,b) (p)->lpVtbl->GetAttachmentTable(p,a,b)
|
||||||
|
#define IMessage_OpenAttach(p,a,b,c,d) (p)->lpVtbl->OpenAttach(p,a,b,c,d)
|
||||||
|
#define IMessage_CreateAttach(p,a,b,c,d) (p)->lpVtbl->CreateAttach(p,a,b,c,d)
|
||||||
|
#define IMessage_DeleteAttach(p,a,b,c,d) (p)->lpVtbl->DeleteAttach(p,a,b,c,d)
|
||||||
|
#define IMessage_GetRecipientTable(p,a,b) (p)->lpVtbl->GetRecipientTable(p,a,b)
|
||||||
|
#define IMessage_ModifyRecipients(p,a,b) (p)->lpVtbl->ModifyRecipients(p,a,b)
|
||||||
|
#define IMessage_SubmitMessage(p,a) (p)->lpVtbl->SubmitMessage(p,a)
|
||||||
|
#define IMessage_SetReadFlag(p,a) (p)->lpVtbl->SetReadFlag(p,a)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Message flags (PR_MESSAGE_FLAGS) */
|
||||||
|
|
||||||
|
#define MSGFLAG_READ 0x00000001U
|
||||||
|
#define MSGFLAG_UNMODIFIED 0x00000002U
|
||||||
|
#define MSGFLAG_SUBMIT 0x00000004U
|
||||||
|
#define MSGFLAG_UNSENT 0x00000008U
|
||||||
|
#define MSGFLAG_HASATTACH 0x00000010U
|
||||||
|
#define MSGFLAG_FROMME 0x00000020U
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* IAttach interface
|
||||||
|
*/
|
||||||
|
#define INTERFACE IAttach
|
||||||
|
DECLARE_INTERFACE_(IAttach,IMAPIProp)
|
||||||
|
{
|
||||||
|
/*** IUnknown methods ***/
|
||||||
|
STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
|
||||||
|
STDMETHOD_(ULONG,AddRef)(THIS) PURE;
|
||||||
|
STDMETHOD_(ULONG,Release)(THIS) PURE;
|
||||||
|
/*** IMAPIProp methods ***/
|
||||||
|
STDMETHOD(GetLastError)(THIS_ HRESULT hRes, ULONG ulFlags, LPMAPIERROR *lppErr) PURE;
|
||||||
|
STDMETHOD(SaveChanges)(THIS_ ULONG ulFlags) PURE;
|
||||||
|
STDMETHOD(GetProps)(THIS_ LPSPropTagArray lpPropTags, ULONG ulFlags, ULONG *lpValues, LPSPropValue *lppProps) PURE;
|
||||||
|
STDMETHOD(GetPropList)(THIS_ ULONG ulFlags, LPSPropTagArray *lppPropTagArray) PURE;
|
||||||
|
STDMETHOD(OpenProperty)(THIS_ ULONG ulPropTag, LPCIID lpIid, ULONG ulOpts, ULONG ulFlags, LPUNKNOWN *lppUnk) PURE;
|
||||||
|
STDMETHOD(SetProps)(THIS_ ULONG cValues, LPSPropValue lpProps, LPSPropProblemArray *lppProbs) PURE;
|
||||||
|
STDMETHOD(DeleteProps)(THIS_ LPSPropTagArray lpPropTags, LPSPropProblemArray *lppProbs) PURE;
|
||||||
|
STDMETHOD(CopyTo)(THIS_ ULONG ciidExclude, LPCIID lpIid, LPSPropTagArray lpProps, ULONG ulParam,
|
||||||
|
LPMAPIPROGRESS lpProgress, LPCIID lpIface,LPVOID lpDest, ULONG ulFlags,
|
||||||
|
LPSPropProblemArray *lppProbs) PURE;
|
||||||
|
STDMETHOD(CopyProps)(THIS_ LPSPropTagArray lpIncludeProps, ULONG ulParam, LPMAPIPROGRESS lpProgress,
|
||||||
|
LPCIID lpIid, LPVOID lpDestObj, ULONG ulFlags, LPSPropProblemArray *lppProblems) PURE;
|
||||||
|
STDMETHOD(GetNamesFromIDs)(THIS_ LPSPropTagArray *lppPropTags, LPGUID lpIid, ULONG ulFlags, ULONG *lpCount,
|
||||||
|
LPMAPINAMEID **lpppNames) PURE;
|
||||||
|
STDMETHOD(GetIDsFromNames)(THIS_ ULONG cPropNames, LPMAPINAMEID *lppNames, ULONG ulFlags, LPSPropTagArray *lppPropTags) PURE;
|
||||||
|
};
|
||||||
|
#undef INTERFACE
|
||||||
|
|
||||||
|
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||||
|
/*** IUnknown methods ***/
|
||||||
|
#define IAttach_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
|
||||||
|
#define IAttach_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||||
|
#define IAttach_Release(p) (p)->lpVtbl->Release(p)
|
||||||
|
/*** IMAPIProp methods ***/
|
||||||
|
#define IAttach_GetLastError(p,a,b,c) (p)->lpVtbl->GetLastError(p,a,b,c)
|
||||||
|
#define IAttach_SaveChanges(p,a) (p)->lpVtbl->SaveChanges(p,a)
|
||||||
|
#define IAttach_GetProps(p,a,b,c,d) (p)->lpVtbl->GetProps(p,a,b,c,d)
|
||||||
|
#define IAttach_GetPropList(p,a,b) (p)->lpVtbl->GetPropList(p,a,b)
|
||||||
|
#define IAttach_OpenProperty(p,a,b,c,d,e) (p)->lpVtbl->OpenProperty(p,a,b,c,d,e)
|
||||||
|
#define IAttach_SetProps(p,a,b,c) (p)->lpVtbl->SetProps(p,a,b,c)
|
||||||
|
#define IAttach_DeleteProps(p,a,b) (p)->lpVtbl->DeleteProps(p,a,b)
|
||||||
|
#define IAttach_CopyTo(p,a,b,c,d,e,f,g,h,i) (p)->lpVtbl->CopyTo(p,a,b,c,d,e,f,g,h,i)
|
||||||
|
#define IAttach_CopyProps(p,a,b,c,d,e,f,g) (p)->lpVtbl->CopyProps(p,a,b,c,d,e,f,g)
|
||||||
|
#define IAttach_GetNamesFromIDs(p,a,b,c,d,e) (p)->lpVtbl->GetNamesFromIDs(p,a,b,c,d,e)
|
||||||
|
#define IAttach_GetIDsFromNames(p,a,b,c,d) (p)->lpVtbl->GetIDsFromNames(p,a,b,c,d)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Attachment flags */
|
||||||
|
|
||||||
|
#define NO_ATTACHMENT 0x00000000U
|
||||||
|
#define ATTACH_BY_VALUE 0x00000001U
|
||||||
|
|
||||||
#endif /*MAPIDEFS_H*/
|
#endif /*MAPIDEFS_H*/
|
||||||
|
|
|
@ -452,6 +452,7 @@
|
||||||
#define PR_AB_PROVIDER_ID PROP_TAG(PT_BINARY,0x3615)
|
#define PR_AB_PROVIDER_ID PROP_TAG(PT_BINARY,0x3615)
|
||||||
#define PR_DEFAULT_VIEW_ENTRYID PROP_TAG(PT_BINARY,0x3616)
|
#define PR_DEFAULT_VIEW_ENTRYID PROP_TAG(PT_BINARY,0x3616)
|
||||||
#define PR_ASSOC_CONTENT_COUNT PROP_TAG(PT_I4,0x3617)
|
#define PR_ASSOC_CONTENT_COUNT PROP_TAG(PT_I4,0x3617)
|
||||||
|
#define PR_IPM_DRAFTS_ENTRYID PROP_TAG(PT_BINARY,0x36D7)
|
||||||
#define PR_ATTACHMENT_X400_PARAMETERS PROP_TAG(PT_BINARY,0x3700)
|
#define PR_ATTACHMENT_X400_PARAMETERS PROP_TAG(PT_BINARY,0x3700)
|
||||||
#define PR_ATTACH_DATA_OBJ PROP_TAG(PT_OBJECT,0x3701)
|
#define PR_ATTACH_DATA_OBJ PROP_TAG(PT_OBJECT,0x3701)
|
||||||
#define PR_ATTACH_DATA_BIN PROP_TAG(PT_BINARY,0x3701)
|
#define PR_ATTACH_DATA_BIN PROP_TAG(PT_BINARY,0x3701)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue