mirror of
https://github.com/reactos/reactos.git
synced 2025-06-01 23:48:12 +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>shlwapi</library>
|
||||
<library>shell32</library>
|
||||
<library>advapi32</library>
|
||||
<library>kernel32</library>
|
||||
<library>uuid</library>
|
||||
<library>ntdll</library>
|
||||
|
|
|
@ -145,17 +145,17 @@
|
|||
205 stub FDecodeID@12
|
||||
206 stub CchOfEncoding@4
|
||||
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)
|
||||
210 stdcall MAPILogoff(long long long long)
|
||||
211 stdcall MAPISendMail(long long ptr long long)
|
||||
212 stub MAPISaveMail
|
||||
213 stub MAPIReadMail
|
||||
214 stub MAPIFindNext
|
||||
215 stub MAPIDeleteMail
|
||||
217 stub MAPIAddress
|
||||
218 stub MAPIDetails
|
||||
219 stub MAPIResolveName
|
||||
212 stdcall MAPISaveMail(ptr ptr ptr long long ptr)
|
||||
213 stdcall MAPIReadMail(ptr ptr ptr long long ptr)
|
||||
214 stdcall MAPIFindNext(ptr ptr ptr ptr long long ptr)
|
||||
215 stdcall MAPIDeleteMail(ptr ptr ptr long long)
|
||||
217 stdcall MAPIAddress(ptr ptr ptr long ptr long long ptr long ptr ptr)
|
||||
218 stdcall MAPIDetails(ptr ptr ptr long long)
|
||||
219 stdcall MAPIResolveName(ptr ptr ptr long long ptr)
|
||||
220 stub BMAPISendMail
|
||||
221 stub BMAPISaveMail
|
||||
222 stub BMAPIReadMail
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* MAPI basics
|
||||
*
|
||||
* Copyright 2001 CodeWeavers Inc.
|
||||
* Copyright 2001, 2009 CodeWeavers Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -29,6 +29,7 @@
|
|||
#include "mapiform.h"
|
||||
#include "mapi.h"
|
||||
#include "wine/debug.h"
|
||||
#include "util.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(mapi);
|
||||
|
||||
|
@ -45,9 +46,11 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
|
|||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
DisableThreadLibraryCalls(hinstDLL);
|
||||
load_mapi_providers();
|
||||
break;
|
||||
case DLL_PROCESS_DETACH:
|
||||
TRACE("DLL_PROCESS_DETACH: %d objects remaining\n", MAPI_ObjectCount);
|
||||
unload_mapi_providers();
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
|
@ -58,8 +61,17 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
|
|||
*/
|
||||
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));
|
||||
|
||||
*ppv = NULL;
|
||||
return CLASS_E_CLASSNOTAVAILABLE;
|
||||
}
|
||||
|
||||
|
@ -80,36 +92,77 @@ HRESULT WINAPI DllCanUnloadNow(void)
|
|||
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)
|
||||
{
|
||||
FIXME("(%p) Stub\n", init);
|
||||
return SUCCESS_SUCCESS;
|
||||
TRACE("(%p)\n", init);
|
||||
|
||||
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,
|
||||
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);
|
||||
|
||||
if (mapiFunctions.MAPILogon)
|
||||
return mapiFunctions.MAPILogon(uiparam, profile, password, flags, reserved, session);
|
||||
|
||||
if (session) *session = 1;
|
||||
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 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);
|
||||
|
||||
if (mapiFunctions.MAPILogoff)
|
||||
return mapiFunctions.MAPILogoff(session, uiparam, flags, reserved);
|
||||
|
||||
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,
|
||||
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);
|
||||
return SUCCESS_SUCCESS;
|
||||
|
||||
if (mapiFunctions.MAPILogonEx)
|
||||
return mapiFunctions.MAPILogonEx(uiparam, profile, password, flags, session);
|
||||
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
HRESULT WINAPI MAPIOpenLocalFormContainer(LPVOID *ppfcnt)
|
||||
|
@ -118,9 +171,20 @@ HRESULT WINAPI MAPIOpenLocalFormContainer(LPVOID *ppfcnt)
|
|||
return E_FAIL;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* MAPIUninitialize
|
||||
*
|
||||
* Uninitialises the MAPI library. In our case, we pass through to the
|
||||
* loaded Extended MAPI provider.
|
||||
*
|
||||
*/
|
||||
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)
|
||||
|
@ -129,3 +193,68 @@ HRESULT WINAPI MAPIAdminProfiles(ULONG ulFlags, LPPROFADMIN *lppProfAdmin)
|
|||
*lppProfAdmin = NULL;
|
||||
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
|
||||
*
|
||||
* Copyright 2005 Hans Leidekker
|
||||
* 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
|
||||
|
@ -24,18 +25,347 @@
|
|||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#define COBJMACROS
|
||||
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
#include "winerror.h"
|
||||
#include "objbase.h"
|
||||
#include "objidl.h"
|
||||
#include "mapi.h"
|
||||
#include "mapix.h"
|
||||
#include "mapiutil.h"
|
||||
#include "mapidefs.h"
|
||||
#include "winreg.h"
|
||||
#include "shellapi.h"
|
||||
#include "shlwapi.h"
|
||||
#include "wine/debug.h"
|
||||
#include "util.h"
|
||||
|
||||
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)
|
||||
*
|
||||
|
@ -53,7 +383,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mapi);
|
|||
* Failure: MAPI_E_FAILURE
|
||||
*
|
||||
* NOTES
|
||||
* This is a temporary hack.
|
||||
* The fallback procedure is a temporary hack.
|
||||
*/
|
||||
ULONG WINAPI MAPISendMail( LHANDLE session, ULONG_PTR uiparam,
|
||||
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,
|
||||
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;
|
||||
|
||||
for (i = 0; i < message->nRecipCount; i++)
|
||||
|
@ -201,3 +540,12 @@ exit:
|
|||
|
||||
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
|
||||
*
|
||||
* Copyright 2004 Jon Griffiths
|
||||
* 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
|
||||
|
@ -37,6 +38,7 @@
|
|||
#include "mapival.h"
|
||||
#include "xcmc.h"
|
||||
#include "msi.h"
|
||||
#include "util.h"
|
||||
|
||||
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,
|
||||
14,15 };
|
||||
|
||||
MAPI_FUNCTIONS mapiFunctions;
|
||||
|
||||
/**************************************************************************
|
||||
* ScInitMapiUtil (MAPI32.33)
|
||||
*
|
||||
|
@ -858,8 +862,9 @@ BOOL WINAPI FGetComponentPath(LPCSTR component, LPCSTR qualifier, LPSTR dll_path
|
|||
hmsi = LoadLibraryA("msi.dll");
|
||||
if (hmsi)
|
||||
{
|
||||
FARPROC pMsiProvideQualifiedComponentA = GetProcAddress(hmsi, "MsiProvideQualifiedComponentA");
|
||||
UINT (WINAPI *pMsiProvideQualifiedComponentA)(LPCSTR, LPCSTR, DWORD, LPSTR, LPDWORD);
|
||||
|
||||
pMsiProvideQualifiedComponentA = (void *)GetProcAddress(hmsi, "MsiProvideQualifiedComponentA");
|
||||
if (pMsiProvideQualifiedComponentA)
|
||||
{
|
||||
static const char * const fmt[] = { "%d\\NT", "%d\\95", "%d" };
|
||||
|
@ -902,3 +907,174 @@ HRESULT WINAPI HrQueryAllRows(LPMAPITABLE lpTable, LPSPropTagArray lpPropTags,
|
|||
*lppRows = NULL;
|
||||
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_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"
|
||||
|
|
|
@ -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,
|
||||
Rect ? Rect->right : 0, Rect ? Rect->bottom : 0);
|
||||
|
||||
if (!IsMenu(Menu))
|
||||
{
|
||||
SetLastError( ERROR_INVALID_MENU_HANDLE );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
fEndMenu = FALSE;
|
||||
if (! MenuGetRosMenuInfo(&MenuInfo, Menu))
|
||||
{
|
||||
|
@ -3516,17 +3522,12 @@ MenuTrackMenu(HMENU Menu, UINT Flags, INT x, INT y,
|
|||
{
|
||||
MenuSelectItem(Mt.OwnerWnd, &MenuInfo, NO_SELECTED_ITEM,
|
||||
FALSE, 0 );
|
||||
}
|
||||
/* fall through */
|
||||
|
||||
case VK_UP:
|
||||
if (MenuGetRosMenuInfo(&MenuInfo, Mt.CurrentMenu))
|
||||
{
|
||||
MenuMoveSelection(Mt.OwnerWnd, &MenuInfo,
|
||||
VK_HOME == Msg.wParam ? ITEM_NEXT : ITEM_PREV);
|
||||
}
|
||||
break;
|
||||
|
||||
case VK_UP:
|
||||
case VK_DOWN: /* If on menu bar, pull-down the menu */
|
||||
if (MenuGetRosMenuInfo(&MenuInfo, Mt.CurrentMenu))
|
||||
{
|
||||
|
@ -3682,6 +3683,11 @@ MenuTrackMenu(HMENU Menu, UINT Flags, INT x, INT y,
|
|||
{
|
||||
DestroyWindow(MenuInfo.Wnd);
|
||||
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);
|
||||
}
|
||||
|
@ -5183,6 +5189,12 @@ TrackPopupMenu(
|
|||
{
|
||||
BOOL ret = FALSE;
|
||||
|
||||
if (!IsMenu(Menu))
|
||||
{
|
||||
SetLastError( ERROR_INVALID_MENU_HANDLE );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
MenuInitTracking(Wnd, Menu, TRUE, Flags);
|
||||
|
||||
/* Send WM_INITMENUPOPUP message only if TPM_NONOTIFY flag is not specified */
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
* Copyright (C) 1998 Justin Bradford
|
||||
* Copyright (c) 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
|
||||
|
@ -83,25 +84,19 @@ typedef struct IAddrBook IAddrBook;
|
|||
typedef IAddrBook *LPADRBOOK;
|
||||
typedef struct IABContainer IABContainer;
|
||||
typedef IABContainer *LPABCONT;
|
||||
typedef struct IAttach IAttach;
|
||||
typedef IAttach *LPATTACH;
|
||||
typedef struct IAttach *LPATTACH;
|
||||
typedef struct IDistList IDistList;
|
||||
typedef IDistList *LPDISTLIST;
|
||||
typedef struct IMailUser IMailUser;
|
||||
typedef IMailUser *LPMAILUSER;
|
||||
typedef struct IMAPIAdviseSink *LPMAPIADVISESINK;
|
||||
typedef struct IMAPIContainer IMAPIContainer;
|
||||
typedef IMAPIContainer *LPMAPICONTAINER;
|
||||
typedef struct IMAPIFolder IMAPIFolder;
|
||||
typedef IMAPIFolder *LPMAPIFOLDER;
|
||||
typedef struct IMAPIContainer *LPMAPICONTAINER;
|
||||
typedef struct IMAPIFolder *LPMAPIFOLDER;
|
||||
typedef struct IMAPIProgress IMAPIProgress;
|
||||
typedef IMAPIProgress *LPMAPIPROGRESS;
|
||||
typedef struct IMAPIStatus IMAPIStatus;
|
||||
typedef IMAPIStatus *LPMAPISTATUS;
|
||||
typedef struct IMessage IMessage;
|
||||
typedef IMessage *LPMESSAGE;
|
||||
typedef struct IMsgStore IMsgStore;
|
||||
typedef IMsgStore *LPMDB;
|
||||
typedef struct IMessage *LPMESSAGE;
|
||||
typedef struct IProfSect IProfSect;
|
||||
typedef IProfSect *LPPROFSECT;
|
||||
typedef struct IProviderAdmin IProviderAdmin;
|
||||
|
@ -156,12 +151,14 @@ typedef struct _MAPIUID
|
|||
|
||||
/* Flags for various calls */
|
||||
#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_READ 0x00000002U /* Want read access */
|
||||
#define MAPI_ACCESS_DELETE 0x00000004U /* Want delete access */
|
||||
#define MAPI_ACCESS_CREATE_HIERARCHY 0x00000008U
|
||||
#define MAPI_ACCESS_CREATE_CONTENTS 0x00000010U
|
||||
#define MAPI_ACCESS_CREATE_ASSOCIATED 0x00000020U
|
||||
#define MAPI_USE_DEFAULT 0x00000040U
|
||||
#define MAPI_UNICODE 0x80000000U /* Strings in this call are Unicode */
|
||||
|
||||
#if defined (UNICODE) || defined (__WINESRC__)
|
||||
|
@ -170,6 +167,9 @@ typedef struct _MAPIUID
|
|||
#define fMapiUnicode 0U
|
||||
#endif
|
||||
|
||||
/* IMAPISession::OpenMessageStore() flags */
|
||||
#define MDB_NO_DIALOG 0x00000001
|
||||
|
||||
/* Types of message receivers */
|
||||
#ifndef MAPI_ORIG
|
||||
#define MAPI_ORIG 0 /* The original author */
|
||||
|
@ -761,6 +761,9 @@ typedef struct _NOTIFICATION
|
|||
typedef LONG (WINAPI NOTIFCALLBACK)(LPVOID,ULONG,LPNOTIFICATION);
|
||||
typedef NOTIFCALLBACK *LPNOTIFCALLBACK;
|
||||
|
||||
/* IMAPIContainer::OpenEntry flags */
|
||||
#define MAPI_BEST_ACCESS 0x00000010
|
||||
|
||||
/*****************************************************************************
|
||||
* IMAPITable interface
|
||||
*
|
||||
|
@ -895,21 +898,263 @@ DECLARE_INTERFACE_(IMAPIProp,IUnknown)
|
|||
#define IMAPIProp_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||
#define IMAPIProp_Release(p) (p)->lpVtbl->Release(p)
|
||||
/*** IMAPIProp methods ***/
|
||||
#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_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_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_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_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_GetIDsFromNames(p,a,b,c,d) (p)->lpVtbl->GetIDsFromNames(p,a,b,c,d)
|
||||
#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_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_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_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_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_GetIDsFromNames(p,a,b,c,d) (p)->lpVtbl->GetIDsFromNames(p,a,b,c,d)
|
||||
#endif
|
||||
|
||||
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
|
||||
{
|
||||
ULONG cb;
|
||||
|
@ -949,4 +1194,133 @@ typedef struct _ADRLIST
|
|||
ADRENTRY aEntries[MAPI_DIM];
|
||||
} 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*/
|
||||
|
|
|
@ -452,6 +452,7 @@
|
|||
#define PR_AB_PROVIDER_ID PROP_TAG(PT_BINARY,0x3615)
|
||||
#define PR_DEFAULT_VIEW_ENTRYID PROP_TAG(PT_BINARY,0x3616)
|
||||
#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_ATTACH_DATA_OBJ PROP_TAG(PT_OBJECT,0x3701)
|
||||
#define PR_ATTACH_DATA_BIN PROP_TAG(PT_BINARY,0x3701)
|
||||
|
|
Loading…
Reference in a new issue