diff options
Diffstat (limited to 'comm/mailnews/mapi')
49 files changed, 14892 insertions, 0 deletions
diff --git a/comm/mailnews/mapi/include/README.md b/comm/mailnews/mapi/include/README.md new file mode 100644 index 0000000000..fe9d707388 --- /dev/null +++ b/comm/mailnews/mapi/include/README.md @@ -0,0 +1,33 @@ +The contents of this directory are from the MAPI Stub Library, formerly +Outlook MAPI Headers. + +The files were downloaded from https://github.com/stephenegriffin/MAPIStubLibrary +at revision 01f9bf8cd2ac39078aabfc4662c873159efd75d6. + +The files have been renamed to lower-cased filenames for cross-compiling +compatibility. + +The content of the imported files was validated by comparing them to the +ones found in the Outlook2010MAPIHeaders.exe that was previously available +from MSDN. No differences were found that affect the code (mostly whitespace). + +MIT License + +Copyright (c) 2018 Microsoft + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/comm/mailnews/mapi/include/mapiaux.h b/comm/mailnews/mapi/include/mapiaux.h new file mode 100644 index 0000000000..4be02ab7da --- /dev/null +++ b/comm/mailnews/mapi/include/mapiaux.h @@ -0,0 +1,235 @@ +/* + * M A P I A U X . H + * + * Messaging Applications Programming Interface. + * + * Copyright (c) 2010 Microsoft Corporation. All Rights Reserved. + * + * Purpose: + * + * This file defines additional interfaces, structures, and constants + * used by the Messaging Applications Programming Interface + */ + + +#ifndef MAPIAUXGUID_H +#ifdef INITGUID +#include <mapiguid.h> +#define MAPIAUXGUID_H +#endif /* INITGUID */ + +#if !defined(INITGUID) || defined(USES_IID_IMsgServiceAdmin2) +DEFINE_OLEGUID(IID_IMsgServiceAdmin2,0x00020387, 0, 0); +#endif + +#if !defined(INITGUID) || defined(USES_IID_IMessageRaw) +DEFINE_OLEGUID(IID_IMessageRaw, 0x0002038A, 0, 0); +#endif + +#endif /* MAPIAUXGUID_H */ + + + +#ifndef MAPIAUX_H +#define MAPIAUX_H + +/* Include common MAPI header files if they haven't been already. */ + +#ifndef MAPIDEFS_H +#include <mapidefs.h> +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef BEGIN_INTERFACE +#define BEGIN_INTERFACE +#endif + +/* Forward interface declarations */ + +DECLARE_MAPI_INTERFACE_PTR(IMsgServiceAdmin2, LPSERVICEADMIN2); + +// Property tags + +#define PR_ATTACH_CONTENT_ID PROP_TAG( PT_TSTRING, 0x3712) +#define PR_ATTACH_CONTENT_ID_W PROP_TAG( PT_UNICODE, 0x3712) +#define PR_ATTACH_CONTENT_ID_A PROP_TAG( PT_STRING8, 0x3712) + +// Additional display attributes, to supplement PR_DISPLAY_TYPE. +#define PR_DISPLAY_TYPE_EX PROP_TAG( PT_LONG, 0x3905) + +#define PR_MSG_EDITOR_FORMAT PROP_TAG( PT_LONG, 0x5909 ) + +#define PR_ROH_FLAGS PROP_TAG( PT_LONG, 0x6623) + +#define PR_ROH_PROXY_AUTH_SCHEME PROP_TAG( PT_LONG, 0x6627) + + +// Constants + +/* MAPILogonEx() flags. */ +#define MAPI_BG_SESSION 0x00200000 /* Used for async profile access */ + +/* Flags for MAPIINIT_0 structure ulFlags value passed to MAPIInitialize() */ +#define MAPI_NO_COINIT 0x00000008 + +/* SaveChanges flags */ +#define SPAMFILTER_ONSAVE ((ULONG) 0x00000080) +#define ITEMPROC_FORCE ((ULONG) 0x00000800) +#define NON_EMS_XP_SAVE ((ULONG) 0x00001000) + +/* Flags for OpenMessageStore() */ +#define MDB_ONLINE ((ULONG) 0x00000100) + + +/* IMsgStore Interface ----------------------------------------------------- */ +/* PR_STORE_SUPPORT_MASK bits */ +#define STORE_UNICODE_OK ((ULONG) 0x00040000) +#define STORE_ITEMPROC ((ULONG) 0x00200000) + +/* Miscellaneous flags */ +#define MAPI_NO_CACHE ((ULONG) 0x00000200) +#define MAPI_CACHE_ONLY ((ULONG) 0x00004000) + + +/* Values for PR_AGING_GRANULARITY (Determines aging is measured by months, weeks, or days) */ +#define AG_MONTHS 0 +#define AG_WEEKS 1 +#define AG_DAYS 2 +#define NUM_AG_TYPES 3 + + +// PR_DISPLAY_TYPE_EX has the following format +// +// 33222222222211111111110000000000 +// 10987654321098765432109876543210 +// +// FAxxxxxxxxxxxxxxRRRRRRRRLLLLLLLL +// +// F = 1 if remote is valid, 0 if it is not +// A = 1 if the user is ACL-able, 0 if the user is not +// x - unused at this time, do not interpret as this may be used in the future +// R = display type from + +#define DTE_FLAG_REMOTE_VALID 0x80000000 +#define DTE_FLAG_ACL_CAPABLE 0x40000000 +#define DTE_MASK_REMOTE 0x0000ff00 +#define DTE_MASK_LOCAL 0x000000ff + +#define DTE_IS_REMOTE_VALID(v) (!!((v) & DTE_FLAG_REMOTE_VALID)) +#define DTE_IS_ACL_CAPABLE(v) (!!((v) & DTE_FLAG_ACL_CAPABLE)) +#define DTE_REMOTE(v) (((v) & DTE_MASK_REMOTE) >> 8) +#define DTE_LOCAL(v) ((v) & DTE_MASK_LOCAL) + +#define DT_ROOM ((ULONG) 0x00000007) +#define DT_EQUIPMENT ((ULONG) 0x00000008) +#define DT_SEC_DISTLIST ((ULONG) 0x00000009) + +// Sender's editor format (PR_MSG_EDITOR_FORMAT) +#define EDITOR_FORMAT_DONTKNOW ((ULONG)0) +#define EDITOR_FORMAT_PLAINTEXT ((ULONG)1) +#define EDITOR_FORMAT_HTML ((ULONG)2) +#define EDITOR_FORMAT_RTF ((ULONG)3) + + +// Flags used in PR_ROH_FLAGS - http://support.microsoft.com/kb/898835 +// Connect to my Exchange mailbox using HTTP +#define ROHFLAGS_USE_ROH 0x1 +// Connect using SSL only +#define ROHFLAGS_SSL_ONLY 0x2 +// Mutually authenticate the session when connecting with SSL +#define ROHFLAGS_MUTUAL_AUTH 0x4 +// On fast networks, connect using HTTP first, then connect using TCP/IP +#define ROHFLAGS_HTTP_FIRST_ON_FAST 0x8 +// On slow networks, connect using HTTP first, then connect using TCP/IP +#define ROHFLAGS_HTTP_FIRST_ON_SLOW 0x20 + +// Flags used in PR_ROH_PROXY_AUTH_SCHEME +// Basic Authentication +#define ROHAUTH_BASIC 0x1 +// NTLM Authentication +#define ROHAUTH_NTLM 0x2 + + +// Interface declarations + +#define MAPI_IMSGSERVICEADMIN_METHODS(IPURE) \ + MAPIMETHOD(GetLastError) \ + (THIS_ HRESULT hResult, \ + ULONG ulFlags, \ + LPMAPIERROR FAR * lppMAPIError) IPURE; \ + MAPIMETHOD(GetMsgServiceTable) \ + (THIS_ ULONG ulFlags, \ + LPMAPITABLE FAR * lppTable) IPURE; \ + MAPIMETHOD(CreateMsgService) \ + (THIS_ LPTSTR lpszService, \ + LPTSTR lpszDisplayName, \ + ULONG_PTR ulUIParam, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(DeleteMsgService) \ + (THIS_ LPMAPIUID lpUID) IPURE; \ + MAPIMETHOD(CopyMsgService) \ + (THIS_ LPMAPIUID lpUID, \ + LPTSTR lpszDisplayName, \ + LPCIID lpInterfaceToCopy, \ + LPCIID lpInterfaceDst, \ + LPVOID lpObjectDst, \ + ULONG_PTR ulUIParam, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(RenameMsgService) \ + (THIS_ LPMAPIUID lpUID, \ + ULONG ulFlags, \ + LPTSTR lpszDisplayName) IPURE; \ + MAPIMETHOD(ConfigureMsgService) \ + (THIS_ LPMAPIUID lpUID, \ + ULONG_PTR ulUIParam, \ + ULONG ulFlags, \ + ULONG cValues, \ + LPSPropValue lpProps) IPURE; \ + MAPIMETHOD(OpenProfileSection) \ + (THIS_ LPMAPIUID lpUID, \ + LPCIID lpInterface, \ + ULONG ulFlags, \ + LPPROFSECT FAR * lppProfSect) IPURE; \ + MAPIMETHOD(MsgServiceTransportOrder) \ + (THIS_ ULONG cUID, \ + LPMAPIUID lpUIDList, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(AdminProviders) \ + (THIS_ LPMAPIUID lpUID, \ + ULONG ulFlags, \ + LPPROVIDERADMIN FAR * lppProviderAdmin) IPURE; \ + MAPIMETHOD(SetPrimaryIdentity) \ + (THIS_ LPMAPIUID lpUID, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(GetProviderTable) \ + (THIS_ ULONG ulFlags, \ + LPMAPITABLE FAR * lppTable) IPURE; \ + +#define MAPI_IMSGSERVICEADMIN_METHODS2(IPURE) \ + MAPIMETHOD(CreateMsgServiceEx) \ + (THIS_ LPTSTR lpszService, \ + LPTSTR lpszDisplayName, \ + ULONG_PTR ulUIParam, \ + ULONG ulFlags, \ + LPMAPIUID lpuidService) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMsgServiceAdmin2 +DECLARE_MAPI_INTERFACE_(IMsgServiceAdmin2, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMSGSERVICEADMIN_METHODS(PURE) + MAPI_IMSGSERVICEADMIN_METHODS2(PURE) +}; + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MAPIAUX_H */ diff --git a/comm/mailnews/mapi/include/mapicode.h b/comm/mailnews/mapi/include/mapicode.h new file mode 100644 index 0000000000..1c448c3003 --- /dev/null +++ b/comm/mailnews/mapi/include/mapicode.h @@ -0,0 +1,218 @@ +/* + * M A P I C O D E . H + * + * Status Codes returned by MAPI routines + * + * Copyright (c) 2009 Microsoft Corporation. All Rights Reserved. + */ + +#ifndef MAPICODE_H +#define MAPICODE_H + +#if _MSC_VER > 1000 +#pragma once +#endif + +#if defined (WIN64) && !defined (_WIN64) +#define _WIN64 +#endif + +/* + * Under Win64 systems Win32 is also defined for backwards compatibility. + */ + +#if defined (WIN32) && !defined (_WIN32) +#define _WIN32 +#endif + +/* Define S_OK and ITF_* */ + +#if defined(_WIN64) || defined(_WIN32) +#include <winerror.h> +#endif + + +/* + * On Windows, scodes are 32-bit values laid out as follows: + * + * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 + * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 + * +-+-+-+-+-+---------------------+-------------------------------+ + * |S|R|C|N|r| Facility | Code | + * +-+-+-+-+-+---------------------+-------------------------------+ + * + * where + * + * S - Severity - indicates success/fail + * + * 0 - Success + * 1 - Fail (COERROR) + * + * R - reserved portion of the facility code, corresponds to Windows + * second severity bit. + * + * C - reserved portion of the facility code, corresponds to Windows + * C field. + * + * N - reserved portion of the facility code. Used to indicate a + * mapped Windows status value. + * + * r - reserved portion of the facility code. Reserved for internal + * use. Used to indicate HRESULT values that are not status + * values, but are instead message ids for display strings. + * + * Facility - is the facility code + * FACILITY_NULL 0x0 + * FACILITY_RPC 0x1 + * FACILITY_DISPATCH 0x2 + * FACILITY_STORAGE 0x3 + * FACILITY_ITF 0x4 + * FACILITY_WIN32 0x7 + * FACILITY_WINDOWS 0x8 + * + * Code - is the facility's status code + * + */ + + + + +/* + * We can't use OLE 2.0 macros to build sCodes because the definition has + * changed and we wish to conform to the new definition. + */ +#define MAKE_MAPI_SCODE(sev,fac,code) \ + ((SCODE) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))) ) + +/* The following two macros are used to build OLE 2.0 style sCodes */ + +#define MAKE_MAPI_E( err ) (MAKE_MAPI_SCODE( 1, FACILITY_ITF, err )) +#define MAKE_MAPI_S( warn ) (MAKE_MAPI_SCODE( 0, FACILITY_ITF, warn )) + +#ifdef SUCCESS_SUCCESS +#undef SUCCESS_SUCCESS +#endif +#define SUCCESS_SUCCESS 0L + +/* General errors (used by more than one MAPI object) */ + +#define MAPI_E_CALL_FAILED E_FAIL +#define MAPI_E_NOT_ENOUGH_MEMORY E_OUTOFMEMORY +#define MAPI_E_INVALID_PARAMETER E_INVALIDARG +#define MAPI_E_INTERFACE_NOT_SUPPORTED E_NOINTERFACE +#define MAPI_E_NO_ACCESS E_ACCESSDENIED + +#define MAPI_E_NO_SUPPORT MAKE_MAPI_E( 0x102 ) +#define MAPI_E_BAD_CHARWIDTH MAKE_MAPI_E( 0x103 ) +#define MAPI_E_STRING_TOO_LONG MAKE_MAPI_E( 0x105 ) +#define MAPI_E_UNKNOWN_FLAGS MAKE_MAPI_E( 0x106 ) +#define MAPI_E_INVALID_ENTRYID MAKE_MAPI_E( 0x107 ) +#define MAPI_E_INVALID_OBJECT MAKE_MAPI_E( 0x108 ) +#define MAPI_E_OBJECT_CHANGED MAKE_MAPI_E( 0x109 ) +#define MAPI_E_OBJECT_DELETED MAKE_MAPI_E( 0x10A ) +#define MAPI_E_BUSY MAKE_MAPI_E( 0x10B ) +#define MAPI_E_NOT_ENOUGH_DISK MAKE_MAPI_E( 0x10D ) +#define MAPI_E_NOT_ENOUGH_RESOURCES MAKE_MAPI_E( 0x10E ) +#define MAPI_E_NOT_FOUND MAKE_MAPI_E( 0x10F ) +#define MAPI_E_VERSION MAKE_MAPI_E( 0x110 ) +#define MAPI_E_LOGON_FAILED MAKE_MAPI_E( 0x111 ) +#define MAPI_E_SESSION_LIMIT MAKE_MAPI_E( 0x112 ) +#define MAPI_E_USER_CANCEL MAKE_MAPI_E( 0x113 ) +#define MAPI_E_UNABLE_TO_ABORT MAKE_MAPI_E( 0x114 ) +#define MAPI_E_NETWORK_ERROR MAKE_MAPI_E( 0x115 ) +#define MAPI_E_DISK_ERROR MAKE_MAPI_E( 0x116 ) +#define MAPI_E_TOO_COMPLEX MAKE_MAPI_E( 0x117 ) +#define MAPI_E_BAD_COLUMN MAKE_MAPI_E( 0x118 ) +#define MAPI_E_EXTENDED_ERROR MAKE_MAPI_E( 0x119 ) +#define MAPI_E_COMPUTED MAKE_MAPI_E( 0x11A ) +#define MAPI_E_CORRUPT_DATA MAKE_MAPI_E( 0x11B ) +#define MAPI_E_UNCONFIGURED MAKE_MAPI_E( 0x11C ) +#define MAPI_E_FAILONEPROVIDER MAKE_MAPI_E( 0x11D ) +#define MAPI_E_UNKNOWN_CPID MAKE_MAPI_E( 0x11E ) +#define MAPI_E_UNKNOWN_LCID MAKE_MAPI_E( 0x11F ) + +/* Flavors of E_ACCESSDENIED, used at logon */ + +#define MAPI_E_PASSWORD_CHANGE_REQUIRED MAKE_MAPI_E( 0x120 ) +#define MAPI_E_PASSWORD_EXPIRED MAKE_MAPI_E( 0x121 ) +#define MAPI_E_INVALID_WORKSTATION_ACCOUNT MAKE_MAPI_E( 0x122 ) +#define MAPI_E_INVALID_ACCESS_TIME MAKE_MAPI_E( 0x123 ) +#define MAPI_E_ACCOUNT_DISABLED MAKE_MAPI_E( 0x124 ) + +/* MAPI base function and status object specific errors and warnings */ + +#define MAPI_E_END_OF_SESSION MAKE_MAPI_E( 0x200 ) +#define MAPI_E_UNKNOWN_ENTRYID MAKE_MAPI_E( 0x201 ) +#define MAPI_E_MISSING_REQUIRED_COLUMN MAKE_MAPI_E( 0x202 ) +#define MAPI_W_NO_SERVICE MAKE_MAPI_S( 0x203 ) + +/* Property specific errors and warnings */ + +#define MAPI_E_BAD_VALUE MAKE_MAPI_E( 0x301 ) +#define MAPI_E_INVALID_TYPE MAKE_MAPI_E( 0x302 ) +#define MAPI_E_TYPE_NO_SUPPORT MAKE_MAPI_E( 0x303 ) +#define MAPI_E_UNEXPECTED_TYPE MAKE_MAPI_E( 0x304 ) +#define MAPI_E_TOO_BIG MAKE_MAPI_E( 0x305 ) +#define MAPI_E_DECLINE_COPY MAKE_MAPI_E( 0x306 ) +#define MAPI_E_UNEXPECTED_ID MAKE_MAPI_E( 0x307 ) + +#define MAPI_W_ERRORS_RETURNED MAKE_MAPI_S( 0x380 ) + +/* Table specific errors and warnings */ + +#define MAPI_E_UNABLE_TO_COMPLETE MAKE_MAPI_E( 0x400 ) +#define MAPI_E_TIMEOUT MAKE_MAPI_E( 0x401 ) +#define MAPI_E_TABLE_EMPTY MAKE_MAPI_E( 0x402 ) +#define MAPI_E_TABLE_TOO_BIG MAKE_MAPI_E( 0x403 ) + +#define MAPI_E_INVALID_BOOKMARK MAKE_MAPI_E( 0x405 ) + +#define MAPI_W_POSITION_CHANGED MAKE_MAPI_S( 0x481 ) +#define MAPI_W_APPROX_COUNT MAKE_MAPI_S( 0x482 ) + +/* Transport specific errors and warnings */ + +#define MAPI_E_WAIT MAKE_MAPI_E( 0x500 ) +#define MAPI_E_CANCEL MAKE_MAPI_E( 0x501 ) +#define MAPI_E_NOT_ME MAKE_MAPI_E( 0x502 ) + +#define MAPI_W_CANCEL_MESSAGE MAKE_MAPI_S( 0x580 ) + +/* Message Store, Folder, and Message specific errors and warnings */ + +#define MAPI_E_CORRUPT_STORE MAKE_MAPI_E( 0x600 ) +#define MAPI_E_NOT_IN_QUEUE MAKE_MAPI_E( 0x601 ) +#define MAPI_E_NO_SUPPRESS MAKE_MAPI_E( 0x602 ) +#define MAPI_E_COLLISION MAKE_MAPI_E( 0x604 ) +#define MAPI_E_NOT_INITIALIZED MAKE_MAPI_E( 0x605 ) +#define MAPI_E_NON_STANDARD MAKE_MAPI_E( 0x606 ) +#define MAPI_E_NO_RECIPIENTS MAKE_MAPI_E( 0x607 ) +#define MAPI_E_SUBMITTED MAKE_MAPI_E( 0x608 ) +#define MAPI_E_HAS_FOLDERS MAKE_MAPI_E( 0x609 ) +#define MAPI_E_HAS_MESSAGES MAKE_MAPI_E( 0x60A ) +#define MAPI_E_FOLDER_CYCLE MAKE_MAPI_E( 0x60B ) + +#define MAPI_W_PARTIAL_COMPLETION MAKE_MAPI_S( 0x680 ) + +/* Address Book specific errors and warnings */ + +#define MAPI_E_AMBIGUOUS_RECIP MAKE_MAPI_E( 0x700 ) + +/* The range 0x0800 to 0x08FF is reserved */ + +/* Obsolete typing shortcut that will go away eventually. */ +#ifndef MakeResult +#define MakeResult(_s) ResultFromScode(_s) +#endif + +/* We expect these to eventually be defined by OLE, but for now, + * here they are. When OLE defines them they can be much more + * efficient than these, but these are "proper" and don't make + * use of any hidden tricks. + */ +#ifndef HR_SUCCEEDED +#define HR_SUCCEEDED(_hr) SUCCEEDED((SCODE)(_hr)) +#define HR_FAILED(_hr) FAILED((SCODE)(_hr)) +#endif + +#endif /* MAPICODE_H */ diff --git a/comm/mailnews/mapi/include/mapidbg.h b/comm/mailnews/mapi/include/mapidbg.h new file mode 100644 index 0000000000..e22c5fce57 --- /dev/null +++ b/comm/mailnews/mapi/include/mapidbg.h @@ -0,0 +1,492 @@ +/* + * M A P I D B G . H + * + * Debugging support for MAPI service providers. + * Support functions are implemented in MAPIDBG.C. + * + * Copyright (c) 2009 Microsoft Corporation. All Rights Reserved. + */ + +#ifndef __MAPIDBG_H_ +#define __MAPIDBG_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#if defined (WIN64) && !defined (_WIN64) +#define _WIN64 +#endif + +/* + * Under Win64 systems Win32 is also defined for backwards compatibility. + */ + +#if defined (WIN32) && !defined (_WIN32) +#define _WIN32 +#endif + +/* + * Debugging Macros ------------------------------------------------------- + * + * IFDBG(x) Results in the expression x if DEBUG is defined, or + * to nothing if DEBUG is not defined + * + * IFNDBG(x) Results in the expression x if DEBUG is not defined, + * or to nothing if DEBUG is defined + * + * Unreferenced(a) Causes a to be referenced so that the compiler + * doesn't issue warnings about unused local variables + * which exist but are reserved for future use (eg + * ulFlags in many cases) + */ + +#if defined(DEBUG) +#define IFDBG(x) x +#define IFNDBG(x) +#else +#define IFDBG(x) +#define IFNDBG(x) x +#endif + +#ifdef __cplusplus +#define EXTERN_C_BEGIN extern "C" { +#define EXTERN_C_END } +#else +#define EXTERN_C_BEGIN +#define EXTERN_C_END +#endif + +#define dimensionof(a) (sizeof(a)/sizeof(*(a))) + +#define Unreferenced(a) ((void)(a)) + +typedef long SCODE; +typedef unsigned long ULONG; +typedef unsigned long DWORD; + +/* + * Assert Macros --------------------------------------------------------- + * + * Assert(a) Displays a message indicating the file and line number + * of this Assert() if a == 0. OK'ing an assert traps + * into the debugger. + * + * AssertSz(a,sz) Works like an Assert(), but displays the string sz + * along with the file and line number. + * + * Side asserts A side assert works like an Assert(), but evaluates + * 'a' even when asserts are not enabled. + * + * NF asserts A NF (Non-Fatal) assert works like an Assert(), but + * continues instead of trapping into the debugger when + * OK'ed. + */ + +#if defined(DEBUG) || defined(ASSERTS_ENABLED) +#define IFTRAP(x) x +#else +#define IFTRAP(x) 0 +#endif + +#define Trap() IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,"Trap")) +#define TrapSz(psz) IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz)) +#define TrapSz1(psz,a1) IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz,a1)) +#define TrapSz2(psz,a1,a2) IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2)) +#define TrapSz3(psz,a1,a2,a3) IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3)) +#define TrapSz4(psz,a1,a2,a3,a4) IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3,a4)) +#define TrapSz5(psz,a1,a2,a3,a4,a5) IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5)) +#define TrapSz6(psz,a1,a2,a3,a4,a5,a6) IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6)) +#define TrapSz7(psz,a1,a2,a3,a4,a5,a6,a7) IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6,a7)) +#define TrapSz8(psz,a1,a2,a3,a4,a5,a6,a7,a8) IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6,a7,a8)) +#define TrapSz9(psz,a1,a2,a3,a4,a5,a6,a7,a8,a9) IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6,a7,a8,a9)) + +#define Assert(t) IFTRAP(((t) ? 0 : DebugTrapFn(1,__FILE__,__LINE__,"Assertion Failure: " #t),0)) +#define AssertSz(t,psz) IFTRAP(((t) ? 0 : DebugTrapFn(1,__FILE__,__LINE__,psz),0)) +#define AssertSz1(t,psz,a1) IFTRAP(((t) ? 0 : DebugTrapFn(1,__FILE__,__LINE__,psz,a1),0)) +#define AssertSz2(t,psz,a1,a2) IFTRAP(((t) ? 0 : DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2),0)) +#define AssertSz3(t,psz,a1,a2,a3) IFTRAP(((t) ? 0 : DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3),0)) +#define AssertSz4(t,psz,a1,a2,a3,a4) IFTRAP(((t) ? 0 : DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3,a4),0)) +#define AssertSz5(t,psz,a1,a2,a3,a4,a5) IFTRAP(((t) ? 0 : DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5),0)) +#define AssertSz6(t,psz,a1,a2,a3,a4,a5,a6) IFTRAP(((t) ? 0 : DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6),0)) +#define AssertSz7(t,psz,a1,a2,a3,a4,a5,a6,a7) IFTRAP(((t) ? 0 : DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6,a7),0)) +#define AssertSz8(t,psz,a1,a2,a3,a4,a5,a6,a7,a8) IFTRAP(((t) ? 0 : DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6,a7,a8),0)) +#define AssertSz9(t,psz,a1,a2,a3,a4,a5,a6,a7,a8,a9) IFTRAP(((t) ? 0 : DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6,a7,a8,a9),0)) + +#define SideAssert(t) ((t) ? 0 : IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,"Assertion Failure: " #t)),0) +#define SideAssertSz(t,psz) ((t) ? 0 : IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz)),0) +#define SideAssertSz1(t,psz,a1) ((t) ? 0 : IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz,a1)),0) +#define SideAssertSz2(t,psz,a1,a2) ((t) ? 0 : IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2)),0) +#define SideAssertSz3(t,psz,a1,a2,a3) ((t) ? 0 : IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3)),0) +#define SideAssertSz4(t,psz,a1,a2,a3,a4) ((t) ? 0 : IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3,a4)),0) +#define SideAssertSz5(t,psz,a1,a2,a3,a4,a5) ((t) ? 0 : IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5)),0) +#define SideAssertSz6(t,psz,a1,a2,a3,a4,a5,a6) ((t) ? 0 : IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6)),0) +#define SideAssertSz7(t,psz,a1,a2,a3,a4,a5,a6,a7) ((t) ? 0 : IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6,a7)),0) +#define SideAssertSz8(t,psz,a1,a2,a3,a4,a5,a6,a7,a8) ((t) ? 0 : IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6,a7,a8)),0) +#define SideAssertSz9(t,psz,a1,a2,a3,a4,a5,a6,a7,a8,a9) ((t) ? 0 : IFTRAP(DebugTrapFn(1,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6,a7,a8,a9)),0) + +#define NFAssert(t) IFTRAP(((t) ? 0 : DebugTrapFn(0,__FILE__,__LINE__,"Assertion Failure: " #t),0)) +#define NFAssertSz(t,psz) IFTRAP(((t) ? 0 : DebugTrapFn(0,__FILE__,__LINE__,psz),0)) +#define NFAssertSz1(t,psz,a1) IFTRAP(((t) ? 0 : DebugTrapFn(0,__FILE__,__LINE__,psz,a1),0)) +#define NFAssertSz2(t,psz,a1,a2) IFTRAP(((t) ? 0 : DebugTrapFn(0,__FILE__,__LINE__,psz,a1,a2),0)) +#define NFAssertSz3(t,psz,a1,a2,a3) IFTRAP(((t) ? 0 : DebugTrapFn(0,__FILE__,__LINE__,psz,a1,a2,a3),0)) +#define NFAssertSz4(t,psz,a1,a2,a3,a4) IFTRAP(((t) ? 0 : DebugTrapFn(0,__FILE__,__LINE__,psz,a1,a2,a3,a4),0)) +#define NFAssertSz5(t,psz,a1,a2,a3,a4,a5) IFTRAP(((t) ? 0 : DebugTrapFn(0,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5),0)) +#define NFAssertSz6(t,psz,a1,a2,a3,a4,a5,a6) IFTRAP(((t) ? 0 : DebugTrapFn(0,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6),0)) +#define NFAssertSz7(t,psz,a1,a2,a3,a4,a5,a6,a7) IFTRAP(((t) ? 0 : DebugTrapFn(0,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6,a7),0)) +#define NFAssertSz8(t,psz,a1,a2,a3,a4,a5,a6,a7,a8) IFTRAP(((t) ? 0 : DebugTrapFn(0,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6,a7,a8),0)) +#define NFAssertSz9(t,psz,a1,a2,a3,a4,a5,a6,a7,a8,a9) IFTRAP(((t) ? 0 : DebugTrapFn(0,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6,a7,a8,a9),0)) + +#define NFSideAssert(t) ((t) ? 0 : IFTRAP(DebugTrapFn(0,__FILE__,__LINE__,"Assertion Failure: " #t)),0) +#define NFSideAssertSz(t,psz) ((t) ? 0 : IFTRAP(DebugTrapFn(0,__FILE__,__LINE__,psz)),0) +#define NFSideAssertSz1(t,psz,a1) ((t) ? 0 : IFTRAP(DebugTrapFn(0,__FILE__,__LINE__,psz,a1)),0) +#define NFSideAssertSz2(t,psz,a1,a2) ((t) ? 0 : IFTRAP(DebugTrapFn(0,__FILE__,__LINE__,psz,a1,a2)),0) +#define NFSideAssertSz3(t,psz,a1,a2,a3) ((t) ? 0 : IFTRAP(DebugTrapFn(0,__FILE__,__LINE__,psz,a1,a2,a3)),0) +#define NFSideAssertSz4(t,psz,a1,a2,a3,a4) ((t) ? 0 : IFTRAP(DebugTrapFn(0,__FILE__,__LINE__,psz,a1,a2,a3,a4)),0) +#define NFSideAssertSz5(t,psz,a1,a2,a3,a4,a5) ((t) ? 0 : IFTRAP(DebugTrapFn(0,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5)),0) +#define NFSideAssertSz6(t,psz,a1,a2,a3,a4,a5,a6) ((t) ? 0 : IFTRAP(DebugTrapFn(0,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6)),0) +#define NFSideAssertSz7(t,psz,a1,a2,a3,a4,a5,a6,a7) ((t) ? 0 : IFTRAP(DebugTrapFn(0,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6,a7)),0) +#define NFSideAssertSz8(t,psz,a1,a2,a3,a4,a5,a6,a7,a8) ((t) ? 0 : IFTRAP(DebugTrapFn(0,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6,a7,a8)),0) +#define NFSideAssertSz9(t,psz,a1,a2,a3,a4,a5,a6,a7,a8,a9) ((t) ? 0 : IFTRAP(DebugTrapFn(0,__FILE__,__LINE__,psz,a1,a2,a3,a4,a5,a6,a7,a8,a9)),0) + +/* + * Trace Macros ------------------------------------------------------------ + * + * DebugTrace Use for arbitrary formatted output. It + * takes exactly the same arguments as the + * Windows wsprintf() function. + * DebugTraceResult Shorthand for error tracing with an + * HRESULT. Arguments are the name of the + * function (not quoted) and the HRESULT. + * DebugTraceSc Shorthand for error tracing with an + * SCODE. Arguments are the name of the + * function (not quoted) and the SCODE. + * DebugTraceArg Shorthand for invalid parameter + * tracing. Arguments are the name of the + * function (not quoted) and a quoted + * string describing the bad parameter. + */ + +#if defined(DEBUG) || defined(TRACES_ENABLED) +#define IFTRACE(x) x +#define DebugTrace DebugTraceFn +#else +#define IFTRACE(x) 0 +#define DebugTrace 1?0:DebugTraceFn +#endif + +#define DebugTraceResult(f,hr) IFTRACE(((hr) ? DebugTraceFn(#f " returns 0x%08lX %s\n", GetScode(hr), SzDecodeScode(GetScode(hr))) : 0)) +#define DebugTraceSc(f,sc) IFTRACE(((sc) ? DebugTraceFn(#f " returns 0x%08lX %s\n", sc, SzDecodeScode(sc)) : 0)) +#define DebugTraceArg(f,s) IFTRACE(DebugTraceFn(#f ": bad parameter: " s "\n")) +#define DebugTraceLine() IFTRACE(DebugTraceFn("File %s, Line %i \n",__FILE__,__LINE__)) +#define DebugTraceProblems(sz, rgprob) IFTRACE(DebugTraceProblemsFn(sz, rgprob)) + +#define TraceSz(psz) IFTRACE(DebugTraceFn("~" psz)) +#define TraceSz1(psz,a1) IFTRACE(DebugTraceFn("~" psz,a1)) +#define TraceSz2(psz,a1,a2) IFTRACE(DebugTraceFn("~" psz,a1,a2)) +#define TraceSz3(psz,a1,a2,a3) IFTRACE(DebugTraceFn("~" psz,a1,a2,a3)) +#define TraceSz4(psz,a1,a2,a3,a4) IFTRACE(DebugTraceFn("~" psz,a1,a2,a3,a4)) +#define TraceSz5(psz,a1,a2,a3,a4,a5) IFTRACE(DebugTraceFn("~" psz,a1,a2,a3,a4,a5)) +#define TraceSz6(psz,a1,a2,a3,a4,a5,a6) IFTRACE(DebugTraceFn("~" psz,a1,a2,a3,a4,a5,a6)) +#define TraceSz7(psz,a1,a2,a3,a4,a5,a6,a7) IFTRACE(DebugTraceFn("~" psz,a1,a2,a3,a4,a5,a6,a7)) +#define TraceSz8(psz,a1,a2,a3,a4,a5,a6,a7,a8) IFTRACE(DebugTraceFn("~" psz,a1,a2,a3,a4,a5,a6,a7,a8)) +#define TraceSz9(psz,a1,a2,a3,a4,a5,a6,a7,a8,a9) IFTRACE(DebugTraceFn("~" psz,a1,a2,a3,a4,a5,a6,a7,a8,a9)) + +/* Debugging Functions ---------------------------------------------------- */ + +EXTERN_C_BEGIN + +#if defined(_WIN64) || defined (_WIN32) +#define EXPORTDBG +#else +#error "Unknown Platform: MAPI is currently supported on Win32 and Win64" +#endif + +int EXPORTDBG __cdecl DebugTrapFn(int fFatal, char *pszFile, int iLine, char *pszFormat, ...); +int EXPORTDBG __cdecl DebugTraceFn(char *pszFormat, ...); +void EXPORTDBG __cdecl DebugTraceProblemsFn(char *sz, void *rgprob); +char * EXPORTDBG __cdecl SzDecodeScodeFn(SCODE sc); +char * EXPORTDBG __cdecl SzDecodeUlPropTypeFn(unsigned long ulPropType); +char * EXPORTDBG __cdecl SzDecodeUlPropTagFn(unsigned long ulPropTag); +unsigned long EXPORTDBG __cdecl UlPropTagFromSzFn(char *psz); +SCODE EXPORTDBG __cdecl ScodeFromSzFn(char *psz); +void * EXPORTDBG __cdecl DBGMEM_EncapsulateFn(void * pmalloc, char *pszSubsys, int fCheckOften); +void EXPORTDBG __cdecl DBGMEM_ShutdownFn(void * pmalloc); +void EXPORTDBG __cdecl DBGMEM_CheckMemFn(void * pmalloc, int fReportOrphans); +#if defined(_WIN64) || defined(_WIN32) +void EXPORTDBG __cdecl DBGMEM_LeakHook(FARPROC pfn); +void EXPORTDBG __cdecl GetCallStack(DWORD_PTR *, int, int); +#endif +void EXPORTDBG __cdecl DBGMEM_NoLeakDetectFn(void * pmalloc, void *pv); +void EXPORTDBG __cdecl DBGMEM_SetFailureAtFn(void * pmalloc, ULONG ulFailureAt); +SCODE EXPORTDBG __cdecl ScCheckScFn(SCODE, SCODE *, char *, char *, int); +void * EXPORTDBG __cdecl VMAlloc(ULONG); +void * EXPORTDBG __cdecl VMAllocEx(ULONG, ULONG); +void * EXPORTDBG __cdecl VMRealloc(void *, ULONG); +void * EXPORTDBG __cdecl VMReallocEx(void *, ULONG, ULONG); +ULONG EXPORTDBG __cdecl VMGetSize(void *); +ULONG EXPORTDBG __cdecl VMGetSizeEx(void *, ULONG); +void EXPORTDBG __cdecl VMFree(void *); +void EXPORTDBG __cdecl VMFreeEx(void *, ULONG); + +EXTERN_C_END + +/* + * Debugging Macros ------------------------------------------------------- + * + * SzDecodeScode Returns the string name of an SCODE + * SzDecodeUlPropTag Returns the string name of a property + * tag + * UlPropTagFromSz Given a property tag's name, returns + * its value + * ScodeFromSz Given an SCODE's name, returns its + * value + * + * DBGMEM_Encapsulate Given an IMalloc interface, adds heap- + * checking functionality and returns a + * wrapped interface + * DBGMEM_Shutdown Undoes DBGMEM_Encapsulate, and prints + * out information on any allocations made + * since the interface was encapsulated + * that have not yet been released. + * DBGMEM_CheckMem Checks all memory allocated on the heap, + * and optionally reports leaked blocks. + * DBGMEM_NoLeakDetect Prevents a block from appearing on the leak + * report. Pass NULL for pv to inhibit leak + * reports at all from this heap. + */ + +#ifdef DEBUG + +#define SzDecodeScode(_sc) SzDecodeScodeFn(_sc) +#define SzDecodeUlPropType(_ulPropType) SzDecodeUlPropTypeFn(_ulPropType) +#define SzDecodeUlPropTag(_ulPropTag) SzDecodeUlPropTagFn(_ulPropTag) +#define UlPropTagFromSz(_sz) UlPropTagFromSzFn(_sz) +#define ScodeFromSz(_sz) ScodeFromSzFn(_sz) +#define DBGMEM_Encapsulate(pm, psz, f) DBGMEM_EncapsulateFn(pm, psz, f) +#define DBGMEM_Shutdown(pm) DBGMEM_ShutdownFn(pm) +#define DBGMEM_CheckMem(pm, f) DBGMEM_CheckMemFn(pm, f) +#define DBGMEM_NoLeakDetect(pm, pv) DBGMEM_NoLeakDetectFn(pm, pv) +#define DBGMEM_SetFailureAt(pm, ul) DBGMEM_SetFailureAtFn(pm, ul) + +#else + +#define SzDecodeScode(_sc) (0) +#define SzDecodeUlPropType(_ulPropType) (0) +#define SzDecodeUlPropTag(_ulPropTag) (0) +#define UlPropTagFromSz(_sz) (0) +#define ScodeFromSz(_sz) (0) + +#if defined(__cplusplus) && !defined(CINTERFACE) +#define DBGMEM_Encapsulate(pmalloc, pszSubsys, fCheckOften) \ + ((pmalloc)->AddRef(), (pmalloc)) +#define DBGMEM_Shutdown(pmalloc) \ + ((pmalloc)->Release()) +#else +#define DBGMEM_Encapsulate(pmalloc, pszSubsys, fCheckOften) \ + ((pmalloc)->lpVtbl->AddRef(pmalloc), (pmalloc)) +#define DBGMEM_Shutdown(pmalloc) \ + ((pmalloc)->lpVtbl->Release(pmalloc)) +#endif +#define DBGMEM_CheckMem(pm, f) +#define DBGMEM_NoLeakDetect(pm, pv) +#define DBGMEM_SetFailureAt(pm, ul) + +#endif + +/* + * SCODE maps ------------------------------------------------------------- + * + * ScCheckSc Given an SCODE and method name, verifies + * that the SCODE can legally be returned from + * thet method. Prints out a debug string if + * it cannot. + * HrCheckHr As ScCheckSc, for functions that return + * HRESULT. + */ + +#if defined(DEBUG) && !defined(DOS) +#define ScCheckSc(sc,fn) ScCheckScFn(sc,fn##_Scodes,#fn,__FILE__, __LINE__) +#define HrCheckHr(hr,fn) HrCheckSc(GetScode(hr),fn) +#else +#define ScCheckSc(sc,fn) (sc) +#define HrCheckHr(hr,fn) (hr) +#endif + +#define HrCheckSc(sc,fn) ResultFromScode(ScCheckSc(sc,fn)) + +#if defined(DEBUG) && !defined(DOS) +extern SCODE Common_Scodes[]; +extern SCODE MAPILogon_Scodes[]; +extern SCODE MAPIAllocateBuffer_Scodes[]; +extern SCODE MAPIAllocateMore_Scodes[]; +extern SCODE MAPIFreeBuffer_Scodes[]; + +extern SCODE IUnknown_QueryInterface_Scodes[]; +extern SCODE IUnknown_AddRef_Scodes[]; +extern SCODE IUnknown_Release_Scodes[]; +extern SCODE IUnknown_GetLastError_Scodes[]; + +extern SCODE IMAPIProp_CopyTo_Scodes[]; +extern SCODE IMAPIProp_CopyProps_Scodes[]; +extern SCODE IMAPIProp_DeleteProps_Scodes[]; +extern SCODE IMAPIProp_GetIDsFromNames_Scodes[]; +extern SCODE IMAPIProp_GetLastError_Scodes[]; +extern SCODE IMAPIProp_GetNamesFromIDs_Scodes[]; +extern SCODE IMAPIProp_GetPropList_Scodes[]; +extern SCODE IMAPIProp_GetProps_Scodes[]; +extern SCODE IMAPIProp_OpenProperty_Scodes[]; +extern SCODE IMAPIProp_SetProps_Scodes[]; +extern SCODE IMAPIProp_SaveChanges_Scodes[]; + +extern SCODE IStream_Read_Scodes[]; +extern SCODE IStream_Write_Scodes[]; +extern SCODE IStream_Seek_Scodes[]; +extern SCODE IStream_SetSize_Scodes[]; +extern SCODE IStream_Tell_Scodes[]; +extern SCODE IStream_LockRegion_Scodes[]; +extern SCODE IStream_UnlockRegion_Scodes[]; +extern SCODE IStream_Clone_Scodes[]; +extern SCODE IStream_CopyTo_Scodes[]; +extern SCODE IStream_Revert_Scodes[]; +extern SCODE IStream_Stat_Scodes[]; +extern SCODE IStream_Commit_Scodes[]; + +extern SCODE IMAPITable_GetLastError_Scodes[]; +extern SCODE IMAPITable_Advise_Scodes[]; +extern SCODE IMAPITable_Unadvise_Scodes[]; +extern SCODE IMAPITable_GetStatus_Scodes[]; +extern SCODE IMAPITable_SetColumns_Scodes[]; +extern SCODE IMAPITable_QueryColumns_Scodes[]; +extern SCODE IMAPITable_GetRowCount_Scodes[]; +extern SCODE IMAPITable_SeekRow_Scodes[]; +extern SCODE IMAPITable_SeekRowApprox_Scodes[]; +extern SCODE IMAPITable_QueryPosition_Scodes[]; +extern SCODE IMAPITable_FindRow_Scodes[]; +extern SCODE IMAPITable_Restrict_Scodes[]; +extern SCODE IMAPITable_CreateBookmark_Scodes[]; +extern SCODE IMAPITable_FreeBookmark_Scodes[]; +extern SCODE IMAPITable_SortTable_Scodes[]; +extern SCODE IMAPITable_QuerySortOrder_Scodes[]; +extern SCODE IMAPITable_QueryRows_Scodes[]; +extern SCODE IMAPITable_Abort_Scodes[]; +extern SCODE IMAPITable_ExpandRow_Scodes[]; +extern SCODE IMAPITable_CollapseRow_Scodes[]; +extern SCODE IMAPITable_WaitForCompletion_Scodes[]; +extern SCODE IMAPITable_GetCollapseState_Scodes[]; +extern SCODE IMAPITable_SetCollapseState_Scodes[]; + +extern SCODE IMAPISession_LogOff_Scodes[]; +extern SCODE IMAPISession_Release_Scodes[]; +extern SCODE IMAPISession_GetLastError_Scodes[]; +extern SCODE IMAPISession_GetMsgStoresTable_Scodes[]; +extern SCODE IMAPISession_GetStatusTable_Scodes[]; +extern SCODE IMAPISession_OpenMsgStore_Scodes[]; +extern SCODE IMAPISession_OpenAddressBook_Scodes[]; +extern SCODE IMAPISession_OpenEntry_Scodes[]; +extern SCODE IMAPISession_OpenProfileSection_Scodes[]; +extern SCODE IMAPISession_Advise_Scodes[]; +extern SCODE IMAPISession_Unadvise_Scodes[]; +extern SCODE IMAPISession_CompareEntryIDs_Scodes[]; +extern SCODE IMAPISession_MessageOptions_Scodes[]; +extern SCODE IMAPISession_QueryDefaultMessageOpt_Scodes[]; +extern SCODE IMAPISession_EnumAdrTypes_Scodes[]; +extern SCODE IMAPISession_QueryIdentity_Scodes[]; +extern SCODE IMAPISession_OpenProfileSection_Scodes[]; +extern SCODE IMAPISession_GetStatusTable_Scodes[]; + +extern SCODE IMsgStore_Advise_Scodes[] ; +extern SCODE IMsgStore_Unadvise_Scodes[] ; +extern SCODE IMsgStore_CompareEntryIDs_Scodes[] ; +extern SCODE IMsgStore_OpenEntry_Scodes[] ; +extern SCODE IMsgStore_SetReceiveFolder_Scodes[]; +extern SCODE IMsgStore_GetReceiveFolder_Scodes[]; +extern SCODE IMsgStore_GetReceiveFolderTable_Scodes[]; +extern SCODE IMsgStore_StoreLogoff_Scodes[]; +extern SCODE IMsgStore_AbortSubmit_Scodes[]; +extern SCODE IMsgStore_GetOutgoingQueue_Scodes[] ; +extern SCODE IMsgStore_SetLockState_Scodes[] ; +extern SCODE IMsgStore_FinishedMsg_Scodes[] ; +extern SCODE IMsgStore_NotifyNewMail_Scodes[]; + +extern SCODE IMAPIFolder_GetContentsTable_Scodes[]; +extern SCODE IMAPIFolder_GetHierarchyTable_Scodes[]; +extern SCODE IMAPIFolder_SaveContentsSort_Scodes[]; +extern SCODE IMAPIFolder_OpenEntry_Scodes[]; +extern SCODE IMAPIFolder_CreateMessage_Scodes[]; +extern SCODE IMAPIFolder_CopyMessages_Scodes[]; +extern SCODE IMAPIFolder_DeleteMessages_Scodes[]; +extern SCODE IMAPIFolder_CreateFolder_Scodes[]; +extern SCODE IMAPIFolder_CopyFolder_Scodes[]; +extern SCODE IMAPIFolder_DeleteFolder_Scodes[]; +extern SCODE IMAPIFolder_SetSearchCriteria_Scodes[]; +extern SCODE IMAPIFolder_GetSearchCriteria_Scodes[]; +extern SCODE IMAPIFolder_SetReadFlags_Scodes[]; +extern SCODE IMAPIFolder_GetMessageStatus_Scodes[]; +extern SCODE IMAPIFolder_SetMessageStatus_Scodes[]; +extern SCODE IMAPIFolder_EmptyFolder_Scodes[]; + +extern SCODE IMessage_SaveChanges_Scodes[]; +extern SCODE IMessage_GetAttachmentTable_Scodes[]; +extern SCODE IMessage_OpenAttach_Scodes[]; +extern SCODE IMessage_CreateAttach_Scodes[]; +extern SCODE IMessage_DeleteAttach_Scodes[]; +extern SCODE IMessage_GetRecipientTable_Scodes[]; +extern SCODE IMessage_ModifyRecipients_Scodes[]; +extern SCODE IMessage_SubmitMessage_Scodes[]; +extern SCODE IMessage_SetReadFlag_Scodes[]; + +extern SCODE IAttach_SaveChanges_Scodes[]; + +extern SCODE IAddrBook_OpenEntry_Scodes[]; +extern SCODE IAddrBook_CompareEntryIDs_Scodes[]; +extern SCODE IAddrBook_CreateOneOff_Scodes[]; +extern SCODE IAddrBook_ResolveName_Scodes[]; +extern SCODE IAddrBook_Address_Scodes[]; +extern SCODE IAddrBook_Details_Scodes[]; +extern SCODE IAddrBook_RecipOptions_Scodes[]; +extern SCODE IAddrBook_QueryDefaultRecipOpt_Scodes[]; +extern SCODE IAddrBook_Address_Scodes[]; +extern SCODE IAddrBook_ButtonPress_Scodes[]; + +extern SCODE IABContainer_GetContentsTable_Scodes[]; +extern SCODE IABContainer_GetHierarchyTable_Scodes[]; + +extern SCODE INotifObj_ChangeEvMask_Scodes[]; + +extern SCODE IMAPIStatus_ChangePassword_Scodes[]; +extern SCODE IMAPIStatus_FlushQueues_Scodes[]; +extern SCODE IMAPIStatus_SettingsDialog_Scodes[]; +extern SCODE IMAPIStatus_ValidateState_Scodes[]; + +extern SCODE IMSProvider_Logon_Scodes[]; +extern SCODE IMSProvider_Deinit_Scodes[]; +extern SCODE IMSProvider_Init_Scodes[]; +extern SCODE IMSProvider_SpoolerLogon_Scodes[]; +extern SCODE IMSProvider_Shutdown_Scodes[]; + +extern SCODE SMAPI_MAPILogon_Scodes[]; +extern SCODE SMAPI_MAPILogoff_Scodes[]; +extern SCODE SMAPI_MAPIFreeBuffer_Scodes[]; +extern SCODE SMAPI_MAPISendMail_Scodes[]; +extern SCODE SMAPI_MAPISendDocuments_Scodes[]; +extern SCODE SMAPI_MAPIFindNext_Scodes[]; +extern SCODE SMAPI_MAPIReadMail_Scodes[]; +extern SCODE SMAPI_MAPISaveMail_Scodes[]; +extern SCODE SMAPI_MAPIDeleteMail_Scodes[]; +extern SCODE SMAPI_MAPIAddress_Scodes[]; +extern SCODE SMAPI_MAPIResolveName_Scodes[]; +extern SCODE SMAPI_MAPIDetails_Scodes[]; + +extern SCODE IMSLogon_OpenEntry_Scodes[]; +extern SCODE IMSLogon_OpenStatusEntry_Scodes[]; +extern SCODE IMSLogon_CompareEntryIDs_Scodes[]; +extern SCODE IMSLogon_Advise_Scodes[]; +extern SCODE IMSLogon_Unadvise_Scodes[]; +extern SCODE IMSLogon_Logoff_Scodes[]; +#endif + +/* ------------------------------------------------------------------------ */ + +#endif + diff --git a/comm/mailnews/mapi/include/mapidefs.h b/comm/mailnews/mapi/include/mapidefs.h new file mode 100644 index 0000000000..83597279e3 --- /dev/null +++ b/comm/mailnews/mapi/include/mapidefs.h @@ -0,0 +1,2736 @@ +/* + * M A P I D E F S . H + * + * Definitions used by MAPI clients and service providers. + * + * Copyright (c) 2009 Microsoft Corporation. All Rights Reserved. + */ + +#ifndef MAPIDEFS_H +#define MAPIDEFS_H + +#if _MSC_VER > 1000 +#pragma once +#endif + +#if defined (WIN64) && !defined (_WIN64) +#define _WIN64 +#endif + +/* + * Under Win64 systems Win32 is also defined for backwards compatibility. + */ + +#if defined (WIN32) && !defined (_WIN32) +#define _WIN32 +#endif + +#if defined (_WIN64) || defined(_WIN32) /* Must include WINDOWS.H on Win32/Win64 */ +#ifndef _WINDOWS_ +#define INC_OLE2 /* Get the OLE2 stuff */ +#define INC_RPC /* harmless on Windows NT; Windows 95 needs it */ +#define _INC_OLE /* Windows 95 will include OLE1 without this */ +#include <windows.h> +#endif + +#ifndef _OLEERROR_H_ +#include <winerror.h> +#endif +#ifndef _OBJBASE_H_ +#include <objbase.h> +#endif +#endif + +#if defined (DOS) +#ifndef _COMPOBJ_H_ +#include <compobj.h> +#endif +#endif + +#ifndef _INC_STDDEF +#include <stddef.h> +#endif + +/* Array dimension for structures with variable-sized arrays at the end. */ + +#ifndef MAPI_DIM +#define MAPI_DIM 1 +#endif + +/* Provider init type. Force to cdecl always */ + +#ifndef STDMAPIINITCALLTYPE +#if !defined (_MAC) && (defined (_WIN64) || defined(_WIN32)) +#define STDMAPIINITCALLTYPE __cdecl +#else +#define STDMAPIINITCALLTYPE STDMETHODCALLTYPE +#endif +#define STDINITMETHODIMP HRESULT STDMAPIINITCALLTYPE +#define STDINITMETHODIMP_(type) type STDMAPIINITCALLTYPE +#endif + + +#define MAPI_NT_SERVICE ((ULONG) 0x00010000) /* Provider is being loaded in an NT service */ + + +#ifdef __cplusplus +extern "C" { +#endif + +/* Simple data types */ + +#if !defined (MIDL_PASS) /* MIDL doesn't want to see these */ + +#ifndef _MAC +typedef wchar_t WCHAR; // wc, 16-bit UNICODE character +#else +// some Macintosh compilers don't define wchar_t in a convenient location, or define it as a char +typedef unsigned short WCHAR; // wc, 16-bit UNICODE character +#endif + +#ifdef UNICODE +typedef WCHAR TCHAR; +#else +typedef char TCHAR; +#endif + + +#if _SAL_VERSION >= 20 +typedef _Null_terminated_ WCHAR FAR * LPWSTR; +typedef _Null_terminated_ const WCHAR FAR * LPCWSTR; +#else +typedef WCHAR FAR * LPWSTR; +typedef const WCHAR FAR * LPCWSTR; +#endif +typedef TCHAR FAR * LPTSTR; +typedef const TCHAR FAR * LPCTSTR; +typedef BYTE FAR * LPBYTE; +#endif /* defined MIDL_PASS */ + +typedef ULONG FAR * LPULONG; + +#ifndef __LHANDLE +#define __LHANDLE +typedef ULONG_PTR LHANDLE, FAR * LPLHANDLE; +#endif + +#if !defined(_WINBASE_) && !defined(_FILETIME_) +#define _FILETIME_ +typedef struct _FILETIME +{ + DWORD dwLowDateTime; + DWORD dwHighDateTime; +} FILETIME, FAR * LPFILETIME; +#endif + +#ifndef BEGIN_INTERFACE +#define BEGIN_INTERFACE +#endif + +/* + * This flag is used in many different MAPI calls to signify that + * the object opened by the call should be modifiable (MAPI_MODIFY). + * If the flag MAPI_MAX_ACCESS is set, the object returned should be + * returned at the maximum access level allowed. An additional + * property available on the object (PR_ACCESS_LEVEL) uses the same + * MAPI_MODIFY flag to say just what this new access level is. + */ + +#define MAPI_MODIFY ((ULONG) 0x00000001) + +/* + * The following flags are used to indicate to the client what access + * level is permissible in the object. They appear in PR_ACCESS in + * message and folder objects as well as in contents and associated + * contents tables + */ + +#define MAPI_ACCESS_MODIFY ((ULONG) 0x00000001) +#define MAPI_ACCESS_READ ((ULONG) 0x00000002) +#define MAPI_ACCESS_DELETE ((ULONG) 0x00000004) +#define MAPI_ACCESS_CREATE_HIERARCHY ((ULONG) 0x00000008) +#define MAPI_ACCESS_CREATE_CONTENTS ((ULONG) 0x00000010) +#define MAPI_ACCESS_CREATE_ASSOCIATED ((ULONG) 0x00000020) + +/* + * The MAPI_UNICODE flag is used in many different MAPI calls to signify + * that strings passed through the interface are in Unicode (a 16-bit + * character set). The default is an 8-bit character set. + * + * The value fMapiUnicode can be used as the 'normal' value for + * that bit, given the application's default character set. + */ + +#define MAPI_UNICODE ((ULONG) 0x80000000) + +#ifdef UNICODE +#define fMapiUnicode MAPI_UNICODE +#else +#define fMapiUnicode 0 +#endif + +/* successful HRESULT */ +#define hrSuccess 0 + + + +/* Recipient types */ +#ifndef MAPI_ORIG /* also defined in mapi.h */ +#define MAPI_ORIG 0 /* Recipient is message originator */ +#define MAPI_TO 1 /* Recipient is a primary recipient */ +#define MAPI_CC 2 /* Recipient is a copy recipient */ +#define MAPI_BCC 3 /* Recipient is blind copy recipient */ +#define MAPI_P1 0x10000000 /* Recipient is a P1 resend recipient */ +#define MAPI_SUBMITTED 0x80000000 /* Recipient is already processed */ +/* #define MAPI_AUTHORIZE 4 recipient is a CMC authorizing user */ +/*#define MAPI_DISCRETE 0x10000000 Recipient is a P1 resend recipient */ +#endif + +/* Bit definitions for abFlags[0] of ENTRYID */ +#define MAPI_SHORTTERM 0x80 +#define MAPI_NOTRECIP 0x40 +#define MAPI_THISSESSION 0x20 +#define MAPI_NOW 0x10 +#define MAPI_NOTRESERVED 0x08 + +/* Bit definitions for abFlags[1] of ENTRYID */ +#define MAPI_COMPOUND 0x80 + +/* ENTRYID */ +typedef struct +{ + BYTE abFlags[4]; + BYTE ab[MAPI_DIM]; +} ENTRYID, FAR *LPENTRYID; + +#define CbNewENTRYID(_cb) (offsetof(ENTRYID,ab) + (_cb)) +#define CbENTRYID(_cb) (offsetof(ENTRYID,ab) + (_cb)) +#define SizedENTRYID(_cb, _name) \ + struct _ENTRYID_ ## _name \ +{ \ + BYTE abFlags[4]; \ + BYTE ab[_cb]; \ +} _name + +/* Byte-order-independent version of GUID (world-unique identifier) */ +typedef struct _MAPIUID +{ + BYTE ab[16]; +} MAPIUID, FAR * LPMAPIUID; + +/* Note: need to include C run-times (memory.h) to use this macro */ + +#define IsEqualMAPIUID(lpuid1, lpuid2) (!memcmp(lpuid1, lpuid2, sizeof(MAPIUID))) + +/* + * Constants for one-off entry ID: + * The MAPIUID that identifies the one-off provider; + * the flag that defines whether the embedded strings are Unicode; + * the flag that specifies whether the recipient gets TNEF or not. + */ + +#define MAPI_ONE_OFF_UID { 0x81, 0x2b, 0x1f, 0xa4, 0xbe, 0xa3, 0x10, 0x19, \ + 0x9d, 0x6e, 0x00, 0xdd, 0x01, 0x0f, 0x54, 0x02 } +#define MAPI_ONE_OFF_UNICODE 0x8000 +#define MAPI_ONE_OFF_NO_RICH_INFO 0x0001 + +/* Object type */ + +#define MAPI_STORE ((ULONG) 0x00000001) /* Message Store */ +#define MAPI_ADDRBOOK ((ULONG) 0x00000002) /* Address Book */ +#define MAPI_FOLDER ((ULONG) 0x00000003) /* Folder */ +#define MAPI_ABCONT ((ULONG) 0x00000004) /* Address Book Container */ +#define MAPI_MESSAGE ((ULONG) 0x00000005) /* Message */ +#define MAPI_MAILUSER ((ULONG) 0x00000006) /* Individual Recipient */ +#define MAPI_ATTACH ((ULONG) 0x00000007) /* Attachment */ +#define MAPI_DISTLIST ((ULONG) 0x00000008) /* Distribution List Recipient */ +#define MAPI_PROFSECT ((ULONG) 0x00000009) /* Profile Section */ +#define MAPI_STATUS ((ULONG) 0x0000000A) /* Status Object */ +#define MAPI_SESSION ((ULONG) 0x0000000B) /* Session */ +#define MAPI_FORMINFO ((ULONG) 0x0000000C) /* Form Information */ + + +/* + * Maximum length of profile names and passwords, not including + * the null termination character. + */ +#ifndef cchProfileNameMax +#define cchProfileNameMax 64 +#define cchProfilePassMax 64 +#endif + + +/* Property Types */ + +#define MV_FLAG 0x1000 /* Multi-value flag */ + +#define PT_UNSPECIFIED ((ULONG) 0) /* (Reserved for interface use) type doesn't matter to caller */ +#define PT_NULL ((ULONG) 1) /* NULL property value */ +#define PT_I2 ((ULONG) 2) /* Signed 16-bit value */ +#define PT_LONG ((ULONG) 3) /* Signed 32-bit value */ +#define PT_R4 ((ULONG) 4) /* 4-byte floating point */ +#define PT_DOUBLE ((ULONG) 5) /* Floating point double */ +#define PT_CURRENCY ((ULONG) 6) /* Signed 64-bit int (decimal w/ 4 digits right of decimal pt) */ +#define PT_APPTIME ((ULONG) 7) /* Application time */ +#define PT_ERROR ((ULONG) 10) /* 32-bit error value */ +#define PT_BOOLEAN ((ULONG) 11) /* 16-bit boolean (non-zero true) */ +#define PT_OBJECT ((ULONG) 13) /* Embedded object in a property */ +#define PT_I8 ((ULONG) 20) /* 8-byte signed integer */ +#define PT_STRING8 ((ULONG) 30) /* Null terminated 8-bit character string */ +#define PT_UNICODE ((ULONG) 31) /* Null terminated Unicode string */ +#define PT_SYSTIME ((ULONG) 64) /* FILETIME 64-bit int w/ number of 100ns periods since Jan 1,1601 */ +#define PT_CLSID ((ULONG) 72) /* OLE GUID */ +#define PT_BINARY ((ULONG) 258) /* Uninterpreted (counted byte array) */ +#define PT_PTR ((ULONG) 259) /* Pointer Variable, scales to the platform */ +/* Changes are likely to these numbers, and to their structures. */ + +/* Alternate property type names for ease of use */ +#define PT_SHORT PT_I2 +#define PT_I4 PT_LONG +#define PT_FLOAT PT_R4 +#define PT_R8 PT_DOUBLE +#define PT_LONGLONG PT_I8 + +/* + * The type of a MAPI-defined string property is indirected, so + * that it defaults to Unicode string on a Unicode platform and to + * String8 on an ANSI or DBCS platform. + * + * Macros are defined here both for the property type, and for the + * field of the property value structure which should be + * dereferenced to obtain the string pointer. + */ + +#ifdef UNICODE +#define PT_TSTRING PT_UNICODE +#define PT_MV_TSTRING (MV_FLAG|PT_UNICODE) +#define LPSZ lpszW +#define LPPSZ lppszW +#define MVSZ MVszW +#else +#define PT_TSTRING PT_STRING8 +#define PT_MV_TSTRING (MV_FLAG|PT_STRING8) +#define LPSZ lpszA +#define LPPSZ lppszA +#define MVSZ MVszA +#endif + + +/* Property Tags + * + * By convention, MAPI never uses 0 or FFFF as a property ID. + * Use as null values, initializers, sentinels, or what have you. + */ + +#define PROP_TYPE_MASK ((ULONG)0x0000FFFF) /* Mask for Property type */ +#define PROP_TYPE(ulPropTag) (((ULONG)(ulPropTag))&PROP_TYPE_MASK) +#define PROP_ID(ulPropTag) (((ULONG)(ulPropTag))>>16) +#define PROP_TAG(ulPropType,ulPropID) ((((ULONG)(ulPropID))<<16)|((ULONG)(ulPropType))) +#define PROP_ID_NULL 0 +#define PROP_ID_INVALID 0xFFFF +#define PR_NULL PROP_TAG( PT_NULL, PROP_ID_NULL) +#define CHANGE_PROP_TYPE(ulPropTag, ulPropType) \ + (((ULONG)0xFFFF0000 & (ulPropTag)) | (ulPropType)) + + +/* Multi-valued Property Types */ + +#define PT_MV_I2 (MV_FLAG|PT_I2) +#define PT_MV_LONG (MV_FLAG|PT_LONG) +#define PT_MV_R4 (MV_FLAG|PT_R4) +#define PT_MV_DOUBLE (MV_FLAG|PT_DOUBLE) +#define PT_MV_CURRENCY (MV_FLAG|PT_CURRENCY) +#define PT_MV_APPTIME (MV_FLAG|PT_APPTIME) +#define PT_MV_SYSTIME (MV_FLAG|PT_SYSTIME) +#define PT_MV_STRING8 (MV_FLAG|PT_STRING8) +#define PT_MV_BINARY (MV_FLAG|PT_BINARY) +#define PT_MV_UNICODE (MV_FLAG|PT_UNICODE) +#define PT_MV_CLSID (MV_FLAG|PT_CLSID) +#define PT_MV_I8 (MV_FLAG|PT_I8) + +/* Alternate property type names for ease of use */ +#define PT_MV_SHORT PT_MV_I2 +#define PT_MV_I4 PT_MV_LONG +#define PT_MV_FLOAT PT_MV_R4 +#define PT_MV_R8 PT_MV_DOUBLE +#define PT_MV_LONGLONG PT_MV_I8 + +/* + * Property type reserved bits + * + * MV_INSTANCE is used as a flag in table operations to request + * that a multi-valued property be presented as a single-valued + * property appearing in multiple rows. + */ + +#define MV_INSTANCE 0x2000 +#define MVI_FLAG (MV_FLAG | MV_INSTANCE) +#define MVI_PROP(tag) ((tag) | MVI_FLAG) + +/* --------------- */ +/* Data Structures */ +/* --------------- */ + +/* Property Tag Array */ + +typedef struct _SPropTagArray +{ + ULONG cValues; + ULONG aulPropTag[MAPI_DIM]; +} SPropTagArray, FAR * LPSPropTagArray; + +#define CbNewSPropTagArray(_ctag) \ + (offsetof(SPropTagArray,aulPropTag) + (_ctag)*sizeof(ULONG)) +#define CbSPropTagArray(_lparray) \ + (offsetof(SPropTagArray,aulPropTag) + \ + (UINT)((_lparray)->cValues)*sizeof(ULONG)) +/* SPropTagArray */ +#define SizedSPropTagArray(_ctag, _name) \ +struct _SPropTagArray_ ## _name \ +{ \ + ULONG cValues; \ + ULONG aulPropTag[_ctag]; \ +} _name + +/* -------------- */ +/* Property Value */ +/* -------------- */ + +typedef struct _SPropValue SPropValue; + + +/* 32-bit CURRENCY definition stolen from oaidl.h */ +/* 16-bit CURRENCY definition stolen from variant.h */ + +#ifndef _tagCY_DEFINED +#define _tagCY_DEFINED +#define _CY_DEFINED +#if defined (DOS) && !defined (_VARIANT_H_) +typedef struct FARSTRUCT tagCY { +#ifdef _MAC + long Hi; + long Lo; +#else + unsigned long Lo; + long Hi; +#endif +} CY; +#elif defined (_WIN64) || defined(_WIN32) +/* real definition that makes the C++ compiler happy */ +typedef union tagCY { + struct { +#ifdef _MAC + long Hi; + long Lo; +#else + unsigned long Lo; + long Hi; +#endif + }; + LONGLONG int64; +} CY; +#endif +#endif + /* size is 8 */ +typedef CY CURRENCY; + +typedef struct _SBinary +{ + ULONG cb; + LPBYTE lpb; +} SBinary, FAR *LPSBinary; + +typedef struct _SShortArray +{ + ULONG cValues; + short int FAR *lpi; +} SShortArray; + +typedef struct _SGuidArray +{ + ULONG cValues; + GUID FAR *lpguid; +} SGuidArray; + +typedef struct _SRealArray +{ + ULONG cValues; + float FAR *lpflt; +} SRealArray; + +typedef struct _SLongArray +{ + ULONG cValues; + LONG FAR *lpl; +} SLongArray; + +typedef struct _SLargeIntegerArray +{ + ULONG cValues; + LARGE_INTEGER FAR *lpli; +} SLargeIntegerArray; + +typedef struct _SDateTimeArray +{ + ULONG cValues; + FILETIME FAR *lpft; +} SDateTimeArray; + +typedef struct _SAppTimeArray +{ + ULONG cValues; + double FAR *lpat; +} SAppTimeArray; + +typedef struct _SCurrencyArray +{ + ULONG cValues; + CURRENCY FAR *lpcur; +} SCurrencyArray; + +typedef struct _SBinaryArray +{ + ULONG cValues; + SBinary FAR *lpbin; +} SBinaryArray; + +typedef struct _SDoubleArray +{ + ULONG cValues; + double FAR *lpdbl; +} SDoubleArray; + +typedef struct _SWStringArray +{ + ULONG cValues; + LPWSTR FAR *lppszW; +} SWStringArray; + +typedef struct _SLPSTRArray +{ + ULONG cValues; + LPSTR FAR *lppszA; +} SLPSTRArray; + +typedef union _PV +{ + short int i; /* case PT_I2 */ + LONG l; /* case PT_LONG */ + ULONG ul; /* alias for PT_LONG */ + LPVOID lpv; /* alias for PT_PTR */ + float flt; /* case PT_R4 */ + double dbl; /* case PT_DOUBLE */ + unsigned short int b; /* case PT_BOOLEAN */ + CURRENCY cur; /* case PT_CURRENCY */ + double at; /* case PT_APPTIME */ + FILETIME ft; /* case PT_SYSTIME */ + LPSTR lpszA; /* case PT_STRING8 */ + SBinary bin; /* case PT_BINARY */ + LPWSTR lpszW; /* case PT_UNICODE */ + LPGUID lpguid; /* case PT_CLSID */ + LARGE_INTEGER li; /* case PT_I8 */ + SShortArray MVi; /* case PT_MV_I2 */ + SLongArray MVl; /* case PT_MV_LONG */ + SRealArray MVflt; /* case PT_MV_R4 */ + SDoubleArray MVdbl; /* case PT_MV_DOUBLE */ + SCurrencyArray MVcur; /* case PT_MV_CURRENCY */ + SAppTimeArray MVat; /* case PT_MV_APPTIME */ + SDateTimeArray MVft; /* case PT_MV_SYSTIME */ + SBinaryArray MVbin; /* case PT_MV_BINARY */ + SLPSTRArray MVszA; /* case PT_MV_STRING8 */ + SWStringArray MVszW; /* case PT_MV_UNICODE */ + SGuidArray MVguid; /* case PT_MV_CLSID */ + SLargeIntegerArray MVli; /* case PT_MV_I8 */ + SCODE err; /* case PT_ERROR */ + LONG x; /* case PT_NULL, PT_OBJECT (no usable value) */ +} __UPV; + +typedef struct _SPropValue +{ + ULONG ulPropTag; + ULONG dwAlignPad; + union _PV Value; +} SPropValue, FAR * LPSPropValue; + + +/* --------------------------------------------- */ +/* Property Problem and Property Problem Arrays */ +/* --------------------------------------------- */ + +typedef struct _SPropProblem +{ + ULONG ulIndex; + ULONG ulPropTag; + SCODE scode; +} SPropProblem, FAR * LPSPropProblem; + +typedef struct _SPropProblemArray +{ + ULONG cProblem; + SPropProblem aProblem[MAPI_DIM]; +} SPropProblemArray, FAR * LPSPropProblemArray; + +#define CbNewSPropProblemArray(_cprob) \ + (offsetof(SPropProblemArray,aProblem) + (_cprob)*sizeof(SPropProblem)) +#define CbSPropProblemArray(_lparray) \ + (offsetof(SPropProblemArray,aProblem) + \ + (UINT) ((_lparray)->cProblem*sizeof(SPropProblem))) +#define SizedSPropProblemArray(_cprob, _name) \ +struct _SPropProblemArray_ ## _name \ +{ \ + ULONG cProblem; \ + SPropProblem aProblem[_cprob]; \ +} _name + +/* + * ENTRYLIST + */ + +typedef SBinaryArray ENTRYLIST, FAR *LPENTRYLIST; + +/* + * FLATENTRYLIST + * MTSID + * FLATMTSIDLIST + */ + +typedef struct { + ULONG cb; + BYTE abEntry[MAPI_DIM]; +} FLATENTRY, FAR *LPFLATENTRY; + +typedef struct { + ULONG cEntries; + ULONG cbEntries; + BYTE abEntries[MAPI_DIM]; +} FLATENTRYLIST, FAR *LPFLATENTRYLIST; + +typedef struct { + ULONG cb; + BYTE ab[MAPI_DIM]; +} MTSID, FAR *LPMTSID; + +typedef struct { + ULONG cMTSIDs; + ULONG cbMTSIDs; + BYTE abMTSIDs[MAPI_DIM]; +} FLATMTSIDLIST, FAR *LPFLATMTSIDLIST; + +#define CbNewFLATENTRY(_cb) (offsetof(FLATENTRY,abEntry) + (_cb)) +#define CbFLATENTRY(_lpentry) (offsetof(FLATENTRY,abEntry) + (_lpentry)->cb) +#define CbNewFLATENTRYLIST(_cb) (offsetof(FLATENTRYLIST,abEntries) + (_cb)) +#define CbFLATENTRYLIST(_lplist) (offsetof(FLATENTRYLIST,abEntries) + (_lplist)->cbEntries) +#define CbNewMTSID(_cb) (offsetof(MTSID,ab) + (_cb)) +#define CbMTSID(_lpentry) (offsetof(MTSID,ab) + (_lpentry)->cb) +#define CbNewFLATMTSIDLIST(_cb) (offsetof(FLATMTSIDLIST,abMTSIDs) + (_cb)) +#define CbFLATMTSIDLIST(_lplist) (offsetof(FLATMTSIDLIST,abMTSIDs) + (_lplist)->cbMTSIDs) +/* No SizedXXX macros for these types. */ + +/* ------------------------------ */ +/* ADRENTRY, ADRLIST */ + +typedef struct _ADRENTRY +{ + ULONG ulReserved1; /* Never used */ + ULONG cValues; + LPSPropValue rgPropVals; +} ADRENTRY, FAR * LPADRENTRY; + +typedef struct _ADRLIST +{ + ULONG cEntries; + ADRENTRY aEntries[MAPI_DIM]; +} ADRLIST, FAR * LPADRLIST; + +#define CbNewADRLIST(_centries) \ + (offsetof(ADRLIST,aEntries) + (_centries)*sizeof(ADRENTRY)) +#define CbADRLIST(_lpadrlist) \ + (offsetof(ADRLIST,aEntries) + (UINT)(_lpadrlist)->cEntries*sizeof(ADRENTRY)) +#define SizedADRLIST(_centries, _name) \ +struct _ADRLIST_ ## _name \ +{ \ + ULONG cEntries; \ + ADRENTRY aEntries[_centries]; \ +} _name + +/* ------------------------------ */ +/* SRow, SRowSet */ + +typedef struct _SRow +{ + ULONG ulAdrEntryPad; /* Pad so SRow's can map to ADRENTRY's */ + ULONG cValues; /* Count of property values */ + LPSPropValue lpProps; /* Property value array */ +} SRow, FAR * LPSRow; + +typedef struct _SRowSet +{ + ULONG cRows; /* Count of rows */ + SRow aRow[MAPI_DIM]; /* Array of rows */ +} SRowSet, FAR * LPSRowSet; + +#define CbNewSRowSet(_crow) (offsetof(SRowSet,aRow) + (_crow)*sizeof(SRow)) +#define CbSRowSet(_lprowset) (offsetof(SRowSet,aRow) + \ + (UINT)((_lprowset)->cRows*sizeof(SRow))) +#define SizedSRowSet(_crow, _name) \ +struct _SRowSet_ ## _name \ +{ \ + ULONG cRows; \ + SRow aRow[_crow]; \ +} _name + +/* MAPI Allocation Routines ------------------------------------------------ */ + +typedef SCODE (STDMETHODCALLTYPE ALLOCATEBUFFER)( + ULONG cbSize, + LPVOID FAR * lppBuffer +); + +typedef SCODE (STDMETHODCALLTYPE ALLOCATEMORE)( + ULONG cbSize, + LPVOID lpObject, + LPVOID FAR * lppBuffer +); + +typedef ULONG (STDAPICALLTYPE FREEBUFFER)( + LPVOID lpBuffer +); + +typedef ALLOCATEBUFFER FAR *LPALLOCATEBUFFER; +typedef ALLOCATEMORE FAR * LPALLOCATEMORE; +typedef FREEBUFFER FAR * LPFREEBUFFER; + +/* MAPI Component Object Model Macros -------------------------------------- */ + +#if defined(MAPI_IF) && (!defined(__cplusplus) || defined(CINTERFACE)) +#define DECLARE_MAPI_INTERFACE(iface) \ + typedef struct iface##Vtbl iface##Vtbl, FAR * iface; \ + struct iface##Vtbl +#define DECLARE_MAPI_INTERFACE_(iface, baseiface) \ + DECLARE_MAPI_INTERFACE(iface) +#define DECLARE_MAPI_INTERFACE_PTR(iface, piface) \ + typedef struct iface##Vtbl iface##Vtbl, FAR * iface, FAR * FAR * piface; +#else +#define DECLARE_MAPI_INTERFACE(iface) \ + DECLARE_INTERFACE(iface) +#define DECLARE_MAPI_INTERFACE_(iface, baseiface) \ + DECLARE_INTERFACE_(iface, baseiface) +#ifdef __cplusplus +#define DECLARE_MAPI_INTERFACE_PTR(iface, piface) \ + interface iface; typedef iface FAR * piface +#else +#define DECLARE_MAPI_INTERFACE_PTR(iface, piface) \ + typedef interface iface iface, FAR * piface +#endif +#endif + +#define MAPIMETHOD(method) MAPIMETHOD_(HRESULT, method) +#define MAPIMETHOD_(type, method) STDMETHOD_(type, method) +#define MAPIMETHOD_DECLARE(type, method, prefix) \ + STDMETHODIMP_(type) prefix##method +#define MAPIMETHOD_TYPEDEF(type, method, prefix) \ + typedef type (STDMETHODCALLTYPE prefix##method##_METHOD) + +#define MAPI_IUNKNOWN_METHODS(IPURE) \ + MAPIMETHOD(QueryInterface) \ + (THIS_ REFIID riid, LPVOID FAR * ppvObj) IPURE; \ + MAPIMETHOD_(ULONG,AddRef) (THIS) IPURE; \ + MAPIMETHOD_(ULONG,Release) (THIS) IPURE; \ + +#undef IMPL +#define IMPL + +/* Pointers to MAPI Interfaces --------------------------------------------- */ + +typedef const IID FAR * LPCIID; + +DECLARE_MAPI_INTERFACE_PTR(IMsgStore, LPMDB); +DECLARE_MAPI_INTERFACE_PTR(IMAPIFolder, LPMAPIFOLDER); +DECLARE_MAPI_INTERFACE_PTR(IMessage, LPMESSAGE); +DECLARE_MAPI_INTERFACE_PTR(IAttach, LPATTACH); +DECLARE_MAPI_INTERFACE_PTR(IAddrBook, LPADRBOOK); +DECLARE_MAPI_INTERFACE_PTR(IABContainer, LPABCONT); +DECLARE_MAPI_INTERFACE_PTR(IMailUser, LPMAILUSER); +DECLARE_MAPI_INTERFACE_PTR(IDistList, LPDISTLIST); +DECLARE_MAPI_INTERFACE_PTR(IMAPIStatus, LPMAPISTATUS); +DECLARE_MAPI_INTERFACE_PTR(IMAPITable, LPMAPITABLE); +DECLARE_MAPI_INTERFACE_PTR(IProfSect, LPPROFSECT); +DECLARE_MAPI_INTERFACE_PTR(IMAPIProp, LPMAPIPROP); +DECLARE_MAPI_INTERFACE_PTR(IMAPIContainer, LPMAPICONTAINER); +DECLARE_MAPI_INTERFACE_PTR(IMAPIAdviseSink, LPMAPIADVISESINK); +DECLARE_MAPI_INTERFACE_PTR(IMAPIProgress, LPMAPIPROGRESS); +DECLARE_MAPI_INTERFACE_PTR(IProviderAdmin, LPPROVIDERADMIN); + +/* Extended MAPI Error Information ----------------------------------------- */ + +typedef struct _MAPIERROR +{ + ULONG ulVersion; + LPTSTR lpszError; + LPTSTR lpszComponent; + ULONG ulLowLevelError; + ULONG ulContext; + +} MAPIERROR, FAR * LPMAPIERROR; + + +/* IMAPIAdviseSink Interface ----------------------------------------------- */ + +/* + * Notification event types. The event types can be combined in a bitmask + * for filtering. Each one has a parameter structure associated with it: + * + * fnevCriticalError ERROR_NOTIFICATION + * fnevNewMail NEWMAIL_NOTIFICATION + * fnevObjectCreated OBJECT_NOTIFICATION + * fnevObjectDeleted OBJECT_NOTIFICATION + * fnevObjectModified OBJECT_NOTIFICATION + * fnevObjectCopied OBJECT_NOTIFICATION + * fnevSearchComplete OBJECT_NOTIFICATION + * fnevTableModified TABLE_NOTIFICATION + * fnevStatusObjectModified ? + * + * fnevExtended EXTENDED_NOTIFICATION + */ + +#define fnevCriticalError ((ULONG) 0x00000001) +#define fnevNewMail ((ULONG) 0x00000002) +#define fnevObjectCreated ((ULONG) 0x00000004) +#define fnevObjectDeleted ((ULONG) 0x00000008) +#define fnevObjectModified ((ULONG) 0x00000010) +#define fnevObjectMoved ((ULONG) 0x00000020) +#define fnevObjectCopied ((ULONG) 0x00000040) +#define fnevSearchComplete ((ULONG) 0x00000080) +#define fnevTableModified ((ULONG) 0x00000100) +#define fnevStatusObjectModified ((ULONG) 0x00000200) +#define fnevReservedForMapi ((ULONG) 0x40000000) +#define fnevExtended ((ULONG) 0x80000000) + +/* TABLE_NOTIFICATION event types passed in ulTableEvent */ + +#define TABLE_CHANGED 1 +#define TABLE_ERROR 2 +#define TABLE_ROW_ADDED 3 +#define TABLE_ROW_DELETED 4 +#define TABLE_ROW_MODIFIED 5 +#define TABLE_SORT_DONE 6 +#define TABLE_RESTRICT_DONE 7 +#define TABLE_SETCOL_DONE 8 +#define TABLE_RELOAD 9 + +/* Event Structures */ + +typedef struct _ERROR_NOTIFICATION +{ + ULONG cbEntryID; + LPENTRYID lpEntryID; + SCODE scode; + ULONG ulFlags; /* 0 or MAPI_UNICODE */ + LPMAPIERROR lpMAPIError; /* Detailed error information */ +} ERROR_NOTIFICATION; + +typedef struct _NEWMAIL_NOTIFICATION +{ + ULONG cbEntryID; + LPENTRYID lpEntryID; /* identifies the new message */ + ULONG cbParentID; + LPENTRYID lpParentID; /* identifies the folder it lives in */ + ULONG ulFlags; /* 0 or MAPI_UNICODE */ + LPTSTR lpszMessageClass; /* message class (UNICODE or string8) */ + ULONG ulMessageFlags; /* copy of PR_MESSAGE_FLAGS */ +} NEWMAIL_NOTIFICATION; + +typedef struct _OBJECT_NOTIFICATION +{ + ULONG cbEntryID; + LPENTRYID lpEntryID; /* EntryID of object */ + ULONG ulObjType; /* Type of object */ + ULONG cbParentID; + LPENTRYID lpParentID; /* EntryID of parent object */ + ULONG cbOldID; + LPENTRYID lpOldID; /* EntryID of old object */ + ULONG cbOldParentID; + LPENTRYID lpOldParentID; /* EntryID of old parent */ + LPSPropTagArray lpPropTagArray; +} OBJECT_NOTIFICATION; + +typedef struct _TABLE_NOTIFICATION +{ + ULONG ulTableEvent; /* Identifies WHICH table event */ + HRESULT hResult; /* Value for TABLE_ERROR */ + SPropValue propIndex; /* This row's "index property" */ + SPropValue propPrior; /* Preceding row's "index property" */ + SRow row; /* New data of added/modified row */ + ULONG ulPad; /* Force to 8-byte boundary */ +} TABLE_NOTIFICATION; + +typedef struct _EXTENDED_NOTIFICATION +{ + ULONG ulEvent; /* extended event code */ + ULONG cb; /* size of event parameters */ + LPBYTE pbEventParameters; /* event parameters */ +} EXTENDED_NOTIFICATION; + +typedef struct +{ + ULONG cbEntryID; + LPENTRYID lpEntryID; + ULONG cValues; + LPSPropValue lpPropVals; +} STATUS_OBJECT_NOTIFICATION; + +typedef struct _NOTIFICATION +{ + ULONG ulEventType; /* notification type, i.e. fnevSomething */ + ULONG ulAlignPad; /* Force to 8-byte boundary */ + union + { + ERROR_NOTIFICATION err; + NEWMAIL_NOTIFICATION newmail; + OBJECT_NOTIFICATION obj; + TABLE_NOTIFICATION tab; + EXTENDED_NOTIFICATION ext; + STATUS_OBJECT_NOTIFICATION statobj; + } info; +} NOTIFICATION, FAR * LPNOTIFICATION; + + +/* Interface used for registering and issuing notification callbacks. */ + +#define MAPI_IMAPIADVISESINK_METHODS(IPURE) \ + MAPIMETHOD_(ULONG, OnNotify) \ + (THIS_ ULONG cNotif, \ + LPNOTIFICATION lpNotifications) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPIAdviseSink +DECLARE_MAPI_INTERFACE_(IMAPIAdviseSink, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIADVISESINK_METHODS(PURE) +}; + +/* Callback function type for MAPIAllocAdviseSink */ + +typedef long (STDAPICALLTYPE NOTIFCALLBACK) ( + LPVOID lpvContext, + ULONG cNotification, + LPNOTIFICATION lpNotifications); +typedef NOTIFCALLBACK FAR * LPNOTIFCALLBACK; + +/* + * Message name for the 16-bit MAPI notififcation engine. + * This can be used in 16-bit applications to force processing + * of notification callbacks. + */ + +#define szMAPINotificationMsg "MAPI Notify window message" + + +/* IMAPIProgress Interface ------------------------------------------------- */ + +/* Flag values for the progress indicator */ + +#define MAPI_TOP_LEVEL ((ULONG) 0x00000001) + +#define MAPI_IMAPIPROGRESS_METHODS(IPURE) \ + MAPIMETHOD(Progress) \ + (THIS_ ULONG ulValue, \ + ULONG ulCount, \ + ULONG ulTotal) IPURE; \ + MAPIMETHOD(GetFlags) \ + (THIS_ ULONG FAR * lpulFlags) IPURE; \ + MAPIMETHOD(GetMax) \ + (THIS_ ULONG FAR * lpulMax) IPURE; \ + MAPIMETHOD(GetMin) \ + (THIS_ ULONG FAR * lpulMin) IPURE; \ + MAPIMETHOD(SetLimits) \ + (THIS_ LPULONG lpulMin, \ + LPULONG lpulMax, \ + LPULONG lpulFlags) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPIProgress +DECLARE_MAPI_INTERFACE_(IMAPIProgress, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIPROGRESS_METHODS(PURE) +}; + + +/* IMAPIProp Interface ----------------------------------------------------- */ + +/* GetLastError */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) above */ + +/* + * Version: + */ +#define MAPI_ERROR_VERSION 0x00000000L + +/* GetPropList */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) above */ + +/* GetProps */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) above */ + +/* SaveChanges */ + +#define KEEP_OPEN_READONLY ((ULONG) 0x00000001) +#define KEEP_OPEN_READWRITE ((ULONG) 0x00000002) +#define FORCE_SAVE ((ULONG) 0x00000004) +/* define MAPI_DEFERRED_ERRORS ((ULONG) 0x00000008) below */ + +/* OpenProperty - ulFlags */ +/****** MAPI_MODIFY ((ULONG) 0x00000001) above */ +#define MAPI_CREATE ((ULONG) 0x00000002) +#define STREAM_APPEND ((ULONG) 0x00000004) +/****** MAPI_DEFERRED_ERRORS ((ULONG) 0x00000008) below */ + +/* OpenProperty - ulInterfaceOptions, IID_IMAPITable */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) above */ + +/* CopyTo, CopyProps */ + +#define MAPI_MOVE ((ULONG) 0x00000001) +#define MAPI_NOREPLACE ((ULONG) 0x00000002) +#define MAPI_DECLINE_OK ((ULONG) 0x00000004) + +#ifndef MAPI_DIALOG /* also defined in mapi.h */ +#define MAPI_DIALOG ((ULONG) 0x00000008) +#endif + +#ifndef MAPI_USE_DEFAULT /* also defined in mapi.h */ +#define MAPI_USE_DEFAULT 0x00000040 /* Use default profile in logon */ +#endif + +/* Flags used in GetIDsFromNames */ +/****** MAPI_CREATE ((ULONG) 0x00000002) above */ + +/* Flags used in GetNamesFromIDs (bit fields) */ +#define MAPI_NO_STRINGS ((ULONG) 0x00000001) +#define MAPI_NO_IDS ((ULONG) 0x00000002) + +/* Union discriminator */ +#define MNID_ID 0 +#define MNID_STRING 1 +typedef struct _MAPINAMEID +{ + LPGUID lpguid; + ULONG ulKind; + union { + LONG_PTR lID_Reserved; + LONG lID; + LPWSTR lpwstrName; + } Kind; + +} MAPINAMEID, FAR * LPMAPINAMEID; + +#define MAPI_IMAPIPROP_METHODS(IPURE) \ + MAPIMETHOD(GetLastError) \ + (THIS_ HRESULT hResult, \ + ULONG ulFlags, \ + LPMAPIERROR FAR * lppMAPIError) IPURE; \ + MAPIMETHOD(SaveChanges) \ + (THIS_ ULONG ulFlags) IPURE; \ + MAPIMETHOD(GetProps) \ + (THIS_ LPSPropTagArray lpPropTagArray, \ + ULONG ulFlags, \ + ULONG FAR * lpcValues, \ + LPSPropValue FAR * lppPropArray) IPURE; \ + MAPIMETHOD(GetPropList) \ + (THIS_ ULONG ulFlags, \ + LPSPropTagArray FAR * lppPropTagArray) IPURE; \ + MAPIMETHOD(OpenProperty) \ + (THIS_ ULONG ulPropTag, \ + LPCIID lpiid, \ + ULONG ulInterfaceOptions, \ + ULONG ulFlags, \ + LPUNKNOWN FAR * lppUnk) IPURE; \ + MAPIMETHOD(SetProps) \ + (THIS_ ULONG cValues, \ + LPSPropValue lpPropArray, \ + LPSPropProblemArray FAR * lppProblems) IPURE; \ + MAPIMETHOD(DeleteProps) \ + (THIS_ LPSPropTagArray lpPropTagArray, \ + LPSPropProblemArray FAR * lppProblems) IPURE; \ + MAPIMETHOD(CopyTo) \ + (THIS_ ULONG ciidExclude, \ + LPCIID rgiidExclude, \ + LPSPropTagArray lpExcludeProps, \ + ULONG_PTR ulUIParam, \ + LPMAPIPROGRESS lpProgress, \ + LPCIID lpInterface, \ + LPVOID lpDestObj, \ + ULONG ulFlags, \ + LPSPropProblemArray FAR * lppProblems) IPURE; \ + MAPIMETHOD(CopyProps) \ + (THIS_ LPSPropTagArray lpIncludeProps, \ + ULONG_PTR ulUIParam, \ + LPMAPIPROGRESS lpProgress, \ + LPCIID lpInterface, \ + LPVOID lpDestObj, \ + ULONG ulFlags, \ + LPSPropProblemArray FAR * lppProblems) IPURE; \ + MAPIMETHOD(GetNamesFromIDs) \ + (THIS_ LPSPropTagArray FAR * lppPropTags, \ + LPGUID lpPropSetGuid, \ + ULONG ulFlags, \ + ULONG FAR * lpcPropNames, \ + LPMAPINAMEID FAR * FAR * lpppPropNames) IPURE; \ + MAPIMETHOD(GetIDsFromNames) \ + (THIS_ ULONG cPropNames, \ + LPMAPINAMEID FAR * lppPropNames, \ + ULONG ulFlags, \ + LPSPropTagArray FAR * lppPropTags) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPIProp +DECLARE_MAPI_INTERFACE_(IMAPIProp, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIPROP_METHODS(PURE) +}; + +/* IMAPITable Interface ---------------------------------------------------- */ + +/* Table status */ + +#define TBLSTAT_COMPLETE ((ULONG) 0) +#define TBLSTAT_QCHANGED ((ULONG) 7) +#define TBLSTAT_SORTING ((ULONG) 9) +#define TBLSTAT_SORT_ERROR ((ULONG) 10) +#define TBLSTAT_SETTING_COLS ((ULONG) 11) +#define TBLSTAT_SETCOL_ERROR ((ULONG) 13) +#define TBLSTAT_RESTRICTING ((ULONG) 14) +#define TBLSTAT_RESTRICT_ERROR ((ULONG) 15) + + +/* Table Type */ + +#define TBLTYPE_SNAPSHOT ((ULONG) 0) +#define TBLTYPE_KEYSET ((ULONG) 1) +#define TBLTYPE_DYNAMIC ((ULONG) 2) + + +/* Sort order */ + +/* bit 0: set if descending, clear if ascending */ + +#define TABLE_SORT_ASCEND ((ULONG) 0x00000000) +#define TABLE_SORT_DESCEND ((ULONG) 0x00000001) +#define TABLE_SORT_COMBINE ((ULONG) 0x00000002) + + +/* Data structures */ + +typedef struct _SSortOrder +{ + ULONG ulPropTag; /* Column to sort on */ + ULONG ulOrder; /* Ascending, descending, combine to left */ +} SSortOrder, FAR * LPSSortOrder; + +typedef struct _SSortOrderSet +{ + ULONG cSorts; /* Number of sort columns in aSort below*/ + ULONG cCategories; /* 0 for non-categorized, up to cSorts */ + ULONG cExpanded; /* 0 if no categories start expanded, */ + /* up to cExpanded */ + SSortOrder aSort[MAPI_DIM]; /* The sort orders */ +} SSortOrderSet, FAR * LPSSortOrderSet; + +#define CbNewSSortOrderSet(_csort) \ + (offsetof(SSortOrderSet,aSort) + (_csort)*sizeof(SSortOrder)) +#define CbSSortOrderSet(_lpset) \ + (offsetof(SSortOrderSet,aSort) + \ + (UINT)((_lpset)->cSorts*sizeof(SSortOrder))) +#define SizedSSortOrderSet(_csort, _name) \ +struct _SSortOrderSet_ ## _name \ +{ \ + ULONG cSorts; \ + ULONG cCategories; \ + ULONG cExpanded; \ + SSortOrder aSort[_csort]; \ +} _name + +typedef ULONG_PTR BOOKMARK; + +#define BOOKMARK_BEGINNING ((BOOKMARK) 0) /* Before first row */ +#define BOOKMARK_CURRENT ((BOOKMARK) 1) /* Before current row */ +#define BOOKMARK_END ((BOOKMARK) 2) /* After last row */ + +/* Fuzzy Level */ + +#define FL_FULLSTRING ((ULONG) 0x00000000) +#define FL_SUBSTRING ((ULONG) 0x00000001) +#define FL_PREFIX ((ULONG) 0x00000002) + +#define FL_IGNORECASE ((ULONG) 0x00010000) +#define FL_IGNORENONSPACE ((ULONG) 0x00020000) +#define FL_LOOSE ((ULONG) 0x00040000) + +/* Restrictions */ + +typedef struct _SRestriction FAR * LPSRestriction; + +/* Restriction types */ + +#define RES_AND ((ULONG) 0x00000000) +#define RES_OR ((ULONG) 0x00000001) +#define RES_NOT ((ULONG) 0x00000002) +#define RES_CONTENT ((ULONG) 0x00000003) +#define RES_PROPERTY ((ULONG) 0x00000004) +#define RES_COMPAREPROPS ((ULONG) 0x00000005) +#define RES_BITMASK ((ULONG) 0x00000006) +#define RES_SIZE ((ULONG) 0x00000007) +#define RES_EXIST ((ULONG) 0x00000008) +#define RES_SUBRESTRICTION ((ULONG) 0x00000009) +#define RES_COMMENT ((ULONG) 0x0000000A) +#define RES_COUNT ((ULONG) 0x0000000B) // OFFICEDEV: Count restriction to CAP results +#define RES_ANNOTATION ((ULONG) 0x0000000C) // OFFICEDEV: Annotation restriction to pass information like LCID, etc. + +/* Relational operators. These apply to all property comparison restrictions. */ + +#define RELOP_LT ((ULONG) 0) /* < */ +#define RELOP_LE ((ULONG) 1) /* <= */ +#define RELOP_GT ((ULONG) 2) /* > */ +#define RELOP_GE ((ULONG) 3) /* >= */ +#define RELOP_EQ ((ULONG) 4) /* == */ +#define RELOP_NE ((ULONG) 5) /* != */ +#define RELOP_RE ((ULONG) 6) /* LIKE (Regular expression) */ + +/* Bitmask operators, for RES_BITMASK only. */ + +#define BMR_EQZ ((ULONG) 0) /* ==0 */ +#define BMR_NEZ ((ULONG) 1) /* !=0 */ + +/* Subobject identifiers for RES_SUBRESTRICTION only. See MAPITAGS.H. */ + +/* #define PR_MESSAGE_RECIPIENTS PROP_TAG(PT_OBJECT,0x0E12) */ +/* #define PR_MESSAGE_ATTACHMENTS PROP_TAG(PT_OBJECT,0x0E13) */ + +typedef struct _SAndRestriction +{ + ULONG cRes; + LPSRestriction lpRes; +} SAndRestriction; + +typedef struct _SOrRestriction +{ + ULONG cRes; + LPSRestriction lpRes; +} SOrRestriction; + +typedef struct _SNotRestriction +{ + ULONG ulReserved; + LPSRestriction lpRes; +} SNotRestriction; + +typedef struct _SContentRestriction +{ + ULONG ulFuzzyLevel; + ULONG ulPropTag; + LPSPropValue lpProp; +} SContentRestriction; + +typedef struct _SBitMaskRestriction +{ + ULONG relBMR; + ULONG ulPropTag; + ULONG ulMask; +} SBitMaskRestriction; + +typedef struct _SPropertyRestriction +{ + ULONG relop; + ULONG ulPropTag; + LPSPropValue lpProp; +} SPropertyRestriction; + +typedef struct _SComparePropsRestriction +{ + ULONG relop; + ULONG ulPropTag1; + ULONG ulPropTag2; +} SComparePropsRestriction; + +typedef struct _SSizeRestriction +{ + ULONG relop; + ULONG ulPropTag; + ULONG cb; +} SSizeRestriction; + +typedef struct _SExistRestriction +{ + ULONG ulReserved1; + ULONG ulPropTag; + ULONG ulReserved2; +} SExistRestriction; + +typedef struct _SSubRestriction +{ + ULONG ulSubObject; + LPSRestriction lpRes; +} SSubRestriction; + +typedef struct _SCommentRestriction +{ + ULONG cValues; /* # of properties in lpProp */ + LPSRestriction lpRes; + LPSPropValue lpProp; +} SCommentRestriction; + +// OFFICEDEV: The following two restrictions are new to Office 12 and are not +// backwards compatible with older clients. +typedef struct _SAnnotationRestriction +{ + ULONG cValues; /* # of properties in lpProp */ + LPSRestriction lpRes; + LPSPropValue lpProp; +} SAnnotationRestriction; + +typedef struct _SCountRestriction +{ + ULONG ulCount; + LPSRestriction lpRes; +} SCountRestriction; + +typedef struct _SRestriction +{ + ULONG rt; /* Restriction type */ + union + { + SComparePropsRestriction resCompareProps; /* first */ + SAndRestriction resAnd; + SOrRestriction resOr; + SNotRestriction resNot; + SContentRestriction resContent; + SPropertyRestriction resProperty; + SBitMaskRestriction resBitMask; + SSizeRestriction resSize; + SExistRestriction resExist; + SSubRestriction resSub; + SCommentRestriction resComment; + SAnnotationRestriction resAnnotation; // OFFICEDEV: not backwards compatible with Office 11 and older + SCountRestriction resCount; // OFFICEDEV: not backwards compatible with Office 11 and older + } res; +} SRestriction; + +/* SComparePropsRestriction is first in the union so that */ +/* static initializations of 3-value restriction work. */ + +/* Flags of the methods of IMAPITable */ + +/* QueryColumn */ + +#define TBL_ALL_COLUMNS ((ULONG) 0x00000001) + +/* QueryRows */ +/* Possible values for PR_ROW_TYPE (for categorization) */ + +#define TBL_LEAF_ROW ((ULONG) 1) +#define TBL_EMPTY_CATEGORY ((ULONG) 2) +#define TBL_EXPANDED_CATEGORY ((ULONG) 3) +#define TBL_COLLAPSED_CATEGORY ((ULONG) 4) + +/* Table wait flag */ + +#define TBL_NOWAIT ((ULONG) 0x00000001) +/* alternative name for TBL_NOWAIT */ +#define TBL_ASYNC ((ULONG) 0x00000001) +#define TBL_BATCH ((ULONG) 0x00000002) + +/* FindRow */ + +#define DIR_BACKWARD ((ULONG) 0x00000001) + +/* Table cursor states */ + +#define TBL_NOADVANCE ((ULONG) 0x00000001) + +#define MAPI_IMAPITABLE_METHODS(IPURE) \ + MAPIMETHOD(GetLastError) \ + (THIS_ HRESULT hResult, \ + ULONG ulFlags, \ + LPMAPIERROR FAR * lppMAPIError) IPURE; \ + MAPIMETHOD(Advise) \ + (THIS_ ULONG ulEventMask, \ + LPMAPIADVISESINK lpAdviseSink, \ + ULONG_PTR FAR * lpulConnection) IPURE; \ + MAPIMETHOD(Unadvise) \ + (THIS_ ULONG_PTR ulConnection) IPURE; \ + MAPIMETHOD(GetStatus) \ + (THIS_ ULONG FAR * lpulTableStatus, \ + ULONG FAR * lpulTableType) IPURE; \ + MAPIMETHOD(SetColumns) \ + (THIS_ LPSPropTagArray lpPropTagArray, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(QueryColumns) \ + (THIS_ ULONG ulFlags, \ + LPSPropTagArray FAR * lpPropTagArray) IPURE; \ + MAPIMETHOD(GetRowCount) \ + (THIS_ ULONG ulFlags, \ + ULONG FAR * lpulCount) IPURE; \ + MAPIMETHOD(SeekRow) \ + (THIS_ BOOKMARK bkOrigin, \ + LONG lRowCount, \ + LONG FAR * lplRowsSought) IPURE; \ + MAPIMETHOD(SeekRowApprox) \ + (THIS_ ULONG ulNumerator, \ + ULONG ulDenominator) IPURE; \ + MAPIMETHOD(QueryPosition) \ + (THIS_ ULONG FAR * lpulRow, \ + ULONG FAR * lpulNumerator, \ + ULONG FAR * lpulDenominator) IPURE; \ + MAPIMETHOD(FindRow) \ + (THIS_ LPSRestriction lpRestriction, \ + BOOKMARK bkOrigin, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(Restrict) \ + (THIS_ LPSRestriction lpRestriction, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(CreateBookmark) \ + (THIS_ BOOKMARK FAR * lpbkPosition) IPURE; \ + MAPIMETHOD(FreeBookmark) \ + (THIS_ BOOKMARK bkPosition) IPURE; \ + MAPIMETHOD(SortTable) \ + (THIS_ LPSSortOrderSet lpSortCriteria, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(QuerySortOrder) \ + (THIS_ LPSSortOrderSet FAR * lppSortCriteria) IPURE; \ + MAPIMETHOD(QueryRows) \ + (THIS_ LONG lRowCount, \ + ULONG ulFlags, \ + LPSRowSet FAR * lppRows) IPURE; \ + MAPIMETHOD(Abort) (THIS) IPURE; \ + MAPIMETHOD(ExpandRow) \ + (THIS_ ULONG cbInstanceKey, \ + LPBYTE pbInstanceKey, \ + ULONG ulRowCount, \ + ULONG ulFlags, \ + LPSRowSet FAR * lppRows, \ + ULONG FAR * lpulMoreRows) IPURE; \ + MAPIMETHOD(CollapseRow) \ + (THIS_ ULONG cbInstanceKey, \ + LPBYTE pbInstanceKey, \ + ULONG ulFlags, \ + ULONG FAR * lpulRowCount) IPURE; \ + MAPIMETHOD(WaitForCompletion) \ + (THIS_ ULONG ulFlags, \ + ULONG ulTimeout, \ + ULONG FAR * lpulTableStatus) IPURE; \ + MAPIMETHOD(GetCollapseState) \ + (THIS_ ULONG ulFlags, \ + ULONG cbInstanceKey, \ + LPBYTE lpbInstanceKey, \ + ULONG FAR * lpcbCollapseState, \ + LPBYTE FAR * lppbCollapseState) IPURE; \ + MAPIMETHOD(SetCollapseState) \ + (THIS_ ULONG ulFlags, \ + ULONG cbCollapseState, \ + LPBYTE pbCollapseState, \ + BOOKMARK FAR * lpbkLocation) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPITable +DECLARE_MAPI_INTERFACE_(IMAPITable, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPITABLE_METHODS(PURE) +}; + +/* IProfSect Interface ----------------------------------------------------- */ + +/* Standard section for public profile properties */ + +#define PS_PROFILE_PROPERTIES_INIT \ +{ 0x98, 0x15, 0xAC, 0x08, 0xAA, 0xB0, 0x10, 0x1A, \ + 0x8C, 0x93, 0x08, 0x00, 0x2B, 0x2A, 0x56, 0xC2 } + + +#define MAPI_IPROFSECT_METHODS(IPURE) + +#undef INTERFACE +#define INTERFACE IProfSect +DECLARE_MAPI_INTERFACE_(IProfSect, IMAPIProp) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIPROP_METHODS(PURE) + MAPI_IPROFSECT_METHODS(PURE) +}; + +/* IMAPIStatus Interface --------------------------------------------------- */ + +/* Values for PR_RESOURCE_TYPE, _METHODS, _FLAGS */ + +#define MAPI_STORE_PROVIDER ((ULONG) 33) /* Message Store */ +#define MAPI_AB ((ULONG) 34) /* Address Book */ +#define MAPI_AB_PROVIDER ((ULONG) 35) /* Address Book Provider */ +#define MAPI_TRANSPORT_PROVIDER ((ULONG) 36) /* Transport Provider */ +#define MAPI_SPOOLER ((ULONG) 37) /* Message Spooler */ +#define MAPI_PROFILE_PROVIDER ((ULONG) 38) /* Profile Provider */ +#define MAPI_SUBSYSTEM ((ULONG) 39) /* Overall Subsystem Status */ +#define MAPI_HOOK_PROVIDER ((ULONG) 40) /* Spooler Hook */ + +#define STATUS_VALIDATE_STATE ((ULONG) 0x00000001) +#define STATUS_SETTINGS_DIALOG ((ULONG) 0x00000002) +#define STATUS_CHANGE_PASSWORD ((ULONG) 0x00000004) +#define STATUS_FLUSH_QUEUES ((ULONG) 0x00000008) + +#define STATUS_DEFAULT_OUTBOUND ((ULONG) 0x00000001) +#define STATUS_DEFAULT_STORE ((ULONG) 0x00000002) +#define STATUS_PRIMARY_IDENTITY ((ULONG) 0x00000004) +#define STATUS_SIMPLE_STORE ((ULONG) 0x00000008) +#define STATUS_XP_PREFER_LAST ((ULONG) 0x00000010) +#define STATUS_NO_PRIMARY_IDENTITY ((ULONG) 0x00000020) +#define STATUS_NO_DEFAULT_STORE ((ULONG) 0x00000040) +#define STATUS_TEMP_SECTION ((ULONG) 0x00000080) +#define STATUS_OWN_STORE ((ULONG) 0x00000100) +/****** HOOK_INBOUND ((ULONG) 0x00000200) Defined in MAPIHOOK.H */ +/****** HOOK_OUTBOUND ((ULONG) 0x00000400) Defined in MAPIHOOK.H */ +#define STATUS_NEED_IPM_TREE ((ULONG) 0x00000800) +#define STATUS_PRIMARY_STORE ((ULONG) 0x00001000) +#define STATUS_SECONDARY_STORE ((ULONG) 0x00002000) + + +/* + * PR_STATUS_CODE bit. Low 16 bits for common values; High 16 bits + * for provider type-specific values. (DCR 304) + */ + +#define STATUS_AVAILABLE ((ULONG) 0x00000001) +#define STATUS_OFFLINE ((ULONG) 0x00000002) +#define STATUS_FAILURE ((ULONG) 0x00000004) + +/* Transport values of PR_STATUS_CODE */ + +#define STATUS_INBOUND_ENABLED ((ULONG) 0x00010000) +#define STATUS_INBOUND_ACTIVE ((ULONG) 0x00020000) +#define STATUS_INBOUND_FLUSH ((ULONG) 0x00040000) +#define STATUS_OUTBOUND_ENABLED ((ULONG) 0x00100000) +#define STATUS_OUTBOUND_ACTIVE ((ULONG) 0x00200000) +#define STATUS_OUTBOUND_FLUSH ((ULONG) 0x00400000) +#define STATUS_REMOTE_ACCESS ((ULONG) 0x00800000) + +/* ValidateState flags */ + +#define SUPPRESS_UI ((ULONG) 0x00000001) +#define REFRESH_XP_HEADER_CACHE ((ULONG) 0x00010000) +#define PROCESS_XP_HEADER_CACHE ((ULONG) 0x00020000) +#define FORCE_XP_CONNECT ((ULONG) 0x00040000) +#define FORCE_XP_DISCONNECT ((ULONG) 0x00080000) +#define CONFIG_CHANGED ((ULONG) 0x00100000) +#define ABORT_XP_HEADER_OPERATION ((ULONG) 0x00200000) +#define SHOW_XP_SESSION_UI ((ULONG) 0x00400000) + +/* SettingsDialog flags */ + +#define UI_READONLY ((ULONG) 0x00000001) + +/* FlushQueues flags */ + +#define FLUSH_UPLOAD ((ULONG) 0x00000002) +#define FLUSH_DOWNLOAD ((ULONG) 0x00000004) +#define FLUSH_FORCE ((ULONG) 0x00000008) +#define FLUSH_NO_UI ((ULONG) 0x00000010) +#define FLUSH_ASYNC_OK ((ULONG) 0x00000020) + +#define MAPI_IMAPISTATUS_METHODS(IPURE) \ + MAPIMETHOD(ValidateState) \ + (THIS_ ULONG_PTR ulUIParam, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(SettingsDialog) \ + (THIS_ ULONG_PTR ulUIParam, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(ChangePassword) \ + (THIS_ LPTSTR lpOldPass, \ + LPTSTR lpNewPass, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(FlushQueues) \ + (THIS_ ULONG_PTR ulUIParam, \ + ULONG cbTargetTransport, \ + LPENTRYID lpTargetTransport, \ + ULONG ulFlags) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPIStatus +DECLARE_MAPI_INTERFACE_(IMAPIStatus, IMAPIProp) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIPROP_METHODS(PURE) + MAPI_IMAPISTATUS_METHODS(PURE) +}; + +/* IMAPIContainer Interface ------------------------------------------------ */ + +/* Flags for OpenEntry() */ + +/****** MAPI_MODIFY ((ULONG) 0x00000001) above */ +/****** MAPI_DEFERRED_ERRORS ((ULONG) 0x00000008) below */ +#define MAPI_BEST_ACCESS ((ULONG) 0x00000010) + +/* GetContentsTable() */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) above */ +/****** MAPI_DEFERRED_ERRORS ((ULONG) 0x00000008) below */ +/****** MAPI_ASSOCIATED ((ULONG) 0x00000040) below */ + +/* GetHierarchyTable() */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) above */ +#define CONVENIENT_DEPTH ((ULONG) 0x00000001) +/****** MAPI_DEFERRED_ERRORS ((ULONG) 0x00000008) below */ + +/* GetSearchCriteria */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) above */ +#define SEARCH_RUNNING ((ULONG) 0x00000001) +#define SEARCH_REBUILD ((ULONG) 0x00000002) +#define SEARCH_RECURSIVE ((ULONG) 0x00000004) +#define SEARCH_FOREGROUND ((ULONG) 0x00000008) + +/* SetSearchCriteria */ +#define STOP_SEARCH ((ULONG) 0x00000001) +#define RESTART_SEARCH ((ULONG) 0x00000002) +#define RECURSIVE_SEARCH ((ULONG) 0x00000004) +#define SHALLOW_SEARCH ((ULONG) 0x00000008) +#define FOREGROUND_SEARCH ((ULONG) 0x00000010) +#define BACKGROUND_SEARCH ((ULONG) 0x00000020) + +#define MAPI_IMAPICONTAINER_METHODS(IPURE) \ + MAPIMETHOD(GetContentsTable) \ + (THIS_ ULONG ulFlags, \ + LPMAPITABLE FAR * lppTable) IPURE; \ + MAPIMETHOD(GetHierarchyTable) \ + (THIS_ ULONG ulFlags, \ + LPMAPITABLE FAR * lppTable) IPURE; \ + MAPIMETHOD(OpenEntry) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + LPCIID lpInterface, \ + ULONG ulFlags, \ + ULONG FAR * lpulObjType, \ + LPUNKNOWN FAR * lppUnk) IPURE; \ + MAPIMETHOD(SetSearchCriteria) \ + (THIS_ LPSRestriction lpRestriction, \ + LPENTRYLIST lpContainerList, \ + ULONG ulSearchFlags) IPURE; \ + MAPIMETHOD(GetSearchCriteria) \ + (THIS_ ULONG ulFlags, \ + LPSRestriction FAR * lppRestriction, \ + LPENTRYLIST FAR * lppContainerList, \ + ULONG FAR * lpulSearchState)IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPIContainer +DECLARE_MAPI_INTERFACE_(IMAPIContainer, IMAPIProp) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIPROP_METHODS(PURE) + MAPI_IMAPICONTAINER_METHODS(PURE) +}; + +/* IABContainer Interface -------------------------------------------------- */ + +/* + * IABContainer PR_CONTAINER_FLAGS values + * If AB_UNMODIFIABLE and AB_MODIFIABLE are both set, it means the container + * doesn't know if it's modifiable or not, and the client should + * try to modify the contents but we won't expect it to work. + * If the AB_RECIPIENTS flag is set and neither AB_MODIFIABLE or AB_UNMODIFIABLE + * bits are set, it is an error. + */ + +typedef struct _flaglist +{ + ULONG cFlags; + ULONG ulFlag[MAPI_DIM]; +} FlagList, FAR * LPFlagList; + + +/* + * Container flags + */ +#define AB_RECIPIENTS ((ULONG) 0x00000001) +#define AB_SUBCONTAINERS ((ULONG) 0x00000002) +#define AB_MODIFIABLE ((ULONG) 0x00000004) +#define AB_UNMODIFIABLE ((ULONG) 0x00000008) +#define AB_FIND_ON_OPEN ((ULONG) 0x00000010) +#define AB_NOT_DEFAULT ((ULONG) 0x00000020) + +/* CreateEntry() */ + +#define CREATE_CHECK_DUP_STRICT ((ULONG) 0x00000001) +#define CREATE_CHECK_DUP_LOOSE ((ULONG) 0x00000002) +#define CREATE_REPLACE ((ULONG) 0x00000004) + +/* ResolveNames() - ulFlags */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) above */ + +/* ResolveNames() - rgulFlags */ +#define MAPI_UNRESOLVED ((ULONG) 0x00000000) +#define MAPI_AMBIGUOUS ((ULONG) 0x00000001) +#define MAPI_RESOLVED ((ULONG) 0x00000002) + + +#define MAPI_IABCONTAINER_METHODS(IPURE) \ + MAPIMETHOD(CreateEntry) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + ULONG ulCreateFlags, \ + LPMAPIPROP FAR * lppMAPIPropEntry) IPURE; \ + MAPIMETHOD(CopyEntries) \ + (THIS_ LPENTRYLIST lpEntries, \ + ULONG_PTR ulUIParam, \ + LPMAPIPROGRESS lpProgress, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(DeleteEntries) \ + (THIS_ LPENTRYLIST lpEntries, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(ResolveNames) \ + (THIS_ LPSPropTagArray lpPropTagArray, \ + ULONG ulFlags, \ + LPADRLIST lpAdrList, \ + LPFlagList lpFlagList) IPURE; \ + +#undef INTERFACE +#define INTERFACE IABContainer +DECLARE_MAPI_INTERFACE_(IABContainer, IMAPIContainer) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIPROP_METHODS(PURE) + MAPI_IMAPICONTAINER_METHODS(PURE) + MAPI_IABCONTAINER_METHODS(PURE) +}; + +/* IMailUser Interface ----------------------------------------------------- */ + +/* Any call which can create a one-off entryID (i.e. MAPISupport::CreateOneOff + or IAdrBook::CreateOneOff) can encode the value for PR_SEND_RICH_INFO by + passing in the following flag in the ulFlags parameter. Setting this flag + indicates that PR_SEND_RICH_INFO will be FALSE. +*/ +#define MAPI_SEND_NO_RICH_INFO ((ULONG) 0x00010000) + + + + +/* Values of PR_NDR_DIAG_CODE */ + +#define MAPI_DIAG(_code) ((LONG) _code) + +#define MAPI_DIAG_NO_DIAGNOSTIC MAPI_DIAG( -1 ) +#define MAPI_DIAG_OR_NAME_UNRECOGNIZED MAPI_DIAG( 0 ) +#define MAPI_DIAG_OR_NAME_AMBIGUOUS MAPI_DIAG( 1 ) +#define MAPI_DIAG_MTS_CONGESTED MAPI_DIAG( 2 ) +#define MAPI_DIAG_LOOP_DETECTED MAPI_DIAG( 3 ) +#define MAPI_DIAG_RECIPIENT_UNAVAILABLE MAPI_DIAG( 4 ) +#define MAPI_DIAG_MAXIMUM_TIME_EXPIRED MAPI_DIAG( 5 ) +#define MAPI_DIAG_EITS_UNSUPPORTED MAPI_DIAG( 6 ) +#define MAPI_DIAG_CONTENT_TOO_LONG MAPI_DIAG( 7 ) +#define MAPI_DIAG_IMPRACTICAL_TO_CONVERT MAPI_DIAG( 8 ) +#define MAPI_DIAG_PROHIBITED_TO_CONVERT MAPI_DIAG( 9 ) +#define MAPI_DIAG_CONVERSION_UNSUBSCRIBED MAPI_DIAG( 10 ) +#define MAPI_DIAG_PARAMETERS_INVALID MAPI_DIAG( 11 ) +#define MAPI_DIAG_CONTENT_SYNTAX_IN_ERROR MAPI_DIAG( 12 ) +#define MAPI_DIAG_LENGTH_CONSTRAINT_VIOLATD MAPI_DIAG( 13 ) +#define MAPI_DIAG_NUMBER_CONSTRAINT_VIOLATD MAPI_DIAG( 14 ) +#define MAPI_DIAG_CONTENT_TYPE_UNSUPPORTED MAPI_DIAG( 15 ) +#define MAPI_DIAG_TOO_MANY_RECIPIENTS MAPI_DIAG( 16 ) +#define MAPI_DIAG_NO_BILATERAL_AGREEMENT MAPI_DIAG( 17 ) +#define MAPI_DIAG_CRITICAL_FUNC_UNSUPPORTED MAPI_DIAG( 18 ) +#define MAPI_DIAG_CONVERSION_LOSS_PROHIB MAPI_DIAG( 19 ) +#define MAPI_DIAG_LINE_TOO_LONG MAPI_DIAG( 20 ) +#define MAPI_DIAG_PAGE_TOO_LONG MAPI_DIAG( 21 ) +#define MAPI_DIAG_PICTORIAL_SYMBOL_LOST MAPI_DIAG( 22 ) +#define MAPI_DIAG_PUNCTUATION_SYMBOL_LOST MAPI_DIAG( 23 ) +#define MAPI_DIAG_ALPHABETIC_CHARACTER_LOST MAPI_DIAG( 24 ) +#define MAPI_DIAG_MULTIPLE_INFO_LOSSES MAPI_DIAG( 25 ) +#define MAPI_DIAG_REASSIGNMENT_PROHIBITED MAPI_DIAG( 26 ) +#define MAPI_DIAG_REDIRECTION_LOOP_DETECTED MAPI_DIAG( 27 ) +#define MAPI_DIAG_EXPANSION_PROHIBITED MAPI_DIAG( 28 ) +#define MAPI_DIAG_SUBMISSION_PROHIBITED MAPI_DIAG( 29 ) +#define MAPI_DIAG_EXPANSION_FAILED MAPI_DIAG( 30 ) +#define MAPI_DIAG_RENDITION_UNSUPPORTED MAPI_DIAG( 31 ) +#define MAPI_DIAG_MAIL_ADDRESS_INCORRECT MAPI_DIAG( 32 ) +#define MAPI_DIAG_MAIL_OFFICE_INCOR_OR_INVD MAPI_DIAG( 33 ) +#define MAPI_DIAG_MAIL_ADDRESS_INCOMPLETE MAPI_DIAG( 34 ) +#define MAPI_DIAG_MAIL_RECIPIENT_UNKNOWN MAPI_DIAG( 35 ) +#define MAPI_DIAG_MAIL_RECIPIENT_DECEASED MAPI_DIAG( 36 ) +#define MAPI_DIAG_MAIL_ORGANIZATION_EXPIRED MAPI_DIAG( 37 ) +#define MAPI_DIAG_MAIL_REFUSED MAPI_DIAG( 38 ) +#define MAPI_DIAG_MAIL_UNCLAIMED MAPI_DIAG( 39 ) +#define MAPI_DIAG_MAIL_RECIPIENT_MOVED MAPI_DIAG( 40 ) +#define MAPI_DIAG_MAIL_RECIPIENT_TRAVELLING MAPI_DIAG( 41 ) +#define MAPI_DIAG_MAIL_RECIPIENT_DEPARTED MAPI_DIAG( 42 ) +#define MAPI_DIAG_MAIL_NEW_ADDRESS_UNKNOWN MAPI_DIAG( 43 ) +#define MAPI_DIAG_MAIL_FORWARDING_UNWANTED MAPI_DIAG( 44 ) +#define MAPI_DIAG_MAIL_FORWARDING_PROHIB MAPI_DIAG( 45 ) +#define MAPI_DIAG_SECURE_MESSAGING_ERROR MAPI_DIAG( 46 ) +#define MAPI_DIAG_DOWNGRADING_IMPOSSIBLE MAPI_DIAG( 47 ) + +/* Values of PR_DELIVERY_POINT (MH_T_DELIVERY_POINT) */ + +#define MAPI_MH_DP_PUBLIC_UA ((ULONG) 0) +#define MAPI_MH_DP_PRIVATE_UA ((ULONG) 1) +#define MAPI_MH_DP_MS ((ULONG) 2) +#define MAPI_MH_DP_ML ((ULONG) 3) +#define MAPI_MH_DP_PDAU ((ULONG) 4) +#define MAPI_MH_DP_PDS_PATRON ((ULONG) 5) +#define MAPI_MH_DP_OTHER_AU ((ULONG) 6) + + +#define MAPI_IMAILUSER_METHODS(IPURE) + +#undef INTERFACE +#define INTERFACE IMailUser +DECLARE_MAPI_INTERFACE_(IMailUser, IMAPIProp) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIPROP_METHODS(PURE) + MAPI_IMAILUSER_METHODS(PURE) +}; + +/* IDistList Interface ----------------------------------------------------- */ + +#define MAPI_IDISTLIST_METHODS(IPURE) \ + MAPIMETHOD(CreateEntry) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + ULONG ulCreateFlags, \ + LPMAPIPROP FAR * lppMAPIPropEntry) IPURE; \ + MAPIMETHOD(CopyEntries) \ + (THIS_ LPENTRYLIST lpEntries, \ + ULONG_PTR ulUIParam, \ + LPMAPIPROGRESS lpProgress, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(DeleteEntries) \ + (THIS_ LPENTRYLIST lpEntries, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(ResolveNames) \ + (THIS_ LPSPropTagArray lpPropTagArray, \ + ULONG ulFlags, \ + LPADRLIST lpAdrList, \ + LPFlagList lpFlagList) IPURE; \ + +#undef INTERFACE +#define INTERFACE IDistList +DECLARE_MAPI_INTERFACE_(IDistList, IMAPIContainer) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIPROP_METHODS(PURE) + MAPI_IMAPICONTAINER_METHODS(PURE) + MAPI_IDISTLIST_METHODS(PURE) +}; + +/* IMAPIFolder Interface --------------------------------------------------- */ + +/* IMAPIFolder folder type (enum) */ + +#define FOLDER_ROOT ((ULONG) 0x00000000) +#define FOLDER_GENERIC ((ULONG) 0x00000001) +#define FOLDER_SEARCH ((ULONG) 0x00000002) + +/* CreateMessage */ +/****** MAPI_DEFERRED_ERRORS ((ULONG) 0x00000008) below */ +/****** MAPI_ASSOCIATED ((ULONG) 0x00000040) below */ + +/* CopyMessages */ + +#define MESSAGE_MOVE ((ULONG) 0x00000001) +#define MESSAGE_DIALOG ((ULONG) 0x00000002) +/****** MAPI_DECLINE_OK ((ULONG) 0x00000004) above */ + +/* CreateFolder */ + +#define OPEN_IF_EXISTS ((ULONG) 0x00000001) +/****** MAPI_DEFERRED_ERRORS ((ULONG) 0x00000008) below */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) above */ + +/* DeleteFolder */ + +#define DEL_MESSAGES ((ULONG) 0x00000001) +#define FOLDER_DIALOG ((ULONG) 0x00000002) +#define DEL_FOLDERS ((ULONG) 0x00000004) + +/* EmptyFolder */ +#define DEL_ASSOCIATED ((ULONG) 0x00000008) + +/* CopyFolder */ + +#define FOLDER_MOVE ((ULONG) 0x00000001) +/****** FOLDER_DIALOG ((ULONG) 0x00000002) above */ +/****** MAPI_DECLINE_OK ((ULONG) 0x00000004) above */ +#define COPY_SUBFOLDERS ((ULONG) 0x00000010) +/****** MAPI_UNICODE ((ULONG) 0x80000000) above */ + + +/* SetReadFlags */ + +/****** SUPPRESS_RECEIPT ((ULONG) 0x00000001) below */ +/****** FOLDER_DIALOG ((ULONG) 0x00000002) above */ +/****** CLEAR_READ_FLAG ((ULONG) 0x00000004) below */ +/****** MAPI_DEFERRED_ERRORS ((ULONG) 0x00000008) below */ +/****** GENERATE_RECEIPT_ONLY ((ULONG) 0x00000010) below */ +/****** CLEAR_RN_PENDING ((ULONG) 0x00000020) below */ +/****** CLEAR_NRN_PENDING ((ULONG) 0x00000040) below */ + + +/* GetMessageStatus */ + +#define MSGSTATUS_HIGHLIGHTED ((ULONG) 0x00000001) +#define MSGSTATUS_TAGGED ((ULONG) 0x00000002) +#define MSGSTATUS_HIDDEN ((ULONG) 0x00000004) +#define MSGSTATUS_DELMARKED ((ULONG) 0x00000008) + +/* Bits for remote message status */ + +#define MSGSTATUS_REMOTE_DOWNLOAD ((ULONG) 0x00001000) +#define MSGSTATUS_REMOTE_DELETE ((ULONG) 0x00002000) + +/* SaveContentsSort */ + +#define RECURSIVE_SORT ((ULONG) 0x00000002) + +/* PR_STATUS property */ + +#define FLDSTATUS_HIGHLIGHTED ((ULONG) 0x00000001) +#define FLDSTATUS_TAGGED ((ULONG) 0x00000002) +#define FLDSTATUS_HIDDEN ((ULONG) 0x00000004) +#define FLDSTATUS_DELMARKED ((ULONG) 0x00000008) + +#define MAPI_IMAPIFOLDER_METHODS(IPURE) \ + MAPIMETHOD(CreateMessage) \ + (THIS_ LPCIID lpInterface, \ + ULONG ulFlags, \ + LPMESSAGE FAR * lppMessage) IPURE; \ + MAPIMETHOD(CopyMessages) \ + (THIS_ LPENTRYLIST lpMsgList, \ + LPCIID lpInterface, \ + LPVOID lpDestFolder, \ + ULONG_PTR ulUIParam, \ + LPMAPIPROGRESS lpProgress, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(DeleteMessages) \ + (THIS_ LPENTRYLIST lpMsgList, \ + ULONG_PTR ulUIParam, \ + LPMAPIPROGRESS lpProgress, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(CreateFolder) \ + (THIS_ ULONG ulFolderType, \ + LPTSTR lpszFolderName, \ + LPTSTR lpszFolderComment, \ + LPCIID lpInterface, \ + ULONG ulFlags, \ + LPMAPIFOLDER FAR * lppFolder) IPURE; \ + MAPIMETHOD(CopyFolder) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + LPCIID lpInterface, \ + LPVOID lpDestFolder, \ + LPTSTR lpszNewFolderName, \ + ULONG_PTR ulUIParam, \ + LPMAPIPROGRESS lpProgress, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(DeleteFolder) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + ULONG_PTR ulUIParam, \ + LPMAPIPROGRESS lpProgress, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(SetReadFlags) \ + (THIS_ LPENTRYLIST lpMsgList, \ + ULONG_PTR ulUIParam, \ + LPMAPIPROGRESS lpProgress, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(GetMessageStatus) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + ULONG ulFlags, \ + ULONG FAR * lpulMessageStatus) IPURE; \ + MAPIMETHOD(SetMessageStatus) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + ULONG ulNewStatus, \ + ULONG ulNewStatusMask, \ + ULONG FAR * lpulOldStatus) IPURE; \ + MAPIMETHOD(SaveContentsSort) \ + (THIS_ LPSSortOrderSet lpSortCriteria, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(EmptyFolder) \ + (THIS_ ULONG_PTR ulUIParam, \ + LPMAPIPROGRESS lpProgress, \ + ULONG ulFlags) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPIFolder +DECLARE_MAPI_INTERFACE_(IMAPIFolder, IMAPIContainer) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIPROP_METHODS(PURE) + MAPI_IMAPICONTAINER_METHODS(PURE) + MAPI_IMAPIFOLDER_METHODS(PURE) +}; + +/* IMsgStore Interface ----------------------------------------------------- */ + +/* PR_STORE_SUPPORT_MASK bits */ +#define STORE_ENTRYID_UNIQUE ((ULONG) 0x00000001) +#define STORE_READONLY ((ULONG) 0x00000002) +#define STORE_SEARCH_OK ((ULONG) 0x00000004) +#define STORE_MODIFY_OK ((ULONG) 0x00000008) +#define STORE_CREATE_OK ((ULONG) 0x00000010) +#define STORE_ATTACH_OK ((ULONG) 0x00000020) +#define STORE_OLE_OK ((ULONG) 0x00000040) +#define STORE_SUBMIT_OK ((ULONG) 0x00000080) +#define STORE_NOTIFY_OK ((ULONG) 0x00000100) +#define STORE_MV_PROPS_OK ((ULONG) 0x00000200) +#define STORE_CATEGORIZE_OK ((ULONG) 0x00000400) +#define STORE_RTF_OK ((ULONG) 0x00000800) +#define STORE_RESTRICTION_OK ((ULONG) 0x00001000) +#define STORE_SORT_OK ((ULONG) 0x00002000) +#define STORE_PUBLIC_FOLDERS ((ULONG) 0x00004000) +#define STORE_UNCOMPRESSED_RTF ((ULONG) 0x00008000) + +/* PR_STORE_STATE bits, try not to collide with PR_STORE_SUPPORT_MASK */ + +#define STORE_HAS_SEARCHES ((ULONG) 0x01000000) + + +/* OpenEntry() */ + +/****** MAPI_MODIFY ((ULONG) 0x00000001) above */ +/****** MAPI_DEFERRED_ERRORS ((ULONG) 0x00000008) below */ +/****** MAPI_BEST_ACCESS ((ULONG) 0x00000010) above */ + +/* SetReceiveFolder() */ + +/****** MAPI_UNICODE ((ULONG) 0x80000000) above */ + +/* GetReceiveFolder() */ + +/****** MAPI_UNICODE ((ULONG) 0x80000000) above */ + +/* GetReceiveFolderTable() */ + +/****** MAPI_DEFERRED_ERRORS ((ULONG) 0x00000008) below */ + +/* StoreLogoff() */ + +#define LOGOFF_NO_WAIT ((ULONG) 0x00000001) +#define LOGOFF_ORDERLY ((ULONG) 0x00000002) +#define LOGOFF_PURGE ((ULONG) 0x00000004) +#define LOGOFF_ABORT ((ULONG) 0x00000008) +#define LOGOFF_QUIET ((ULONG) 0x00000010) + +#define LOGOFF_COMPLETE ((ULONG) 0x00010000) +#define LOGOFF_INBOUND ((ULONG) 0x00020000) +#define LOGOFF_OUTBOUND ((ULONG) 0x00040000) +#define LOGOFF_OUTBOUND_QUEUE ((ULONG) 0x00080000) + +/* SetLockState() */ + +#define MSG_LOCKED ((ULONG) 0x00000001) +#define MSG_UNLOCKED ((ULONG) 0x00000000) + +/* Flag bits for PR_VALID_FOLDER_MASK */ + +#define FOLDER_IPM_SUBTREE_VALID ((ULONG) 0x00000001) +#define FOLDER_IPM_INBOX_VALID ((ULONG) 0x00000002) +#define FOLDER_IPM_OUTBOX_VALID ((ULONG) 0x00000004) +#define FOLDER_IPM_WASTEBASKET_VALID ((ULONG) 0x00000008) +#define FOLDER_IPM_SENTMAIL_VALID ((ULONG) 0x00000010) +#define FOLDER_VIEWS_VALID ((ULONG) 0x00000020) +#define FOLDER_COMMON_VIEWS_VALID ((ULONG) 0x00000040) +#define FOLDER_FINDER_VALID ((ULONG) 0x00000080) + +#define MAPI_IMSGSTORE_METHODS(IPURE) \ + MAPIMETHOD(Advise) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + ULONG ulEventMask, \ + LPMAPIADVISESINK lpAdviseSink, \ + ULONG_PTR FAR * lpulConnection) IPURE; \ + MAPIMETHOD(Unadvise) \ + (THIS_ ULONG_PTR ulConnection) IPURE; \ + MAPIMETHOD(CompareEntryIDs) \ + (THIS_ ULONG cbEntryID1, \ + LPENTRYID lpEntryID1, \ + ULONG cbEntryID2, \ + LPENTRYID lpEntryID2, \ + ULONG ulFlags, \ + ULONG FAR * lpulResult) IPURE; \ + MAPIMETHOD(OpenEntry) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + LPCIID lpInterface, \ + ULONG ulFlags, \ + ULONG FAR * lpulObjType, \ + LPUNKNOWN FAR * lppUnk) IPURE; \ + MAPIMETHOD(SetReceiveFolder) \ + (THIS_ LPTSTR lpszMessageClass, \ + ULONG ulFlags, \ + ULONG cbEntryID, \ + LPENTRYID lpEntryID) IPURE; \ + MAPIMETHOD(GetReceiveFolder) \ + (THIS_ LPTSTR lpszMessageClass, \ + ULONG ulFlags, \ + ULONG FAR * lpcbEntryID, \ + LPENTRYID FAR * lppEntryID, \ + LPTSTR FAR * lppszExplicitClass) IPURE; \ + MAPIMETHOD(GetReceiveFolderTable) \ + (THIS_ ULONG ulFlags, \ + LPMAPITABLE FAR * lppTable) IPURE; \ + MAPIMETHOD(StoreLogoff) \ + (THIS_ ULONG FAR * lpulFlags) IPURE; \ + MAPIMETHOD(AbortSubmit) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(GetOutgoingQueue) \ + (THIS_ ULONG ulFlags, \ + LPMAPITABLE FAR * lppTable) IPURE; \ + MAPIMETHOD(SetLockState) \ + (THIS_ LPMESSAGE lpMessage, \ + ULONG ulLockState) IPURE; \ + MAPIMETHOD(FinishedMsg) \ + (THIS_ ULONG ulFlags, \ + ULONG cbEntryID, \ + LPENTRYID lpEntryID) IPURE; \ + MAPIMETHOD(NotifyNewMail) \ + (THIS_ LPNOTIFICATION lpNotification) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMsgStore +DECLARE_MAPI_INTERFACE_(IMsgStore, IMAPIProp) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIPROP_METHODS(PURE) + MAPI_IMSGSTORE_METHODS(PURE) +}; + +/* IMessage Interface ------------------------------------------------------ */ + +/* SubmitMessage */ + +#define FORCE_SUBMIT ((ULONG) 0x00000001) + +/* Flags defined in PR_MESSAGE_FLAGS */ + +#define MSGFLAG_READ ((ULONG) 0x00000001) +#define MSGFLAG_UNMODIFIED ((ULONG) 0x00000002) +#define MSGFLAG_SUBMIT ((ULONG) 0x00000004) +#define MSGFLAG_UNSENT ((ULONG) 0x00000008) +#define MSGFLAG_HASATTACH ((ULONG) 0x00000010) +#define MSGFLAG_FROMME ((ULONG) 0x00000020) +#define MSGFLAG_ASSOCIATED ((ULONG) 0x00000040) +#define MSGFLAG_RESEND ((ULONG) 0x00000080) +#define MSGFLAG_RN_PENDING ((ULONG) 0x00000100) +#define MSGFLAG_NRN_PENDING ((ULONG) 0x00000200) + +/* Flags defined in PR_SUBMIT_FLAGS */ + +#define SUBMITFLAG_LOCKED ((ULONG) 0x00000001) +#define SUBMITFLAG_PREPROCESS ((ULONG) 0x00000002) + +/* GetAttachmentTable() */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) above */ + +/* GetRecipientTable() */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) above */ + +/* ModifyRecipients */ + +/* ((ULONG) 0x00000001 is not a valid flag on ModifyRecipients. */ +#define MODRECIP_ADD ((ULONG) 0x00000002) +#define MODRECIP_MODIFY ((ULONG) 0x00000004) +#define MODRECIP_REMOVE ((ULONG) 0x00000008) + +/* SetReadFlag */ + +#define SUPPRESS_RECEIPT ((ULONG) 0x00000001) +#define CLEAR_READ_FLAG ((ULONG) 0x00000004) +/****** MAPI_DEFERRED_ERRORS ((ULONG) 0x00000008) below */ +#define GENERATE_RECEIPT_ONLY ((ULONG) 0x00000010) +#define CLEAR_RN_PENDING ((ULONG) 0x00000020) +#define CLEAR_NRN_PENDING ((ULONG) 0x00000040) + +/* DeleteAttach */ + +#define ATTACH_DIALOG ((ULONG) 0x00000001) + +/* PR_SECURITY values */ +#define SECURITY_SIGNED ((ULONG) 0x00000001) +#define SECURITY_ENCRYPTED ((ULONG) 0x00000002) + +/* PR_PRIORITY values */ +#define PRIO_URGENT ((long) 1) +#define PRIO_NORMAL ((long) 0) +#define PRIO_NONURGENT ((long) -1) + +/* PR_SENSITIVITY values */ +#define SENSITIVITY_NONE ((ULONG) 0x00000000) +#define SENSITIVITY_PERSONAL ((ULONG) 0x00000001) +#define SENSITIVITY_PRIVATE ((ULONG) 0x00000002) +#define SENSITIVITY_COMPANY_CONFIDENTIAL ((ULONG) 0x00000003) + +/* PR_IMPORTANCE values */ +#define IMPORTANCE_LOW ((long) 0) +#define IMPORTANCE_NORMAL ((long) 1) +#define IMPORTANCE_HIGH ((long) 2) + +#define MAPI_IMESSAGE_METHODS(IPURE) \ + MAPIMETHOD(GetAttachmentTable) \ + (THIS_ ULONG ulFlags, \ + LPMAPITABLE FAR * lppTable) IPURE; \ + MAPIMETHOD(OpenAttach) \ + (THIS_ ULONG ulAttachmentNum, \ + LPCIID lpInterface, \ + ULONG ulFlags, \ + LPATTACH FAR * lppAttach) IPURE; \ + MAPIMETHOD(CreateAttach) \ + (THIS_ LPCIID lpInterface, \ + ULONG ulFlags, \ + ULONG FAR * lpulAttachmentNum, \ + LPATTACH FAR * lppAttach) IPURE; \ + MAPIMETHOD(DeleteAttach) \ + (THIS_ ULONG ulAttachmentNum, \ + ULONG_PTR ulUIParam, \ + LPMAPIPROGRESS lpProgress, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(GetRecipientTable) \ + (THIS_ ULONG ulFlags, \ + LPMAPITABLE FAR * lppTable) IPURE; \ + MAPIMETHOD(ModifyRecipients) \ + (THIS_ ULONG ulFlags, \ + LPADRLIST lpMods) IPURE; \ + MAPIMETHOD(SubmitMessage) \ + (THIS_ ULONG ulFlags) IPURE; \ + MAPIMETHOD(SetReadFlag) \ + (THIS_ ULONG ulFlags) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMessage +DECLARE_MAPI_INTERFACE_(IMessage, IMAPIProp) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIPROP_METHODS(PURE) + MAPI_IMESSAGE_METHODS(PURE) +}; + +/* IAttach Interface ------------------------------------------------------- */ + +/* IAttach attachment methods: PR_ATTACH_METHOD values */ + +#define NO_ATTACHMENT ((ULONG) 0x00000000) +#define ATTACH_BY_VALUE ((ULONG) 0x00000001) +#define ATTACH_BY_REFERENCE ((ULONG) 0x00000002) +#define ATTACH_BY_REF_RESOLVE ((ULONG) 0x00000003) +#define ATTACH_BY_REF_ONLY ((ULONG) 0x00000004) +#define ATTACH_EMBEDDED_MSG ((ULONG) 0x00000005) +#define ATTACH_OLE ((ULONG) 0x00000006) + +#define MAPI_IATTACH_METHODS(IPURE) + +#undef INTERFACE +#define INTERFACE IAttach +DECLARE_MAPI_INTERFACE_(IAttach, IMAPIProp) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIPROP_METHODS(PURE) + MAPI_IATTACH_METHODS(PURE) +}; + +/* --------------------------------- */ +/* Address Book interface definition */ + +/* ADRPARM ulFlags - top 4 bits used for versioning */ + +#define GET_ADRPARM_VERSION(ulFlags) (((ULONG)ulFlags) & 0xF0000000) +#define SET_ADRPARM_VERSION(ulFlags, ulVersion) (((ULONG)ulVersion) | (((ULONG)ulFlags) & 0x0FFFFFFF)) + +/* Current versions of ADRPARM */ +#define ADRPARM_HELP_CTX ((ULONG) 0x00000000) + + +/* ulFlags - bit fields */ +#define DIALOG_MODAL ((ULONG) 0x00000001) +#define DIALOG_SDI ((ULONG) 0x00000002) +#define DIALOG_OPTIONS ((ULONG) 0x00000004) +#define ADDRESS_ONE ((ULONG) 0x00000008) +#define AB_SELECTONLY ((ULONG) 0x00000010) +#define AB_RESOLVE ((ULONG) 0x00000020) + +/* --------------------------------- */ +/* PR_DISPLAY_TYPEs */ +/* + * These standard display types are + * by default handled by MAPI. + * They have default icons associated + * with them. + */ + +/* For address book contents tables */ +#define DT_MAILUSER ((ULONG) 0x00000000) +#define DT_DISTLIST ((ULONG) 0x00000001) +#define DT_FORUM ((ULONG) 0x00000002) +#define DT_AGENT ((ULONG) 0x00000003) +#define DT_ORGANIZATION ((ULONG) 0x00000004) +#define DT_PRIVATE_DISTLIST ((ULONG) 0x00000005) +#define DT_REMOTE_MAILUSER ((ULONG) 0x00000006) + +/* For address book hierarchy tables */ +#define DT_MODIFIABLE ((ULONG) 0x00010000) +#define DT_GLOBAL ((ULONG) 0x00020000) +#define DT_LOCAL ((ULONG) 0x00030000) +#define DT_WAN ((ULONG) 0x00040000) +#define DT_NOT_SPECIFIC ((ULONG) 0x00050000) + +/* For folder hierarchy tables */ +#define DT_FOLDER ((ULONG) 0x01000000) +#define DT_FOLDER_LINK ((ULONG) 0x02000000) +#define DT_FOLDER_SPECIAL ((ULONG) 0x04000000) + +/* Accelerator callback for DIALOG_SDI form of AB UI */ +typedef BOOL (STDMETHODCALLTYPE ACCELERATEABSDI)(ULONG_PTR ulUIParam, + LPVOID lpvmsg); +typedef ACCELERATEABSDI FAR * LPFNABSDI; + +/* Callback to application telling it that the DIALOG_SDI form of the */ +/* AB UI has been dismissed. This is so that the above LPFNABSDI */ +/* function doesn't keep being called. */ +typedef void (STDMETHODCALLTYPE DISMISSMODELESS)(ULONG_PTR ulUIParam, + LPVOID lpvContext); +typedef DISMISSMODELESS FAR * LPFNDISMISS; + +/* + * Prototype for the client function hooked to an optional button on + * the address book dialog + */ + +typedef SCODE (STDMETHODCALLTYPE FAR * LPFNBUTTON)( + ULONG_PTR ulUIParam, + LPVOID lpvContext, + ULONG cbEntryID, + LPENTRYID lpSelection, + ULONG ulFlags +); + + +/* Parameters for the address book dialog */ +typedef struct _ADRPARM +{ + ULONG cbABContEntryID; + LPENTRYID lpABContEntryID; + ULONG ulFlags; + + LPVOID lpReserved; + ULONG ulHelpContext; + LPTSTR lpszHelpFileName; + + LPFNABSDI lpfnABSDI; + LPFNDISMISS lpfnDismiss; + LPVOID lpvDismissContext; + LPTSTR lpszCaption; + LPTSTR lpszNewEntryTitle; + LPTSTR lpszDestWellsTitle; + ULONG cDestFields; + ULONG nDestFieldFocus; + LPTSTR FAR * lppszDestTitles; + ULONG FAR * lpulDestComps; + LPSRestriction lpContRestriction; + LPSRestriction lpHierRestriction; +} ADRPARM, FAR * LPADRPARM; + + +/* ------------ */ +/* Random flags */ + +/* Flag for deferred error */ +#define MAPI_DEFERRED_ERRORS ((ULONG) 0x00000008) + +/* Flag for creating and using Folder Associated Information Messages */ +#define MAPI_ASSOCIATED ((ULONG) 0x00000040) + +/* Flags for OpenMessageStore() */ + +#define MDB_NO_DIALOG ((ULONG) 0x00000001) +#define MDB_WRITE ((ULONG) 0x00000004) +/****** MAPI_DEFERRED_ERRORS ((ULONG) 0x00000008) above */ +/****** MAPI_BEST_ACCESS ((ULONG) 0x00000010) above */ +#define MDB_TEMPORARY ((ULONG) 0x00000020) +#define MDB_NO_MAIL ((ULONG) 0x00000080) + +/* Flags for OpenAddressBook */ + +#define AB_NO_DIALOG ((ULONG) 0x00000001) + +/* IMAPIControl Interface -------------------------------------------------- */ + +/* Interface used in controls (particularly the button) defined by */ +/* Display Tables. */ + +/* Flags for GetState */ + +#define MAPI_ENABLED ((ULONG) 0x00000000) +#define MAPI_DISABLED ((ULONG) 0x00000001) + +#define MAPI_IMAPICONTROL_METHODS(IPURE) \ + MAPIMETHOD(GetLastError) \ + (THIS_ HRESULT hResult, \ + ULONG ulFlags, \ + LPMAPIERROR FAR * lppMAPIError) IPURE; \ + MAPIMETHOD(Activate) \ + (THIS_ ULONG ulFlags, \ + ULONG_PTR ulUIParam) IPURE; \ + MAPIMETHOD(GetState) \ + (THIS_ ULONG ulFlags, \ + ULONG FAR * lpulState) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPIControl +DECLARE_MAPI_INTERFACE_(IMAPIControl, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPICONTROL_METHODS(PURE) +}; + +DECLARE_MAPI_INTERFACE_PTR(IMAPIControl, LPMAPICONTROL); + +/* Display Tables ---------------------------------------------------------- */ + +/* Flags used in display tables - that is, PR_CONTROL_FLAGS */ + +#define DT_MULTILINE ((ULONG) 0x00000001) +#define DT_EDITABLE ((ULONG) 0x00000002) +#define DT_REQUIRED ((ULONG) 0x00000004) +#define DT_SET_IMMEDIATE ((ULONG) 0x00000008) +#define DT_PASSWORD_EDIT ((ULONG) 0x00000010) +#define DT_ACCEPT_DBCS ((ULONG) 0x00000020) +#define DT_SET_SELECTION ((ULONG) 0x00000040) + +/* Display Table structures */ + +#define DTCT_LABEL ((ULONG) 0x00000000) +#define DTCT_EDIT ((ULONG) 0x00000001) +#define DTCT_LBX ((ULONG) 0x00000002) +#define DTCT_COMBOBOX ((ULONG) 0x00000003) +#define DTCT_DDLBX ((ULONG) 0x00000004) +#define DTCT_CHECKBOX ((ULONG) 0x00000005) +#define DTCT_GROUPBOX ((ULONG) 0x00000006) +#define DTCT_BUTTON ((ULONG) 0x00000007) +#define DTCT_PAGE ((ULONG) 0x00000008) +#define DTCT_RADIOBUTTON ((ULONG) 0x00000009) +#define DTCT_MVLISTBOX ((ULONG) 0x0000000B) +#define DTCT_MVDDLBX ((ULONG) 0x0000000C) + +/* Labels */ +/* Valid ulFlags: + * MAPI_UNICODE + */ +typedef struct _DTBLLABEL +{ + ULONG ulbLpszLabelName; + ULONG ulFlags; +} DTBLLABEL, FAR * LPDTBLLABEL; +#define SizedDtblLabel(n,u) \ +struct _DTBLLABEL_ ## u \ +{ \ + DTBLLABEL dtbllabel; \ + TCHAR lpszLabelName[n]; \ +} u + + +/* Simple Text Edits */ +/* Valid ulFlags: + * MAPI_UNICODE + */ +typedef struct _DTBLEDIT +{ + ULONG ulbLpszCharsAllowed; + ULONG ulFlags; + ULONG ulNumCharsAllowed; + ULONG ulPropTag; +} DTBLEDIT, FAR * LPDTBLEDIT; +#define SizedDtblEdit(n,u) \ +struct _DTBLEDIT_ ## u \ +{ \ + DTBLEDIT dtbledit; \ + TCHAR lpszCharsAllowed[n]; \ +} u + +/* List Box */ +/* Valid ulFlags: + */ +#define MAPI_NO_HBAR ((ULONG) 0x00000001) +#define MAPI_NO_VBAR ((ULONG) 0x00000002) + +typedef struct _DTBLLBX +{ + ULONG ulFlags; + ULONG ulPRSetProperty; + ULONG ulPRTableName; +} DTBLLBX, FAR * LPDTBLLBX; + + +/* Combo Box */ +/* Valid ulFlags: + * MAPI_UNICODE + */ +typedef struct _DTBLCOMBOBOX +{ + ULONG ulbLpszCharsAllowed; + ULONG ulFlags; + ULONG ulNumCharsAllowed; + ULONG ulPRPropertyName; + ULONG ulPRTableName; +} DTBLCOMBOBOX, FAR * LPDTBLCOMBOBOX; +#define SizedDtblComboBox(n,u) \ +struct _DTBLCOMBOBOX_ ## u \ +{ \ + DTBLCOMBOBOX dtblcombobox; \ + TCHAR lpszCharsAllowed[n]; \ +} u + + +/* Drop Down */ +/* Valid ulFlags: + * none + */ +typedef struct _DTBLDDLBX +{ + ULONG ulFlags; + ULONG ulPRDisplayProperty; + ULONG ulPRSetProperty; + ULONG ulPRTableName; +} DTBLDDLBX, FAR * LPDTBLDDLBX; + + +/* Check Box */ +/* Valid ulFlags: + * MAPI_UNICODE + */ +typedef struct _DTBLCHECKBOX +{ + ULONG ulbLpszLabel; + ULONG ulFlags; + ULONG ulPRPropertyName; +} DTBLCHECKBOX, FAR * LPDTBLCHECKBOX; +#define SizedDtblCheckBox(n,u) \ +struct _DTBLCHECKBOX_ ## u \ +{ \ + DTBLCHECKBOX dtblcheckbox; \ + TCHAR lpszLabel[n]; \ +} u + + + +/* Group Box */ +/* Valid ulFlags: + * MAPI_UNICODE + */ +typedef struct _DTBLGROUPBOX +{ + ULONG ulbLpszLabel; + ULONG ulFlags; +} DTBLGROUPBOX, FAR * LPDTBLGROUPBOX; +#define SizedDtblGroupBox(n,u) \ +struct _DTBLGROUPBOX_ ## u \ +{ \ + DTBLGROUPBOX dtblgroupbox; \ + TCHAR lpszLabel[n]; \ +} u + +/* Button control */ +/* Valid ulFlags: + * MAPI_UNICODE + */ +typedef struct _DTBLBUTTON +{ + ULONG ulbLpszLabel; + ULONG ulFlags; + ULONG ulPRControl; +} DTBLBUTTON, FAR * LPDTBLBUTTON; +#define SizedDtblButton(n,u) \ +struct _DTBLBUTTON_ ## u \ +{ \ + DTBLBUTTON dtblbutton; \ + TCHAR lpszLabel[n]; \ +} u + +/* Pages */ +/* Valid ulFlags: + * MAPI_UNICODE + */ +typedef struct _DTBLPAGE +{ + ULONG ulbLpszLabel; + ULONG ulFlags; + ULONG ulbLpszComponent; + ULONG ulContext; +} DTBLPAGE, FAR * LPDTBLPAGE; +#define SizedDtblPage(n,n1,u) \ +struct _DTBLPAGE_ ## u \ +{ \ + DTBLPAGE dtblpage; \ + TCHAR lpszLabel[n]; \ + TCHAR lpszComponent[n1]; \ +} u + +/* Radio button */ +/* Valid ulFlags: + * MAPI_UNICODE + */ +typedef struct _DTBLRADIOBUTTON +{ + ULONG ulbLpszLabel; + ULONG ulFlags; + ULONG ulcButtons; + ULONG ulPropTag; + long lReturnValue; +} DTBLRADIOBUTTON, FAR * LPDTBLRADIOBUTTON; +#define SizedDtblRadioButton(n,u) \ +struct _DTBLRADIOBUTTON_ ## u \ +{ \ + DTBLRADIOBUTTON dtblradiobutton; \ + TCHAR lpszLabel[n]; \ +} u + + +/* MultiValued listbox */ +/* Valid ulFlags: + * none + */ +typedef struct _DTBLMVLISTBOX +{ + ULONG ulFlags; + ULONG ulMVPropTag; +} DTBLMVLISTBOX, FAR * LPDTBLMVLISTBOX; + + +/* MultiValued dropdown */ +/* Valid ulFlags: + * none + */ +typedef struct _DTBLMVDDLBX +{ + ULONG ulFlags; + ULONG ulMVPropTag; +} DTBLMVDDLBX, FAR * LPDTBLMVDDLBX; + + + + + +/* IProviderAdmin Interface ---------------------------------------------- */ + +/* Flags for ConfigureMsgService */ + +#define UI_SERVICE 0x00000002 +#define SERVICE_UI_ALWAYS 0x00000002 /* Duplicate UI_SERVICE for consistency and compatibility */ +#define SERVICE_UI_ALLOWED 0x00000010 +#define UI_CURRENT_PROVIDER_FIRST 0x00000004 +/* MSG_SERVICE_UI_READ_ONLY 0x00000008 - in MAPISPI.H */ + +/* GetProviderTable() */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) above */ + +/* Values for PR_RESOURCE_FLAGS in message service table */ + +#define MAPI_IPROVIDERADMIN_METHODS(IPURE) \ + MAPIMETHOD(GetLastError) \ + (THIS_ HRESULT hResult, \ + ULONG ulFlags, \ + LPMAPIERROR FAR * lppMAPIError) IPURE; \ + MAPIMETHOD(GetProviderTable) \ + (THIS_ ULONG ulFlags, \ + LPMAPITABLE FAR * lppTable) IPURE; \ + MAPIMETHOD(CreateProvider) \ + (THIS_ LPTSTR lpszProvider, \ + ULONG cValues, \ + LPSPropValue lpProps, \ + ULONG_PTR ulUIParam, \ + ULONG ulFlags, \ + MAPIUID FAR * lpUID) IPURE; \ + MAPIMETHOD(DeleteProvider) \ + (THIS_ LPMAPIUID lpUID) IPURE; \ + MAPIMETHOD(OpenProfileSection) \ + (THIS_ LPMAPIUID lpUID, \ + LPCIID lpInterface, \ + ULONG ulFlags, \ + LPPROFSECT FAR * lppProfSect) IPURE; \ + + +#undef INTERFACE +#define INTERFACE IProviderAdmin +DECLARE_MAPI_INTERFACE_(IProviderAdmin, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IPROVIDERADMIN_METHODS(PURE) +}; + + + +/* IMAPIClientShutdown Interface ----------------------------------------- */ +DECLARE_MAPI_INTERFACE_PTR(IMAPIClientShutdown, LPMAPICLIENTSHUTDOWN); + +#define MAPI_IMAPICLIENTSHUTDOWN_METHODS(IPURE) \ + MAPIMETHOD(QueryFastShutdown) \ + (THIS) IPURE; \ + MAPIMETHOD(NotifyProcessShutdown) \ + (THIS) IPURE; \ + MAPIMETHOD(DoFastShutdown) \ + (THIS) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPIClientShutdown +DECLARE_MAPI_INTERFACE_(IMAPIClientShutdown, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPICLIENTSHUTDOWN_METHODS(PURE) +}; + + +/* IMAPIProviderShutdown Interface --------------------------------------- */ +DECLARE_MAPI_INTERFACE_PTR(IMAPIProviderShutdown, LPMAPIPROVIDERSHUTDOWN); + +#define MAPI_IMAPIPROVIDERSHUTDOWN_METHODS(IPURE) \ + MAPIMETHOD(QueryFastShutdown) \ + (THIS) IPURE; \ + MAPIMETHOD(NotifyProcessShutdown) \ + (THIS) IPURE; \ + MAPIMETHOD(DoFastShutdown) \ + (THIS) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPIProviderShutdown +DECLARE_MAPI_INTERFACE_(IMAPIProviderShutdown, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIPROVIDERSHUTDOWN_METHODS(PURE) +}; + + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MAPIDEFS_H */ diff --git a/comm/mailnews/mapi/include/mapiform.h b/comm/mailnews/mapi/include/mapiform.h new file mode 100644 index 0000000000..e6ab3970ee --- /dev/null +++ b/comm/mailnews/mapi/include/mapiform.h @@ -0,0 +1,632 @@ +/* + * M A P I F O R M . H + * + * Declarations of interfaces for clients and providers of MAPI + * forms and form registries. + * + * Copyright (c) 2009 Microsoft Corporation. All Rights Reserved. + */ + +#ifndef MAPIFORM_H +#define MAPIFORM_H + +#if _MSC_VER > 1000 +#pragma once +#endif + +/* Include common MAPI header files if they haven't been already. */ + +#ifndef MAPIDEFS_H +#include <mapidefs.h> +#include <mapicode.h> +#include <mapiguid.h> +#include <mapitags.h> +#endif + +#ifndef BEGIN_INTERFACE +#define BEGIN_INTERFACE +#endif + +#ifndef _MAC +typedef const RECT FAR *LPCRECT; +#endif + +/* HFRMREG is an enumeration which represents a registry container. + * Microsoft reserves the values from 0 to 0x3FFF for its own use. + */ + +typedef ULONG HFRMREG; + +#define HFRMREG_DEFAULT 0 +#define HFRMREG_LOCAL 1 +#define HFRMREG_PERSONAL 2 +#define HFRMREG_FOLDER 3 + +DECLARE_MAPI_INTERFACE_PTR(IPersistMessage, LPPERSISTMESSAGE); +DECLARE_MAPI_INTERFACE_PTR(IMAPIMessageSite, LPMAPIMESSAGESITE); +DECLARE_MAPI_INTERFACE_PTR(IMAPISession, LPMAPISESSION); +DECLARE_MAPI_INTERFACE_PTR(IMAPIViewContext, LPMAPIVIEWCONTEXT); +DECLARE_MAPI_INTERFACE_PTR(IMAPIViewAdviseSink, LPMAPIVIEWADVISESINK); +DECLARE_MAPI_INTERFACE_PTR(IMAPIFormAdviseSink, LPMAPIFORMADVISESINK); +DECLARE_MAPI_INTERFACE_PTR(IMAPIFormInfo, LPMAPIFORMINFO); +DECLARE_MAPI_INTERFACE_PTR(IMAPIFormMgr, LPMAPIFORMMGR); +DECLARE_MAPI_INTERFACE_PTR(IMAPIFormContainer, LPMAPIFORMCONTAINER); +DECLARE_MAPI_INTERFACE_PTR(IMAPIForm, LPMAPIFORM); +DECLARE_MAPI_INTERFACE_PTR(IMAPIFormFactory, LPMAPIFORMFACTORY); + +typedef const char FAR *FAR * LPPCSTR; +typedef LPMAPIFORMINFO FAR *LPPMAPIFORMINFO; + +STDAPI MAPIOpenFormMgr(LPMAPISESSION pSession, LPMAPIFORMMGR FAR * ppmgr); +STDAPI MAPIOpenLocalFormContainer(LPMAPIFORMCONTAINER FAR * ppfcnt); + + +/*-- GetLastError ----------------------------------------------------------*/ +/* This defines the GetLastError method held in common by most mapiform + * interfaces. It is defined separately so that an implementor may include + * more than one mapiform interface in a class. + */ + +#define MAPI_GETLASTERROR_METHOD(IPURE) \ + MAPIMETHOD(GetLastError) (THIS_ \ + /*in*/ HRESULT hResult, \ + /*in*/ ULONG ulFlags, \ + /*out*/ LPMAPIERROR FAR * lppMAPIError) IPURE; \ + + +/*-- IPersistMessage -------------------------------------------------------*/ +/* This interface is implemented by forms and is used to save, + * initialize and load forms to and from messages. + */ + +#define MAPI_IPERSISTMESSAGE_METHODS(IPURE) \ + MAPIMETHOD(GetClassID) (THIS_ LPCLSID lpClassID) IPURE; \ + MAPIMETHOD(IsDirty)(THIS) IPURE; \ + MAPIMETHOD(InitNew)(THIS_ \ + /*in*/ LPMAPIMESSAGESITE pMessageSite, \ + /*in*/ LPMESSAGE pMessage) IPURE; \ + MAPIMETHOD(Load)(THIS_ \ + /*in*/ LPMAPIMESSAGESITE pMessageSite, \ + /*in*/ LPMESSAGE pMessage, \ + /*in*/ ULONG ulMessageStatus, \ + /*in*/ ULONG ulMessageFlags) IPURE; \ + MAPIMETHOD(Save)(THIS_ \ + /*in*/ LPMESSAGE pMessage, \ + /*in*/ ULONG fSameAsLoad) IPURE; \ + MAPIMETHOD(SaveCompleted)(THIS_ \ + /*in*/ LPMESSAGE pMessage) IPURE; \ + MAPIMETHOD(HandsOffMessage)(THIS) IPURE; \ + +#undef INTERFACE +#define INTERFACE IPersistMessage +DECLARE_MAPI_INTERFACE_(IPersistMessage, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_GETLASTERROR_METHOD(PURE) + MAPI_IPERSISTMESSAGE_METHODS(PURE) +}; + + +/*-- IMAPIMessageSite ------------------------------------------------------*/ + +#define MAPI_IMAPIMESSAGESITE_METHODS(IPURE) \ + MAPIMETHOD(GetSession) (THIS_ \ + /*out*/ LPMAPISESSION FAR * ppSession) IPURE; \ + MAPIMETHOD(GetStore) (THIS_ \ + /*out*/ LPMDB FAR * ppStore) IPURE; \ + MAPIMETHOD(GetFolder) (THIS_ \ + /*out*/ LPMAPIFOLDER FAR * ppFolder) IPURE; \ + MAPIMETHOD(GetMessage) (THIS_ \ + /*out*/ LPMESSAGE FAR * ppmsg) IPURE; \ + MAPIMETHOD(GetFormManager) (THIS_ \ + /*out*/ LPMAPIFORMMGR FAR * ppFormMgr) IPURE; \ + MAPIMETHOD(NewMessage) (THIS_ \ + /*in*/ ULONG fComposeInFolder, \ + /*in*/ LPMAPIFOLDER pFolderFocus, \ + /*in*/ LPPERSISTMESSAGE pPersistMessage, \ + /*out*/ LPMESSAGE FAR * ppMessage, \ + /*out*/ LPMAPIMESSAGESITE FAR * ppMessageSite, \ + /*out*/ LPMAPIVIEWCONTEXT FAR * ppViewContext) IPURE; \ + MAPIMETHOD(CopyMessage) (THIS_ \ + /*in*/ LPMAPIFOLDER pFolderDestination) IPURE; \ + MAPIMETHOD(MoveMessage) (THIS_ \ + /*in*/ LPMAPIFOLDER pFolderDestination, \ + /*in*/ LPMAPIVIEWCONTEXT pViewContext, \ + /*in*/ LPCRECT prcPosRect) IPURE; \ + MAPIMETHOD(DeleteMessage) (THIS_ \ + /*in*/ LPMAPIVIEWCONTEXT pViewContext, \ + /*in*/ LPCRECT prcPosRect) IPURE; \ + MAPIMETHOD(SaveMessage) (THIS) IPURE; \ + MAPIMETHOD(SubmitMessage) (THIS_ \ + /*in*/ ULONG ulFlags) IPURE; \ + MAPIMETHOD(GetSiteStatus) (THIS_ \ + /*out*/ LPULONG lpulStatus) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPIMessageSite +DECLARE_MAPI_INTERFACE_(IMAPIMessageSite, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_GETLASTERROR_METHOD(PURE) + MAPI_IMAPIMESSAGESITE_METHODS(PURE) +}; + + +/*-- IMAPIForm -------------------------------------------------------------*/ +/* This interface is implemented by forms for the benefit of viewers. + * One method (ShutdownForm) is provided such that simple forms implementing + * only IMAPIForm and IPersistMessage have reasonable embedding behavior. + */ + +#define MAPI_IMAPIFORM_METHODS(IPURE) \ + MAPIMETHOD(SetViewContext) (THIS_ \ + /*in*/ LPMAPIVIEWCONTEXT pViewContext) IPURE; \ + MAPIMETHOD(GetViewContext) (THIS_ \ + /*out*/ LPMAPIVIEWCONTEXT FAR * ppViewContext) IPURE; \ + MAPIMETHOD(ShutdownForm)(THIS_ \ + /*in*/ ULONG ulSaveOptions) IPURE; \ + MAPIMETHOD(DoVerb) (THIS_ \ + /*in*/ LONG iVerb, \ + /*in*/ LPMAPIVIEWCONTEXT lpViewContext, /* can be null */ \ + /*in*/ ULONG_PTR hwndParent, \ + /*in*/ LPCRECT lprcPosRect) IPURE; \ + MAPIMETHOD(Advise)(THIS_ \ + /*in*/ LPMAPIVIEWADVISESINK pAdvise, \ + /*out*/ ULONG_PTR FAR * pdwStatus) IPURE; \ + MAPIMETHOD(Unadvise) (THIS_ \ + /*in*/ ULONG_PTR ulConnection) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPIForm +DECLARE_MAPI_INTERFACE_(IMAPIForm, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_GETLASTERROR_METHOD(PURE) + MAPI_IMAPIFORM_METHODS(PURE) +}; + +typedef enum tagSAVEOPTS +{ + SAVEOPTS_SAVEIFDIRTY = 0, + SAVEOPTS_NOSAVE = 1, + SAVEOPTS_PROMPTSAVE = 2 +} SAVEOPTS; + + +/*-- IMAPIViewContext ------------------------------------------------------*/ +/* Implemented by viewers to support next/previous in forms. + */ + +/* Structure passed in GetPrintSetup */ + +typedef struct { + ULONG ulFlags; /* MAPI_UNICODE */ + HGLOBAL hDevMode; + HGLOBAL hDevNames; + ULONG ulFirstPageNumber; + ULONG fPrintAttachments; +} FORMPRINTSETUP, FAR * LPFORMPRINTSETUP; + +/* Values for pulFormat in GetSaveStream */ + +#define SAVE_FORMAT_TEXT 1 +#define SAVE_FORMAT_RICHTEXT 2 + +/* Values from 0 to 0x3fff are reserved for future definition by Microsoft */ + +#define MAPI_IMAPIVIEWCONTEXT_METHODS(IPURE) \ + MAPIMETHOD(SetAdviseSink)(THIS_ \ + /*in*/ LPMAPIFORMADVISESINK pmvns) IPURE; \ + MAPIMETHOD(ActivateNext)(THIS_ \ + /*in*/ ULONG ulDir, \ + /*in*/ LPCRECT prcPosRect) IPURE; \ + MAPIMETHOD(GetPrintSetup)(THIS_ \ + /*in*/ ULONG ulFlags, \ + /*out*/ LPFORMPRINTSETUP FAR * lppFormPrintSetup) IPURE; \ + MAPIMETHOD(GetSaveStream)(THIS_ \ + /*out*/ ULONG FAR * pulFlags, \ + /*out*/ ULONG FAR * pulFormat, \ + /*out*/ LPSTREAM FAR * ppstm) IPURE; \ + MAPIMETHOD(GetViewStatus) (THIS_ \ + /*out*/ LPULONG lpulStatus) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPIViewContext +DECLARE_MAPI_INTERFACE_(IMAPIViewContext, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_GETLASTERROR_METHOD(PURE) + MAPI_IMAPIVIEWCONTEXT_METHODS(PURE) +}; + +#define VCSTATUS_NEXT 0x00000001 +#define VCSTATUS_PREV 0x00000002 +#define VCSTATUS_MODAL 0x00000004 +#define VCSTATUS_INTERACTIVE 0x00000008 +#define VCSTATUS_READONLY 0x00000010 +#define VCSTATUS_DELETE 0x00010000 +#define VCSTATUS_COPY 0x00020000 +#define VCSTATUS_MOVE 0x00040000 +#define VCSTATUS_SUBMIT 0x00080000 +#define VCSTATUS_DELETE_IS_MOVE 0x00100000 +#define VCSTATUS_SAVE 0x00200000 +#define VCSTATUS_NEW_MESSAGE 0x00400000 + +#define VCDIR_NEXT VCSTATUS_NEXT +#define VCDIR_PREV VCSTATUS_PREV +#define VCDIR_DELETE VCSTATUS_DELETE +#define VCDIR_MOVE VCSTATUS_MOVE + + +/*-- IMAPIFormAdviseSink ---------------------------------------------------*/ +/* Part of form server, held by view; receives notifications from the view. + * + * This part of the form server, but is not an interface on the form + * object. This means that clients should not expect to QueryInterface + * from an IMAPIForm* or IOleObject* to this interface, or vice versa. + */ + +#define MAPI_IMAPIFORMADVISESINK_METHODS(IPURE) \ + STDMETHOD(OnChange)(THIS_ ULONG ulDir) IPURE; \ + STDMETHOD(OnActivateNext)(THIS_ \ + /*in*/ LPCSTR lpszMessageClass, \ + /*in*/ ULONG ulMessageStatus, \ + /*in*/ ULONG ulMessageFlags, \ + /*out*/ LPPERSISTMESSAGE FAR * ppPersistMessage) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPIFormAdviseSink +DECLARE_MAPI_INTERFACE_(IMAPIFormAdviseSink, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIFORMADVISESINK_METHODS(PURE) +}; + + +/*-- IMAPIViewAdviseSink ---------------------------------------------------*/ +/* Part of view context, held by form; receives notifications from the form. + */ + +#define MAPI_IMAPIVIEWADVISESINK_METHODS(IPURE) \ + MAPIMETHOD(OnShutdown)(THIS) IPURE; \ + MAPIMETHOD(OnNewMessage)(THIS) IPURE; \ + MAPIMETHOD(OnPrint)(THIS_ \ + /*in*/ ULONG dwPageNumber, \ + /*in*/ HRESULT hrStatus) IPURE; \ + MAPIMETHOD(OnSubmitted) (THIS) IPURE; \ + MAPIMETHOD(OnSaved) (THIS) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPIViewAdviseSink +DECLARE_MAPI_INTERFACE_(IMAPIViewAdviseSink, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIVIEWADVISESINK_METHODS(PURE) +}; + + +/*-- IMAPIFormInfo ---------------------------------------------------------*/ +/* Is implemented by registries. Describes the form. + */ + +/* Single enum value */ + +typedef struct +{ /* fpev */ + LPTSTR pszDisplayName; /* carries the display string */ + ULONG nVal; /* the value for the above enumeration */ +} SMAPIFormPropEnumVal, FAR * LPMAPIFORMPROPENUMVAL; + +/* MAPI Form property descriptor */ + +/* + * Values for the tag in the SMAPIFormProp structure + * + * Microsoft reserves the range from 0 to 0x3FFF for future use in its other + * forms registry implementations. + */ + +typedef ULONG FORMPROPSPECIALTYPE; + +#define FPST_VANILLA 0 +#define FPST_ENUM_PROP 1 + +typedef struct +{ + ULONG ulFlags; /* Contains MAPI_UNICODE if strings are UNICODE */ + ULONG nPropType; /* type of the property, hiword is 0 */ + MAPINAMEID nmid; /* id of the property */ + LPTSTR pszDisplayName; + FORMPROPSPECIALTYPE nSpecialType; /* tag for the following union */ + union + { + struct + { + MAPINAMEID nmidIdx; + ULONG cfpevAvailable; /* # of enums */ + LPMAPIFORMPROPENUMVAL pfpevAvailable; + } s1; /* Property String/Number association Enumeration */ + } u; +} SMAPIFormProp, FAR * LPMAPIFORMPROP; + +/* Array of form properties */ + +typedef struct +{ + ULONG cProps; + ULONG ulPad; /* Pad to 8-byte alignment for insurance */ + SMAPIFormProp aFormProp[MAPI_DIM]; +} SMAPIFormPropArray, FAR * LPMAPIFORMPROPARRAY; + +#define CbMAPIFormPropArray(_c) \ + (offsetof(SMAPIFormPropArray, aFormProp) + \ + (_c)*sizeof(SMAPIFormProp)) + +/* Structure defining the layout of an mapi verb description */ + +typedef struct +{ + LONG lVerb; + LPTSTR szVerbname; + DWORD fuFlags; + DWORD grfAttribs; + ULONG ulFlags; /* Either 0 or MAPI_UNICODE */ +} SMAPIVerb, FAR * LPMAPIVERB; + +/* Structure used for returning arrays of mapi verbs */ + +typedef struct +{ + ULONG cMAPIVerb; /* Number of verbs in the structure */ + SMAPIVerb aMAPIVerb[MAPI_DIM]; +} SMAPIVerbArray, FAR * LPMAPIVERBARRAY; + +#define CbMAPIVerbArray(_c) \ + (offsetof(SMAPIVerbArray, aMAPIVerb) + \ + (_c)*sizeof(SMAPIVerb)) + +#define MAPI_IMAPIFORMINFO_METHODS(IPURE) \ + MAPIMETHOD(CalcFormPropSet)(THIS_ \ + /*in*/ ULONG ulFlags, \ + /*out*/ LPMAPIFORMPROPARRAY FAR * ppFormPropArray) IPURE; \ + MAPIMETHOD(CalcVerbSet)(THIS_ \ + /*in*/ ULONG ulFlags, \ + /*out*/ LPMAPIVERBARRAY FAR * ppMAPIVerbArray) IPURE; \ + MAPIMETHOD(MakeIconFromBinary)(THIS_ \ + /*in*/ ULONG nPropID, \ + /*out*/ HICON FAR* phicon) IPURE; \ + MAPIMETHOD(SaveForm)(THIS_ \ + /*in*/ LPCTSTR szFileName) IPURE; \ + MAPIMETHOD(OpenFormContainer)(THIS_ \ + /*out*/ LPMAPIFORMCONTAINER FAR * ppformcontainer) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPIFormInfo +DECLARE_MAPI_INTERFACE_(IMAPIFormInfo, IMAPIProp) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIPROP_METHODS(PURE) /* note: subsumes getlasterror */ + MAPI_IMAPIFORMINFO_METHODS(PURE) +}; + + +/* Enumeration of permissible values for PR_FORM_MESSAGE_BEHAVIOR */ + +#define MAPI_MESSAGE_BEHAVIOR_IPM 0 +#define MAPI_MESSAGE_BEHAVIOR_FOLDER 1 + + +/*-- IMAPIFormMgr ----------------------------------------------------------*/ +/* The client-visible interface for form resolution and dispatch. + */ + +/* Structure containing an array of message class strings */ + +typedef struct +{ + ULONG cValues; + LPCSTR aMessageClass[MAPI_DIM]; +} SMessageClassArray, FAR * LPSMESSAGECLASSARRAY; + +#define CbMessageClassArray(_c) \ + (offsetof(SMessageClassArray, aMessageClass) + (_c)*sizeof(LPCSTR)) + +/* Structure containing an array of IMAPIFormInfo interfaces */ + +typedef struct +{ + ULONG cForms; + LPMAPIFORMINFO aFormInfo[MAPI_DIM]; +} SMAPIFormInfoArray, FAR * LPSMAPIFORMINFOARRAY; + +#define CbMAPIFormInfoArray(_c) \ + (offsetof(SMAPIFormInfoArray, aFormInfo) + \ + (_c)*sizeof(LPMAPIFORMINFO)) + +/* Flags for IMAPIFormMgr::SelectFormContainer */ + +#define MAPIFORM_SELECT_ALL_REGISTRIES 0 +#define MAPIFORM_SELECT_FOLDER_REGISTRY_ONLY 1 +#define MAPIFORM_SELECT_NON_FOLDER_REGISTRY_ONLY 2 + +/* Flags for IMAPIFormMgr::CalcFormPropSet */ + +#define FORMPROPSET_UNION 0 +#define FORMPROPSET_INTERSECTION 1 + +/* Flags for IMAPIFormMgr::ResolveMessageClass and + IMAPIFormMgr::ResolveMultipleMessageClasses */ + +#define MAPIFORM_EXACTMATCH 0x0020 + +#define MAPI_IMAPIFORMMGR_METHODS(IPURE) \ + MAPIMETHOD(LoadForm)(THIS_ \ + /*in*/ ULONG_PTR ulUIParam, \ + /*in*/ ULONG ulFlags, \ + /*in*/ LPCSTR lpszMessageClass, \ + /*in*/ ULONG ulMessageStatus, \ + /*in*/ ULONG ulMessageFlags, \ + /*in*/ LPMAPIFOLDER pFolderFocus, \ + /*in*/ LPMAPIMESSAGESITE pMessageSite, \ + /*in*/ LPMESSAGE pmsg, \ + /*in*/ LPMAPIVIEWCONTEXT pViewContext, \ + /*in*/ REFIID riid, \ + /*out*/ LPVOID FAR *ppvObj) IPURE; \ + MAPIMETHOD(ResolveMessageClass)(THIS_ \ + /*in*/ LPCSTR szMsgClass, \ + /*in*/ ULONG ulFlags, \ + /*in*/ LPMAPIFOLDER pFolderFocus, /* can be null */ \ + /*out*/ LPMAPIFORMINFO FAR* ppResult) IPURE; \ + MAPIMETHOD(ResolveMultipleMessageClasses)(THIS_ \ + /*in*/ LPSMESSAGECLASSARRAY pMsgClasses, \ + /*in*/ ULONG ulFlags, \ + /*in*/ LPMAPIFOLDER pFolderFocus, /* can be null */ \ + /*out*/ LPSMAPIFORMINFOARRAY FAR * pfrminfoarray) IPURE; \ + MAPIMETHOD(CalcFormPropSet)(THIS_ \ + /*in*/ LPSMAPIFORMINFOARRAY pfrminfoarray, \ + /*in*/ ULONG ulFlags, \ + /*out*/ LPMAPIFORMPROPARRAY FAR* ppResults) IPURE; \ + MAPIMETHOD(CreateForm)(THIS_ \ + /*in*/ ULONG_PTR ulUIParam, \ + /*in*/ ULONG ulFlags, \ + /*in*/ LPMAPIFORMINFO pfrminfoToActivate, \ + /*in*/ REFIID refiidToAsk, \ + /*out*/ LPVOID FAR* ppvObj) IPURE; \ + MAPIMETHOD(SelectForm)(THIS_ \ + /*in*/ ULONG_PTR ulUIParam, \ + /*in*/ ULONG ulFlags, \ + /*in*/ LPCTSTR pszTitle, \ + /*in*/ LPMAPIFOLDER pfld, \ + /*out*/ LPMAPIFORMINFO FAR * ppfrminfoReturned) IPURE; \ + MAPIMETHOD(SelectMultipleForms)(THIS_ \ + /*in*/ ULONG_PTR ulUIParam, \ + /*in*/ ULONG ulFlags, \ + /*in*/ LPCTSTR pszTitle, \ + /*in*/ LPMAPIFOLDER pfld, \ + /*in*/ LPSMAPIFORMINFOARRAY pfrminfoarray, \ + /*out*/ LPSMAPIFORMINFOARRAY FAR * ppfrminfoarray) IPURE; \ + MAPIMETHOD(SelectFormContainer)(THIS_ \ + /*in*/ ULONG_PTR ulUIParam, \ + /*in*/ ULONG ulFlags, \ + /*out*/ LPMAPIFORMCONTAINER FAR * lppfcnt) IPURE; \ + MAPIMETHOD(OpenFormContainer)(THIS_ \ + /*in*/ HFRMREG hfrmreg, \ + /*in*/ LPUNKNOWN lpunk, \ + /*out*/ LPMAPIFORMCONTAINER FAR * lppfcnt) IPURE; \ + MAPIMETHOD(PrepareForm)(THIS_ \ + /*in*/ ULONG_PTR ulUIParam, \ + /*in*/ ULONG ulFlags, \ + /*in*/ LPMAPIFORMINFO pfrminfo) IPURE; \ + MAPIMETHOD(IsInConflict)(THIS_ \ + /*in*/ ULONG ulMessageFlags, \ + /*in*/ ULONG ulMessageStatus, \ + /*in*/ LPCSTR szMessageClass, \ + /*in*/ LPMAPIFOLDER pFolderFocus) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPIFormMgr +DECLARE_MAPI_INTERFACE_(IMAPIFormMgr, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_GETLASTERROR_METHOD(PURE) + MAPI_IMAPIFORMMGR_METHODS(PURE) +}; + +/* Platform numbers (used in .CFG files for forms) */ + +#define MAPIFORM_CPU_X86 1 +#define MAPIFORM_CPU_MIP 2 +#define MAPIFORM_CPU_AXP 3 +#define MAPIFORM_CPU_PPC 4 +#define MAPIFORM_CPU_M68 5 +#define MAPIFORM_CPU_X64 6 + +#define MAPIFORM_OS_WIN_31 1 +#define MAPIFORM_OS_WINNT_35 2 +#define MAPIFORM_OS_WIN_95 3 +#define MAPIFORM_OS_MAC_7x 4 +#define MAPIFORM_OS_WINNT_40 5 +#define MAPIFORM_OS_WINNT_50 6 +#define MAPIFORM_OS_WINNT_60 7 + +#define MAPIFORM_PLATFORM(CPU, OS) ((ULONG) ((((ULONG) CPU) << 16) | OS)) + + +/*-- IMAPIFormContainer -------------------------------------------------*/ + +/* Flags for IMAPIFormMgr::CalcFormPropSet */ + +/* #define FORMPROPSET_UNION 0 */ +/* #define FORMPROPSET_INTERSECTION 1 */ + +/* Flags for IMAPIFormMgr::InstallForm */ + +#define MAPIFORM_INSTALL_DIALOG MAPI_DIALOG +#define MAPIFORM_INSTALL_OVERWRITEONCONFLICT 0x0010 + +/* Flags for IMAPIFormContainer::ResolveMessageClass and + IMAPIFormContainer::ResolveMultipleMessageClasses */ +/* #define MAPIFORM_EXACTIMATCH 0x0020 */ + +#define MAPI_IMAPIFORMCONTAINER_METHODS(IPURE) \ + MAPIMETHOD(InstallForm)(THIS_ \ + /*in*/ ULONG_PTR ulUIParam, \ + /*in*/ ULONG ulFlags, \ + /*in*/ LPCTSTR szCfgPathName) IPURE; \ + MAPIMETHOD(RemoveForm)(THIS_ \ + /*in*/ LPCSTR szMessageClass) IPURE; \ + MAPIMETHOD(ResolveMessageClass) (THIS_ \ + /*in*/ LPCSTR szMessageClass, \ + /*in*/ ULONG ulFlags, \ + /*out*/ LPMAPIFORMINFO FAR * pforminfo) IPURE; \ + MAPIMETHOD(ResolveMultipleMessageClasses) (THIS_ \ + /*in*/ LPSMESSAGECLASSARRAY pMsgClassArray, \ + /*in*/ ULONG ulFlags, \ + /*out*/ LPSMAPIFORMINFOARRAY FAR * ppfrminfoarray) IPURE; \ + MAPIMETHOD(CalcFormPropSet)(THIS_ \ + /*in*/ ULONG ulFlags, \ + /*out*/ LPMAPIFORMPROPARRAY FAR * ppResults) IPURE; \ + MAPIMETHOD(GetDisplay)(THIS_ \ + /*in*/ ULONG ulFlags, \ + /*out*/ LPTSTR FAR * pszDisplayName) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPIFormContainer +DECLARE_MAPI_INTERFACE_(IMAPIFormContainer, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_GETLASTERROR_METHOD(PURE) + MAPI_IMAPIFORMCONTAINER_METHODS(PURE) +}; + +/*-- IMAPIFormFactory ------------------------------------------------------*/ + +#define MAPI_IMAPIFORMFACTORY_METHODS(IPURE) \ + MAPIMETHOD(CreateClassFactory) (THIS_ \ + /*in*/ REFCLSID clsidForm, \ + /*in*/ ULONG ulFlags, \ + /*out*/ LPCLASSFACTORY FAR * lppClassFactory) IPURE; \ + MAPIMETHOD(LockServer) (THIS_ \ + /*in*/ ULONG ulFlags, \ + /*in*/ ULONG fLockServer) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPIFormFactory +DECLARE_MAPI_INTERFACE_(IMAPIFormFactory, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_GETLASTERROR_METHOD(PURE) + MAPI_IMAPIFORMFACTORY_METHODS(PURE) +}; + +#endif /* MAPIFORM_H */ diff --git a/comm/mailnews/mapi/include/mapiguid.h b/comm/mailnews/mapi/include/mapiguid.h new file mode 100644 index 0000000000..f7b9dc71fb --- /dev/null +++ b/comm/mailnews/mapi/include/mapiguid.h @@ -0,0 +1,353 @@ +/* + * M A P I G U I D . H + * + * Master definitions of all GUID's for MAPI. + * + * When included without INITGUID defined, this header file + * defines symbols that reference IIDs elsewhere. + * + * When included with INITGUID defined and a "USES_IID_I..." + * statement for each IID used by the subsystem, it generates the + * bytes for those actual IIDs into the associated object file. + * + * This range of 256 GUIDs reserved by OLE for MAPI use October 5, 1992. + * + * Copyright (c) 2009 Microsoft Corporation. All Rights Reserved. + */ + +/* + * List of GUIDS allocated by MAPI + * + * 0x00020300 IID_IMAPISession + * 0x00020301 IID_IMAPITable + * 0x00020302 IID_IMAPIAdviseSink + * 0x00020303 IID_IMAPIProp + * 0x00020304 IID_IProfSect + * 0x00020305 IID_IMAPIStatus + * 0x00020306 IID_IMsgStore + * 0x00020307 IID_IMessage + * 0x00020308 IID_IAttachment + * 0x00020309 IID_IAddrBook + * 0x0002030A IID_IMailUser + * 0x0002030B IID_IMAPIContainer + * 0x0002030C IID_IMAPIFolder + * 0x0002030D IID_IABContainer + * 0x0002030E IID_IDistList + * 0x0002030F IID_IMAPISup + * 0x00020310 IID_IMSProvider + * 0x00020311 IID_IABProvider + * 0x00020312 IID_IXPProvider + * 0x00020313 IID_IMSLogon + * 0x00020314 IID_IABLogon + * 0x00020315 IID_IXPLogon + * 0x00020316 IID_IMAPITableData + * 0x00020317 IID_IMAPISpoolerInit + * 0x00020318 IID_IMAPISpoolerSession + * 0x00020319 IID_ITNEF + * 0x0002031A IID_IMAPIPropData + * 0x0002031B IID_IMAPIControl + * 0x0002031C IID_IProfAdmin + * 0x0002031D IID_IMsgServiceAdmin + * 0x0002031E IID_IMAPISpoolerService + * 0x0002031F IID_IMAPIProgress + * 0x00020320 IID_ISpoolerHook + * 0x00020321 IID_IMAPIViewContext + * 0x00020322 IID_IMAPIFormMgr + * 0x00020323 IID_IEnumMAPIFormProp + * 0x00020324 IID_IMAPIFormInfo + * 0x00020325 IID_IProviderAdmin + * 0x00020327 IID_IMAPIForm + * 0x00020328 PS_MAPI + * 0x00020329 PS_PUBLIC_STRINGS + * 0x0002032A IID_IPersistMessage + * 0x0002032B IID_IMAPIViewAdviseSink + * 0x0002032C IID_IStreamDocfile + * 0x0002032D IID_IMAPIFormProp + * 0x0002032E IID_IMAPIFormContainer + * 0x0002032F IID_IMAPIFormAdviseSink + * 0x00020330 IID_IStreamTnef + * 0x00020350 IID_IMAPIFormFactory + * 0x00020370 IID_IMAPIMessageSite + * 0x00020380 PS_ROUTING_EMAIL_ADDRESSES + * 0x00020381 PS_ROUTING_ADDRTYPE + * 0x00020382 PS_ROUTING_DISPLAY_NAME + * 0x00020383 PS_ROUTING_ENTRYID + * 0x00020384 PS_ROUTING_SEARCH_KEY + * 0x00020385 MUID_PROFILE_INSTANCE + * 0x00020397 IID_IMAPIClientShutdown + * 0x00020398 IID_IMAPIProviderShutdown + * + * The remaining GUIDs from 0x00020300 to 0x000203FF are reserved by + * MAPI for future use. The current maximum used by MAPI is 0x00020398 + * + */ + +#ifndef MAPIGUID_H +#ifdef INITGUID +#define MAPIGUID_H +#if _MSC_VER > 1000 +#pragma once +#endif +#endif + +/* Derive from IUnknown */ +#if !defined(INITGUID) || defined(USES_IID_IMAPISession) +DEFINE_OLEGUID(IID_IMAPISession, 0x00020300, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IMAPITable) +DEFINE_OLEGUID(IID_IMAPITable, 0x00020301, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IMAPIAdviseSink) +DEFINE_OLEGUID(IID_IMAPIAdviseSink, 0x00020302, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IMAPIControl) +DEFINE_OLEGUID(IID_IMAPIControl, 0x0002031B, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IProfAdmin) +DEFINE_OLEGUID(IID_IProfAdmin, 0x0002031C, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IMsgServiceAdmin) +DEFINE_OLEGUID(IID_IMsgServiceAdmin,0x0002031D, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IProviderAdmin) +DEFINE_OLEGUID(IID_IProviderAdmin, 0x00020325, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IMAPIProgress) +DEFINE_OLEGUID(IID_IMAPIProgress, 0x0002031F, 0, 0); +#endif + +/* MAPIProp or derive from MAPIProp */ +#if !defined(INITGUID) || defined(USES_IID_IMAPIProp) +DEFINE_OLEGUID(IID_IMAPIProp, 0x00020303, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IProfSect) +DEFINE_OLEGUID(IID_IProfSect, 0x00020304, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IMAPIStatus) +DEFINE_OLEGUID(IID_IMAPIStatus, 0x00020305, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IMsgStore) +DEFINE_OLEGUID(IID_IMsgStore, 0x00020306, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IMessage) +DEFINE_OLEGUID(IID_IMessage, 0x00020307, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IAttachment) +DEFINE_OLEGUID(IID_IAttachment, 0x00020308, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IAddrBook) +DEFINE_OLEGUID(IID_IAddrBook, 0x00020309, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IMailUser) +DEFINE_OLEGUID(IID_IMailUser, 0x0002030A, 0, 0); +#endif + +/* MAPIContainer or derive from MAPIContainer */ +#if !defined(INITGUID) || defined(USES_IID_IMAPIContainer) +DEFINE_OLEGUID(IID_IMAPIContainer, 0x0002030B, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IMAPIFolder) +DEFINE_OLEGUID(IID_IMAPIFolder, 0x0002030C, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IABContainer) +DEFINE_OLEGUID(IID_IABContainer, 0x0002030D, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IDistList) +DEFINE_OLEGUID(IID_IDistList, 0x0002030E, 0, 0); +#endif + +/* MAPI Support Object */ +#if !defined(INITGUID) || defined(USES_IID_IMAPISup) +DEFINE_OLEGUID(IID_IMAPISup, 0x0002030F, 0, 0); +#endif + +/* Provider INIT objects */ +#if !defined(INITGUID) || defined(USES_IID_IMSProvider) +DEFINE_OLEGUID(IID_IMSProvider, 0x00020310, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IABProvider) +DEFINE_OLEGUID(IID_IABProvider, 0x00020311, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IXPProvider) +DEFINE_OLEGUID(IID_IXPProvider, 0x00020312, 0, 0); +#endif + +/* Provider LOGON Objects */ +#if !defined(INITGUID) || defined(USES_IID_IMSLogon) +DEFINE_OLEGUID(IID_IMSLogon, 0x00020313, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IABLogon) +DEFINE_OLEGUID(IID_IABLogon, 0x00020314, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IXPLogon) +DEFINE_OLEGUID(IID_IXPLogon, 0x00020315, 0, 0); +#endif + +/* IMAPITable-in-memory Table Data Object */ +#if !defined(INITGUID) || defined(USES_IID_IMAPITableData) +DEFINE_OLEGUID(IID_IMAPITableData, 0x00020316, 0, 0); +#endif + +/* MAPI Spooler Init Object (internal) */ +#if !defined(INITGUID) || defined(USES_IID_IMAPISpoolerInit) +DEFINE_OLEGUID(IID_IMAPISpoolerInit, 0x00020317, 0, 0); +#endif + +/* MAPI Spooler Session Object (internal) */ +#if !defined(INITGUID) || defined(USES_IID_IMAPISpoolerSession) +DEFINE_OLEGUID(IID_IMAPISpoolerSession, 0x00020318, 0, 0); +#endif + +/* MAPI TNEF Object Interface */ +#if !defined(INITGUID) || defined(USES_IID_ITNEF) +DEFINE_OLEGUID(IID_ITNEF, 0x00020319, 0, 0); +#endif + +/* IMAPIProp-in-memory Property Data Object */ +#if !defined(INITGUID) || defined(USES_IID_IMAPIPropData) +DEFINE_OLEGUID(IID_IMAPIPropData, 0x0002031A, 0, 0); +#endif + +/* MAPI Spooler Hook Object */ +#if !defined(INITGUID) || defined(USES_IID_ISpoolerHook) +DEFINE_OLEGUID(IID_ISpoolerHook, 0x00020320, 0, 0); +#endif + +/* MAPI Spooler Service Object */ +#if !defined(INITGUID) || defined(USES_IID_IMAPISpoolerService) +DEFINE_OLEGUID(IID_IMAPISpoolerService, 0x0002031E, 0, 0); +#endif + +/* MAPI forms, form manager, etc. */ +#if !defined(INITGUID) || defined(USES_IID_IMAPIViewContext) +DEFINE_OLEGUID(IID_IMAPIViewContext, 0x00020321, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IMAPIFormMgr) +DEFINE_OLEGUID(IID_IMAPIFormMgr, 0x00020322, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IEnumMAPIFormProp) +DEFINE_OLEGUID(IID_IEnumMAPIFormProp, 0x00020323, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IMAPIFormInfo) +DEFINE_OLEGUID(IID_IMAPIFormInfo, 0x00020324, 0, 0); +#endif +#if !defined(INITGUID) || defined(USES_IID_IMAPIForm) +DEFINE_OLEGUID(IID_IMAPIForm, 0x00020327, 0, 0); +#endif + + +/* Well known guids for name<->id mappings */ + +/* The name of MAPI's property set */ +#if !defined(INITGUID) || defined(USES_PS_MAPI) +DEFINE_OLEGUID(PS_MAPI, 0x00020328, 0, 0); +#endif + +/* The name of the set of public strings */ +#if !defined(INITGUID) || defined(USES_PS_PUBLIC_STRINGS) +DEFINE_OLEGUID(PS_PUBLIC_STRINGS, 0x00020329, 0, 0); +#endif + + + + +/* MAPI forms, form manager, (cont) */ +#if !defined(INITGUID) || defined(USES_IID_IPersistMessage) +DEFINE_OLEGUID(IID_IPersistMessage, 0x0002032A, 0, 0); +#endif + +/* IMAPIViewAdviseSink */ +#if !defined(INITGUID) || defined(USES_IID_IMAPIViewAdviseSink) +DEFINE_OLEGUID(IID_IMAPIViewAdviseSink, 0x0002032B, 0, 0); +#endif + +/* Message Store OpenProperty */ +#if !defined(INITGUID) || defined(USES_IID_IStreamDocfile) +DEFINE_OLEGUID(IID_IStreamDocfile, 0x0002032C, 0, 0); +#endif + +/* IMAPIFormProp */ +#if !defined(INITGUID) || defined(USES_IID_IMAPIFormProp) +DEFINE_OLEGUID(IID_IMAPIFormProp, 0x0002032D, 0, 0); +#endif + +/* IMAPIFormContainer */ +#if !defined(INITGUID) || defined(USES_IID_IMAPIFormContainer) +DEFINE_OLEGUID(IID_IMAPIFormContainer, 0x0002032E, 0, 0); +#endif + +/* IMAPIFormAdviseSink */ +#if !defined(INITGUID) || defined(USES_IID_IMAPIFormAdviseSink) +DEFINE_OLEGUID(IID_IMAPIFormAdviseSink, 0x0002032F, 0, 0); +#endif + +/* TNEF OpenProperty */ +#if !defined(INITGUID) || defined(USES_IID_IStreamTnef) +DEFINE_OLEGUID(IID_IStreamTnef, 0x00020330, 0, 0); +#endif + +/* IMAPIFormFactory */ +#if !defined(INITGUID) || defined(USES_IID_IMAPIFormFactory) +DEFINE_OLEGUID(IID_IMAPIFormFactory, 0x00020350, 0, 0); +#endif + +/* IMAPIMessageSite */ +#if !defined(INITGUID) || defined(USES_IID_IMAPIMessageSite) +DEFINE_OLEGUID(IID_IMAPIMessageSite, 0x00020370, 0, 0); +#endif + + + +/* Well known guids routing property sets. + Useful when writing applications that route documents + (i.e. Workflow) across gateways. Gateways that speak MAPI + should convert the properties found in the follow property + sets appropriately. */ + +/* PS_ROUTING_EMAIL_ADDRESSES: Addresses that need converting at gateways, etc. */ +#if !defined(INITGUID) || defined(USES_PS_ROUTING_EMAIL_ADDRESSES) +DEFINE_OLEGUID(PS_ROUTING_EMAIL_ADDRESSES, 0x00020380, 0, 0); +#endif + +/* PS_ROUTING_ADDRTYPE: Address types that need converting at gateways, etc. */ +#if !defined(INITGUID) || defined(USES_PS_ROUTING_ADDRTYPE) +DEFINE_OLEGUID(PS_ROUTING_ADDRTYPE, 0x00020381, 0, 0); +#endif + +/* PS_ROUTING_DISPLAY_NAME: Display Name that corresponds to the other props */ +#if !defined(INITGUID) || defined(USES_PS_ROUTING_DISPLAY_NAME) +DEFINE_OLEGUID(PS_ROUTING_DISPLAY_NAME, 0x00020382, 0, 0); +#endif + +/* PS_ROUTING_ENTRYID: (optional) EntryIDs that need converting at gateways, etc. */ +#if !defined(INITGUID) || defined(USES_PS_ROUTING_ENTRYID) +DEFINE_OLEGUID(PS_ROUTING_ENTRYID, 0x00020383, 0, 0); +#endif + +/* PS_ROUTING_SEARCH_KEY: (optional) search keys that need converting at gateways, etc. */ +#if !defined(INITGUID) || defined(USES_PS_ROUTING_SEARCH_KEY) +DEFINE_OLEGUID(PS_ROUTING_SEARCH_KEY, 0x00020384, 0, 0); +#endif + +/* MUID_PROFILE_INSTANCE + Well known section in a profile which contains a property (PR_SEARCH_KEY) which is unique + for any given profile. Applications and providers can depend on this value as being + different for each unique profile. */ +#if !defined(INITGUID) || defined(USES_MUID_PROFILE_INSTANCE) +DEFINE_OLEGUID(MUID_PROFILE_INSTANCE, 0x00020385, 0, 0); +#endif + + +/* Interface GUIDs for Fast Shutdown support */ + +/* IMAPIClientShutdown */ +#if !defined(INITGUID) || defined(USES_IID_IMAPIClientShutdown) +DEFINE_OLEGUID(IID_IMAPIClientShutdown, 0x00020397, 0, 0); +#endif + +/* IMAPIProviderShutdown */ +#if !defined(INITGUID) || defined(USES_IID_IMAPIProviderShutdown) +DEFINE_OLEGUID(IID_IMAPIProviderShutdown, 0x00020398, 0, 0); +#endif + +#endif /* MAPIGUID_H */ diff --git a/comm/mailnews/mapi/include/mapihook.h b/comm/mailnews/mapi/include/mapihook.h new file mode 100644 index 0000000000..a547dcfaad --- /dev/null +++ b/comm/mailnews/mapi/include/mapihook.h @@ -0,0 +1,83 @@ +/* + * M A P I H O O K . H + * + * Defines the SpoolerMsgHook provider interface. + * + * Copyright (c) 2009 Microsoft Corporation. All Rights Reserved. + */ + +#ifndef MAPIHOOK_H +#define MAPIHOOK_H + +#ifndef MAPIDEFS_H +#include <mapidefs.h> +#include <mapicode.h> +#include <mapiguid.h> +#include <mapitags.h> +#endif + +#ifndef BEGIN_INTERFACE +#define BEGIN_INTERFACE +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* ISpoolerHook Interface ------------------------------------------------ */ + +/* MsgHooks */ + +#define HOOK_DELETE ((ULONG) 0x00000001) +#define HOOK_CANCEL ((ULONG) 0x00000002) + +#define MAPI_ISPOOLERHOOK_METHODS(IPURE) \ + MAPIMETHOD(InboundMsgHook) \ + (THIS_ LPMESSAGE lpMessage, \ + LPMAPIFOLDER lpFolder, \ + LPMDB lpMDB, \ + ULONG FAR * lpulFlags, \ + ULONG FAR * lpcbEntryID, \ + LPBYTE FAR * lppEntryID) IPURE; \ + MAPIMETHOD(OutboundMsgHook) \ + (THIS_ LPMESSAGE lpMessage, \ + LPMAPIFOLDER lpFolder, \ + LPMDB lpMDB, \ + ULONG FAR * lpulFlags, \ + ULONG FAR * lpcbEntryID, \ + LPBYTE FAR * lppEntryID) IPURE; \ + +#undef INTERFACE +#define INTERFACE ISpoolerHook +DECLARE_MAPI_INTERFACE_(ISpoolerHook, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_ISPOOLERHOOK_METHODS(PURE) +}; + +DECLARE_MAPI_INTERFACE_PTR(ISpoolerHook, LPSPOOLERHOOK); + +/* Hook Provider Entry Point */ + +#define HOOK_INBOUND ((ULONG) 0x00000200) +#define HOOK_OUTBOUND ((ULONG) 0x00000400) + +typedef HRESULT (STDMAPIINITCALLTYPE HPPROVIDERINIT)( + LPMAPISESSION lpSession, + HINSTANCE hInstance, + LPALLOCATEBUFFER lpAllocateBuffer, + LPALLOCATEMORE lpAllocateMore, + LPFREEBUFFER lpFreeBuffer, + LPMAPIUID lpSectionUID, + ULONG ulFlags, + LPSPOOLERHOOK FAR * lppSpoolerHook +); + +HPPROVIDERINIT HPProviderInit; + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* MAPIHOOK_H */ diff --git a/comm/mailnews/mapi/include/mapinls.h b/comm/mailnews/mapi/include/mapinls.h new file mode 100644 index 0000000000..cc04096a52 --- /dev/null +++ b/comm/mailnews/mapi/include/mapinls.h @@ -0,0 +1,196 @@ +/* + * M A P I N L S . H + * + * Internationalization Support Utilities + * + * Copyright (c) 2009 Microsoft Corporation. All Rights Reserved. + */ + +#ifndef _MAPINLS_H_ +#define _MAPINLS_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#if defined (WIN64) && !defined (_WIN64) +#define _WIN64 +#endif + +#if defined (WIN32) && !defined (_WIN32) +#define _WIN32 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* We don't want to include windows.h in case that conflicts with an */ +/* earlier inclusion of compobj.h */ + +#if !defined(WINAPI) + #if defined(_WIN64) && (_MSC_VER >= 800) + #define WINAPI + #elif defined(_WIN32) && (_MSC_VER >= 800) + #define WINAPI __stdcall + #else + #error "Unknown Platform: MAPI is currently supported on Win32 and Win64" + #endif +#endif + +#if defined(DOS) || defined(_MAC) +#include <string.h> +#endif + +#ifndef FAR +#define FAR +#endif + +typedef unsigned char BYTE; +typedef unsigned short WORD; +typedef unsigned long DWORD; +typedef unsigned int UINT; +typedef int BOOL; + +#ifndef __CHAR_DEFINED__ +typedef char CHAR; +#endif + +#ifdef UNICODE +typedef WCHAR TCHAR; +#else +typedef char TCHAR; +#endif + +#if !defined(_NATIVE_WCHAR_T_DEFINED) +typedef unsigned short WCHAR; +#endif + +typedef WCHAR FAR * LPWSTR; +typedef const WCHAR FAR * LPCWSTR; +typedef CHAR FAR * LPSTR; +typedef const CHAR FAR * LPCSTR; +typedef TCHAR FAR * LPTSTR; +typedef const TCHAR FAR * LPCTSTR; +typedef DWORD LCID; +typedef const void FAR * LPCVOID; + +#ifndef _MAC +#ifndef LPOLESTR +#if defined(_WIN64) || defined(_WIN32) +#define LPOLESTR LPWSTR +#define LPCOLESTR LPCWSTR +#define OLECHAR WCHAR +#define OLESTR(str) L##str +#else +#error "Unknown Platform: MAPI is currently supported on Win32 and Win64" +#endif /* _WIN64 || _WIN32*/ +#endif /* LPOLESTR */ +#endif /* _MAC */ + +#define NORM_IGNORECASE 0x00000001 /* ignore case */ +#define NORM_IGNORENONSPACE 0x00000002 /* ignore diacritics */ +#define NORM_IGNORESYMBOLS 0x00000004 /* ignore symbols */ + +#if defined(_WIN64) || defined (_WIN32) /* from winnls.h */ +#define NORM_IGNOREKANATYPE 0x00010000 /* ignore kanatype */ +#define NORM_IGNOREWIDTH 0x00020000 /* ignore width */ +#else +#error "Unknown Platform: MAPI is currently supported on Win32 and Win64" +#endif + +#if defined(DOS) || defined(_MAC) + +#define IsBadReadPtr(lp, cb) (FALSE) +#define IsBadWritePtr(lp, cb) (FALSE) +#define IsBadHugeReadPtr(lp, cb) (FALSE) +#define IsBadHugeWritePtr(lp, cb) (FALSE) +#define IsBadCodePtr(lpfn) (FALSE) +#ifdef _MAC +#undef IsBadStringPtr +#endif +#define IsBadStringPtr(lpsz, cchMax) (FALSE) +#define IsBadStringPtrA(lpsz, cchMax) (FALSE) + +#if defined(DOS) + +#define lstrcpyA strcpy +#define lstrlenA strlen +#define lstrcmpA strcmp +#define lstrcmp strcmp +#define lstrcmpi strcmpi +#define lstrcpy strcpy +#define lstrcat strcat +#define lstrlen strlen +#define wsprintf sprintf + +#endif +#endif + +#if defined(DOS) || defined(WIN16) +/* Simulate effect of afx header */ +#define __T(x) x +#define _T(x) __T(x) +#define TEXT _T +#endif + +#define CP_ACP 0 /* default to ANSI code page */ +#define CP_OEMCP 1 /* default to OEM code page */ + +LCID WINAPI MNLS_GetUserDefaultLCID(void); +UINT WINAPI MNLS_GetACP(void); +int WINAPI MNLS_CompareStringA(LCID Locale, DWORD dwCmpFlags, + LPCSTR lpString1, int cchCount1, LPCSTR lpString2, + int cchCount2); +int WINAPI MNLS_CompareStringW(LCID Locale, DWORD dwCmpFlags, + LPCWSTR lpString1, int cchCount1, LPCWSTR lpString2, + int cchCount2); +int WINAPI MNLS_MultiByteToWideChar(UINT uCodePage, DWORD dwFlags, + LPCSTR lpMultiByteStr, int cchMultiByte, + LPWSTR lpWideCharStr, int cchWideChar); +int WINAPI MNLS_WideCharToMultiByte(UINT uCodePage, DWORD dwFlags, + LPCWSTR lpWideCharStr, int cchWideChar, + LPSTR lpMultiByteStr, int cchMultiByte, + LPCSTR lpDefaultChar, BOOL FAR *lpfUsedDefaultChar); +int WINAPI MNLS_lstrlenW(LPCWSTR lpString); +int WINAPI MNLS_lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2); +LPWSTR WINAPI MNLS_lstrcpyW(LPWSTR lpString1, LPCWSTR lpString2); +BOOL WINAPI MNLS_IsBadStringPtrW(LPCWSTR lpsz, UINT ucchMax); + +#if (defined (_WIN64) || defined(_WIN32)) && !defined(_WINNT) && !defined(_WIN95) && !defined(_MAC) +#define _WINNT +#endif + +#if !defined(_WINNT) && !defined(_WIN95) +#define GetUserDefaultLCID MNLS_GetUserDefaultLCID +#define GetACP MNLS_GetACP +#define MultiByteToWideChar MNLS_MultiByteToWideChar +#define WideCharToMultiByte MNLS_WideCharToMultiByte +#define CompareStringA MNLS_CompareStringA +#endif + +#if !defined(MAPI_NOWIDECHAR) + +#define lstrlenW MNLS_lstrlenW +#define lstrcmpW MNLS_lstrcmpW +#define lstrcpyW MNLS_lstrcpyW +#define CompareStringW MNLS_CompareStringW + +#if defined(_WINNT) || defined(_WIN95) +#define IsBadStringPtrW MNLS_IsBadStringPtrW +#elif defined(_MAC) +#define IsBadStringPtrW(lpsz, cchMax) (FALSE) +#else +#error "Unknown Platform: MAPI is currently supported on Win32 and Win64" +#define IsBadStringPtrW (FALSE) +#endif + +#endif /* ! MAPI_NOWIDECHAR */ + +#ifdef __cplusplus +} +#endif + +#endif /* _MAPINLS_H_ */ + + diff --git a/comm/mailnews/mapi/include/mapioid.h b/comm/mailnews/mapi/include/mapioid.h new file mode 100644 index 0000000000..8d0536aa75 --- /dev/null +++ b/comm/mailnews/mapi/include/mapioid.h @@ -0,0 +1,106 @@ +/* + * M A P I O I D . H + * + * MAPI OID definition header file + * + * Copyright (c) 2009 Microsoft Corporation. All Rights Reserved. + */ + +#ifndef _MAPIOID_ +#define _MAPIOID_ + +/* + * MAPI 1.0 Object Identifiers (OID's) + * + * All MAPI 1.0 OIDs are prefixed by the segment + * + * {iso(1) ansi(2) usa(840) microsoft(113556) mapi(3)} + * + * All MAPI 1.0 tags are also include the addistion segment + * + * {tags(10)} + * + * All MAPI 1.0 encodings are also include the addistion segment + * + * {encodeings(11)} + * + * The set of defined tags are as follows + * + * {{mapiprefix} {tags} {tnef(1)}} MAPI 1.0 TNEF encapsulation tag + * + * {{mapiprefix} {tags} {ole(3)}} MAPI 1.0 OLE prefix + * {{mapiprefix} {tags} {ole(3)} {v1(1)}} MAPI 1.0 OLE 1.0 prefix + * {{mapiprefix} {tags} {ole(3)} {v1(1)} {storage(1)}} MAPI 1.0 OLE 1.0 OLESTREAM + * {{mapiprefix} {tags} {ole(3)} {v2(2)}} MAPI 1.0 OLE 2.0 prefix + * {{mapiprefix} {tags} {ole(3)} {v2(2)} {storage(1)}} MAPI 1.0 OLE 2.0 IStorage + * + * The set of defined encodings are as follows + * + * {{mapiprefix} {encodings} {MacBinary(1)}} MAPI 1.0 MacBinary + */ + +#define OID_TAG 0x0A +#define OID_ENCODING 0x0B + +#define DEFINE_OID_1(name, b0, b1) \ + EXTERN_C const BYTE name[] + +#define DEFINE_OID_2(name, b0, b1, b2) \ + EXTERN_C const BYTE name[] + +#define DEFINE_OID_3(name, b0, b1, b2, b3) \ + EXTERN_C const BYTE name[] + +#define DEFINE_OID_4(name, b0, b1, b2, b3, b4) \ + EXTERN_C const BYTE name[] + +#define CB_OID_1 9 +#define CB_OID_2 10 +#define CB_OID_3 11 +#define CB_OID_4 12 + +#ifdef INITOID +#include <initoid.h> +#endif + +#ifdef USES_OID_TNEF +DEFINE_OID_1(OID_TNEF, OID_TAG, 0x01); +#define CB_OID_TNEF CB_OID_1 +#endif + +#ifdef USES_OID_OLE +DEFINE_OID_1(OID_OLE, OID_TAG, 0x03); +#define CB_OID_OLE CB_OID_1 +#endif + +#ifdef USES_OID_OLE1 +DEFINE_OID_2(OID_OLE1, OID_TAG, 0x03, 0x01); +#define CB_OID_OLE1 CB_OID_2 +#endif + +#ifdef USES_OID_OLE1_STORAGE +DEFINE_OID_3(OID_OLE1_STORAGE, OID_TAG, 0x03, 0x01, 0x01); +#define CB_OID_OLE1_STORAGE CB_OID_3 +#endif + +#ifdef USES_OID_OLE2 +DEFINE_OID_2(OID_OLE2, OID_TAG, 0x03, 0x02); +#define CB_OID_OLE2 CB_OID_2 +#endif + +#ifdef USES_OID_OLE2_STORAGE +DEFINE_OID_3(OID_OLE2_STORAGE, OID_TAG, 0x03, 0x02, 0x01); +#define CB_OID_OLE2_STORAGE CB_OID_3 +#endif + +#ifdef USES_OID_MAC_BINARY +DEFINE_OID_1(OID_MAC_BINARY, OID_ENCODING, 0x01); +#define CB_OID_MAC_BINARY CB_OID_1 +#endif + +#ifdef USES_OID_MIMETAG +DEFINE_OID_1(OID_MIMETAG, OID_TAG, 0x04); +#define CB_OID_MIMETAG CB_OID_1 +#endif + +#endif diff --git a/comm/mailnews/mapi/include/mapispi.h b/comm/mailnews/mapi/include/mapispi.h new file mode 100644 index 0000000000..cc326b840a --- /dev/null +++ b/comm/mailnews/mapi/include/mapispi.h @@ -0,0 +1,929 @@ +/* + * M A P I S P I . H + * + * Defines the calls and structures exchanged between MAPI or the spooler + * and the MAPI service providers + * + * Copyright (c) 2009 Microsoft Corporation. All Rights Reserved. + */ + +#ifndef MAPISPI_H +#define MAPISPI_H +#if _MSC_VER > 1000 +#pragma once +#endif + +/* Include common MAPI header files if they haven't been already. */ +#ifndef MAPIDEFS_H +#include <mapidefs.h> +#endif +#ifndef MAPICODE_H +#include <mapicode.h> +#endif +#ifndef MAPIGUID_H +#include <mapiguid.h> +#endif +#ifndef MAPITAGS_H +#include <mapitags.h> +#endif + + +#ifndef BEGIN_INTERFACE +#define BEGIN_INTERFACE +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* The MAPI SPI has a version number. MAPIX.DLL knows and supports + * one or more versions of the SPI. Each provider supports one or + * more versions of the SPI. Checks are performed in both MAPIX.DLL + * and in the provider to ensure that they agree to use exactly one + * version of the MAPI SPI. + * + * The SPI version number is composed of a major (8-bit) version, + * minor (8-bit) version, and micro (16-bit) version. The first + * retail ship of MAPI 1.0 is expected to be version 1.0.0. + * The major version number changes rarely. + * The minor version number changes opon each retail ship of + * MAPI if the SPI has been modified. + * The micro version number changes internally at Microsoft + * during development of MAPI. + * + * The version of the SPI documented by this set of header files + * is ALWAYS known as "CURRENT_SPI_VERSION". If you write a + * service provider, and get a new set of header files, and update + * your code to the new interface, you'll be at the "current" version. + */ +#define CURRENT_SPI_VERSION 0x00010010L + +/* Here are some well-known SPI version numbers: + * (These will eventually be useful for provider-writers who + * might choose to make provider DLLs that support more than + * one version of the MAPI SPI. + */ +#define PDK1_SPI_VERSION 0x00010000L /* 0.1.0 MAPI PDK1 Spring 1993 */ + +#define PDK2_SPI_VERSION 0x00010008L /* 0.1.8 MAPI PDK2 Spring 1994 */ + +#define PDK3_SPI_VERSION 0x00010010L /* 0.1.16 MAPI PDK3 Fall 1994 */ + +/* + * Forward declaration of interface pointers specific to the service + * provider interface. + */ +DECLARE_MAPI_INTERFACE_PTR(IMAPISupport, LPMAPISUP); + +/* IMAPISupport Interface -------------------------------------------------- */ + +/* Notification key structure for the MAPI notification engine */ + +typedef struct +{ + ULONG cb; /* How big the key is */ + BYTE ab[MAPI_DIM]; /* Key contents */ +} NOTIFKEY, FAR * LPNOTIFKEY; + +#define CbNewNOTIFKEY(_cb) (offsetof(NOTIFKEY,ab) + (_cb)) +#define CbNOTIFKEY(_lpkey) (offsetof(NOTIFKEY,ab) + (_lpkey)->cb) +#define SizedNOTIFKEY(_cb, _name) \ + struct _NOTIFKEY_ ## _name \ +{ \ + ULONG cb; \ + BYTE ab[_cb]; \ +} _name + + +/* For Subscribe() */ + +#define NOTIFY_SYNC ((ULONG) 0x40000000) + +/* For Notify() */ + +#define NOTIFY_CANCELED ((ULONG) 0x80000000) + + +/* From the Notification Callback function (well, this is really a ulResult) */ + +#define CALLBACK_DISCONTINUE ((ULONG) 0x80000000) + +/* For Transport's SpoolerNotify() */ + +#define NOTIFY_NEWMAIL ((ULONG) 0x00000001) +#define NOTIFY_READYTOSEND ((ULONG) 0x00000002) +#define NOTIFY_SENTDEFERRED ((ULONG) 0x00000004) +#define NOTIFY_CRITSEC ((ULONG) 0x00001000) +#define NOTIFY_NONCRIT ((ULONG) 0x00002000) +#define NOTIFY_CONFIG_CHANGE ((ULONG) 0x00004000) +#define NOTIFY_CRITICAL_ERROR ((ULONG) 0x10000000) + +/* For Message Store's SpoolerNotify() */ + +#define NOTIFY_NEWMAIL_RECEIVED ((ULONG) 0x20000000) + +/* For ModifyStatusRow() */ + +#define STATUSROW_UPDATE ((ULONG) 0x10000000) + +/* For IStorageFromStream() */ + +#define STGSTRM_RESET ((ULONG) 0x00000000) +#define STGSTRM_CURRENT ((ULONG) 0x10000000) +#define STGSTRM_MODIFY ((ULONG) 0x00000002) +#define STGSTRM_CREATE ((ULONG) 0x00001000) + +/* For GetOneOffTable() */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) */ + +/* For CreateOneOff() */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) */ +/****** MAPI_SEND_NO_RICH_INFO ((ULONG) 0x00010000) */ + +/* For ReadReceipt() */ +#define MAPI_NON_READ ((ULONG) 0x00000001) + +/* For DoConfigPropSheet() */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) */ + +/* Preprocessor calls: */ + +/* PreprocessMessage, first ordinal in RegisterPreprocessor(). */ + +typedef HRESULT (STDMETHODCALLTYPE PREPROCESSMESSAGE)( + LPVOID lpvSession, + LPMESSAGE lpMessage, + LPADRBOOK lpAdrBook, + LPMAPIFOLDER lpFolder, + LPALLOCATEBUFFER AllocateBuffer, + LPALLOCATEMORE AllocateMore, + LPFREEBUFFER FreeBuffer, + ULONG FAR *lpcOutbound, + LPMESSAGE FAR * FAR *lpppMessage, + LPADRLIST FAR *lppRecipList); + +/* RemovePreprocessInfo, second ordinal in RegisterPreprocessor(). */ + +typedef HRESULT (STDMETHODCALLTYPE REMOVEPREPROCESSINFO)(LPMESSAGE lpMessage); + +/* Function pointer for GetReleaseInfo */ + +#define MAPI_IMAPISUPPORT_METHODS1(IPURE) \ + MAPIMETHOD(GetLastError) \ + (THIS_ HRESULT hResult, \ + ULONG ulFlags, \ + LPMAPIERROR FAR * lppMAPIError) IPURE; \ + MAPIMETHOD(GetMemAllocRoutines) \ + (THIS_ LPALLOCATEBUFFER FAR * lpAllocateBuffer, \ + LPALLOCATEMORE FAR * lpAllocateMore, \ + LPFREEBUFFER FAR * lpFreeBuffer) IPURE; \ + MAPIMETHOD(Subscribe) \ + (THIS_ LPNOTIFKEY lpKey, \ + ULONG ulEventMask, \ + ULONG ulFlags, \ + LPMAPIADVISESINK lpAdviseSink, \ + ULONG_PTR FAR * lpulConnection) IPURE; \ + MAPIMETHOD(Unsubscribe) \ + (THIS_ ULONG_PTR ulConnection) IPURE; \ + MAPIMETHOD(Notify) \ + (THIS_ LPNOTIFKEY lpKey, \ + ULONG cNotification, \ + LPNOTIFICATION lpNotifications, \ + ULONG FAR * lpulFlags) IPURE; \ + MAPIMETHOD(ModifyStatusRow) \ + (THIS_ ULONG cValues, \ + LPSPropValue lpColumnVals, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(OpenProfileSection) \ + (THIS_ LPMAPIUID lpUid, \ + ULONG ulFlags, \ + LPPROFSECT FAR * lppProfileObj) IPURE; \ + MAPIMETHOD(RegisterPreprocessor) \ + (THIS_ LPMAPIUID lpMuid, \ + LPTSTR lpszAdrType, \ + LPTSTR lpszDLLName, \ + LPSTR /* String8! */ lpszPreprocess, \ + LPSTR /* String8! */ lpszRemovePreprocessInfo, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(NewUID) \ + (THIS_ LPMAPIUID lpMuid) IPURE; \ + MAPIMETHOD(MakeInvalid) \ + (THIS_ ULONG ulFlags, \ + LPVOID lpObject, \ + ULONG ulRefCount, \ + ULONG cMethods) IPURE; \ + +#define MAPI_IMAPISUPPORT_METHODS2(IPURE) \ + MAPIMETHOD(SpoolerYield) \ + (THIS_ ULONG ulFlags) IPURE; \ + MAPIMETHOD(SpoolerNotify) \ + (THIS_ ULONG ulFlags, \ + LPVOID lpvData) IPURE; \ + MAPIMETHOD(CreateOneOff) \ + (THIS_ LPTSTR lpszName, \ + LPTSTR lpszAdrType, \ + LPTSTR lpszAddress, \ + ULONG ulFlags, \ + ULONG FAR * lpcbEntryID, \ + LPENTRYID FAR * lppEntryID) IPURE; \ + MAPIMETHOD(SetProviderUID) \ + (THIS_ LPMAPIUID lpProviderID, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(CompareEntryIDs) \ + (THIS_ ULONG cbEntry1, \ + LPENTRYID lpEntry1, \ + ULONG cbEntry2, \ + LPENTRYID lpEntry2, \ + ULONG ulCompareFlags, \ + ULONG FAR * lpulResult) IPURE; \ + MAPIMETHOD(OpenTemplateID) \ + (THIS_ ULONG cbTemplateID, \ + LPENTRYID lpTemplateID, \ + ULONG ulTemplateFlags, \ + LPMAPIPROP lpMAPIPropData, \ + LPCIID lpInterface, \ + LPMAPIPROP FAR * lppMAPIPropNew, \ + LPMAPIPROP lpMAPIPropSibling) IPURE; \ + MAPIMETHOD(OpenEntry) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + LPCIID lpInterface, \ + ULONG ulOpenFlags, \ + ULONG FAR * lpulObjType, \ + LPUNKNOWN FAR * lppUnk) IPURE; \ + MAPIMETHOD(GetOneOffTable) \ + (THIS_ ULONG ulFlags, \ + LPMAPITABLE FAR * lppTable) IPURE; \ + MAPIMETHOD(Address) \ + (THIS_ ULONG_PTR FAR * lpulUIParam, \ + LPADRPARM lpAdrParms, \ + LPADRLIST FAR * lppAdrList) IPURE; \ + MAPIMETHOD(Details) \ + (THIS_ ULONG_PTR FAR * lpulUIParam, \ + LPFNDISMISS lpfnDismiss, \ + LPVOID lpvDismissContext, \ + ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + LPFNBUTTON lpfButtonCallback, \ + LPVOID lpvButtonContext, \ + LPTSTR lpszButtonText, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(NewEntry) \ + (THIS_ ULONG_PTR ulUIParam, \ + ULONG ulFlags, \ + ULONG cbEIDContainer, \ + LPENTRYID lpEIDContainer, \ + ULONG cbEIDNewEntryTpl, \ + LPENTRYID lpEIDNewEntryTpl, \ + ULONG FAR * lpcbEIDNewEntry, \ + LPENTRYID FAR * lppEIDNewEntry) IPURE; \ + MAPIMETHOD(DoConfigPropsheet) \ + (THIS_ ULONG_PTR ulUIParam, \ + ULONG ulFlags, \ + LPTSTR lpszTitle, \ + LPMAPITABLE lpDisplayTable, \ + LPMAPIPROP lpCOnfigData, \ + ULONG ulTopPage) IPURE; \ + MAPIMETHOD(CopyMessages) \ + (THIS_ LPCIID lpSrcInterface, \ + LPVOID lpSrcFolder, \ + LPENTRYLIST lpMsgList, \ + LPCIID lpDestInterface, \ + LPVOID lpDestFolder, \ + ULONG_PTR ulUIParam, \ + LPMAPIPROGRESS lpProgress, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(CopyFolder) \ + (THIS_ LPCIID lpSrcInterface, \ + LPVOID lpSrcFolder, \ + ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + LPCIID lpDestInterface, \ + LPVOID lpDestFolder, \ + LPTSTR lszNewFolderName, \ + ULONG_PTR ulUIParam, \ + LPMAPIPROGRESS lpProgress, \ + ULONG ulFlags) IPURE; \ + +#define MAPI_IMAPISUPPORT_METHODS3(IPURE) \ + MAPIMETHOD(DoCopyTo) \ + (THIS_ LPCIID lpSrcInterface, \ + LPVOID lpSrcObj, \ + ULONG ciidExclude, \ + LPCIID rgiidExclude, \ + LPSPropTagArray lpExcludeProps, \ + ULONG_PTR ulUIParam, \ + LPMAPIPROGRESS lpProgress, \ + LPCIID lpDestInterface, \ + LPVOID lpDestObj, \ + ULONG ulFlags, \ + LPSPropProblemArray FAR * lppProblems) IPURE; \ + MAPIMETHOD(DoCopyProps) \ + (THIS_ LPCIID lpSrcInterface, \ + LPVOID lpSrcObj, \ + LPSPropTagArray lpIncludeProps, \ + ULONG_PTR ulUIParam, \ + LPMAPIPROGRESS lpProgress, \ + LPCIID lpDestInterface, \ + LPVOID lpDestObj, \ + ULONG ulFlags, \ + LPSPropProblemArray FAR * lppProblems) IPURE; \ + MAPIMETHOD(DoProgressDialog) \ + (THIS_ ULONG_PTR ulUIParam, \ + ULONG ulFlags, \ + LPMAPIPROGRESS FAR * lppProgress) IPURE; \ + MAPIMETHOD(ReadReceipt) \ + (THIS_ ULONG ulFlags, \ + LPMESSAGE lpReadMessage, \ + LPMESSAGE FAR * lppEmptyMessage) IPURE; \ + MAPIMETHOD(PrepareSubmit) \ + (THIS_ LPMESSAGE lpMessage, \ + ULONG FAR * lpulFlags) IPURE; \ + MAPIMETHOD(ExpandRecips) \ + (THIS_ LPMESSAGE lpMessage, \ + ULONG FAR * lpulFlags) IPURE; \ + MAPIMETHOD(UpdatePAB) \ + (THIS_ ULONG ulFlags, \ + LPMESSAGE lpMessage) IPURE; \ + MAPIMETHOD(DoSentMail) \ + (THIS_ ULONG ulFlags, \ + LPMESSAGE lpMessage) IPURE; \ + MAPIMETHOD(OpenAddressBook) \ + (THIS_ LPCIID lpInterface, \ + ULONG ulFlags, \ + LPADRBOOK FAR * lppAdrBook) IPURE; \ + MAPIMETHOD(Preprocess) \ + (THIS_ ULONG ulFlags, \ + ULONG cbEntryID, \ + LPENTRYID lpEntryID) IPURE; \ + MAPIMETHOD(CompleteMsg) \ + (THIS_ ULONG ulFlags, \ + ULONG cbEntryID, \ + LPENTRYID lpEntryID) IPURE; \ + MAPIMETHOD(StoreLogoffTransports) \ + (THIS_ ULONG FAR * lpulFlags) IPURE; \ + MAPIMETHOD(StatusRecips) \ + (THIS_ LPMESSAGE lpMessage, \ + LPADRLIST lpRecipList) IPURE; \ + MAPIMETHOD(WrapStoreEntryID) \ + (THIS_ ULONG cbOrigEntry, \ + LPENTRYID lpOrigEntry, \ + ULONG FAR * lpcbWrappedEntry, \ + LPENTRYID FAR * lppWrappedEntry) IPURE; \ + MAPIMETHOD(ModifyProfile) \ + (THIS_ ULONG ulFlags) IPURE; \ + MAPIMETHOD(IStorageFromStream) \ + (THIS_ LPUNKNOWN lpUnkIn, \ + LPCIID lpInterface, \ + ULONG ulFlags, \ + LPSTORAGE FAR * lppStorageOut) IPURE; \ + MAPIMETHOD(GetSvcConfigSupportObj) \ + (THIS_ ULONG ulFlags, \ + LPMAPISUP FAR * lppSvcSupport) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMAPISupport +DECLARE_MAPI_INTERFACE_(IMAPISupport, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPISUPPORT_METHODS1(PURE) + MAPI_IMAPISUPPORT_METHODS2(PURE) + MAPI_IMAPISUPPORT_METHODS3(PURE) +}; + + +/********************************************************************/ +/* */ +/* ADDRESS BOOK SPI */ +/* */ +/********************************************************************/ + +/* Address Book Provider ------------------------------------------------- */ + +/* OpenTemplateID() */ +#define FILL_ENTRY ((ULONG) 0x00000001) + +/* For Logon() */ + +/*#define AB_NO_DIALOG ((ULONG) 0x00000001) in mapidefs.h */ +/*#define MAPI_UNICODE ((ULONG) 0x80000000) in mapidefs.h */ + + + +DECLARE_MAPI_INTERFACE_PTR(IABProvider, LPABPROVIDER); +DECLARE_MAPI_INTERFACE_PTR(IABLogon, LPABLOGON); + +#define MAPI_IABPROVIDER_METHODS(IPURE) \ + MAPIMETHOD(Shutdown) \ + (THIS_ ULONG FAR * lpulFlags) IPURE; \ + MAPIMETHOD(Logon) \ + (THIS_ LPMAPISUP lpMAPISup, \ + ULONG_PTR ulUIParam, \ + LPTSTR lpszProfileName, \ + ULONG ulFlags, \ + ULONG FAR * lpulpcbSecurity, \ + LPBYTE FAR * lppbSecurity, \ + LPMAPIERROR FAR * lppMAPIError, \ + LPABLOGON FAR * lppABLogon) IPURE; \ + +#undef INTERFACE +#define INTERFACE IABProvider +DECLARE_MAPI_INTERFACE_(IABProvider, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IABPROVIDER_METHODS(PURE) +}; + +/* For GetOneOffTable() */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) */ + +#define MAPI_IABLOGON_METHODS(IPURE) \ + MAPIMETHOD(GetLastError) \ + (THIS_ HRESULT hResult, \ + ULONG ulFlags, \ + LPMAPIERROR FAR * lppMAPIError) IPURE; \ + MAPIMETHOD(Logoff) \ + (THIS_ ULONG ulFlags) IPURE; \ + MAPIMETHOD(OpenEntry) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + LPCIID lpInterface, \ + ULONG ulFlags, \ + ULONG FAR * lpulObjType, \ + LPUNKNOWN FAR * lppUnk) IPURE; \ + MAPIMETHOD(CompareEntryIDs) \ + (THIS_ ULONG cbEntryID1, \ + LPENTRYID lpEntryID1, \ + ULONG cbEntryID2, \ + LPENTRYID lpEntryID2, \ + ULONG ulFlags, \ + ULONG FAR * lpulResult) IPURE; \ + MAPIMETHOD(Advise) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + ULONG ulEventMask, \ + LPMAPIADVISESINK lpAdviseSink, \ + ULONG_PTR FAR * lpulConnection) IPURE; \ + MAPIMETHOD(Unadvise) \ + (THIS_ ULONG_PTR ulConnection) IPURE; \ + MAPIMETHOD(OpenStatusEntry) \ + (THIS_ LPCIID lpInterface, \ + ULONG ulFlags, \ + ULONG FAR * lpulObjType, \ + LPMAPISTATUS FAR * lppEntry) IPURE; \ + MAPIMETHOD(OpenTemplateID) \ + (THIS_ ULONG cbTemplateID, \ + LPENTRYID lpTemplateID, \ + ULONG ulTemplateFlags, \ + LPMAPIPROP lpMAPIPropData, \ + LPCIID lpInterface, \ + LPMAPIPROP FAR * lppMAPIPropNew, \ + LPMAPIPROP lpMAPIPropSibling) IPURE; \ + MAPIMETHOD(GetOneOffTable) \ + (THIS_ ULONG ulFlags, \ + LPMAPITABLE FAR * lppTable) IPURE; \ + MAPIMETHOD(PrepareRecips) \ + (THIS_ ULONG ulFlags, \ + LPSPropTagArray lpPropTagArray, \ + LPADRLIST lpRecipList) IPURE; \ + +#undef INTERFACE +#define INTERFACE IABLogon +DECLARE_MAPI_INTERFACE_(IABLogon, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IABLOGON_METHODS(PURE) +}; + +typedef HRESULT (STDMAPIINITCALLTYPE ABPROVIDERINIT)( + HINSTANCE hInstance, + LPMALLOC lpMalloc, + LPALLOCATEBUFFER lpAllocateBuffer, + LPALLOCATEMORE lpAllocateMore, + LPFREEBUFFER lpFreeBuffer, + ULONG ulFlags, + ULONG ulMAPIVer, + ULONG FAR * lpulProviderVer, + LPABPROVIDER FAR * lppABProvider +); + +ABPROVIDERINIT ABProviderInit; + + + +/********************************************************************/ +/* */ +/* TRANSPORT SPI */ +/* */ +/********************************************************************/ + +/* For DeinitTransport */ + +#define DEINIT_NORMAL ((ULONG) 0x00000001) +#define DEINIT_HURRY ((ULONG) 0x80000000) + +/* For TransportLogon */ + +/* Flags that the Spooler may pass to the transport: */ + +#define LOGON_NO_DIALOG ((ULONG) 0x00000001) +#define LOGON_NO_CONNECT ((ULONG) 0x00000004) +#define LOGON_NO_INBOUND ((ULONG) 0x00000008) +#define LOGON_NO_OUTBOUND ((ULONG) 0x00000010) +/*#define MAPI_UNICODE ((ULONG) 0x80000000) in mapidefs.h */ + +/* Flags that the transport may pass to the Spooler: */ + +#define LOGON_SP_IDLE ((ULONG) 0x00010000) +#define LOGON_SP_POLL ((ULONG) 0x00020000) +#define LOGON_SP_RESOLVE ((ULONG) 0x00040000) + + +DECLARE_MAPI_INTERFACE_PTR(IXPProvider, LPXPPROVIDER); +DECLARE_MAPI_INTERFACE_PTR(IXPLogon, LPXPLOGON); + +#define MAPI_IXPPROVIDER_METHODS(IPURE) \ + MAPIMETHOD(Shutdown) \ + (THIS_ ULONG FAR * lpulFlags) IPURE; \ + MAPIMETHOD(TransportLogon) \ + (THIS_ LPMAPISUP lpMAPISup, \ + ULONG_PTR ulUIParam, \ + __in LPTSTR lpszProfileName, \ + ULONG FAR * lpulFlags, \ + LPMAPIERROR FAR * lppMAPIError, \ + LPXPLOGON FAR * lppXPLogon) IPURE; \ + +#undef INTERFACE +#define INTERFACE IXPProvider +DECLARE_MAPI_INTERFACE_(IXPProvider, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IXPPROVIDER_METHODS(PURE) +}; + +/* OptionData returned from call to RegisterOptions */ + +#define OPTION_TYPE_RECIPIENT ((ULONG) 0x00000001) +#define OPTION_TYPE_MESSAGE ((ULONG) 0x00000002) + +typedef struct _OPTIONDATA +{ + ULONG ulFlags; /* MAPI_RECIPIENT, MAPI_MESSAGE */ + LPGUID lpRecipGUID; /* Same as returned by AddressTypes() */ + LPTSTR lpszAdrType; /* Same as returned by AddressTypes() */ + LPTSTR lpszDLLName; /* Options DLL */ + ULONG ulOrdinal; /* Ordinal in that DLL */ + ULONG cbOptionsData; /* Count of bytes in lpbOptionsData */ + LPBYTE lpbOptionsData; /* Providers per [recip|message] option data */ + ULONG cOptionsProps; /* Count of Options default prop values */ + LPSPropValue lpOptionsProps; /* Default Options property values */ +} OPTIONDATA, FAR *LPOPTIONDATA; + +typedef SCODE (STDMAPIINITCALLTYPE OPTIONCALLBACK)( + HINSTANCE hInst, + LPMALLOC lpMalloc, + ULONG ulFlags, + ULONG cbOptionData, + LPBYTE lpbOptionData, + LPMAPISUP lpMAPISup, + LPMAPIPROP lpDataSource, + LPMAPIPROP FAR * lppWrappedSource, + LPMAPIERROR FAR * lppMAPIError); + +/* For XP_AddressTypes */ + +/*#define MAPI_UNICODE ((ULONG) 0x80000000) in mapidefs.h */ + +/* For XP_RegisterRecipOptions */ + +/*#define MAPI_UNICODE ((ULONG) 0x80000000) in mapidefs.h */ + +/* For XP_RegisterMessageOptions */ + +/*#define MAPI_UNICODE ((ULONG) 0x80000000) in mapidefs.h */ + +/* For TransportNotify */ + +#define NOTIFY_ABORT_DEFERRED ((ULONG) 0x40000000) +#define NOTIFY_CANCEL_MESSAGE ((ULONG) 0x80000000) +#define NOTIFY_BEGIN_INBOUND ((ULONG) 0x00000001) +#define NOTIFY_END_INBOUND ((ULONG) 0x00010000) +#define NOTIFY_BEGIN_OUTBOUND ((ULONG) 0x00000002) +#define NOTIFY_END_OUTBOUND ((ULONG) 0x00020000) +#define NOTIFY_BEGIN_INBOUND_FLUSH ((ULONG) 0x00000004) +#define NOTIFY_END_INBOUND_FLUSH ((ULONG) 0x00040000) +#define NOTIFY_BEGIN_OUTBOUND_FLUSH ((ULONG) 0x00000008) +#define NOTIFY_END_OUTBOUND_FLUSH ((ULONG) 0x00080000) + +/* For TransportLogoff */ + +#define LOGOFF_NORMAL ((ULONG) 0x00000001) +#define LOGOFF_HURRY ((ULONG) 0x80000000) + +/* For SubmitMessage */ + +#define BEGIN_DEFERRED ((ULONG) 0x00000001) + +/* For EndMessage */ + +/* Flags that the Spooler may pass to the Transport: */ + +/* Flags that the transport may pass to the Spooler: */ + +#define END_RESEND_NOW ((ULONG) 0x00010000) +#define END_RESEND_LATER ((ULONG) 0x00020000) +#define END_DONT_RESEND ((ULONG) 0x00040000) + +#define MAPI_IXPLOGON_METHODS(IPURE) \ + MAPIMETHOD(AddressTypes) \ + (THIS_ ULONG FAR * lpulFlags, \ + ULONG FAR * lpcAdrType, \ + __deref_out_ecount_full(*lpcAdrType) LPTSTR FAR * FAR * lpppAdrTypeArray, \ + ULONG FAR * lpcMAPIUID, \ + LPMAPIUID FAR * FAR * lpppUIDArray) IPURE; \ + MAPIMETHOD(RegisterOptions) \ + (THIS_ ULONG FAR * lpulFlags, \ + ULONG FAR * lpcOptions, \ + LPOPTIONDATA FAR * lppOptions) IPURE; \ + MAPIMETHOD(TransportNotify) \ + (THIS_ ULONG FAR * lpulFlags, \ + LPVOID FAR * lppvData) IPURE; \ + MAPIMETHOD(Idle) \ + (THIS_ ULONG ulFlags) IPURE; \ + MAPIMETHOD(TransportLogoff) \ + (THIS_ ULONG ulFlags) IPURE; \ + MAPIMETHOD(SubmitMessage) \ + (THIS_ ULONG ulFlags, \ + LPMESSAGE lpMessage, \ + ULONG_PTR FAR * lpulMsgRef, \ + ULONG_PTR FAR * lpulReturnParm) IPURE; \ + MAPIMETHOD(EndMessage) \ + (THIS_ ULONG_PTR ulMsgRef, \ + ULONG FAR * lpulFlags) IPURE; \ + MAPIMETHOD(Poll) \ + (THIS_ ULONG FAR * lpulIncoming) IPURE; \ + MAPIMETHOD(StartMessage) \ + (THIS_ ULONG ulFlags, \ + LPMESSAGE lpMessage, \ + ULONG_PTR FAR * lpulMsgRef) IPURE; \ + MAPIMETHOD(OpenStatusEntry) \ + (THIS_ LPCIID lpInterface, \ + ULONG ulFlags, \ + ULONG FAR * lpulObjType, \ + LPMAPISTATUS FAR * lppEntry) IPURE; \ + MAPIMETHOD(ValidateState) \ + (THIS_ ULONG_PTR ulUIParam, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(FlushQueues) \ + (THIS_ ULONG_PTR ulUIParam, \ + ULONG cbTargetTransport, \ + LPENTRYID lpTargetTransport, \ + ULONG ulFlags) IPURE; \ + +#undef INTERFACE +#define INTERFACE IXPLogon +DECLARE_MAPI_INTERFACE_(IXPLogon, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IXPLOGON_METHODS(PURE) +}; + + +/* Transport Provider Entry Point */ + +typedef HRESULT (STDMAPIINITCALLTYPE XPPROVIDERINIT)( + HINSTANCE hInstance, + LPMALLOC lpMalloc, + LPALLOCATEBUFFER lpAllocateBuffer, + LPALLOCATEMORE lpAllocateMore, + LPFREEBUFFER lpFreeBuffer, + ULONG ulFlags, + ULONG ulMAPIVer, + ULONG FAR * lpulProviderVer, + LPXPPROVIDER FAR * lppXPProvider); + +XPPROVIDERINIT XPProviderInit; + +/********************************************************************/ +/* */ +/* MESSAGE STORE SPI */ +/* */ +/********************************************************************/ + +/* Flags and enums */ + +/* For Logon() */ + +/*#define MAPI_UNICODE ((ULONG) 0x80000000) in mapidefs.h */ +/*#define MDB_NO_DIALOG ((ULONG) 0x00000001) in mapidefs.h */ +/*#define MDB_WRITE ((ULONG) 0x00000004) in mapidefs.h */ +/*#define MAPI_DEFERRED_ERRORS ((ULONG) 0x00000008) in mapidefs.h */ +/*#define MDB_TEMPORARY ((ULONG) 0x00000020) in mapidefs.h */ +/*#define MDB_NO_MAIL ((ULONG) 0x00000080) in mapidefs.h */ + +/* For SpoolerLogon() */ + +/*#define MAPI_UNICODE ((ULONG) 0x80000000) in mapidefs.h */ +/*#define MDB_NO_DIALOG ((ULONG) 0x00000001) in mapidefs.h */ +/*#define MDB_WRITE ((ULONG) 0x00000004) in mapidefs.h */ +/*#define MAPI_DEFERRED_ERRORS ((ULONG) 0x00000008) in mapidefs.h */ + +/* GetCredentials, SetCredentials */ + +#define LOGON_SP_TRANSPORT ((ULONG) 0x00000001) +#define LOGON_SP_PROMPT ((ULONG) 0x00000002) +#define LOGON_SP_NEWPW ((ULONG) 0x00000004) +#define LOGON_CHANGED ((ULONG) 0x00000008) + +/* DoMCDialog */ + +#define DIALOG_FOLDER ((ULONG) 0x00000001) +#define DIALOG_MESSAGE ((ULONG) 0x00000002) +#define DIALOG_PROP ((ULONG) 0x00000004) +#define DIALOG_ATTACH ((ULONG) 0x00000008) + +#define DIALOG_MOVE ((ULONG) 0x00000010) +#define DIALOG_COPY ((ULONG) 0x00000020) +#define DIALOG_DELETE ((ULONG) 0x00000040) + +#define DIALOG_ALLOW_CANCEL ((ULONG) 0x00000080) +#define DIALOG_CONFIRM_CANCEL ((ULONG) 0x00000100) + +/* ExpandRecips */ + +#define NEEDS_PREPROCESSING ((ULONG) 0x00000001) +#define NEEDS_SPOOLER ((ULONG) 0x00000002) + +/* PrepareSubmit */ + +#define CHECK_SENDER ((ULONG) 0x00000001) +#define NON_STANDARD ((ULONG) 0x00010000) + + +DECLARE_MAPI_INTERFACE_PTR(IMSLogon, LPMSLOGON); +DECLARE_MAPI_INTERFACE_PTR(IMSProvider, LPMSPROVIDER); + +/* Message Store Provider Interface (IMSPROVIDER) */ + +#define MAPI_IMSPROVIDER_METHODS(IPURE) \ + MAPIMETHOD(Shutdown) \ + (THIS_ ULONG FAR * lpulFlags) IPURE; \ + MAPIMETHOD(Logon) \ + (THIS_ LPMAPISUP lpMAPISup, \ + ULONG_PTR ulUIParam, \ + LPTSTR lpszProfileName, \ + ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + ULONG ulFlags, \ + LPCIID lpInterface, \ + ULONG FAR * lpcbSpoolSecurity, \ + LPBYTE FAR * lppbSpoolSecurity, \ + LPMAPIERROR FAR * lppMAPIError, \ + LPMSLOGON FAR * lppMSLogon, \ + LPMDB FAR * lppMDB) IPURE; \ + MAPIMETHOD(SpoolerLogon) \ + (THIS_ LPMAPISUP lpMAPISup, \ + ULONG_PTR ulUIParam, \ + LPTSTR lpszProfileName, \ + ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + ULONG ulFlags, \ + LPCIID lpInterface, \ + ULONG cbSpoolSecurity, \ + LPBYTE lpbSpoolSecurity, \ + LPMAPIERROR FAR * lppMAPIError, \ + LPMSLOGON FAR * lppMSLogon, \ + LPMDB FAR * lppMDB) IPURE; \ + MAPIMETHOD(CompareStoreIDs) \ + (THIS_ ULONG cbEntryID1, \ + LPENTRYID lpEntryID1, \ + ULONG cbEntryID2, \ + LPENTRYID lpEntryID2, \ + ULONG ulFlags, \ + ULONG FAR * lpulResult) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMSProvider +DECLARE_MAPI_INTERFACE_(IMSProvider, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMSPROVIDER_METHODS(PURE) +}; + +/* The MSLOGON object is returned by the Logon() method of the + * MSPROVIDER interface. This object is for use by MAPIX.DLL. + */ +#define MAPI_IMSLOGON_METHODS(IPURE) \ + MAPIMETHOD(GetLastError) \ + (THIS_ HRESULT hResult, \ + ULONG ulFlags, \ + LPMAPIERROR FAR * lppMAPIError) IPURE; \ + MAPIMETHOD(Logoff) \ + (THIS_ ULONG FAR * lpulFlags) IPURE; \ + MAPIMETHOD(OpenEntry) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + LPCIID lpInterface, \ + ULONG ulFlags, \ + ULONG FAR * lpulObjType, \ + LPUNKNOWN FAR * lppUnk) IPURE; \ + MAPIMETHOD(CompareEntryIDs) \ + (THIS_ ULONG cbEntryID1, \ + LPENTRYID lpEntryID1, \ + ULONG cbEntryID2, \ + LPENTRYID lpEntryID2, \ + ULONG ulFlags, \ + ULONG FAR * lpulResult) IPURE; \ + MAPIMETHOD(Advise) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + ULONG ulEventMask, \ + LPMAPIADVISESINK lpAdviseSink, \ + ULONG_PTR FAR * lpulConnection) IPURE; \ + MAPIMETHOD(Unadvise) \ + (THIS_ ULONG_PTR ulConnection) IPURE; \ + MAPIMETHOD(OpenStatusEntry) \ + (THIS_ LPCIID lpInterface, \ + ULONG ulFlags, \ + ULONG FAR * lpulObjType, \ + LPVOID FAR * lppEntry) IPURE; \ + +#undef INTERFACE +#define INTERFACE IMSLogon +DECLARE_MAPI_INTERFACE_(IMSLogon, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMSLOGON_METHODS(PURE) +}; + +/* Message Store Provider Entry Point */ + +typedef HRESULT (STDMAPIINITCALLTYPE MSPROVIDERINIT)( + HINSTANCE hInstance, + LPMALLOC lpMalloc, /* AddRef() if you keep it */ + LPALLOCATEBUFFER lpAllocateBuffer, /* -> AllocateBuffer */ + LPALLOCATEMORE lpAllocateMore, /* -> AllocateMore */ + LPFREEBUFFER lpFreeBuffer, /* -> FreeBuffer */ + ULONG ulFlags, + ULONG ulMAPIVer, + ULONG FAR * lpulProviderVer, + LPMSPROVIDER FAR * lppMSProvider +); + +MSPROVIDERINIT MSProviderInit; + + +/********************************************************************/ +/* */ +/* MESSAGE SERVICE CONFIGURATION */ +/* */ +/********************************************************************/ + +/* Flags for service configuration entry point */ + +/* #define MAPI_UNICODE 0x80000000 */ +/* #define SERVICE_UI_ALWAYS 0x00000002 */ +/* #define SERVICE_UI_ALLOWED 0x00000010 */ +#define MSG_SERVICE_UI_READ_ONLY 0x00000008 /* display parameters only */ +#define SERVICE_LOGON_FAILED 0x00000020 /* reconfigure provider */ + +/* Contexts for service configuration entry point */ + +#define MSG_SERVICE_INSTALL 0x00000001 +#define MSG_SERVICE_CREATE 0x00000002 +#define MSG_SERVICE_CONFIGURE 0x00000003 +#define MSG_SERVICE_DELETE 0x00000004 +#define MSG_SERVICE_UNINSTALL 0x00000005 +#define MSG_SERVICE_PROVIDER_CREATE 0x00000006 +#define MSG_SERVICE_PROVIDER_DELETE 0x00000007 + +/* Prototype for service configuration entry point */ + +typedef HRESULT (STDAPICALLTYPE MSGSERVICEENTRY)( + HINSTANCE hInstance, + LPMALLOC lpMalloc, + LPMAPISUP lpMAPISup, + ULONG_PTR ulUIParam, + ULONG ulFlags, + ULONG ulContext, + ULONG cValues, + LPSPropValue lpProps, + LPPROVIDERADMIN lpProviderAdmin, + LPMAPIERROR FAR *lppMapiError +); +typedef MSGSERVICEENTRY FAR *LPMSGSERVICEENTRY; + + +#ifdef __cplusplus +} +#endif + +#endif /* MAPISPI_H */ + diff --git a/comm/mailnews/mapi/include/mapitags.h b/comm/mailnews/mapi/include/mapitags.h new file mode 100644 index 0000000000..a259cfccd9 --- /dev/null +++ b/comm/mailnews/mapi/include/mapitags.h @@ -0,0 +1,1036 @@ +/* + * M A P I T A G S . H + * + * Property tag definitions for standard properties of MAPI + * objects. + * + * The following ranges should be used for all property IDs. Note that + * property IDs for objects other than messages and recipients should + * all fall in the range 0x3000 to 0x3FFF: + * + * From To Kind of property + * -------------------------------- + * 0001 0BFF MAPI_defined envelope property + * 0C00 0DFF MAPI_defined per-recipient property + * 0E00 0FFF MAPI_defined non-transmittable property + * 1000 2FFF MAPI_defined message content property + * + * 3000 3FFF MAPI_defined property (usually not message or recipient) + * + * 4000 57FF Transport-defined envelope property + * 5800 5FFF Transport-defined per-recipient property + * 6000 65FF User-defined non-transmittable property + * 6600 67FF Provider-defined internal non-transmittable property + * 6800 7BFF Message class-defined content property + * 7C00 7FFF Message class-defined non-transmittable + * property + * + * 8000 FFFE User-defined Name-to-id mapped property + * + * The 3000-3FFF range is further subdivided as follows: + * + * From To Kind of property + * -------------------------------- + * 3000 33FF Common property such as display name, entry ID + * 3400 35FF Message store object + * 3600 36FF Folder or AB container + * 3700 38FF Attachment + * 3900 39FF Address book object + * 3A00 3BFF Mail user + * 3C00 3CFF Distribution list + * 3D00 3DFF Profile section + * 3E00 3FFF Status object + * + * Copyright (c) 2009 Microsoft Corporation. All Rights Reserved. + */ + +#ifndef MAPITAGS_H +#define MAPITAGS_H + +#if _MSC_VER > 1000 +#pragma once +#endif + +/* Determine if a property is transmittable. */ + +#define FIsTransmittable(ulPropTag) \ + ((PROP_ID (ulPropTag) < (ULONG)0x0E00) || \ + (PROP_ID (ulPropTag) >= (ULONG)0x8000) || \ + ((PROP_ID (ulPropTag) >= (ULONG)0x1000) && (PROP_ID (ulPropTag) < (ULONG)0x6000)) || \ + ((PROP_ID (ulPropTag) >= (ULONG)0x6800) && (PROP_ID (ulPropTag) < (ULONG)0x7C00))) + +/* + * Message envelope properties + */ + +#define PR_ACKNOWLEDGEMENT_MODE PROP_TAG( PT_LONG, 0x0001) +#define PR_ALTERNATE_RECIPIENT_ALLOWED PROP_TAG( PT_BOOLEAN, 0x0002) +#define PR_AUTHORIZING_USERS PROP_TAG( PT_BINARY, 0x0003) +#define PR_AUTO_FORWARD_COMMENT PROP_TAG( PT_TSTRING, 0x0004) +#define PR_AUTO_FORWARD_COMMENT_W PROP_TAG( PT_UNICODE, 0x0004) +#define PR_AUTO_FORWARD_COMMENT_A PROP_TAG( PT_STRING8, 0x0004) +#define PR_AUTO_FORWARDED PROP_TAG( PT_BOOLEAN, 0x0005) +#define PR_CONTENT_CONFIDENTIALITY_ALGORITHM_ID PROP_TAG( PT_BINARY, 0x0006) +#define PR_CONTENT_CORRELATOR PROP_TAG( PT_BINARY, 0x0007) +#define PR_CONTENT_IDENTIFIER PROP_TAG( PT_TSTRING, 0x0008) +#define PR_CONTENT_IDENTIFIER_W PROP_TAG( PT_UNICODE, 0x0008) +#define PR_CONTENT_IDENTIFIER_A PROP_TAG( PT_STRING8, 0x0008) +#define PR_CONTENT_LENGTH PROP_TAG( PT_LONG, 0x0009) +#define PR_CONTENT_RETURN_REQUESTED PROP_TAG( PT_BOOLEAN, 0x000A) + + + +#define PR_CONVERSATION_KEY PROP_TAG( PT_BINARY, 0x000B) + +#define PR_CONVERSION_EITS PROP_TAG( PT_BINARY, 0x000C) +#define PR_CONVERSION_WITH_LOSS_PROHIBITED PROP_TAG( PT_BOOLEAN, 0x000D) +#define PR_CONVERTED_EITS PROP_TAG( PT_BINARY, 0x000E) +#define PR_DEFERRED_DELIVERY_TIME PROP_TAG( PT_SYSTIME, 0x000F) +#define PR_DELIVER_TIME PROP_TAG( PT_SYSTIME, 0x0010) +#define PR_DISCARD_REASON PROP_TAG( PT_LONG, 0x0011) +#define PR_DISCLOSURE_OF_RECIPIENTS PROP_TAG( PT_BOOLEAN, 0x0012) +#define PR_DL_EXPANSION_HISTORY PROP_TAG( PT_BINARY, 0x0013) +#define PR_DL_EXPANSION_PROHIBITED PROP_TAG( PT_BOOLEAN, 0x0014) +#define PR_EXPIRY_TIME PROP_TAG( PT_SYSTIME, 0x0015) +#define PR_IMPLICIT_CONVERSION_PROHIBITED PROP_TAG( PT_BOOLEAN, 0x0016) +#define PR_IMPORTANCE PROP_TAG( PT_LONG, 0x0017) +#define PR_IPM_ID PROP_TAG( PT_BINARY, 0x0018) +#define PR_LATEST_DELIVERY_TIME PROP_TAG( PT_SYSTIME, 0x0019) +#define PR_MESSAGE_CLASS PROP_TAG( PT_TSTRING, 0x001A) +#define PR_MESSAGE_CLASS_W PROP_TAG( PT_UNICODE, 0x001A) +#define PR_MESSAGE_CLASS_A PROP_TAG( PT_STRING8, 0x001A) +#define PR_MESSAGE_DELIVERY_ID PROP_TAG( PT_BINARY, 0x001B) + + + + + +#define PR_MESSAGE_SECURITY_LABEL PROP_TAG( PT_BINARY, 0x001E) +#define PR_OBSOLETED_IPMS PROP_TAG( PT_BINARY, 0x001F) +#define PR_ORIGINALLY_INTENDED_RECIPIENT_NAME PROP_TAG( PT_BINARY, 0x0020) +#define PR_ORIGINAL_EITS PROP_TAG( PT_BINARY, 0x0021) +#define PR_ORIGINATOR_CERTIFICATE PROP_TAG( PT_BINARY, 0x0022) +#define PR_ORIGINATOR_DELIVERY_REPORT_REQUESTED PROP_TAG( PT_BOOLEAN, 0x0023) +#define PR_ORIGINATOR_RETURN_ADDRESS PROP_TAG( PT_BINARY, 0x0024) + + + +#define PR_PARENT_KEY PROP_TAG( PT_BINARY, 0x0025) +#define PR_PRIORITY PROP_TAG( PT_LONG, 0x0026) + + + +#define PR_ORIGIN_CHECK PROP_TAG( PT_BINARY, 0x0027) +#define PR_PROOF_OF_SUBMISSION_REQUESTED PROP_TAG( PT_BOOLEAN, 0x0028) +#define PR_READ_RECEIPT_REQUESTED PROP_TAG( PT_BOOLEAN, 0x0029) +#define PR_RECEIPT_TIME PROP_TAG( PT_SYSTIME, 0x002A) +#define PR_RECIPIENT_REASSIGNMENT_PROHIBITED PROP_TAG( PT_BOOLEAN, 0x002B) +#define PR_REDIRECTION_HISTORY PROP_TAG( PT_BINARY, 0x002C) +#define PR_RELATED_IPMS PROP_TAG( PT_BINARY, 0x002D) +#define PR_ORIGINAL_SENSITIVITY PROP_TAG( PT_LONG, 0x002E) +#define PR_LANGUAGES PROP_TAG( PT_TSTRING, 0x002F) +#define PR_LANGUAGES_W PROP_TAG( PT_UNICODE, 0x002F) +#define PR_LANGUAGES_A PROP_TAG( PT_STRING8, 0x002F) +#define PR_REPLY_TIME PROP_TAG( PT_SYSTIME, 0x0030) +#define PR_REPORT_TAG PROP_TAG( PT_BINARY, 0x0031) +#define PR_REPORT_TIME PROP_TAG( PT_SYSTIME, 0x0032) +#define PR_RETURNED_IPM PROP_TAG( PT_BOOLEAN, 0x0033) +#define PR_SECURITY PROP_TAG( PT_LONG, 0x0034) +#define PR_INCOMPLETE_COPY PROP_TAG( PT_BOOLEAN, 0x0035) +#define PR_SENSITIVITY PROP_TAG( PT_LONG, 0x0036) +#define PR_SUBJECT PROP_TAG( PT_TSTRING, 0x0037) +#define PR_SUBJECT_W PROP_TAG( PT_UNICODE, 0x0037) +#define PR_SUBJECT_A PROP_TAG( PT_STRING8, 0x0037) +#define PR_SUBJECT_IPM PROP_TAG( PT_BINARY, 0x0038) +#define PR_CLIENT_SUBMIT_TIME PROP_TAG( PT_SYSTIME, 0x0039) +#define PR_REPORT_NAME PROP_TAG( PT_TSTRING, 0x003A) +#define PR_REPORT_NAME_W PROP_TAG( PT_UNICODE, 0x003A) +#define PR_REPORT_NAME_A PROP_TAG( PT_STRING8, 0x003A) +#define PR_SENT_REPRESENTING_SEARCH_KEY PROP_TAG( PT_BINARY, 0x003B) +#define PR_X400_CONTENT_TYPE PROP_TAG( PT_BINARY, 0x003C) +#define PR_SUBJECT_PREFIX PROP_TAG( PT_TSTRING, 0x003D) +#define PR_SUBJECT_PREFIX_W PROP_TAG( PT_UNICODE, 0x003D) +#define PR_SUBJECT_PREFIX_A PROP_TAG( PT_STRING8, 0x003D) +#define PR_NON_RECEIPT_REASON PROP_TAG( PT_LONG, 0x003E) +#define PR_RECEIVED_BY_ENTRYID PROP_TAG( PT_BINARY, 0x003F) +#define PR_RECEIVED_BY_NAME PROP_TAG( PT_TSTRING, 0x0040) +#define PR_RECEIVED_BY_NAME_W PROP_TAG( PT_UNICODE, 0x0040) +#define PR_RECEIVED_BY_NAME_A PROP_TAG( PT_STRING8, 0x0040) +#define PR_SENT_REPRESENTING_ENTRYID PROP_TAG( PT_BINARY, 0x0041) +#define PR_SENT_REPRESENTING_NAME PROP_TAG( PT_TSTRING, 0x0042) +#define PR_SENT_REPRESENTING_NAME_W PROP_TAG( PT_UNICODE, 0x0042) +#define PR_SENT_REPRESENTING_NAME_A PROP_TAG( PT_STRING8, 0x0042) +#define PR_RCVD_REPRESENTING_ENTRYID PROP_TAG( PT_BINARY, 0x0043) +#define PR_RCVD_REPRESENTING_NAME PROP_TAG( PT_TSTRING, 0x0044) +#define PR_RCVD_REPRESENTING_NAME_W PROP_TAG( PT_UNICODE, 0x0044) +#define PR_RCVD_REPRESENTING_NAME_A PROP_TAG( PT_STRING8, 0x0044) +#define PR_REPORT_ENTRYID PROP_TAG( PT_BINARY, 0x0045) +#define PR_READ_RECEIPT_ENTRYID PROP_TAG( PT_BINARY, 0x0046) +#define PR_MESSAGE_SUBMISSION_ID PROP_TAG( PT_BINARY, 0x0047) +#define PR_PROVIDER_SUBMIT_TIME PROP_TAG( PT_SYSTIME, 0x0048) +#define PR_ORIGINAL_SUBJECT PROP_TAG( PT_TSTRING, 0x0049) +#define PR_ORIGINAL_SUBJECT_W PROP_TAG( PT_UNICODE, 0x0049) +#define PR_ORIGINAL_SUBJECT_A PROP_TAG( PT_STRING8, 0x0049) +#define PR_DISC_VAL PROP_TAG( PT_BOOLEAN, 0x004A) +#define PR_ORIG_MESSAGE_CLASS PROP_TAG( PT_TSTRING, 0x004B) +#define PR_ORIG_MESSAGE_CLASS_W PROP_TAG( PT_UNICODE, 0x004B) +#define PR_ORIG_MESSAGE_CLASS_A PROP_TAG( PT_STRING8, 0x004B) +#define PR_ORIGINAL_AUTHOR_ENTRYID PROP_TAG( PT_BINARY, 0x004C) +#define PR_ORIGINAL_AUTHOR_NAME PROP_TAG( PT_TSTRING, 0x004D) +#define PR_ORIGINAL_AUTHOR_NAME_W PROP_TAG( PT_UNICODE, 0x004D) +#define PR_ORIGINAL_AUTHOR_NAME_A PROP_TAG( PT_STRING8, 0x004D) +#define PR_ORIGINAL_SUBMIT_TIME PROP_TAG( PT_SYSTIME, 0x004E) +#define PR_REPLY_RECIPIENT_ENTRIES PROP_TAG( PT_BINARY, 0x004F) +#define PR_REPLY_RECIPIENT_NAMES PROP_TAG( PT_TSTRING, 0x0050) +#define PR_REPLY_RECIPIENT_NAMES_W PROP_TAG( PT_UNICODE, 0x0050) +#define PR_REPLY_RECIPIENT_NAMES_A PROP_TAG( PT_STRING8, 0x0050) + +#define PR_RECEIVED_BY_SEARCH_KEY PROP_TAG( PT_BINARY, 0x0051) +#define PR_RCVD_REPRESENTING_SEARCH_KEY PROP_TAG( PT_BINARY, 0x0052) +#define PR_READ_RECEIPT_SEARCH_KEY PROP_TAG( PT_BINARY, 0x0053) +#define PR_REPORT_SEARCH_KEY PROP_TAG( PT_BINARY, 0x0054) +#define PR_ORIGINAL_DELIVERY_TIME PROP_TAG( PT_SYSTIME, 0x0055) +#define PR_ORIGINAL_AUTHOR_SEARCH_KEY PROP_TAG( PT_BINARY, 0x0056) + +#define PR_MESSAGE_TO_ME PROP_TAG( PT_BOOLEAN, 0x0057) +#define PR_MESSAGE_CC_ME PROP_TAG( PT_BOOLEAN, 0x0058) +#define PR_MESSAGE_RECIP_ME PROP_TAG( PT_BOOLEAN, 0x0059) + +#define PR_ORIGINAL_SENDER_NAME PROP_TAG( PT_TSTRING, 0x005A) +#define PR_ORIGINAL_SENDER_NAME_W PROP_TAG( PT_UNICODE, 0x005A) +#define PR_ORIGINAL_SENDER_NAME_A PROP_TAG( PT_STRING8, 0x005A) +#define PR_ORIGINAL_SENDER_ENTRYID PROP_TAG( PT_BINARY, 0x005B) +#define PR_ORIGINAL_SENDER_SEARCH_KEY PROP_TAG( PT_BINARY, 0x005C) +#define PR_ORIGINAL_SENT_REPRESENTING_NAME PROP_TAG( PT_TSTRING, 0x005D) +#define PR_ORIGINAL_SENT_REPRESENTING_NAME_W PROP_TAG( PT_UNICODE, 0x005D) +#define PR_ORIGINAL_SENT_REPRESENTING_NAME_A PROP_TAG( PT_STRING8, 0x005D) +#define PR_ORIGINAL_SENT_REPRESENTING_ENTRYID PROP_TAG( PT_BINARY, 0x005E) +#define PR_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY PROP_TAG( PT_BINARY, 0x005F) + +#define PR_START_DATE PROP_TAG( PT_SYSTIME, 0x0060) +#define PR_END_DATE PROP_TAG( PT_SYSTIME, 0x0061) +#define PR_OWNER_APPT_ID PROP_TAG( PT_LONG, 0x0062) +#define PR_RESPONSE_REQUESTED PROP_TAG( PT_BOOLEAN, 0x0063) + +#define PR_SENT_REPRESENTING_ADDRTYPE PROP_TAG( PT_TSTRING, 0x0064) +#define PR_SENT_REPRESENTING_ADDRTYPE_W PROP_TAG( PT_UNICODE, 0x0064) +#define PR_SENT_REPRESENTING_ADDRTYPE_A PROP_TAG( PT_STRING8, 0x0064) +#define PR_SENT_REPRESENTING_EMAIL_ADDRESS PROP_TAG( PT_TSTRING, 0x0065) +#define PR_SENT_REPRESENTING_EMAIL_ADDRESS_W PROP_TAG( PT_UNICODE, 0x0065) +#define PR_SENT_REPRESENTING_EMAIL_ADDRESS_A PROP_TAG( PT_STRING8, 0x0065) + +#define PR_ORIGINAL_SENDER_ADDRTYPE PROP_TAG( PT_TSTRING, 0x0066) +#define PR_ORIGINAL_SENDER_ADDRTYPE_W PROP_TAG( PT_UNICODE, 0x0066) +#define PR_ORIGINAL_SENDER_ADDRTYPE_A PROP_TAG( PT_STRING8, 0x0066) +#define PR_ORIGINAL_SENDER_EMAIL_ADDRESS PROP_TAG( PT_TSTRING, 0x0067) +#define PR_ORIGINAL_SENDER_EMAIL_ADDRESS_W PROP_TAG( PT_UNICODE, 0x0067) +#define PR_ORIGINAL_SENDER_EMAIL_ADDRESS_A PROP_TAG( PT_STRING8, 0x0067) + +#define PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE PROP_TAG( PT_TSTRING, 0x0068) +#define PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE_W PROP_TAG( PT_UNICODE, 0x0068) +#define PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE_A PROP_TAG( PT_STRING8, 0x0068) +#define PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS PROP_TAG( PT_TSTRING, 0x0069) +#define PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS_W PROP_TAG( PT_UNICODE, 0x0069) +#define PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS_A PROP_TAG( PT_STRING8, 0x0069) + +#define PR_CONVERSATION_TOPIC PROP_TAG( PT_TSTRING, 0x0070) +#define PR_CONVERSATION_TOPIC_W PROP_TAG( PT_UNICODE, 0x0070) +#define PR_CONVERSATION_TOPIC_A PROP_TAG( PT_STRING8, 0x0070) +#define PR_CONVERSATION_INDEX PROP_TAG( PT_BINARY, 0x0071) + +#define PR_ORIGINAL_DISPLAY_BCC PROP_TAG( PT_TSTRING, 0x0072) +#define PR_ORIGINAL_DISPLAY_BCC_W PROP_TAG( PT_UNICODE, 0x0072) +#define PR_ORIGINAL_DISPLAY_BCC_A PROP_TAG( PT_STRING8, 0x0072) +#define PR_ORIGINAL_DISPLAY_CC PROP_TAG( PT_TSTRING, 0x0073) +#define PR_ORIGINAL_DISPLAY_CC_W PROP_TAG( PT_UNICODE, 0x0073) +#define PR_ORIGINAL_DISPLAY_CC_A PROP_TAG( PT_STRING8, 0x0073) +#define PR_ORIGINAL_DISPLAY_TO PROP_TAG( PT_TSTRING, 0x0074) +#define PR_ORIGINAL_DISPLAY_TO_W PROP_TAG( PT_UNICODE, 0x0074) +#define PR_ORIGINAL_DISPLAY_TO_A PROP_TAG( PT_STRING8, 0x0074) + +#define PR_RECEIVED_BY_ADDRTYPE PROP_TAG( PT_TSTRING, 0x0075) +#define PR_RECEIVED_BY_ADDRTYPE_W PROP_TAG( PT_UNICODE, 0x0075) +#define PR_RECEIVED_BY_ADDRTYPE_A PROP_TAG( PT_STRING8, 0x0075) +#define PR_RECEIVED_BY_EMAIL_ADDRESS PROP_TAG( PT_TSTRING, 0x0076) +#define PR_RECEIVED_BY_EMAIL_ADDRESS_W PROP_TAG( PT_UNICODE, 0x0076) +#define PR_RECEIVED_BY_EMAIL_ADDRESS_A PROP_TAG( PT_STRING8, 0x0076) + +#define PR_RCVD_REPRESENTING_ADDRTYPE PROP_TAG( PT_TSTRING, 0x0077) +#define PR_RCVD_REPRESENTING_ADDRTYPE_W PROP_TAG( PT_UNICODE, 0x0077) +#define PR_RCVD_REPRESENTING_ADDRTYPE_A PROP_TAG( PT_STRING8, 0x0077) +#define PR_RCVD_REPRESENTING_EMAIL_ADDRESS PROP_TAG( PT_TSTRING, 0x0078) +#define PR_RCVD_REPRESENTING_EMAIL_ADDRESS_W PROP_TAG( PT_UNICODE, 0x0078) +#define PR_RCVD_REPRESENTING_EMAIL_ADDRESS_A PROP_TAG( PT_STRING8, 0x0078) + +#define PR_ORIGINAL_AUTHOR_ADDRTYPE PROP_TAG( PT_TSTRING, 0x0079) +#define PR_ORIGINAL_AUTHOR_ADDRTYPE_W PROP_TAG( PT_UNICODE, 0x0079) +#define PR_ORIGINAL_AUTHOR_ADDRTYPE_A PROP_TAG( PT_STRING8, 0x0079) +#define PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS PROP_TAG( PT_TSTRING, 0x007A) +#define PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS_W PROP_TAG( PT_UNICODE, 0x007A) +#define PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS_A PROP_TAG( PT_STRING8, 0x007A) + +#define PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE PROP_TAG( PT_TSTRING, 0x007B) +#define PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE_W PROP_TAG( PT_UNICODE, 0x007B) +#define PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE_A PROP_TAG( PT_STRING8, 0x007B) +#define PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS PROP_TAG( PT_TSTRING, 0x007C) +#define PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS_W PROP_TAG( PT_UNICODE, 0x007C) +#define PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS_A PROP_TAG( PT_STRING8, 0x007C) + +#define PR_TRANSPORT_MESSAGE_HEADERS PROP_TAG(PT_TSTRING, 0x007D) +#define PR_TRANSPORT_MESSAGE_HEADERS_W PROP_TAG(PT_UNICODE, 0x007D) +#define PR_TRANSPORT_MESSAGE_HEADERS_A PROP_TAG(PT_STRING8, 0x007D) + +#define PR_DELEGATION PROP_TAG(PT_BINARY, 0x007E) + +#define PR_TNEF_CORRELATION_KEY PROP_TAG(PT_BINARY, 0x007F) + + + +/* + * Message content properties + */ + +#define PR_BODY PROP_TAG( PT_TSTRING, 0x1000) +#define PR_BODY_W PROP_TAG( PT_UNICODE, 0x1000) +#define PR_BODY_A PROP_TAG( PT_STRING8, 0x1000) +#define PR_REPORT_TEXT PROP_TAG( PT_TSTRING, 0x1001) +#define PR_REPORT_TEXT_W PROP_TAG( PT_UNICODE, 0x1001) +#define PR_REPORT_TEXT_A PROP_TAG( PT_STRING8, 0x1001) +#define PR_ORIGINATOR_AND_DL_EXPANSION_HISTORY PROP_TAG( PT_BINARY, 0x1002) +#define PR_REPORTING_DL_NAME PROP_TAG( PT_BINARY, 0x1003) +#define PR_REPORTING_MTA_CERTIFICATE PROP_TAG( PT_BINARY, 0x1004) + +/* Removed PR_REPORT_ORIGIN_AUTHENTICATION_CHECK with DCR 3865, use PR_ORIGIN_CHECK */ + +#define PR_RTF_SYNC_BODY_CRC PROP_TAG( PT_LONG, 0x1006) +#define PR_RTF_SYNC_BODY_COUNT PROP_TAG( PT_LONG, 0x1007) +#define PR_RTF_SYNC_BODY_TAG PROP_TAG( PT_TSTRING, 0x1008) +#define PR_RTF_SYNC_BODY_TAG_W PROP_TAG( PT_UNICODE, 0x1008) +#define PR_RTF_SYNC_BODY_TAG_A PROP_TAG( PT_STRING8, 0x1008) +#define PR_RTF_COMPRESSED PROP_TAG( PT_BINARY, 0x1009) +#define PR_RTF_SYNC_PREFIX_COUNT PROP_TAG( PT_LONG, 0x1010) +#define PR_RTF_SYNC_TRAILING_COUNT PROP_TAG( PT_LONG, 0x1011) +#define PR_ORIGINALLY_INTENDED_RECIP_ENTRYID PROP_TAG( PT_BINARY, 0x1012) + +/* + * Reserved 0x1100-0x1200 + */ + + +/* + * Message recipient properties + */ + +#define PR_CONTENT_INTEGRITY_CHECK PROP_TAG( PT_BINARY, 0x0C00) +#define PR_EXPLICIT_CONVERSION PROP_TAG( PT_LONG, 0x0C01) +#define PR_IPM_RETURN_REQUESTED PROP_TAG( PT_BOOLEAN, 0x0C02) +#define PR_MESSAGE_TOKEN PROP_TAG( PT_BINARY, 0x0C03) +#define PR_NDR_REASON_CODE PROP_TAG( PT_LONG, 0x0C04) +#define PR_NDR_DIAG_CODE PROP_TAG( PT_LONG, 0x0C05) +#define PR_NON_RECEIPT_NOTIFICATION_REQUESTED PROP_TAG( PT_BOOLEAN, 0x0C06) +#define PR_DELIVERY_POINT PROP_TAG( PT_LONG, 0x0C07) + +#define PR_ORIGINATOR_NON_DELIVERY_REPORT_REQUESTED PROP_TAG( PT_BOOLEAN, 0x0C08) +#define PR_ORIGINATOR_REQUESTED_ALTERNATE_RECIPIENT PROP_TAG( PT_BINARY, 0x0C09) +#define PR_PHYSICAL_DELIVERY_BUREAU_FAX_DELIVERY PROP_TAG( PT_BOOLEAN, 0x0C0A) +#define PR_PHYSICAL_DELIVERY_MODE PROP_TAG( PT_LONG, 0x0C0B) +#define PR_PHYSICAL_DELIVERY_REPORT_REQUEST PROP_TAG( PT_LONG, 0x0C0C) +#define PR_PHYSICAL_FORWARDING_ADDRESS PROP_TAG( PT_BINARY, 0x0C0D) +#define PR_PHYSICAL_FORWARDING_ADDRESS_REQUESTED PROP_TAG( PT_BOOLEAN, 0x0C0E) +#define PR_PHYSICAL_FORWARDING_PROHIBITED PROP_TAG( PT_BOOLEAN, 0x0C0F) +#define PR_PHYSICAL_RENDITION_ATTRIBUTES PROP_TAG( PT_BINARY, 0x0C10) +#define PR_PROOF_OF_DELIVERY PROP_TAG( PT_BINARY, 0x0C11) +#define PR_PROOF_OF_DELIVERY_REQUESTED PROP_TAG( PT_BOOLEAN, 0x0C12) +#define PR_RECIPIENT_CERTIFICATE PROP_TAG( PT_BINARY, 0x0C13) +#define PR_RECIPIENT_NUMBER_FOR_ADVICE PROP_TAG( PT_TSTRING, 0x0C14) +#define PR_RECIPIENT_NUMBER_FOR_ADVICE_W PROP_TAG( PT_UNICODE, 0x0C14) +#define PR_RECIPIENT_NUMBER_FOR_ADVICE_A PROP_TAG( PT_STRING8, 0x0C14) +#define PR_RECIPIENT_TYPE PROP_TAG( PT_LONG, 0x0C15) +#define PR_REGISTERED_MAIL_TYPE PROP_TAG( PT_LONG, 0x0C16) +#define PR_REPLY_REQUESTED PROP_TAG( PT_BOOLEAN, 0x0C17) +#define PR_REQUESTED_DELIVERY_METHOD PROP_TAG( PT_LONG, 0x0C18) +#define PR_SENDER_ENTRYID PROP_TAG( PT_BINARY, 0x0C19) +#define PR_SENDER_NAME PROP_TAG( PT_TSTRING, 0x0C1A) +#define PR_SENDER_NAME_W PROP_TAG( PT_UNICODE, 0x0C1A) +#define PR_SENDER_NAME_A PROP_TAG( PT_STRING8, 0x0C1A) +#define PR_SUPPLEMENTARY_INFO PROP_TAG( PT_TSTRING, 0x0C1B) +#define PR_SUPPLEMENTARY_INFO_W PROP_TAG( PT_UNICODE, 0x0C1B) +#define PR_SUPPLEMENTARY_INFO_A PROP_TAG( PT_STRING8, 0x0C1B) +#define PR_TYPE_OF_MTS_USER PROP_TAG( PT_LONG, 0x0C1C) +#define PR_SENDER_SEARCH_KEY PROP_TAG( PT_BINARY, 0x0C1D) +#define PR_SENDER_ADDRTYPE PROP_TAG( PT_TSTRING, 0x0C1E) +#define PR_SENDER_ADDRTYPE_W PROP_TAG( PT_UNICODE, 0x0C1E) +#define PR_SENDER_ADDRTYPE_A PROP_TAG( PT_STRING8, 0x0C1E) +#define PR_SENDER_EMAIL_ADDRESS PROP_TAG( PT_TSTRING, 0x0C1F) +#define PR_SENDER_EMAIL_ADDRESS_W PROP_TAG( PT_UNICODE, 0x0C1F) +#define PR_SENDER_EMAIL_ADDRESS_A PROP_TAG( PT_STRING8, 0x0C1F) + +/* + * Message non-transmittable properties + */ + +/* + * The two tags, PR_MESSAGE_RECIPIENTS and PR_MESSAGE_ATTACHMENTS, + * are to be used in the exclude list passed to + * IMessage::CopyTo when the caller wants either the recipients or attachments + * of the message to not get copied. It is also used in the ProblemArray + * return from IMessage::CopyTo when an error is encountered copying them + */ + +#define PR_CURRENT_VERSION PROP_TAG( PT_I8, 0x0E00) +#define PR_DELETE_AFTER_SUBMIT PROP_TAG( PT_BOOLEAN, 0x0E01) +#define PR_DISPLAY_BCC PROP_TAG( PT_TSTRING, 0x0E02) +#define PR_DISPLAY_BCC_W PROP_TAG( PT_UNICODE, 0x0E02) +#define PR_DISPLAY_BCC_A PROP_TAG( PT_STRING8, 0x0E02) +#define PR_DISPLAY_CC PROP_TAG( PT_TSTRING, 0x0E03) +#define PR_DISPLAY_CC_W PROP_TAG( PT_UNICODE, 0x0E03) +#define PR_DISPLAY_CC_A PROP_TAG( PT_STRING8, 0x0E03) +#define PR_DISPLAY_TO PROP_TAG( PT_TSTRING, 0x0E04) +#define PR_DISPLAY_TO_W PROP_TAG( PT_UNICODE, 0x0E04) +#define PR_DISPLAY_TO_A PROP_TAG( PT_STRING8, 0x0E04) +#define PR_PARENT_DISPLAY PROP_TAG( PT_TSTRING, 0x0E05) +#define PR_PARENT_DISPLAY_W PROP_TAG( PT_UNICODE, 0x0E05) +#define PR_PARENT_DISPLAY_A PROP_TAG( PT_STRING8, 0x0E05) +#define PR_MESSAGE_DELIVERY_TIME PROP_TAG( PT_SYSTIME, 0x0E06) +#define PR_MESSAGE_FLAGS PROP_TAG( PT_LONG, 0x0E07) +#define PR_MESSAGE_SIZE PROP_TAG( PT_LONG, 0x0E08) +#define PR_PARENT_ENTRYID PROP_TAG( PT_BINARY, 0x0E09) +#define PR_SENTMAIL_ENTRYID PROP_TAG( PT_BINARY, 0x0E0A) +#define PR_CORRELATE PROP_TAG( PT_BOOLEAN, 0x0E0C) +#define PR_CORRELATE_MTSID PROP_TAG( PT_BINARY, 0x0E0D) +#define PR_DISCRETE_VALUES PROP_TAG( PT_BOOLEAN, 0x0E0E) +#define PR_RESPONSIBILITY PROP_TAG( PT_BOOLEAN, 0x0E0F) +#define PR_SPOOLER_STATUS PROP_TAG( PT_LONG, 0x0E10) +#define PR_TRANSPORT_STATUS PROP_TAG( PT_LONG, 0x0E11) +#define PR_MESSAGE_RECIPIENTS PROP_TAG( PT_OBJECT, 0x0E12) +#define PR_MESSAGE_ATTACHMENTS PROP_TAG( PT_OBJECT, 0x0E13) +#define PR_SUBMIT_FLAGS PROP_TAG( PT_LONG, 0x0E14) +#define PR_RECIPIENT_STATUS PROP_TAG( PT_LONG, 0x0E15) +#define PR_TRANSPORT_KEY PROP_TAG( PT_LONG, 0x0E16) +#define PR_MSG_STATUS PROP_TAG( PT_LONG, 0x0E17) +#define PR_MESSAGE_DOWNLOAD_TIME PROP_TAG( PT_LONG, 0x0E18) +#define PR_CREATION_VERSION PROP_TAG( PT_I8, 0x0E19) +#define PR_MODIFY_VERSION PROP_TAG( PT_I8, 0x0E1A) +#define PR_HASATTACH PROP_TAG( PT_BOOLEAN, 0x0E1B) +#define PR_BODY_CRC PROP_TAG( PT_LONG, 0x0E1C) +#define PR_NORMALIZED_SUBJECT PROP_TAG( PT_TSTRING, 0x0E1D) +#define PR_NORMALIZED_SUBJECT_W PROP_TAG( PT_UNICODE, 0x0E1D) +#define PR_NORMALIZED_SUBJECT_A PROP_TAG( PT_STRING8, 0x0E1D) +#define PR_RTF_IN_SYNC PROP_TAG( PT_BOOLEAN, 0x0E1F) +#define PR_ATTACH_SIZE PROP_TAG( PT_LONG, 0x0E20) +#define PR_ATTACH_NUM PROP_TAG( PT_LONG, 0x0E21) +#define PR_PREPROCESS PROP_TAG( PT_BOOLEAN, 0x0E22) + +/* PR_ORIGINAL_DISPLAY_TO, _CC, and _BCC moved to transmittible range 03/09/95 */ + +#define PR_ORIGINATING_MTA_CERTIFICATE PROP_TAG( PT_BINARY, 0x0E25) +#define PR_PROOF_OF_SUBMISSION PROP_TAG( PT_BINARY, 0x0E26) + + +/* + * The range of non-message and non-recipient property IDs (0x3000 - 0x3FFF) is + * further broken down into ranges to make assigning new property IDs easier. + * + * From To Kind of property + * -------------------------------- + * 3000 32FF MAPI_defined common property + * 3200 33FF MAPI_defined form property + * 3400 35FF MAPI_defined message store property + * 3600 36FF MAPI_defined Folder or AB Container property + * 3700 38FF MAPI_defined attachment property + * 3900 39FF MAPI_defined address book property + * 3A00 3BFF MAPI_defined mailuser property + * 3C00 3CFF MAPI_defined DistList property + * 3D00 3DFF MAPI_defined Profile Section property + * 3E00 3EFF MAPI_defined Status property + * 3F00 3FFF MAPI_defined display table property + */ + +/* + * Properties common to numerous MAPI objects. + * + * Those properties that can appear on messages are in the + * non-transmittable range for messages. They start at the high + * end of that range and work down. + * + * Properties that never appear on messages are defined in the common + * property range (see above). + */ + +/* + * properties that are common to multiple objects (including message objects) + * -- these ids are in the non-transmittable range + */ + +#define PR_ENTRYID PROP_TAG( PT_BINARY, 0x0FFF) +#define PR_OBJECT_TYPE PROP_TAG( PT_LONG, 0x0FFE) +#define PR_ICON PROP_TAG( PT_BINARY, 0x0FFD) +#define PR_MINI_ICON PROP_TAG( PT_BINARY, 0x0FFC) +#define PR_STORE_ENTRYID PROP_TAG( PT_BINARY, 0x0FFB) +#define PR_STORE_RECORD_KEY PROP_TAG( PT_BINARY, 0x0FFA) +#define PR_RECORD_KEY PROP_TAG( PT_BINARY, 0x0FF9) +#define PR_MAPPING_SIGNATURE PROP_TAG( PT_BINARY, 0x0FF8) +#define PR_ACCESS_LEVEL PROP_TAG( PT_LONG, 0x0FF7) +#define PR_INSTANCE_KEY PROP_TAG( PT_BINARY, 0x0FF6) +#define PR_ROW_TYPE PROP_TAG( PT_LONG, 0x0FF5) +#define PR_ACCESS PROP_TAG( PT_LONG, 0x0FF4) + +/* + * properties that are common to multiple objects (usually not including message objects) + * -- these ids are in the transmittable range + */ + +#define PR_ROWID PROP_TAG( PT_LONG, 0x3000) +#define PR_DISPLAY_NAME PROP_TAG( PT_TSTRING, 0x3001) +#define PR_DISPLAY_NAME_W PROP_TAG( PT_UNICODE, 0x3001) +#define PR_DISPLAY_NAME_A PROP_TAG( PT_STRING8, 0x3001) +#define PR_ADDRTYPE PROP_TAG( PT_TSTRING, 0x3002) +#define PR_ADDRTYPE_W PROP_TAG( PT_UNICODE, 0x3002) +#define PR_ADDRTYPE_A PROP_TAG( PT_STRING8, 0x3002) +#define PR_EMAIL_ADDRESS PROP_TAG( PT_TSTRING, 0x3003) +#define PR_EMAIL_ADDRESS_W PROP_TAG( PT_UNICODE, 0x3003) +#define PR_EMAIL_ADDRESS_A PROP_TAG( PT_STRING8, 0x3003) +#define PR_COMMENT PROP_TAG( PT_TSTRING, 0x3004) +#define PR_COMMENT_W PROP_TAG( PT_UNICODE, 0x3004) +#define PR_COMMENT_A PROP_TAG( PT_STRING8, 0x3004) +#define PR_DEPTH PROP_TAG( PT_LONG, 0x3005) +#define PR_PROVIDER_DISPLAY PROP_TAG( PT_TSTRING, 0x3006) +#define PR_PROVIDER_DISPLAY_W PROP_TAG( PT_UNICODE, 0x3006) +#define PR_PROVIDER_DISPLAY_A PROP_TAG( PT_STRING8, 0x3006) +#define PR_CREATION_TIME PROP_TAG( PT_SYSTIME, 0x3007) +#define PR_LAST_MODIFICATION_TIME PROP_TAG( PT_SYSTIME, 0x3008) +#define PR_RESOURCE_FLAGS PROP_TAG( PT_LONG, 0x3009) +#define PR_PROVIDER_DLL_NAME PROP_TAG( PT_TSTRING, 0x300A) +#define PR_PROVIDER_DLL_NAME_W PROP_TAG( PT_UNICODE, 0x300A) +#define PR_PROVIDER_DLL_NAME_A PROP_TAG( PT_STRING8, 0x300A) +#define PR_SEARCH_KEY PROP_TAG( PT_BINARY, 0x300B) +#define PR_PROVIDER_UID PROP_TAG( PT_BINARY, 0x300C) +#define PR_PROVIDER_ORDINAL PROP_TAG( PT_LONG, 0x300D) + +/* + * MAPI Form properties + */ +#define PR_FORM_VERSION PROP_TAG(PT_TSTRING, 0x3301) +#define PR_FORM_VERSION_W PROP_TAG(PT_UNICODE, 0x3301) +#define PR_FORM_VERSION_A PROP_TAG(PT_STRING8, 0x3301) +#define PR_FORM_CLSID PROP_TAG(PT_CLSID, 0x3302) +#define PR_FORM_CONTACT_NAME PROP_TAG(PT_TSTRING, 0x3303) +#define PR_FORM_CONTACT_NAME_W PROP_TAG(PT_UNICODE, 0x3303) +#define PR_FORM_CONTACT_NAME_A PROP_TAG(PT_STRING8, 0x3303) +#define PR_FORM_CATEGORY PROP_TAG(PT_TSTRING, 0x3304) +#define PR_FORM_CATEGORY_W PROP_TAG(PT_UNICODE, 0x3304) +#define PR_FORM_CATEGORY_A PROP_TAG(PT_STRING8, 0x3304) +#define PR_FORM_CATEGORY_SUB PROP_TAG(PT_TSTRING, 0x3305) +#define PR_FORM_CATEGORY_SUB_W PROP_TAG(PT_UNICODE, 0x3305) +#define PR_FORM_CATEGORY_SUB_A PROP_TAG(PT_STRING8, 0x3305) +#define PR_FORM_HOST_MAP PROP_TAG(PT_MV_LONG, 0x3306) +#define PR_FORM_HIDDEN PROP_TAG(PT_BOOLEAN, 0x3307) +#define PR_FORM_DESIGNER_NAME PROP_TAG(PT_TSTRING, 0x3308) +#define PR_FORM_DESIGNER_NAME_W PROP_TAG(PT_UNICODE, 0x3308) +#define PR_FORM_DESIGNER_NAME_A PROP_TAG(PT_STRING8, 0x3308) +#define PR_FORM_DESIGNER_GUID PROP_TAG(PT_CLSID, 0x3309) +#define PR_FORM_MESSAGE_BEHAVIOR PROP_TAG(PT_LONG, 0x330A) + +/* + * Message store properties + */ + +#define PR_DEFAULT_STORE PROP_TAG( PT_BOOLEAN, 0x3400) +#define PR_STORE_SUPPORT_MASK PROP_TAG( PT_LONG, 0x340D) +#define PR_STORE_STATE PROP_TAG( PT_LONG, 0x340E) + +#define PR_IPM_SUBTREE_SEARCH_KEY PROP_TAG( PT_BINARY, 0x3410) +#define PR_IPM_OUTBOX_SEARCH_KEY PROP_TAG( PT_BINARY, 0x3411) +#define PR_IPM_WASTEBASKET_SEARCH_KEY PROP_TAG( PT_BINARY, 0x3412) +#define PR_IPM_SENTMAIL_SEARCH_KEY PROP_TAG( PT_BINARY, 0x3413) +#define PR_MDB_PROVIDER PROP_TAG( PT_BINARY, 0x3414) +#define PR_RECEIVE_FOLDER_SETTINGS PROP_TAG( PT_OBJECT, 0x3415) + +#define PR_VALID_FOLDER_MASK PROP_TAG( PT_LONG, 0x35DF) +#define PR_IPM_SUBTREE_ENTRYID PROP_TAG( PT_BINARY, 0x35E0) + +#define PR_IPM_OUTBOX_ENTRYID PROP_TAG( PT_BINARY, 0x35E2) +#define PR_IPM_WASTEBASKET_ENTRYID PROP_TAG( PT_BINARY, 0x35E3) +#define PR_IPM_SENTMAIL_ENTRYID PROP_TAG( PT_BINARY, 0x35E4) +#define PR_VIEWS_ENTRYID PROP_TAG( PT_BINARY, 0x35E5) +#define PR_COMMON_VIEWS_ENTRYID PROP_TAG( PT_BINARY, 0x35E6) +#define PR_FINDER_ENTRYID PROP_TAG( PT_BINARY, 0x35E7) + +/* Proptags 0x35E8-0x35FF reserved for folders "guaranteed" by PR_VALID_FOLDER_MASK */ + + +/* + * Folder and AB Container properties + */ + +#define PR_CONTAINER_FLAGS PROP_TAG( PT_LONG, 0x3600) +#define PR_FOLDER_TYPE PROP_TAG( PT_LONG, 0x3601) +#define PR_CONTENT_COUNT PROP_TAG( PT_LONG, 0x3602) +#define PR_CONTENT_UNREAD PROP_TAG( PT_LONG, 0x3603) +#define PR_CREATE_TEMPLATES PROP_TAG( PT_OBJECT, 0x3604) +#define PR_DETAILS_TABLE PROP_TAG( PT_OBJECT, 0x3605) +#define PR_SEARCH PROP_TAG( PT_OBJECT, 0x3607) +#define PR_SELECTABLE PROP_TAG( PT_BOOLEAN, 0x3609) +#define PR_SUBFOLDERS PROP_TAG( PT_BOOLEAN, 0x360A) +#define PR_STATUS PROP_TAG( PT_LONG, 0x360B) +#define PR_ANR PROP_TAG( PT_TSTRING, 0x360C) +#define PR_ANR_W PROP_TAG( PT_UNICODE, 0x360C) +#define PR_ANR_A PROP_TAG( PT_STRING8, 0x360C) +#define PR_CONTENTS_SORT_ORDER PROP_TAG( PT_MV_LONG, 0x360D) +#define PR_CONTAINER_HIERARCHY PROP_TAG( PT_OBJECT, 0x360E) +#define PR_CONTAINER_CONTENTS PROP_TAG( PT_OBJECT, 0x360F) +#define PR_FOLDER_ASSOCIATED_CONTENTS PROP_TAG( PT_OBJECT, 0x3610) +#define PR_DEF_CREATE_DL PROP_TAG( PT_BINARY, 0x3611) +#define PR_DEF_CREATE_MAILUSER PROP_TAG( PT_BINARY, 0x3612) +#define PR_CONTAINER_CLASS PROP_TAG( PT_TSTRING, 0x3613) +#define PR_CONTAINER_CLASS_W PROP_TAG( PT_UNICODE, 0x3613) +#define PR_CONTAINER_CLASS_A PROP_TAG( PT_STRING8, 0x3613) +#define PR_CONTAINER_MODIFY_VERSION PROP_TAG( PT_I8, 0x3614) +#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_LONG, 0x3617) + +/* Reserved 0x36C0-0x36FF */ + +/* + * Attachment properties + */ + +#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) +#define PR_ATTACH_ENCODING PROP_TAG( PT_BINARY, 0x3702) +#define PR_ATTACH_EXTENSION PROP_TAG( PT_TSTRING, 0x3703) +#define PR_ATTACH_EXTENSION_W PROP_TAG( PT_UNICODE, 0x3703) +#define PR_ATTACH_EXTENSION_A PROP_TAG( PT_STRING8, 0x3703) +#define PR_ATTACH_FILENAME PROP_TAG( PT_TSTRING, 0x3704) +#define PR_ATTACH_FILENAME_W PROP_TAG( PT_UNICODE, 0x3704) +#define PR_ATTACH_FILENAME_A PROP_TAG( PT_STRING8, 0x3704) +#define PR_ATTACH_METHOD PROP_TAG( PT_LONG, 0x3705) +#define PR_ATTACH_LONG_FILENAME PROP_TAG( PT_TSTRING, 0x3707) +#define PR_ATTACH_LONG_FILENAME_W PROP_TAG( PT_UNICODE, 0x3707) +#define PR_ATTACH_LONG_FILENAME_A PROP_TAG( PT_STRING8, 0x3707) +#define PR_ATTACH_PATHNAME PROP_TAG( PT_TSTRING, 0x3708) +#define PR_ATTACH_PATHNAME_W PROP_TAG( PT_UNICODE, 0x3708) +#define PR_ATTACH_PATHNAME_A PROP_TAG( PT_STRING8, 0x3708) +#define PR_ATTACH_RENDERING PROP_TAG( PT_BINARY, 0x3709) +#define PR_ATTACH_TAG PROP_TAG( PT_BINARY, 0x370A) +#define PR_RENDERING_POSITION PROP_TAG( PT_LONG, 0x370B) +#define PR_ATTACH_TRANSPORT_NAME PROP_TAG( PT_TSTRING, 0x370C) +#define PR_ATTACH_TRANSPORT_NAME_W PROP_TAG( PT_UNICODE, 0x370C) +#define PR_ATTACH_TRANSPORT_NAME_A PROP_TAG( PT_STRING8, 0x370C) +#define PR_ATTACH_LONG_PATHNAME PROP_TAG( PT_TSTRING, 0x370D) +#define PR_ATTACH_LONG_PATHNAME_W PROP_TAG( PT_UNICODE, 0x370D) +#define PR_ATTACH_LONG_PATHNAME_A PROP_TAG( PT_STRING8, 0x370D) +#define PR_ATTACH_MIME_TAG PROP_TAG( PT_TSTRING, 0x370E) +#define PR_ATTACH_MIME_TAG_W PROP_TAG( PT_UNICODE, 0x370E) +#define PR_ATTACH_MIME_TAG_A PROP_TAG( PT_STRING8, 0x370E) +#define PR_ATTACH_ADDITIONAL_INFO PROP_TAG( PT_BINARY, 0x370F) + +/* + * AB Object properties + */ + +#define PR_DISPLAY_TYPE PROP_TAG( PT_LONG, 0x3900) +#define PR_TEMPLATEID PROP_TAG( PT_BINARY, 0x3902) +#define PR_PRIMARY_CAPABILITY PROP_TAG( PT_BINARY, 0x3904) + + +/* + * Mail user properties + */ +#define PR_7BIT_DISPLAY_NAME PROP_TAG( PT_STRING8, 0x39FF) +#define PR_ACCOUNT PROP_TAG( PT_TSTRING, 0x3A00) +#define PR_ACCOUNT_W PROP_TAG( PT_UNICODE, 0x3A00) +#define PR_ACCOUNT_A PROP_TAG( PT_STRING8, 0x3A00) +#define PR_ALTERNATE_RECIPIENT PROP_TAG( PT_BINARY, 0x3A01) +#define PR_CALLBACK_TELEPHONE_NUMBER PROP_TAG( PT_TSTRING, 0x3A02) +#define PR_CALLBACK_TELEPHONE_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A02) +#define PR_CALLBACK_TELEPHONE_NUMBER_A PROP_TAG( PT_STRING8, 0x3A02) +#define PR_CONVERSION_PROHIBITED PROP_TAG( PT_BOOLEAN, 0x3A03) +#define PR_DISCLOSE_RECIPIENTS PROP_TAG( PT_BOOLEAN, 0x3A04) +#define PR_GENERATION PROP_TAG( PT_TSTRING, 0x3A05) +#define PR_GENERATION_W PROP_TAG( PT_UNICODE, 0x3A05) +#define PR_GENERATION_A PROP_TAG( PT_STRING8, 0x3A05) +#define PR_GIVEN_NAME PROP_TAG( PT_TSTRING, 0x3A06) +#define PR_GIVEN_NAME_W PROP_TAG( PT_UNICODE, 0x3A06) +#define PR_GIVEN_NAME_A PROP_TAG( PT_STRING8, 0x3A06) +#define PR_GOVERNMENT_ID_NUMBER PROP_TAG( PT_TSTRING, 0x3A07) +#define PR_GOVERNMENT_ID_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A07) +#define PR_GOVERNMENT_ID_NUMBER_A PROP_TAG( PT_STRING8, 0x3A07) +#define PR_BUSINESS_TELEPHONE_NUMBER PROP_TAG( PT_TSTRING, 0x3A08) +#define PR_BUSINESS_TELEPHONE_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A08) +#define PR_BUSINESS_TELEPHONE_NUMBER_A PROP_TAG( PT_STRING8, 0x3A08) +#define PR_OFFICE_TELEPHONE_NUMBER PR_BUSINESS_TELEPHONE_NUMBER +#define PR_OFFICE_TELEPHONE_NUMBER_W PR_BUSINESS_TELEPHONE_NUMBER_W +#define PR_OFFICE_TELEPHONE_NUMBER_A PR_BUSINESS_TELEPHONE_NUMBER_A +#define PR_HOME_TELEPHONE_NUMBER PROP_TAG( PT_TSTRING, 0x3A09) +#define PR_HOME_TELEPHONE_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A09) +#define PR_HOME_TELEPHONE_NUMBER_A PROP_TAG( PT_STRING8, 0x3A09) +#define PR_INITIALS PROP_TAG( PT_TSTRING, 0x3A0A) +#define PR_INITIALS_W PROP_TAG( PT_UNICODE, 0x3A0A) +#define PR_INITIALS_A PROP_TAG( PT_STRING8, 0x3A0A) +#define PR_KEYWORD PROP_TAG( PT_TSTRING, 0x3A0B) +#define PR_KEYWORD_W PROP_TAG( PT_UNICODE, 0x3A0B) +#define PR_KEYWORD_A PROP_TAG( PT_STRING8, 0x3A0B) +#define PR_LANGUAGE PROP_TAG( PT_TSTRING, 0x3A0C) +#define PR_LANGUAGE_W PROP_TAG( PT_UNICODE, 0x3A0C) +#define PR_LANGUAGE_A PROP_TAG( PT_STRING8, 0x3A0C) +#define PR_LOCATION PROP_TAG( PT_TSTRING, 0x3A0D) +#define PR_LOCATION_W PROP_TAG( PT_UNICODE, 0x3A0D) +#define PR_LOCATION_A PROP_TAG( PT_STRING8, 0x3A0D) +#define PR_MAIL_PERMISSION PROP_TAG( PT_BOOLEAN, 0x3A0E) +#define PR_MHS_COMMON_NAME PROP_TAG( PT_TSTRING, 0x3A0F) +#define PR_MHS_COMMON_NAME_W PROP_TAG( PT_UNICODE, 0x3A0F) +#define PR_MHS_COMMON_NAME_A PROP_TAG( PT_STRING8, 0x3A0F) +#define PR_ORGANIZATIONAL_ID_NUMBER PROP_TAG( PT_TSTRING, 0x3A10) +#define PR_ORGANIZATIONAL_ID_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A10) +#define PR_ORGANIZATIONAL_ID_NUMBER_A PROP_TAG( PT_STRING8, 0x3A10) +#define PR_SURNAME PROP_TAG( PT_TSTRING, 0x3A11) +#define PR_SURNAME_W PROP_TAG( PT_UNICODE, 0x3A11) +#define PR_SURNAME_A PROP_TAG( PT_STRING8, 0x3A11) +#define PR_ORIGINAL_ENTRYID PROP_TAG( PT_BINARY, 0x3A12) +#define PR_ORIGINAL_DISPLAY_NAME PROP_TAG( PT_TSTRING, 0x3A13) +#define PR_ORIGINAL_DISPLAY_NAME_W PROP_TAG( PT_UNICODE, 0x3A13) +#define PR_ORIGINAL_DISPLAY_NAME_A PROP_TAG( PT_STRING8, 0x3A13) +#define PR_ORIGINAL_SEARCH_KEY PROP_TAG( PT_BINARY, 0x3A14) +#define PR_POSTAL_ADDRESS PROP_TAG( PT_TSTRING, 0x3A15) +#define PR_POSTAL_ADDRESS_W PROP_TAG( PT_UNICODE, 0x3A15) +#define PR_POSTAL_ADDRESS_A PROP_TAG( PT_STRING8, 0x3A15) +#define PR_COMPANY_NAME PROP_TAG( PT_TSTRING, 0x3A16) +#define PR_COMPANY_NAME_W PROP_TAG( PT_UNICODE, 0x3A16) +#define PR_COMPANY_NAME_A PROP_TAG( PT_STRING8, 0x3A16) +#define PR_TITLE PROP_TAG( PT_TSTRING, 0x3A17) +#define PR_TITLE_W PROP_TAG( PT_UNICODE, 0x3A17) +#define PR_TITLE_A PROP_TAG( PT_STRING8, 0x3A17) +#define PR_DEPARTMENT_NAME PROP_TAG( PT_TSTRING, 0x3A18) +#define PR_DEPARTMENT_NAME_W PROP_TAG( PT_UNICODE, 0x3A18) +#define PR_DEPARTMENT_NAME_A PROP_TAG( PT_STRING8, 0x3A18) +#define PR_OFFICE_LOCATION PROP_TAG( PT_TSTRING, 0x3A19) +#define PR_OFFICE_LOCATION_W PROP_TAG( PT_UNICODE, 0x3A19) +#define PR_OFFICE_LOCATION_A PROP_TAG( PT_STRING8, 0x3A19) +#define PR_PRIMARY_TELEPHONE_NUMBER PROP_TAG( PT_TSTRING, 0x3A1A) +#define PR_PRIMARY_TELEPHONE_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A1A) +#define PR_PRIMARY_TELEPHONE_NUMBER_A PROP_TAG( PT_STRING8, 0x3A1A) +#define PR_BUSINESS2_TELEPHONE_NUMBER PROP_TAG( PT_TSTRING, 0x3A1B) +#define PR_BUSINESS2_TELEPHONE_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A1B) +#define PR_BUSINESS2_TELEPHONE_NUMBER_A PROP_TAG( PT_STRING8, 0x3A1B) +#define PR_OFFICE2_TELEPHONE_NUMBER PR_BUSINESS2_TELEPHONE_NUMBER +#define PR_OFFICE2_TELEPHONE_NUMBER_W PR_BUSINESS2_TELEPHONE_NUMBER_W +#define PR_OFFICE2_TELEPHONE_NUMBER_A PR_BUSINESS2_TELEPHONE_NUMBER_A +#define PR_MOBILE_TELEPHONE_NUMBER PROP_TAG( PT_TSTRING, 0x3A1C) +#define PR_MOBILE_TELEPHONE_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A1C) +#define PR_MOBILE_TELEPHONE_NUMBER_A PROP_TAG( PT_STRING8, 0x3A1C) +#define PR_CELLULAR_TELEPHONE_NUMBER PR_MOBILE_TELEPHONE_NUMBER +#define PR_CELLULAR_TELEPHONE_NUMBER_W PR_MOBILE_TELEPHONE_NUMBER_W +#define PR_CELLULAR_TELEPHONE_NUMBER_A PR_MOBILE_TELEPHONE_NUMBER_A +#define PR_RADIO_TELEPHONE_NUMBER PROP_TAG( PT_TSTRING, 0x3A1D) +#define PR_RADIO_TELEPHONE_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A1D) +#define PR_RADIO_TELEPHONE_NUMBER_A PROP_TAG( PT_STRING8, 0x3A1D) +#define PR_CAR_TELEPHONE_NUMBER PROP_TAG( PT_TSTRING, 0x3A1E) +#define PR_CAR_TELEPHONE_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A1E) +#define PR_CAR_TELEPHONE_NUMBER_A PROP_TAG( PT_STRING8, 0x3A1E) +#define PR_OTHER_TELEPHONE_NUMBER PROP_TAG( PT_TSTRING, 0x3A1F) +#define PR_OTHER_TELEPHONE_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A1F) +#define PR_OTHER_TELEPHONE_NUMBER_A PROP_TAG( PT_STRING8, 0x3A1F) +#define PR_TRANSMITABLE_DISPLAY_NAME PROP_TAG( PT_TSTRING, 0x3A20) +#define PR_TRANSMITABLE_DISPLAY_NAME_W PROP_TAG( PT_UNICODE, 0x3A20) +#define PR_TRANSMITABLE_DISPLAY_NAME_A PROP_TAG( PT_STRING8, 0x3A20) +#define PR_PAGER_TELEPHONE_NUMBER PROP_TAG( PT_TSTRING, 0x3A21) +#define PR_PAGER_TELEPHONE_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A21) +#define PR_PAGER_TELEPHONE_NUMBER_A PROP_TAG( PT_STRING8, 0x3A21) +#define PR_BEEPER_TELEPHONE_NUMBER PR_PAGER_TELEPHONE_NUMBER +#define PR_BEEPER_TELEPHONE_NUMBER_W PR_PAGER_TELEPHONE_NUMBER_W +#define PR_BEEPER_TELEPHONE_NUMBER_A PR_PAGER_TELEPHONE_NUMBER_A +#define PR_USER_CERTIFICATE PROP_TAG( PT_BINARY, 0x3A22) +#define PR_PRIMARY_FAX_NUMBER PROP_TAG( PT_TSTRING, 0x3A23) +#define PR_PRIMARY_FAX_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A23) +#define PR_PRIMARY_FAX_NUMBER_A PROP_TAG( PT_STRING8, 0x3A23) +#define PR_BUSINESS_FAX_NUMBER PROP_TAG( PT_TSTRING, 0x3A24) +#define PR_BUSINESS_FAX_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A24) +#define PR_BUSINESS_FAX_NUMBER_A PROP_TAG( PT_STRING8, 0x3A24) +#define PR_HOME_FAX_NUMBER PROP_TAG( PT_TSTRING, 0x3A25) +#define PR_HOME_FAX_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A25) +#define PR_HOME_FAX_NUMBER_A PROP_TAG( PT_STRING8, 0x3A25) +#define PR_COUNTRY PROP_TAG( PT_TSTRING, 0x3A26) +#define PR_COUNTRY_W PROP_TAG( PT_UNICODE, 0x3A26) +#define PR_COUNTRY_A PROP_TAG( PT_STRING8, 0x3A26) +#define PR_BUSINESS_ADDRESS_COUNTRY PR_COUNTRY +#define PR_BUSINESS_ADDRESS_COUNTRY_W PR_COUNTRY_W +#define PR_BUSINESS_ADDRESS_COUNTRY_A PR_COUNTRY_A + +#define PR_LOCALITY PROP_TAG( PT_TSTRING, 0x3A27) +#define PR_LOCALITY_W PROP_TAG( PT_UNICODE, 0x3A27) +#define PR_LOCALITY_A PROP_TAG( PT_STRING8, 0x3A27) +#define PR_BUSINESS_ADDRESS_CITY PR_LOCALITY +#define PR_BUSINESS_ADDRESS_CITY_W PR_LOCALITY_W +#define PR_BUSINESS_ADDRESS_CITY_A PR_LOCALITY_A + +#define PR_STATE_OR_PROVINCE PROP_TAG( PT_TSTRING, 0x3A28) +#define PR_STATE_OR_PROVINCE_W PROP_TAG( PT_UNICODE, 0x3A28) +#define PR_STATE_OR_PROVINCE_A PROP_TAG( PT_STRING8, 0x3A28) +#define PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE PR_STATE_OR_PROVINCE +#define PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE_W PR_STATE_OR_PROVINCE_W +#define PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE_A PR_STATE_OR_PROVINCE_A + +#define PR_STREET_ADDRESS PROP_TAG( PT_TSTRING, 0x3A29) +#define PR_STREET_ADDRESS_W PROP_TAG( PT_UNICODE, 0x3A29) +#define PR_STREET_ADDRESS_A PROP_TAG( PT_STRING8, 0x3A29) +#define PR_BUSINESS_ADDRESS_STREET PR_STREET_ADDRESS +#define PR_BUSINESS_ADDRESS_STREET_W PR_STREET_ADDRESS_W +#define PR_BUSINESS_ADDRESS_STREET_A PR_STREET_ADDRESS_A + +#define PR_POSTAL_CODE PROP_TAG( PT_TSTRING, 0x3A2A) +#define PR_POSTAL_CODE_W PROP_TAG( PT_UNICODE, 0x3A2A) +#define PR_POSTAL_CODE_A PROP_TAG( PT_STRING8, 0x3A2A) +#define PR_BUSINESS_ADDRESS_POSTAL_CODE PR_POSTAL_CODE +#define PR_BUSINESS_ADDRESS_POSTAL_CODE_W PR_POSTAL_CODE_W +#define PR_BUSINESS_ADDRESS_POSTAL_CODE_A PR_POSTAL_CODE_A + + +#define PR_POST_OFFICE_BOX PROP_TAG( PT_TSTRING, 0x3A2B) +#define PR_POST_OFFICE_BOX_W PROP_TAG( PT_UNICODE, 0x3A2B) +#define PR_POST_OFFICE_BOX_A PROP_TAG( PT_STRING8, 0x3A2B) +#define PR_BUSINESS_ADDRESS_POST_OFFICE_BOX PR_POST_OFFICE_BOX +#define PR_BUSINESS_ADDRESS_POST_OFFICE_BOX_W PR_POST_OFFICE_BOX_W +#define PR_BUSINESS_ADDRESS_POST_OFFICE_BOX_A PR_POST_OFFICE_BOX_A + + +#define PR_TELEX_NUMBER PROP_TAG( PT_TSTRING, 0x3A2C) +#define PR_TELEX_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A2C) +#define PR_TELEX_NUMBER_A PROP_TAG( PT_STRING8, 0x3A2C) +#define PR_ISDN_NUMBER PROP_TAG( PT_TSTRING, 0x3A2D) +#define PR_ISDN_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A2D) +#define PR_ISDN_NUMBER_A PROP_TAG( PT_STRING8, 0x3A2D) +#define PR_ASSISTANT_TELEPHONE_NUMBER PROP_TAG( PT_TSTRING, 0x3A2E) +#define PR_ASSISTANT_TELEPHONE_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A2E) +#define PR_ASSISTANT_TELEPHONE_NUMBER_A PROP_TAG( PT_STRING8, 0x3A2E) +#define PR_HOME2_TELEPHONE_NUMBER PROP_TAG( PT_TSTRING, 0x3A2F) +#define PR_HOME2_TELEPHONE_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A2F) +#define PR_HOME2_TELEPHONE_NUMBER_A PROP_TAG( PT_STRING8, 0x3A2F) +#define PR_ASSISTANT PROP_TAG( PT_TSTRING, 0x3A30) +#define PR_ASSISTANT_W PROP_TAG( PT_UNICODE, 0x3A30) +#define PR_ASSISTANT_A PROP_TAG( PT_STRING8, 0x3A30) +#define PR_SEND_RICH_INFO PROP_TAG( PT_BOOLEAN, 0x3A40) + +#define PR_WEDDING_ANNIVERSARY PROP_TAG( PT_SYSTIME, 0x3A41) +#define PR_BIRTHDAY PROP_TAG( PT_SYSTIME, 0x3A42) + + +#define PR_HOBBIES PROP_TAG( PT_TSTRING, 0x3A43) +#define PR_HOBBIES_W PROP_TAG( PT_UNICODE, 0x3A43) +#define PR_HOBBIES_A PROP_TAG( PT_STRING8, 0x3A43) + +#define PR_MIDDLE_NAME PROP_TAG( PT_TSTRING, 0x3A44) +#define PR_MIDDLE_NAME_W PROP_TAG( PT_UNICODE, 0x3A44) +#define PR_MIDDLE_NAME_A PROP_TAG( PT_STRING8, 0x3A44) + +#define PR_DISPLAY_NAME_PREFIX PROP_TAG( PT_TSTRING, 0x3A45) +#define PR_DISPLAY_NAME_PREFIX_W PROP_TAG( PT_UNICODE, 0x3A45) +#define PR_DISPLAY_NAME_PREFIX_A PROP_TAG( PT_STRING8, 0x3A45) + +#define PR_PROFESSION PROP_TAG( PT_TSTRING, 0x3A46) +#define PR_PROFESSION_W PROP_TAG( PT_UNICODE, 0x3A46) +#define PR_PROFESSION_A PROP_TAG( PT_STRING8, 0x3A46) + +#define PR_PREFERRED_BY_NAME PROP_TAG( PT_TSTRING, 0x3A47) +#define PR_PREFERRED_BY_NAME_W PROP_TAG( PT_UNICODE, 0x3A47) +#define PR_PREFERRED_BY_NAME_A PROP_TAG( PT_STRING8, 0x3A47) + +#define PR_SPOUSE_NAME PROP_TAG( PT_TSTRING, 0x3A48) +#define PR_SPOUSE_NAME_W PROP_TAG( PT_UNICODE, 0x3A48) +#define PR_SPOUSE_NAME_A PROP_TAG( PT_STRING8, 0x3A48) + +#define PR_COMPUTER_NETWORK_NAME PROP_TAG( PT_TSTRING, 0x3A49) +#define PR_COMPUTER_NETWORK_NAME_W PROP_TAG( PT_UNICODE, 0x3A49) +#define PR_COMPUTER_NETWORK_NAME_A PROP_TAG( PT_STRING8, 0x3A49) + +#define PR_CUSTOMER_ID PROP_TAG( PT_TSTRING, 0x3A4A) +#define PR_CUSTOMER_ID_W PROP_TAG( PT_UNICODE, 0x3A4A) +#define PR_CUSTOMER_ID_A PROP_TAG( PT_STRING8, 0x3A4A) + +#define PR_TTYTDD_PHONE_NUMBER PROP_TAG( PT_TSTRING, 0x3A4B) +#define PR_TTYTDD_PHONE_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A4B) +#define PR_TTYTDD_PHONE_NUMBER_A PROP_TAG( PT_STRING8, 0x3A4B) + +#define PR_FTP_SITE PROP_TAG( PT_TSTRING, 0x3A4C) +#define PR_FTP_SITE_W PROP_TAG( PT_UNICODE, 0x3A4C) +#define PR_FTP_SITE_A PROP_TAG( PT_STRING8, 0x3A4C) + +#define PR_GENDER PROP_TAG( PT_SHORT, 0x3A4D) + +#define PR_MANAGER_NAME PROP_TAG( PT_TSTRING, 0x3A4E) +#define PR_MANAGER_NAME_W PROP_TAG( PT_UNICODE, 0x3A4E) +#define PR_MANAGER_NAME_A PROP_TAG( PT_STRING8, 0x3A4E) + +#define PR_NICKNAME PROP_TAG( PT_TSTRING, 0x3A4F) +#define PR_NICKNAME_W PROP_TAG( PT_UNICODE, 0x3A4F) +#define PR_NICKNAME_A PROP_TAG( PT_STRING8, 0x3A4F) + +#define PR_PERSONAL_HOME_PAGE PROP_TAG( PT_TSTRING, 0x3A50) +#define PR_PERSONAL_HOME_PAGE_W PROP_TAG( PT_UNICODE, 0x3A50) +#define PR_PERSONAL_HOME_PAGE_A PROP_TAG( PT_STRING8, 0x3A50) + + +#define PR_BUSINESS_HOME_PAGE PROP_TAG( PT_TSTRING, 0x3A51) +#define PR_BUSINESS_HOME_PAGE_W PROP_TAG( PT_UNICODE, 0x3A51) +#define PR_BUSINESS_HOME_PAGE_A PROP_TAG( PT_STRING8, 0x3A51) + +#define PR_CONTACT_VERSION PROP_TAG( PT_CLSID, 0x3A52) +#define PR_CONTACT_ENTRYIDS PROP_TAG( PT_MV_BINARY, 0x3A53) + +#define PR_CONTACT_ADDRTYPES PROP_TAG( PT_MV_TSTRING, 0x3A54) +#define PR_CONTACT_ADDRTYPES_W PROP_TAG( PT_MV_UNICODE, 0x3A54) +#define PR_CONTACT_ADDRTYPES_A PROP_TAG( PT_MV_STRING8, 0x3A54) + +#define PR_CONTACT_DEFAULT_ADDRESS_INDEX PROP_TAG( PT_LONG, 0x3A55) + +#define PR_CONTACT_EMAIL_ADDRESSES PROP_TAG( PT_MV_TSTRING, 0x3A56) +#define PR_CONTACT_EMAIL_ADDRESSES_W PROP_TAG( PT_MV_UNICODE, 0x3A56) +#define PR_CONTACT_EMAIL_ADDRESSES_A PROP_TAG( PT_MV_STRING8, 0x3A56) + + +#define PR_COMPANY_MAIN_PHONE_NUMBER PROP_TAG( PT_TSTRING, 0x3A57) +#define PR_COMPANY_MAIN_PHONE_NUMBER_W PROP_TAG( PT_UNICODE, 0x3A57) +#define PR_COMPANY_MAIN_PHONE_NUMBER_A PROP_TAG( PT_STRING8, 0x3A57) + +#define PR_CHILDRENS_NAMES PROP_TAG( PT_MV_TSTRING, 0x3A58) +#define PR_CHILDRENS_NAMES_W PROP_TAG( PT_MV_UNICODE, 0x3A58) +#define PR_CHILDRENS_NAMES_A PROP_TAG( PT_MV_STRING8, 0x3A58) + + + +#define PR_HOME_ADDRESS_CITY PROP_TAG( PT_TSTRING, 0x3A59) +#define PR_HOME_ADDRESS_CITY_W PROP_TAG( PT_UNICODE, 0x3A59) +#define PR_HOME_ADDRESS_CITY_A PROP_TAG( PT_STRING8, 0x3A59) + +#define PR_HOME_ADDRESS_COUNTRY PROP_TAG( PT_TSTRING, 0x3A5A) +#define PR_HOME_ADDRESS_COUNTRY_W PROP_TAG( PT_UNICODE, 0x3A5A) +#define PR_HOME_ADDRESS_COUNTRY_A PROP_TAG( PT_STRING8, 0x3A5A) + +#define PR_HOME_ADDRESS_POSTAL_CODE PROP_TAG( PT_TSTRING, 0x3A5B) +#define PR_HOME_ADDRESS_POSTAL_CODE_W PROP_TAG( PT_UNICODE, 0x3A5B) +#define PR_HOME_ADDRESS_POSTAL_CODE_A PROP_TAG( PT_STRING8, 0x3A5B) + +#define PR_HOME_ADDRESS_STATE_OR_PROVINCE PROP_TAG( PT_TSTRING, 0x3A5C) +#define PR_HOME_ADDRESS_STATE_OR_PROVINCE_W PROP_TAG( PT_UNICODE, 0x3A5C) +#define PR_HOME_ADDRESS_STATE_OR_PROVINCE_A PROP_TAG( PT_STRING8, 0x3A5C) + +#define PR_HOME_ADDRESS_STREET PROP_TAG( PT_TSTRING, 0x3A5D) +#define PR_HOME_ADDRESS_STREET_W PROP_TAG( PT_UNICODE, 0x3A5D) +#define PR_HOME_ADDRESS_STREET_A PROP_TAG( PT_STRING8, 0x3A5D) + +#define PR_HOME_ADDRESS_POST_OFFICE_BOX PROP_TAG( PT_TSTRING, 0x3A5E) +#define PR_HOME_ADDRESS_POST_OFFICE_BOX_W PROP_TAG( PT_UNICODE, 0x3A5E) +#define PR_HOME_ADDRESS_POST_OFFICE_BOX_A PROP_TAG( PT_STRING8, 0x3A5E) + +#define PR_OTHER_ADDRESS_CITY PROP_TAG( PT_TSTRING, 0x3A5F) +#define PR_OTHER_ADDRESS_CITY_W PROP_TAG( PT_UNICODE, 0x3A5F) +#define PR_OTHER_ADDRESS_CITY_A PROP_TAG( PT_STRING8, 0x3A5F) + +#define PR_OTHER_ADDRESS_COUNTRY PROP_TAG( PT_TSTRING, 0x3A60) +#define PR_OTHER_ADDRESS_COUNTRY_W PROP_TAG( PT_UNICODE, 0x3A60) +#define PR_OTHER_ADDRESS_COUNTRY_A PROP_TAG( PT_STRING8, 0x3A60) + +#define PR_OTHER_ADDRESS_POSTAL_CODE PROP_TAG( PT_TSTRING, 0x3A61) +#define PR_OTHER_ADDRESS_POSTAL_CODE_W PROP_TAG( PT_UNICODE, 0x3A61) +#define PR_OTHER_ADDRESS_POSTAL_CODE_A PROP_TAG( PT_STRING8, 0x3A61) + +#define PR_OTHER_ADDRESS_STATE_OR_PROVINCE PROP_TAG( PT_TSTRING, 0x3A62) +#define PR_OTHER_ADDRESS_STATE_OR_PROVINCE_W PROP_TAG( PT_UNICODE, 0x3A62) +#define PR_OTHER_ADDRESS_STATE_OR_PROVINCE_A PROP_TAG( PT_STRING8, 0x3A62) + +#define PR_OTHER_ADDRESS_STREET PROP_TAG( PT_TSTRING, 0x3A63) +#define PR_OTHER_ADDRESS_STREET_W PROP_TAG( PT_UNICODE, 0x3A63) +#define PR_OTHER_ADDRESS_STREET_A PROP_TAG( PT_STRING8, 0x3A63) + +#define PR_OTHER_ADDRESS_POST_OFFICE_BOX PROP_TAG( PT_TSTRING, 0x3A64) +#define PR_OTHER_ADDRESS_POST_OFFICE_BOX_W PROP_TAG( PT_UNICODE, 0x3A64) +#define PR_OTHER_ADDRESS_POST_OFFICE_BOX_A PROP_TAG( PT_STRING8, 0x3A64) + + +/* + * Profile section properties + */ + +#define PR_STORE_PROVIDERS PROP_TAG( PT_BINARY, 0x3D00) +#define PR_AB_PROVIDERS PROP_TAG( PT_BINARY, 0x3D01) +#define PR_TRANSPORT_PROVIDERS PROP_TAG( PT_BINARY, 0x3D02) + +#define PR_DEFAULT_PROFILE PROP_TAG( PT_BOOLEAN, 0x3D04) +#define PR_AB_SEARCH_PATH PROP_TAG( PT_MV_BINARY, 0x3D05) +#define PR_AB_DEFAULT_DIR PROP_TAG( PT_BINARY, 0x3D06) +#define PR_AB_DEFAULT_PAB PROP_TAG( PT_BINARY, 0x3D07) + +#define PR_FILTERING_HOOKS PROP_TAG( PT_BINARY, 0x3D08) +#define PR_SERVICE_NAME PROP_TAG( PT_TSTRING, 0x3D09) +#define PR_SERVICE_NAME_W PROP_TAG( PT_UNICODE, 0x3D09) +#define PR_SERVICE_NAME_A PROP_TAG( PT_STRING8, 0x3D09) +#define PR_SERVICE_DLL_NAME PROP_TAG( PT_TSTRING, 0x3D0A) +#define PR_SERVICE_DLL_NAME_W PROP_TAG( PT_UNICODE, 0x3D0A) +#define PR_SERVICE_DLL_NAME_A PROP_TAG( PT_STRING8, 0x3D0A) +#define PR_SERVICE_ENTRY_NAME PROP_TAG( PT_STRING8, 0x3D0B) +#define PR_SERVICE_UID PROP_TAG( PT_BINARY, 0x3D0C) +#define PR_SERVICE_EXTRA_UIDS PROP_TAG( PT_BINARY, 0x3D0D) +#define PR_SERVICES PROP_TAG( PT_BINARY, 0x3D0E) +#define PR_SERVICE_SUPPORT_FILES PROP_TAG( PT_MV_TSTRING, 0x3D0F) +#define PR_SERVICE_SUPPORT_FILES_W PROP_TAG( PT_MV_UNICODE, 0x3D0F) +#define PR_SERVICE_SUPPORT_FILES_A PROP_TAG( PT_MV_STRING8, 0x3D0F) +#define PR_SERVICE_DELETE_FILES PROP_TAG( PT_MV_TSTRING, 0x3D10) +#define PR_SERVICE_DELETE_FILES_W PROP_TAG( PT_MV_UNICODE, 0x3D10) +#define PR_SERVICE_DELETE_FILES_A PROP_TAG( PT_MV_STRING8, 0x3D10) +#define PR_AB_SEARCH_PATH_UPDATE PROP_TAG( PT_BINARY, 0x3D11) +#define PR_PROFILE_NAME PROP_TAG( PT_TSTRING, 0x3D12) +#define PR_PROFILE_NAME_A PROP_TAG( PT_STRING8, 0x3D12) +#define PR_PROFILE_NAME_W PROP_TAG( PT_UNICODE, 0x3D12) + +/* + * Status object properties + */ + +#define PR_IDENTITY_DISPLAY PROP_TAG( PT_TSTRING, 0x3E00) +#define PR_IDENTITY_DISPLAY_W PROP_TAG( PT_UNICODE, 0x3E00) +#define PR_IDENTITY_DISPLAY_A PROP_TAG( PT_STRING8, 0x3E00) +#define PR_IDENTITY_ENTRYID PROP_TAG( PT_BINARY, 0x3E01) +#define PR_RESOURCE_METHODS PROP_TAG( PT_LONG, 0x3E02) +#define PR_RESOURCE_TYPE PROP_TAG( PT_LONG, 0x3E03) +#define PR_STATUS_CODE PROP_TAG( PT_LONG, 0x3E04) +#define PR_IDENTITY_SEARCH_KEY PROP_TAG( PT_BINARY, 0x3E05) +#define PR_OWN_STORE_ENTRYID PROP_TAG( PT_BINARY, 0x3E06) +#define PR_RESOURCE_PATH PROP_TAG( PT_TSTRING, 0x3E07) +#define PR_RESOURCE_PATH_W PROP_TAG( PT_UNICODE, 0x3E07) +#define PR_RESOURCE_PATH_A PROP_TAG( PT_STRING8, 0x3E07) +#define PR_STATUS_STRING PROP_TAG( PT_TSTRING, 0x3E08) +#define PR_STATUS_STRING_W PROP_TAG( PT_UNICODE, 0x3E08) +#define PR_STATUS_STRING_A PROP_TAG( PT_STRING8, 0x3E08) +#define PR_X400_DEFERRED_DELIVERY_CANCEL PROP_TAG( PT_BOOLEAN, 0x3E09) +#define PR_HEADER_FOLDER_ENTRYID PROP_TAG( PT_BINARY, 0x3E0A) +#define PR_REMOTE_PROGRESS PROP_TAG( PT_LONG, 0x3E0B) +#define PR_REMOTE_PROGRESS_TEXT PROP_TAG( PT_TSTRING, 0x3E0C) +#define PR_REMOTE_PROGRESS_TEXT_W PROP_TAG( PT_UNICODE, 0x3E0C) +#define PR_REMOTE_PROGRESS_TEXT_A PROP_TAG( PT_STRING8, 0x3E0C) +#define PR_REMOTE_VALIDATE_OK PROP_TAG( PT_BOOLEAN, 0x3E0D) + +/* + * Display table properties + */ + +#define PR_CONTROL_FLAGS PROP_TAG( PT_LONG, 0x3F00) +#define PR_CONTROL_STRUCTURE PROP_TAG( PT_BINARY, 0x3F01) +#define PR_CONTROL_TYPE PROP_TAG( PT_LONG, 0x3F02) +#define PR_DELTAX PROP_TAG( PT_LONG, 0x3F03) +#define PR_DELTAY PROP_TAG( PT_LONG, 0x3F04) +#define PR_XPOS PROP_TAG( PT_LONG, 0x3F05) +#define PR_YPOS PROP_TAG( PT_LONG, 0x3F06) +#define PR_CONTROL_ID PROP_TAG( PT_BINARY, 0x3F07) +#define PR_INITIAL_DETAILS_PANE PROP_TAG( PT_LONG, 0x3F08) + +/* + * Secure property id range + */ + +#define PROP_ID_SECURE_MIN 0x67F0 +#define PROP_ID_SECURE_MAX 0x67FF + + +#endif /* MAPITAGS_H */ diff --git a/comm/mailnews/mapi/include/mapiutil.h b/comm/mailnews/mapi/include/mapiutil.h new file mode 100644 index 0000000000..a08634cbff --- /dev/null +++ b/comm/mailnews/mapi/include/mapiutil.h @@ -0,0 +1,889 @@ +/* + * M A P I U T I L . H + * + * Definitions and prototypes for utility functions provided by MAPI + * in MAPI[xx].DLL. + * + * Copyright (c) 2009 Microsoft Corporation. All Rights Reserved. + */ + +#ifndef _MAPIUTIL_H_ +#define _MAPIUTIL_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#if defined (WIN64) && !defined (_WIN64) +#define _WIN64 +#endif + +/* + * Under Win64 systems Win32 is also defined for backwards compatibility. + */ + +#if defined (WIN32) && !defined (_WIN32) +#define _WIN32 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef MAPIX_H +#include <mapix.h> +#endif + +#ifndef BEGIN_INTERFACE +#define BEGIN_INTERFACE +#endif + + +/* IMAPITable in memory */ + +/* ITableData Interface ---------------------------------------------------- */ + +DECLARE_MAPI_INTERFACE_PTR(ITableData, LPTABLEDATA); + +typedef void (STDAPICALLTYPE CALLERRELEASE)( + ULONG_PTR ulCallerData, + LPTABLEDATA lpTblData, + LPMAPITABLE lpVue +); + +#define MAPI_ITABLEDATA_METHODS(IPURE) \ + MAPIMETHOD(HrGetView) \ + (THIS_ LPSSortOrderSet lpSSortOrderSet, \ + CALLERRELEASE FAR * lpfCallerRelease, \ + ULONG_PTR ulCallerData, \ + LPMAPITABLE FAR * lppMAPITable) IPURE; \ + MAPIMETHOD(HrModifyRow) \ + (THIS_ LPSRow) IPURE; \ + MAPIMETHOD(HrDeleteRow) \ + (THIS_ LPSPropValue lpSPropValue) IPURE; \ + MAPIMETHOD(HrQueryRow) \ + (THIS_ LPSPropValue lpsPropValue, \ + LPSRow FAR * lppSRow, \ + ULONG FAR * lpuliRow) IPURE; \ + MAPIMETHOD(HrEnumRow) \ + (THIS_ ULONG ulRowNumber, \ + LPSRow FAR * lppSRow) IPURE; \ + MAPIMETHOD(HrNotify) \ + (THIS_ ULONG ulFlags, \ + ULONG cValues, \ + LPSPropValue lpSPropValue) IPURE; \ + MAPIMETHOD(HrInsertRow) \ + (THIS_ ULONG uliRow, \ + LPSRow lpSRow) IPURE; \ + MAPIMETHOD(HrModifyRows) \ + (THIS_ ULONG ulFlags, \ + LPSRowSet lpSRowSet) IPURE; \ + MAPIMETHOD(HrDeleteRows) \ + (THIS_ ULONG ulFlags, \ + LPSRowSet lprowsetToDelete, \ + ULONG FAR * cRowsDeleted) IPURE; \ + +#undef INTERFACE +#define INTERFACE ITableData +DECLARE_MAPI_INTERFACE_(ITableData, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_ITABLEDATA_METHODS(PURE) +}; + + +/* Entry Point for in memory ITable */ + + +/* CreateTable() + * Creates the internal memory structures and object handle + * to bring a new table into existence. + * + * lpInterface + * Interface ID of the TableData object (IID_IMAPITableData) + * + * lpAllocateBuffer, lpAllocateMore, and lpFreeBuffer + * Function addresses are provided by the caller so that + * this DLL allocates/frees memory appropriately. + * lpvReserved + * Reserved. Should be NULL. + * ulTableType + * TBLTYPE_DYNAMIC, etc. Visible to the calling application + * as part of the GetStatus return data on its views + * ulPropTagIndexColumn + * Index column for use when changing the data + * lpSPropTagArrayColumns + * Column proptags for the minimum set of columns in the table + * lppTableData + * Address of the pointer which will receive the TableData object + */ + +STDAPI_(SCODE) +CreateTable( LPCIID lpInterface, + ALLOCATEBUFFER FAR * lpAllocateBuffer, + ALLOCATEMORE FAR * lpAllocateMore, + FREEBUFFER FAR * lpFreeBuffer, + LPVOID lpvReserved, + ULONG ulTableType, + ULONG ulPropTagIndexColumn, + LPSPropTagArray lpSPropTagArrayColumns, + LPTABLEDATA FAR * lppTableData ); + +/* HrGetView() + * This function obtains a new view on the underlying data + * which supports the IMAPITable interface. All rows and columns + * of the underlying table data are initially visible + * lpSSortOrderSet + * if specified, results in the view being sorted + * lpfCallerRelease + * pointer to a routine to be called when the view is released, or + * NULL. + * ulCallerData + * arbitrary data the caller wants saved with this view and returned in + * the Release callback. + */ + +/* HrModifyRows() + * Add or modify a set of rows in the table data + * ulFlags + * Must be zero + * lpSRowSet + * Each row in the row set contains all the properties for one row + * in the table. One of the properties must be the index column. Any + * row in the table with the same value for its index column is + * replaced, or if there is no current row with that value the + * row is added. + * Each row in LPSRowSet MUST have a unique Index column! + * If any views are open, the view is updated as well. + * The properties do not have to be in the same order as the + * columns in the current table + */ + +/* HrModifyRow() + * Add or modify one row in the table + * lpSRow + * This row contains all the properties for one row in the table. + * One of the properties must be the index column. Any row in + * the table with the same value for its index column is + * replaced, or if there is no current row with that value the + * row is added + * If any views are open, the view is updated as well. + * The properties do not have to be in the same order as the + * columns in the current table + */ + +/* HrDeleteRows() + * Delete a row in the table. + * ulFlags + * TAD_ALL_ROWS - Causes all rows in the table to be deleted + * lpSRowSet is ignored in this case. + * lpSRowSet + * Each row in the row set contains all the properties for one row + * in the table. One of the properties must be the index column. Any + * row in the table with the same value for its index column is + * deleted. + * Each row in LPSRowSet MUST have a unique Index column! + * If any views are open, the view is updated as well. + * The properties do not have to be in the same order as the + * columns in the current table + */ +#define TAD_ALL_ROWS 1 + +/* HrDeleteRow() + * Delete a row in the table. + * lpSPropValue + * This property value specifies the row which has this value + * for its index column + */ + +/* HrQueryRow() + * Returns the values of a specified row in the table + * lpSPropValue + * This property value specifies the row which has this value + * for its index column + * lppSRow + * Address of where to return a pointer to an SRow + * lpuliRow + * Address of where to return the row number. This can be NULL + * if the row number is not required. + * + */ + +/* HrEnumRow() + * Returns the values of a specific (numbered) row in the table + * ulRowNumber + * Indicates row number 0 to n-1 + * lppSRow + * Address of where to return a pointer to a SRow + */ + +/* HrInsertRow() + * Inserts a row into the table. + * uliRow + * The row number before which this row will be inserted into the table. + * Row numbers can be from 0 to n where o to n-1 result in row insertion + * a row number of n results in the row being appended to the table. + * lpSRow + * This row contains all the properties for one row in the table. + * One of the properties must be the index column. Any row in + * the table with the same value for its index column is + * replaced, or if there is no current row with that value the + * row is added + * If any views are open, the view is updated as well. + * The properties do not have to be in the same order as the + * columns in the current table + */ + + +/* IMAPIProp in memory */ + +/* IPropData Interface ---------------------------------------------------- */ + + +#define MAPI_IPROPDATA_METHODS(IPURE) \ + MAPIMETHOD(HrSetObjAccess) \ + (THIS_ ULONG ulAccess) IPURE; \ + MAPIMETHOD(HrSetPropAccess) \ + (THIS_ LPSPropTagArray lpPropTagArray, \ + ULONG FAR * rgulAccess) IPURE; \ + MAPIMETHOD(HrGetPropAccess) \ + (THIS_ LPSPropTagArray FAR * lppPropTagArray, \ + ULONG FAR * FAR * lprgulAccess) IPURE; \ + MAPIMETHOD(HrAddObjProps) \ + (THIS_ LPSPropTagArray lppPropTagArray, \ + LPSPropProblemArray FAR * lprgulAccess) IPURE; + + +#undef INTERFACE +#define INTERFACE IPropData +DECLARE_MAPI_INTERFACE_(IPropData, IMAPIProp) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIPROP_METHODS(PURE) + MAPI_IPROPDATA_METHODS(PURE) +}; + +DECLARE_MAPI_INTERFACE_PTR(IPropData, LPPROPDATA); + + +/* Entry Point for in memory IMAPIProp */ + + +/* CreateIProp() + * Creates the internal memory structures and object handle + * to bring a new property interface into existence. + * + * lpInterface + * Interface ID of the TableData object (IID_IMAPIPropData) + * + * lpAllocateBuffer, lpAllocateMore, and lpFreeBuffer + * Function addresses are provided by the caller so that + * this DLL allocates/frees memory appropriately. + * lppPropData + * Address of the pointer which will receive the IPropData object + * lpvReserved + * Reserved. Should be NULL. + */ + +STDAPI_(SCODE) +CreateIProp( LPCIID lpInterface, + ALLOCATEBUFFER FAR * lpAllocateBuffer, + ALLOCATEMORE FAR * lpAllocateMore, + FREEBUFFER FAR * lpFreeBuffer, + LPVOID lpvReserved, + LPPROPDATA FAR * lppPropData ); + +/* + * Defines for prop/obj access + */ +#define IPROP_READONLY ((ULONG) 0x00000001) +#define IPROP_READWRITE ((ULONG) 0x00000002) +#define IPROP_CLEAN ((ULONG) 0x00010000) +#define IPROP_DIRTY ((ULONG) 0x00020000) + +/* + - HrSetPropAccess + - + * Sets access right attributes on a per-property basis. By default, + * all properties are read/write. + * + */ + +/* + - HrSetObjAccess + - + * Sets access rights for the object itself. By default, the object has + * read/write access. + * + */ + +#ifndef NOIDLEENGINE + +/* Idle time scheduler */ + +/* + * PRI + * + * Priority of an idle task. + * The idle engine sorts tasks by priority, and the one with the higher + * value runs first. Within a priority level, the functions are called + * round-robin. + */ + +#define PRILOWEST -32768 +#define PRIHIGHEST 32767 +#define PRIUSER 0 + +/* + * IRO + * + * Idle routine options. This is a combined bit mask consisting of + * individual firo's. Listed below are the possible bit flags. + * + * FIROWAIT and FIROINTERVAL are mutually exclusive. + * If neither of the flags are specified, the default action + * is to ignore the time parameter of the idle function and + * call it as often as possible if firoPerBlock is not set; + * otherwise call it one time only during the idle block + * once the time constraint has been set. FIROINTERVAL + * is also incompatible with FIROPERBLOCK. + * + * FIROWAIT - time given is minimum idle time before calling + * for the first time in the block of idle time, + * afterwhich call as often as possible. + * FIROINTERVAL - time given is minimum interval between each + * successive call + * FIROPERBLOCK - called only once per contiguous block of idle + * time + * FIRODISABLED - initially disabled when registered, the + * default is to enable the function when registered. + * FIROONCEONLY - called only one time by the scheduler and then + * deregistered automatically. + */ + +#define IRONULL ((USHORT) 0x0000) +#define FIROWAIT ((USHORT) 0x0001) +#define FIROINTERVAL ((USHORT) 0x0002) +#define FIROPERBLOCK ((USHORT) 0x0004) +#define FIRODISABLED ((USHORT) 0x0020) +#define FIROONCEONLY ((USHORT) 0x0040) + +/* + * IRC + * + * Idle routine change options. This is a combined bit mask consisting + * of individual firc's; each one identifies an aspect of the idle task + * that can be changed. + * + */ + +#define IRCNULL ((USHORT) 0x0000) +#define FIRCPFN ((USHORT) 0x0001) /* change function pointer */ +#define FIRCPV ((USHORT) 0x0002) /* change parameter block */ +#define FIRCPRI ((USHORT) 0x0004) /* change priority */ +#define FIRCCSEC ((USHORT) 0x0008) /* change time */ +#define FIRCIRO ((USHORT) 0x0010) /* change routine options */ + +/* + * Type definition for idle functions. An idle function takes one + * parameter, an PV, and returns a BOOL value. + */ + +typedef BOOL (STDAPICALLTYPE FNIDLE) (LPVOID); +typedef FNIDLE FAR *PFNIDLE; + +/* + * FTG + * + * Function Tag. Used to identify a registered idle function. + * + */ + +typedef void FAR *FTG; +typedef FTG FAR *PFTG; +#define FTGNULL ((FTG) NULL) + +/* + - MAPIInitIdle/MAPIDeinitIdle + - + * Purpose: + * Initialises the idle engine + * If the initialisation succeeded, returns 0, else returns -1 + * + * Arguments: + * lpvReserved Reserved, must be NULL. + */ + +STDAPI_(LONG) +MAPIInitIdle (LPVOID lpvReserved); + +STDAPI_(VOID) +MAPIDeinitIdle (VOID); + + +/* + * FtgRegisterIdleRoutine + * + * Registers the function pfn of type PFNIDLE, i.e., (BOOL (*)(LPVOID)) + * as an idle function. + * + * The idle function will be called with the parameter pv by the + * idle engine. The function has initial priority priIdle, + * associated time csecIdle, and options iroIdle. + */ + +STDAPI_(FTG) +FtgRegisterIdleRoutine (PFNIDLE lpfnIdle, LPVOID lpvIdleParam, + short priIdle, ULONG csecIdle, USHORT iroIdle); + +/* + * DeregisterIdleRoutine + * + * Removes the given routine from the list of idle routines. + * The routine will not be called again. It is the responsibility + * of the caller to clean up any data structures pointed to by the + * pvIdleParam parameter; this routine does not free the block. + */ + +STDAPI_(void) +DeregisterIdleRoutine (FTG ftg); + +/* + * EnableIdleRoutine + * + * Enables or disables an idle routine. + */ + +STDAPI_(void) +EnableIdleRoutine (FTG ftg, BOOL fEnable); + +/* + * ChangeIdleRoutine + * + * Changes some or all of the characteristics of the given idle + * function. The changes to make are indicated with flags in the + * ircIdle parameter. + */ + +STDAPI_(void) +ChangeIdleRoutine (FTG ftg, PFNIDLE lpfnIdle, LPVOID lpvIdleParam, + short priIdle, ULONG csecIdle, USHORT iroIdle, USHORT ircIdle); + + +#endif /* ! NOIDLEENGINE */ + + +/* IMalloc Utilities */ + +STDAPI_(LPMALLOC) MAPIGetDefaultMalloc(VOID); + + +/* StreamOnFile (SOF) */ + +/* + * Methods and #define's for implementing an OLE 2.0 storage stream + * (as defined in the OLE 2.0 specs) on top of a system file. + */ + +#define SOF_UNIQUEFILENAME ((ULONG) 0x80000000) + +STDMETHODIMP OpenStreamOnFile( + LPALLOCATEBUFFER lpAllocateBuffer, + LPFREEBUFFER lpFreeBuffer, + ULONG ulFlags, + __in LPCTSTR lpszFileName, + __in_opt LPCTSTR lpszPrefix, + LPSTREAM FAR * lppStream); + +typedef HRESULT (STDMETHODCALLTYPE FAR * LPOPENSTREAMONFILE) ( + LPALLOCATEBUFFER lpAllocateBuffer, + LPFREEBUFFER lpFreeBuffer, + ULONG ulFlags, + __in LPCTSTR lpszFileName, + __in_opt LPCTSTR lpszPrefix, + LPSTREAM FAR * lppStream); + +#if defined(_WIN64) || defined(_WIN32) +#define OPENSTREAMONFILE "OpenStreamOnFile" +#else +#error "Unknown Platform: MAPI is currently supported on Win32 and Win64" +#endif + + +/* Property interface utilities */ + +/* + * Copies a single SPropValue from Src to Dest. Handles all the various + * types of properties and will link its allocations given the master + * allocation object and an allocate more function. + */ +STDAPI_(SCODE) +PropCopyMore( LPSPropValue lpSPropValueDest, + LPSPropValue lpSPropValueSrc, + ALLOCATEMORE * lpfAllocMore, + LPVOID lpvObject ); + +/* + * Returns the size in bytes of structure at lpSPropValue, including the + * Value. + */ +STDAPI_(ULONG) +UlPropSize( LPSPropValue lpSPropValue ); + + +STDAPI_(BOOL) +FEqualNames( LPMAPINAMEID lpName1, LPMAPINAMEID lpName2 ); + +#if (defined(_WIN64) || defined(_WIN32)) && !defined(_WINNT) && !defined(_WIN95) && !defined(_MAC) +#define _WINNT +#endif + +STDAPI_(void) +GetInstance(LPSPropValue lpPropMv, LPSPropValue lpPropSv, ULONG uliInst); + +extern char rgchCsds[]; +extern char rgchCids[]; +extern char rgchCsdi[]; +extern char rgchCidi[]; + +STDAPI_(BOOL) +FPropContainsProp( LPSPropValue lpSPropValueDst, + LPSPropValue lpSPropValueSrc, + ULONG ulFuzzyLevel ); + +STDAPI_(BOOL) +FPropCompareProp( LPSPropValue lpSPropValue1, + ULONG ulRelOp, + LPSPropValue lpSPropValue2 ); + +STDAPI_(LONG) +LPropCompareProp( LPSPropValue lpSPropValueA, + LPSPropValue lpSPropValueB ); + +STDAPI_(HRESULT) +HrAddColumns( LPMAPITABLE lptbl, + LPSPropTagArray lpproptagColumnsNew, + LPALLOCATEBUFFER lpAllocateBuffer, + LPFREEBUFFER lpFreeBuffer); + +STDAPI_(HRESULT) +HrAddColumnsEx( LPMAPITABLE lptbl, + LPSPropTagArray lpproptagColumnsNew, + LPALLOCATEBUFFER lpAllocateBuffer, + LPFREEBUFFER lpFreeBuffer, + void (FAR *lpfnFilterColumns)(LPSPropTagArray ptaga)); + + +/* Notification utilities */ + +/* + * Function that creates an advise sink object given a notification + * callback function and context. + */ + +STDAPI +HrAllocAdviseSink( LPNOTIFCALLBACK lpfnCallback, + LPVOID lpvContext, + LPMAPIADVISESINK FAR *lppAdviseSink ); + + +/* + * Wraps an existing advise sink with another one which guarantees + * that the original advise sink will be called in the thread on + * which it was created. + */ + +STDAPI +HrThisThreadAdviseSink( LPMAPIADVISESINK lpAdviseSink, + LPMAPIADVISESINK FAR *lppAdviseSink); + + + +/* + * Allows a client and/or provider to force notifications + * which are currently queued in the MAPI notification engine + * to be dispatched without doing a message dispatch. + */ + +STDAPI HrDispatchNotifications (ULONG ulFlags); + + +/* Service Provider Utilities */ + +/* + * Structures and utility function for building a display table + * from resources. + */ + +typedef struct { + ULONG ulCtlType; /* DTCT_LABEL, etc. */ + ULONG ulCtlFlags; /* DT_REQUIRED, etc. */ + LPBYTE lpbNotif; /* pointer to notification data */ + ULONG cbNotif; /* count of bytes of notification data */ + LPTSTR lpszFilter; /* character filter for edit/combobox */ + ULONG ulItemID; /* to validate parallel dlg template entry */ + union { /* ulCtlType discriminates */ + LPVOID lpv; /* Initialize this to avoid warnings */ + LPDTBLLABEL lplabel; + LPDTBLEDIT lpedit; + LPDTBLLBX lplbx; + LPDTBLCOMBOBOX lpcombobox; + LPDTBLDDLBX lpddlbx; + LPDTBLCHECKBOX lpcheckbox; + LPDTBLGROUPBOX lpgroupbox; + LPDTBLBUTTON lpbutton; + LPDTBLRADIOBUTTON lpradiobutton; + LPDTBLMVLISTBOX lpmvlbx; + LPDTBLMVDDLBX lpmvddlbx; + LPDTBLPAGE lppage; + } ctl; +} DTCTL, FAR *LPDTCTL; + +typedef struct { + ULONG cctl; + LPTSTR lpszResourceName; /* as usual, may be an integer ID */ + union { /* as usual, may be an integer ID */ + LPTSTR lpszComponent; + ULONG ulItemID; + }; + LPDTCTL lpctl; +} DTPAGE, FAR *LPDTPAGE; + + + +STDAPI +BuildDisplayTable( LPALLOCATEBUFFER lpAllocateBuffer, + LPALLOCATEMORE lpAllocateMore, + LPFREEBUFFER lpFreeBuffer, + LPMALLOC lpMalloc, + HINSTANCE hInstance, + UINT cPages, + LPDTPAGE lpPage, + ULONG ulFlags, + LPMAPITABLE * lppTable, + LPTABLEDATA * lppTblData ); + + +/* MAPI structure validation/copy utilities */ + +/* + * Validate, copy, and adjust pointers in MAPI structures: + * notification + * property value array + * option data + */ + +STDAPI_(SCODE) +ScCountNotifications(int cNotifications, LPNOTIFICATION lpNotifications, + ULONG FAR *lpcb); + +STDAPI_(SCODE) +ScCopyNotifications(int cNotification, LPNOTIFICATION lpNotifications, + LPVOID lpvDst, ULONG FAR *lpcb); + +STDAPI_(SCODE) +ScRelocNotifications(int cNotification, LPNOTIFICATION lpNotifications, + LPVOID lpvBaseOld, LPVOID lpvBaseNew, ULONG FAR *lpcb); + + +STDAPI_(SCODE) +ScCountProps(int cValues, LPSPropValue lpPropArray, ULONG FAR *lpcb); + +STDAPI_(LPSPropValue) +LpValFindProp(ULONG ulPropTag, ULONG cValues, LPSPropValue lpPropArray); + +STDAPI_(SCODE) +ScCopyProps(int cValues, LPSPropValue lpPropArray, LPVOID lpvDst, + ULONG FAR *lpcb); + +STDAPI_(SCODE) +ScRelocProps(int cValues, LPSPropValue lpPropArray, + LPVOID lpvBaseOld, LPVOID lpvBaseNew, ULONG FAR *lpcb); + +STDAPI_(SCODE) +ScDupPropset(int cValues, LPSPropValue lpPropArray, + LPALLOCATEBUFFER lpAllocateBuffer, LPSPropValue FAR *lppPropArray); + + +/* General utility functions */ + +/* Related to the OLE Component object model */ + +STDAPI_(ULONG) UlAddRef(LPVOID lpunk); +STDAPI_(ULONG) UlRelease(LPVOID lpunk); + +/* Related to the MAPI interface */ + +STDAPI HrGetOneProp(LPMAPIPROP lpMapiProp, ULONG ulPropTag, + LPSPropValue FAR *lppProp); +STDAPI HrSetOneProp(LPMAPIPROP lpMapiProp, + LPSPropValue lpProp); +STDAPI_(BOOL) FPropExists(LPMAPIPROP lpMapiProp, ULONG ulPropTag); +STDAPI_(LPSPropValue) PpropFindProp(LPSPropValue lpPropArray, ULONG cValues, + ULONG ulPropTag); +STDAPI_(void) FreePadrlist(LPADRLIST lpAdrlist); +STDAPI_(void) FreeProws(LPSRowSet lpRows); +STDAPI HrQueryAllRows(LPMAPITABLE lpTable, + LPSPropTagArray lpPropTags, + LPSRestriction lpRestriction, + LPSSortOrderSet lpSortOrderSet, + LONG crowsMax, + LPSRowSet FAR *lppRows); + +/* Create or validate the IPM folder tree in a message store */ + +#define MAPI_FORCE_CREATE 1 +#define MAPI_FULL_IPM_TREE 2 + +STDAPI HrValidateIPMSubtree(LPMDB lpMDB, ULONG ulFlags, + ULONG FAR *lpcValues, LPSPropValue FAR *lppValues, + LPMAPIERROR FAR *lpperr); + +/* Encoding and decoding strings */ + +STDAPI_(BOOL) FBinFromHex(__in LPTSTR lpsz, LPBYTE lpb); +STDAPI_(SCODE) ScBinFromHexBounded(__in LPTSTR lpsz, LPBYTE lpb, ULONG cb); +STDAPI_(void) HexFromBin(LPBYTE lpb, int cb, __in LPTSTR lpsz); +STDAPI_(ULONG) UlFromSzHex(LPCTSTR lpsz); + +/* Encoding and decoding entry IDs */ +STDAPI HrEntryIDFromSz(__in LPTSTR lpsz, ULONG FAR *lpcb, + LPENTRYID FAR *lppEntryID); +STDAPI HrSzFromEntryID(ULONG cb, LPENTRYID lpEntryID, + __in LPTSTR FAR *lpsz); +STDAPI HrComposeEID(LPMAPISESSION lpSession, + ULONG cbStoreRecordKey, LPBYTE lpStoreRecordKey, + ULONG cbMsgEntryID, LPENTRYID lpMsgEntryID, + ULONG FAR *lpcbEID, LPENTRYID FAR *lppEntryID); +STDAPI HrDecomposeEID(LPMAPISESSION lpSession, + ULONG cbEntryID, LPENTRYID lpEntryID, + ULONG FAR *lpcbStoreEntryID, + LPENTRYID FAR *lppStoreEntryID, + ULONG FAR *lpcbMsgEntryID, + LPENTRYID FAR *lppMsgEntryID); +STDAPI HrComposeMsgID(LPMAPISESSION lpSession, + ULONG cbStoreSearchKey, LPBYTE pStoreSearchKey, + ULONG cbMsgEntryID, LPENTRYID lpMsgEntryID, + __in LPTSTR FAR *lpszMsgID); +STDAPI HrDecomposeMsgID(LPMAPISESSION lpSession, + __in LPTSTR lpszMsgID, + ULONG FAR *lpcbStoreEntryID, + LPENTRYID FAR *lppStoreEntryID, + ULONG FAR *lppcbMsgEntryID, + LPENTRYID FAR *lppMsgEntryID); + +/* C runtime substitutes */ + + +STDAPI_(LPTSTR) SzFindCh(LPCTSTR lpsz, USHORT ch); /* strchr */ +STDAPI_(LPTSTR) SzFindLastCh(LPCTSTR lpsz, USHORT ch); /* strrchr */ +STDAPI_(LPTSTR) SzFindSz(LPCTSTR lpsz, LPCTSTR lpszKey); /*strstr */ +STDAPI_(unsigned int) UFromSz(LPCTSTR lpsz); /* atoi */ + +STDAPI_(SCODE) ScUNCFromLocalPath(__in LPSTR lpszLocal, __in LPSTR lpszUNC, + UINT cchUNC); +STDAPI_(SCODE) ScLocalPathFromUNC(__in LPSTR lpszUNC, __in LPSTR lpszLocal, + UINT cchLocal); + +/* 64-bit arithmetic with times */ + +STDAPI_(FILETIME) FtAddFt(FILETIME ftAddend1, FILETIME ftAddend2); +STDAPI_(FILETIME) FtMulDwDw(DWORD ftMultiplicand, DWORD ftMultiplier); +STDAPI_(FILETIME) FtMulDw(DWORD ftMultiplier, FILETIME ftMultiplicand); +STDAPI_(FILETIME) FtSubFt(FILETIME ftMinuend, FILETIME ftSubtrahend); +STDAPI_(FILETIME) FtNegFt(FILETIME ft); + +/* Message composition */ + +STDAPI_(SCODE) ScCreateConversationIndex (ULONG cbParent, + LPBYTE lpbParent, + ULONG FAR * lpcbConvIndex, + LPBYTE FAR * lppbConvIndex); + +/* Store support */ + +STDAPI WrapStoreEntryID (ULONG ulFlags, __in LPTSTR lpszDLLName, ULONG cbOrigEntry, + LPENTRYID lpOrigEntry, ULONG *lpcbWrappedEntry, LPENTRYID *lppWrappedEntry); + +/* RTF Sync Utilities */ + +#define RTF_SYNC_RTF_CHANGED ((ULONG) 0x00000001) +#define RTF_SYNC_BODY_CHANGED ((ULONG) 0x00000002) + +STDAPI_(HRESULT) +RTFSync (LPMESSAGE lpMessage, ULONG ulFlags, __out BOOL FAR * lpfMessageUpdated); + + +/* Flags for WrapCompressedRTFStream() */ + +/****** MAPI_MODIFY ((ULONG) 0x00000001) mapidefs.h */ +/****** STORE_UNCOMPRESSED_RTF ((ULONG) 0x00008000) mapidefs.h */ + +STDAPI_(HRESULT) +WrapCompressedRTFStream (__in LPSTREAM lpCompressedRTFStream, + ULONG ulFlags, __out LPSTREAM FAR * lpUncompressedRTFStream); + +/* Storage on Stream */ + +#if defined(_WIN64) || defined(_WIN32) || defined(WIN16) +STDAPI_(HRESULT) +HrIStorageFromStream (LPUNKNOWN lpUnkIn, + LPCIID lpInterface, ULONG ulFlags, LPSTORAGE FAR * lppStorageOut); +#endif + + +/* + * Setup and cleanup. + * + * Providers never need to make these calls. + * + * Test applications and the like which do not call MAPIInitialize + * may want to call them, so that the few utility functions which + * need MAPI allocators (and do not ask for them explicitly) + * will work. + */ + +/* All flags are reserved for ScInitMapiUtil. */ + +STDAPI_(SCODE) ScInitMapiUtil(ULONG ulFlags); +STDAPI_(VOID) DeinitMapiUtil(VOID); + + +/* + * Entry point names. + * + * These are for new entry points defined since MAPI first shipped + * in Windows 95. Using these names in a GetProcAddress call makes + * it easier to write code which uses them optionally. + */ + +#if defined (_WIN64) && defined(_AMD64_) +#define szHrDispatchNotifications "HrDispatchNotifications" +#elif defined (_WIN32) && defined (_X86_) +#define szHrDispatchNotifications "_HrDispatchNotifications@4" +#else +#error "Unknown Platform: MAPI is currently supported on Win32/X86 and Win64/AMD64" +#endif + +typedef HRESULT (STDAPICALLTYPE DISPATCHNOTIFICATIONS)(ULONG ulFlags); +typedef DISPATCHNOTIFICATIONS FAR * LPDISPATCHNOTIFICATIONS; + +#if defined (_WIN64) && defined (_AMD64_) +#define szScCreateConversationIndex "ScCreateConversationIndex" +#elif defined (_WIN32) && defined (_X86_) +#define szScCreateConversationIndex "_ScCreateConversationIndex@16" +#else +#error "Unknown Platform: MAPI is currently supported on Win32/X86 and Win64/AMD64" +#endif + +typedef SCODE (STDAPICALLTYPE CREATECONVERSATIONINDEX)(ULONG cbParent, + LPBYTE lpbParent, ULONG FAR *lpcbConvIndex, LPBYTE FAR *lppbConvIndex); +typedef CREATECONVERSATIONINDEX FAR *LPCREATECONVERSATIONINDEX; + +#ifdef __cplusplus +} +#endif + +#endif /* _MAPIUTIL_H_ */ diff --git a/comm/mailnews/mapi/include/mapival.h b/comm/mailnews/mapi/include/mapival.h new file mode 100644 index 0000000000..0e034100d5 --- /dev/null +++ b/comm/mailnews/mapi/include/mapival.h @@ -0,0 +1,1975 @@ +/* + * M A P I V A L . H + * + * Macros used to validate parameters on standard MAPI object methods. + * Used in conjunction with routines found in MAPIU.DLL. + * + * Copyright (c) 2009 Microsoft Corporation. All Rights Reserved. + */ + +#ifndef _INC_VALIDATE +#define _INC_VALIDATE + +#if _MSC_VER > 1000 +#pragma once +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef MAPIUTIL_H +#include <mapiutil.h> +#endif +#include <stddef.h> +#include <stdarg.h> + + +#define MAKE_ENUM(Method, Interface) Interface##_##Method + +typedef enum _tagMethods +{ +/* IUnknown */ + MAKE_ENUM(QueryInterface, IUnknown) = 0, + MAKE_ENUM(AddRef, IUnknown), /* For completness */ + MAKE_ENUM(Release, IUnknown), /* For completness */ + +/* IMAPIProps */ + MAKE_ENUM(GetLastError, IMAPIProp), + MAKE_ENUM(SaveChanges, IMAPIProp), + MAKE_ENUM(GetProps, IMAPIProp), + MAKE_ENUM(GetPropList, IMAPIProp), + MAKE_ENUM(OpenProperty, IMAPIProp), + MAKE_ENUM(SetProps, IMAPIProp), + MAKE_ENUM(DeleteProps, IMAPIProp), + MAKE_ENUM(CopyTo, IMAPIProp), + MAKE_ENUM(CopyProps, IMAPIProp), + MAKE_ENUM(GetNamesFromIDs, IMAPIProp), + MAKE_ENUM(GetIDsFromNames, IMAPIProp), + +/* IMAPITable */ + MAKE_ENUM(GetLastError, IMAPITable), + MAKE_ENUM(Advise, IMAPITable), + MAKE_ENUM(Unadvise, IMAPITable), + MAKE_ENUM(GetStatus, IMAPITable), + MAKE_ENUM(SetColumns, IMAPITable), + MAKE_ENUM(QueryColumns, IMAPITable), + MAKE_ENUM(GetRowCount, IMAPITable), + MAKE_ENUM(SeekRow, IMAPITable), + MAKE_ENUM(SeekRowApprox, IMAPITable), + MAKE_ENUM(QueryPosition, IMAPITable), + MAKE_ENUM(FindRow, IMAPITable), + MAKE_ENUM(Restrict, IMAPITable), + MAKE_ENUM(CreateBookmark, IMAPITable), + MAKE_ENUM(FreeBookmark, IMAPITable), + MAKE_ENUM(SortTable, IMAPITable), + MAKE_ENUM(QuerySortOrder, IMAPITable), + MAKE_ENUM(QueryRows, IMAPITable), + MAKE_ENUM(Abort, IMAPITable), + MAKE_ENUM(ExpandRow, IMAPITable), + MAKE_ENUM(CollapseRow, IMAPITable), + MAKE_ENUM(WaitForCompletion, IMAPITable), + MAKE_ENUM(GetCollapseState, IMAPITable), + MAKE_ENUM(SetCollapseState, IMAPITable), + +/* IMAPIContainer */ + MAKE_ENUM(GetContentsTable, IMAPIContainer), + MAKE_ENUM(GetHierarchyTable, IMAPIContainer), + MAKE_ENUM(OpenEntry, IMAPIContainer), + MAKE_ENUM(SetSearchCriteria, IMAPIContainer), + MAKE_ENUM(GetSearchCriteria, IMAPIContainer), + +/* IABContainer */ + MAKE_ENUM(CreateEntry, IABContainer), + MAKE_ENUM(CopyEntries, IABContainer), + MAKE_ENUM(DeleteEntries, IABContainer), + MAKE_ENUM(ResolveNames, IABContainer), + +/* IDistList */ + MAKE_ENUM(CreateEntry, IDistList), + MAKE_ENUM(CopyEntries, IDistList), + MAKE_ENUM(DeleteEntries, IDistList), + MAKE_ENUM(ResolveNames, IDistList), + +/* IMAPIFolder */ + MAKE_ENUM(CreateMessage, IMAPIFolder), + MAKE_ENUM(CopyMessages, IMAPIFolder), + MAKE_ENUM(DeleteMessages, IMAPIFolder), + MAKE_ENUM(CreateFolder, IMAPIFolder), + MAKE_ENUM(CopyFolder, IMAPIFolder), + MAKE_ENUM(DeleteFolder, IMAPIFolder), + MAKE_ENUM(SetReadFlags, IMAPIFolder), + MAKE_ENUM(GetMessageStatus, IMAPIFolder), + MAKE_ENUM(SetMessageStatus, IMAPIFolder), + MAKE_ENUM(SaveContentsSort, IMAPIFolder), + MAKE_ENUM(EmptyFolder, IMAPIFolder), + +/* IMsgStore */ + MAKE_ENUM(Advise, IMsgStore), + MAKE_ENUM(Unadvise, IMsgStore), + MAKE_ENUM(CompareEntryIDs, IMsgStore), + MAKE_ENUM(OpenEntry, IMsgStore), + MAKE_ENUM(SetReceiveFolder, IMsgStore), + MAKE_ENUM(GetReceiveFolder, IMsgStore), + MAKE_ENUM(GetReceiveFolderTable, IMsgStore), + MAKE_ENUM(StoreLogoff, IMsgStore), + MAKE_ENUM(AbortSubmit, IMsgStore), + MAKE_ENUM(GetOutgoingQueue, IMsgStore), + MAKE_ENUM(SetLockState, IMsgStore), + MAKE_ENUM(FinishedMsg, IMsgStore), + MAKE_ENUM(NotifyNewMail, IMsgStore), + +/* IMessage */ + MAKE_ENUM(GetAttachmentTable, IMessage), + MAKE_ENUM(OpenAttach, IMessage), + MAKE_ENUM(CreateAttach, IMessage), + MAKE_ENUM(DeleteAttach, IMessage), + MAKE_ENUM(GetRecipientTable, IMessage), + MAKE_ENUM(ModifyRecipients, IMessage), + MAKE_ENUM(SubmitMessage, IMessage), + MAKE_ENUM(SetReadFlag, IMessage), + + +/* IABProvider */ + MAKE_ENUM(Shutdown, IABProvider), + MAKE_ENUM(Logon, IABProvider), + +/* IABLogon */ + MAKE_ENUM(GetLastError, IABLogon), + MAKE_ENUM(Logoff, IABLogon), + MAKE_ENUM(OpenEntry, IABLogon), + MAKE_ENUM(CompareEntryIDs, IABLogon), + MAKE_ENUM(Advise, IABLogon), + MAKE_ENUM(Unadvise, IABLogon), + MAKE_ENUM(OpenStatusEntry, IABLogon), + MAKE_ENUM(OpenTemplateID, IABLogon), + MAKE_ENUM(GetOneOffTable, IABLogon), + MAKE_ENUM(PrepareRecips, IABLogon), + +/* IXPProvider */ + MAKE_ENUM(Shutdown, IXPProvider), + MAKE_ENUM(TransportLogon, IXPProvider), + +/* IXPLogon */ + MAKE_ENUM(AddressTypes, IXPLogon), + MAKE_ENUM(RegisterOptions, IXPLogon), + MAKE_ENUM(TransportNotify, IXPLogon), + MAKE_ENUM(Idle, IXPLogon), + MAKE_ENUM(TransportLogoff, IXPLogon), + MAKE_ENUM(SubmitMessage, IXPLogon), + MAKE_ENUM(EndMessage, IXPLogon), + MAKE_ENUM(Poll, IXPLogon), + MAKE_ENUM(StartMessage, IXPLogon), + MAKE_ENUM(OpenStatusEntry, IXPLogon), + MAKE_ENUM(ValidateState, IXPLogon), + MAKE_ENUM(FlushQueues, IXPLogon), + +/* IMSProvider */ + MAKE_ENUM(Shutdown, IMSProvider), + MAKE_ENUM(Logon, IMSProvider), + MAKE_ENUM(SpoolerLogon, IMSProvider), + MAKE_ENUM(CompareStoreIDs, IMSProvider), + +/* IMSLogon */ + MAKE_ENUM(GetLastError, IMSLogon), + MAKE_ENUM(Logoff, IMSLogon), + MAKE_ENUM(OpenEntry, IMSLogon), + MAKE_ENUM(CompareEntryIDs, IMSLogon), + MAKE_ENUM(Advise, IMSLogon), + MAKE_ENUM(Unadvise, IMSLogon), + MAKE_ENUM(OpenStatusEntry, IMSLogon), + +/* IMAPIControl */ + MAKE_ENUM(GetLastError, IMAPIControl), + MAKE_ENUM(Activate, IMAPIControl), + MAKE_ENUM(GetState, IMAPIControl), + +/* IMAPIStatus */ + MAKE_ENUM(ValidateState, IMAPIStatus), + MAKE_ENUM(SettingsDialog, IMAPIStatus), + MAKE_ENUM(ChangePassword, IMAPIStatus), + MAKE_ENUM(FlushQueues, IMAPIStatus), + +/* IStream */ + MAKE_ENUM(_Read, IStream), + MAKE_ENUM(_Write, IStream), + MAKE_ENUM(Seek, IStream), + MAKE_ENUM(SetSize, IStream), + MAKE_ENUM(CopyTo, IStream), + MAKE_ENUM(Commit, IStream), + MAKE_ENUM(Revert, IStream), + MAKE_ENUM(LockRegion, IStream), + MAKE_ENUM(UnlockRegion, IStream), + MAKE_ENUM(Stat, IStream), + MAKE_ENUM(Clone, IStream), + +/* IMAPIAdviseSink */ + MAKE_ENUM(OnNotify, IMAPIAdviseSink), + +} METHODS; + + +/* Macro wrappers to hide the Validate function return handling */ +#if defined(_AMD64_) || defined(_X86_) +#ifdef __cplusplus + +/* C++ methods can't take the address of the This pointer, so we must + use the first parameter instead */ + +#define ValidateParameters(eMethod, First) \ + { HRESULT _hr_; \ + _hr_ = __CPPValidateParameters(eMethod, (LPVOID) &First); \ + if (HR_FAILED(_hr_)) return (_hr_); } + +#define UlValidateParameters(eMethod, First) \ + { HRESULT _hr_; \ + _hr_ = __CPPValidateParameters(eMethod, &First); \ + if (HR_FAILED(_hr_)) return (ULONG) (_hr_); } + +/* Methods called by MAPI should have correct parameters + - just assert in Debug to check */ +#define CheckParameters(eMethod, First) \ + AssertSz(HR_SUCCEEDED(__CPPValidateParameters(eMethod, &First)), "Parameter validation failed for method called by MAPI!") + + +#else /* __cplusplus */ + +/* For methods that will be called by clients + - validate always */ + +#define ValidateParameters(eMethod, ppThis) \ + { HRESULT _hr_; \ + _hr_ = __ValidateParameters(eMethod, ppThis); \ + if (HR_FAILED(_hr_)) return (_hr_); } + +#define UlValidateParameters(eMethod, ppThis) \ + { HRESULT _hr_; \ + _hr_ = __ValidateParameters(eMethod, ppThis); \ + if (HR_FAILED(_hr_)) return (ULONG) (_hr_); } + +/* Methods called by MAPI should have correct parameters + - just assert in Debug to check */ +#define CheckParameters(eMethod, ppThis) \ + AssertSz(HR_SUCCEEDED(__ValidateParameters(eMethod, ppThis)), "Parameter validation failed for method called by MAPI!") + +#endif /* __cplusplus */ +#endif /* _X86_ || _AMD64_ */ + +/* Prototypes for functions used to validate complex parameters. + */ +#define FBadPropVal( lpPropVal) (FAILED(ScCountProps( 1, lpPropVal, NULL))) + +#define FBadRgPropVal( lpPropVal, cValues) \ + (FAILED(ScCountProps( cValues, lpPropVal, NULL))) + +#define FBadAdrList( lpAdrList) \ + ( AssertSz( ( offsetof( ADRLIST, cEntries) \ + == offsetof( SRowSet, cRows)) \ + && ( offsetof( ADRLIST, aEntries) \ + == offsetof( SRowSet, aRow)) \ + && ( offsetof( ADRENTRY, cValues) \ + == offsetof( SRow, cValues)) \ + && ( offsetof( ADRENTRY, rgPropVals) \ + == offsetof( SRow, lpProps)) \ + , "ADRLIST doesn't match SRowSet") \ + || FBadRowSet( (LPSRowSet) lpAdrList)) + +STDAPI_(BOOL) +FBadRglpszW(__in LPWSTR FAR *lppszW, + ULONG cStrings); + +STDAPI_(BOOL) +FBadRowSet( LPSRowSet lpRowSet); + +STDAPI_(BOOL) +FBadRglpNameID( LPMAPINAMEID FAR * lppNameId, + ULONG cNames); + +STDAPI_(BOOL) +FBadEntryList( LPENTRYLIST lpEntryList); + + +/* BAD_STANDARD_OBJ + * + * This macro insures that the object is a writable object of the correct size + * and that this method belongs to the object. + * + * NOTES ON USE! + * This depends upon using the standard method of declaring the object + * interface. + * + * prefix is the method prefix you chose when declaring the object interface. + * method is the standard method name of the calling method. + * lpVtbl is the name of the lpVtbl element of your object. + */ +#define BAD_STANDARD_OBJ( lpObj, prefix, method, lpVtbl) \ + ( IsBadWritePtr( (lpObj), sizeof(*lpObj)) \ + || IsBadReadPtr( (void *) &(lpObj->lpVtbl->method), sizeof(LPVOID)) \ + ||( ( LPVOID) (lpObj->lpVtbl->method) != (LPVOID) (prefix##method))) + + +#define FBadUnknown( lpObj ) \ + ( IsBadReadPtr( (lpObj), sizeof(LPVOID) ) \ + || IsBadReadPtr( (lpObj)->lpVtbl, 3 * sizeof(LPUNKNOWN) ) \ + || IsBadCodePtr( (FARPROC)(lpObj)->lpVtbl->QueryInterface )) + +/* + * IUnknown + */ + + +/* + * QueryInterface + */ +#define FBadQueryInterface( lpObj, riid, ppvObj) \ + ( IsBadReadPtr( riid, sizeof(IID)) \ + || IsBadWritePtr( ppvObj, sizeof(LPVOID))) + + +/* + * AddRef + * No parameter validation required. + */ +#define FBadAddRef( lpObj) FALSE + + +/* + * Release + * No parameter validation required. + */ +#define FBadRelease( lpObj) FALSE + + +/* + * GetLastError + */ +#define FBadGetLastError( lpObj, hResult, ulFlags, lppMAPIError )\ + (IsBadWritePtr( lppMAPIError, sizeof(LPMAPIERROR))) + +/* + * IMAPIProp + */ + + +/* + * SaveChanges + * No parameter validation required. + */ +#define FBadSaveChanges( lpObj, ulFlags) FALSE + + +/* + * GetProps + */ +#define FBadGetProps( lpObj, lpPTagA, lpcValues, lppPropArray) \ + ( ( lpPTagA \ + && ( IsBadReadPtr( lpPTagA, sizeof(ULONG)) \ + || IsBadReadPtr( lpPTagA, (UINT)( (lpPTagA->cValues + 1) \ + * sizeof(ULONG))))) \ + || IsBadWritePtr( lpcValues, sizeof(ULONG)) \ + || IsBadWritePtr( lppPropArray, sizeof(LPSPropValue))) + + +/* + * GetPropList + */ +#define FBadGetPropList( lpObj, lppPTagA) \ + (IsBadWritePtr( lppPTagA, sizeof(LPSPropTagArray FAR *))) + + +/* + * OpenProperty + */ +#define FBadOpenProperty( lpObj, ulPropTag, lpiid, ulInterfaceOptions, ulFlags \ + , lppUnk) \ + ( IsBadReadPtr( lpiid, sizeof(IID)) \ + || IsBadWritePtr( lppUnk, sizeof (LPUNKNOWN FAR *))) + + +/* + * SetProps + */ +#define FBadSetProps( lpObj, cValues, lpPropArray, lppProblems) \ + ( FBadRgPropVal( lpPropArray, (UINT) cValues) \ + || ( lppProblems \ + && IsBadWritePtr( lppProblems, sizeof(LPSPropProblemArray)))) + + +/* + * DeleteProps + */ +#define FBadDeleteProps( lpObj, lpPTagA, lppProblems) \ + ( ( !lpPTagA \ + || ( IsBadReadPtr( lpPTagA, sizeof(ULONG)) \ + || IsBadReadPtr( lpPTagA, (UINT)( (lpPTagA->cValues + 1) \ + * sizeof(ULONG))))) \ + || ( lppProblems \ + && IsBadWritePtr( lppProblems, sizeof(LPSPropProblemArray)))) + + +/* + * CopyTo + */ +#define FBadCopyTo( lpIPDAT, ciidExclude, rgiidExclude, lpExcludeProps \ + , ulUIParam, lpProgress, lpInterface, lpDestObj \ + , ulFlags, lppProblems) \ + ( ( ciidExclude \ + && ( IsBadReadPtr( rgiidExclude, (UINT)(ciidExclude * sizeof(IID))))) \ + || ( lpExcludeProps \ + && ( IsBadReadPtr( lpExcludeProps, sizeof(ULONG)) \ + || IsBadReadPtr( lpExcludeProps \ + , (UINT)( (lpExcludeProps->cValues + 1) \ + * sizeof(ULONG))))) \ + || (lpProgress && FBadUnknown( lpProgress )) \ + || (lpInterface && IsBadReadPtr( lpInterface, sizeof(IID))) \ + || IsBadReadPtr( lpDestObj, sizeof(LPVOID)) \ + || ( lppProblems \ + && IsBadWritePtr( lppProblems, sizeof(LPSPropProblemArray)))) + + +/* + * CopyProps + */ +#define FBadCopyProps( lpIPDAT, lpPropTagArray \ + , ulUIParam, lpProgress, lpInterface, lpDestObj \ + , ulFlags, lppProblems) \ + ( ( lpPropTagArray \ + && ( IsBadReadPtr( lpPropTagArray, sizeof(ULONG)) \ + || IsBadReadPtr( lpPropTagArray \ + , (UINT)( (lpPropTagArray->cValues + 1) \ + * sizeof(ULONG))))) \ + || (lpProgress && FBadUnknown( lpProgress )) \ + || (lpInterface && IsBadReadPtr( lpInterface, sizeof(IID))) \ + || IsBadReadPtr( lpDestObj, sizeof(LPVOID)) \ + || ( lppProblems \ + && IsBadWritePtr( lppProblems, sizeof(LPSPropProblemArray)))) + + + +/* + * GetNamesFromIDs + */ +#define FBadGetNamesFromIDs( lpIPDAT, lppPropTags, lpPropSetGuid, ulFlags, \ + lpcPropNames, lpppPropNames) \ + ( IsBadReadPtr( lppPropTags, sizeof(LPSPropTagArray)) \ + || ( lpPropSetGuid && IsBadReadPtr( lpPropSetGuid, sizeof(GUID))) \ + || ( *lppPropTags \ + && ( IsBadReadPtr( *lppPropTags, sizeof(ULONG)) \ + || IsBadReadPtr( *lppPropTags \ + , (UINT)( ( ( *lppPropTags)->cValues + 1) \ + * sizeof(ULONG))))) \ + || IsBadWritePtr( lpcPropNames, sizeof (ULONG)) \ + || IsBadWritePtr( lpppPropNames, sizeof (LPVOID FAR *))) + + + +/* + * GetNamesFromIDs + */ +#define FBadGetIDsFromNames( lpIPDAT, cPropNames, lppPropNames, ulFlags \ + , lppPropTags) \ + ( (cPropNames && FBadRglpNameID( lppPropNames, cPropNames)) \ + || IsBadWritePtr( lppPropTags, sizeof(LPULONG FAR *))) + + +STDAPI_(ULONG) +FBadRestriction( LPSRestriction lpres ); + +STDAPI_(ULONG) +FBadPropTag( ULONG ulPropTag ); + +STDAPI_(ULONG) +FBadRow( LPSRow lprow ); + +STDAPI_(ULONG) +FBadProp( LPSPropValue lpprop ); + +STDAPI_(ULONG) +FBadSortOrderSet( LPSSortOrderSet lpsos ); + +STDAPI_(ULONG) +FBadColumnSet( LPSPropTagArray lpptaCols ); + +/* Validation function + + The eMethod parameter tells us which internal validation to perform. + + The ppThis parameter tells us where the stack is, so we can access the other + parameters. + + Becuase of this *magic* we MUST obtain the pointer to the This pointer in + the method function. + +*/ + +#if defined(_WIN64) || defined(_WIN32) +#define BASED_STACK +#else +#error "Unknown Platform: MAPI is currently supported on Win32 and Win64" +#endif + +#if defined(_WIN64) || defined(_WIN32) +HRESULT STDAPICALLTYPE +#else +#error "Unknown Platform: MAPI is currently supported on Win32 and Win64" +#endif + +__CPPValidateParameters(METHODS eMethod, const LPVOID ppFirst); + +#if defined(_WIN64) || defined(_WIN32) +HRESULT STDAPICALLTYPE +#else +#error "Unknown Platform: MAPI is currently supported on Win32 and Win64" +#endif +__ValidateParameters(METHODS eMethod, LPVOID ppThis); + +#ifdef _MAC +#define STDAPIVCALLTYPE __cdecl +#define STDAPIV EXTERN_C HRESULT STDAPIVCALLTYPE +#define STDAPIV_(type) EXTERN_C type STDAPIVCALLTYPE +#endif /* _MAC */ + +/* Macro wrappers for platform independent validation */ + +#if defined(_AMD64_) || defined(_X86_) + +#define ArgShiftN (1 + (sizeof(DWORD_PTR)>>2)) +#define ArgSize(T) ((sizeof(T)+sizeof(DWORD_PTR)-1)>>ArgShiftN) + +#define MakeArg1(idx, a1) memcpy(__rgArgs+idx, &a1, ArgSize(a1)*sizeof(DWORD_PTR)) +#define MakeArg2(idx, a1, a2) MakeArg1(idx, a1); MakeArg1(idx+ArgSize(a1), a2) +#define MakeArg3(idx, a1, a2, a3) MakeArg1(idx, a1); MakeArg2(idx+ArgSize(a1), a2, a3) +#define MakeArg4(idx, a1, a2, a3, a4) MakeArg1(idx, a1); MakeArg3(idx+ArgSize(a1), a2, a3, a4) +#define MakeArg5(idx, a1, a2, a3, a4, a5) MakeArg1(idx, a1); MakeArg4(idx+ArgSize(a1), a2, a3, a4, a5) +#define MakeArg6(idx, a1, a2, a3, a4, a5, a6) MakeArg1(idx, a1); MakeArg5(idx+ArgSize(a1), a2, a3, a4, a5, a6) +#define MakeArg7(idx, a1, a2, a3, a4, a5, a6, a7) MakeArg1(idx, a1); MakeArg6(idx+ArgSize(a1), a2, a3, a4, a5, a6, a7) +#define MakeArg8(idx, a1, a2, a3, a4, a5, a6, a7, a8) MakeArg1(idx, a1); MakeArg7(idx+ArgSize(a1), a2, a3, a4, a5, a6, a7, a8) +#define MakeArg9(idx, a1, a2, a3, a4, a5, a6, a7, a8, a9) MakeArg1(idx, a1); MakeArg8(idx+ArgSize(a1), a2, a3, a4, a5, a6, a7, a8, a9) +#define MakeArg10(idx, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) MakeArg1(idx, a1); MakeArg9(idx+ArgSize(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10) +#define MakeArg11(idx, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) MakeArg1(idx, a1); MakeArg10(idx+ArgSize(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) +#define MakeArg12(idx, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) MakeArg1(idx, a1); MakeArg11(idx+ArgSize(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) +#define MakeArg13(idx, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) MakeArg1(idx, a1); MakeArg12(idx+ArgSize(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) +#define MakeArg14(idx, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) MakeArg1(idx, a1); MakeArg13(idx+ArgSize(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) +#define MakeArg15(idx, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) MakeArg1(idx, a1); MakeArg14(idx+ArgSize(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) +#define MakeArg16(idx, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) MakeArg1(idx, a1); MakeArg15(idx+ArgSize(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) + +#define MakeArray1(a1) \ + DWORD_PTR __rgArgs[ArgSize(a1)]; \ + MakeArg1(0, a1) + +#define MakeArray2(a1, a2) \ + DWORD_PTR __rgArgs[ArgSize(a1) + ArgSize(a2)]; \ + MakeArg2(0, a1, a2) + +#define MakeArray3(a1, a2, a3) \ + DWORD_PTR __rgArgs[ArgSize(a1) + ArgSize(a2) + ArgSize(a3)]; \ + MakeArg3(0, a1, a2, a3) + +#define MakeArray4(a1, a2, a3, a4) \ + DWORD_PTR __rgArgs[ArgSize(a1) + ArgSize(a2) + ArgSize(a3) + ArgSize(a4)]; \ + MakeArg4(0, a1, a2, a3, a4) + +#define MakeArray5(a1, a2, a3, a4, a5) \ + DWORD_PTR __rgArgs[ArgSize(a1) + ArgSize(a2) + ArgSize(a3) + ArgSize(a4) + ArgSize(a5)]; \ + MakeArg5(0, a1, a2, a3, a4, a5) + +#define MakeArray6(a1, a2, a3, a4, a5, a6) \ + DWORD_PTR __rgArgs[ArgSize(a1) + ArgSize(a2) + ArgSize(a3) + ArgSize(a4) + ArgSize(a5) + ArgSize(a6)]; \ + MakeArg6(0, a1, a2, a3, a4, a5, a6) + +#define MakeArray7(a1, a2, a3, a4, a5, a6, a7) \ + DWORD_PTR __rgArgs[ArgSize(a1) + ArgSize(a2) + ArgSize(a3) + ArgSize(a4) + ArgSize(a5) + ArgSize(a6) + ArgSize(a7)]; \ + MakeArg7(0, a1, a2, a3, a4, a5, a6, a7) + +#define MakeArray8(a1, a2, a3, a4, a5, a6, a7, a8) \ + DWORD_PTR __rgArgs[ArgSize(a1) + ArgSize(a2) + ArgSize(a3) + ArgSize(a4) + ArgSize(a5) + ArgSize(a6) + ArgSize(a7) + ArgSize(a8)]; \ + MakeArg8(0, a1, a2, a3, a4, a5, a6, a7, a8) + +#define MakeArray9(a1, a2, a3, a4, a5, a6, a7, a8, a9) \ + DWORD_PTR __rgArgs[ArgSize(a1) + ArgSize(a2) + ArgSize(a3) + ArgSize(a4) + ArgSize(a5) + ArgSize(a6) + ArgSize(a7) + ArgSize(a8) + ArgSize(a9)]; \ + MakeArg9(0, a1, a2, a3, a4, a5, a6, a7, a8, a9) + +#define MakeArray10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \ + DWORD_PTR __rgArgs[ArgSize(a1) + ArgSize(a2) + ArgSize(a3) + ArgSize(a4) + ArgSize(a5) + ArgSize(a6) + ArgSize(a7) + ArgSize(a8) + ArgSize(a9) + ArgSize(a10)]; \ + MakeArg10(0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) + +#define MakeArray11(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \ + DWORD_PTR __rgArgs[ArgSize(a1) + ArgSize(a2) + ArgSize(a3) + ArgSize(a4) + ArgSize(a5) + ArgSize(a6) + ArgSize(a7) + ArgSize(a8) + ArgSize(a9) + ArgSize(a10) + ArgSize(a11)]; \ + MakeArg11(0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) + +#define MakeArray12(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) \ + DWORD_PTR __rgArgs[ArgSize(a1) + ArgSize(a2) + ArgSize(a3) + ArgSize(a4) + ArgSize(a5) + ArgSize(a6) + ArgSize(a7) + ArgSize(a8) + ArgSize(a9) + ArgSize(a10) + ArgSize(a11) + ArgSize(a12)]; \ + MakeArg12(0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) + +#define MakeArray13(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) \ + DWORD_PTR __rgArgs[ArgSize(a1) + ArgSize(a2) + ArgSize(a3) + ArgSize(a4) + ArgSize(a5) + ArgSize(a6) + ArgSize(a7) + ArgSize(a8) + ArgSize(a9) + ArgSize(a10) + ArgSize(a11) + ArgSize(a12) + ArgSize(a13)]; \ + MakeArg13(0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) + +#define MakeArray14(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) \ + DWORD_PTR __rgArgs[ArgSize(a1) + ArgSize(a2) + ArgSize(a3) + ArgSize(a4) + ArgSize(a5) + ArgSize(a6) + ArgSize(a7) + ArgSize(a8) + ArgSize(a9) + ArgSize(a10) + ArgSize(a11) + ArgSize(a12) + ArgSize(a13) + ArgSize(a14)]; \ + MakeArg14(0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) + +#define MakeArray15(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) \ + DWORD_PTR __rgArgs[ArgSize(a1) + ArgSize(a2) + ArgSize(a3) + ArgSize(a4) + ArgSize(a5) + ArgSize(a6) + ArgSize(a7) + ArgSize(a8) + ArgSize(a9) + ArgSize(a10) + ArgSize(a11) + ArgSize(a12) + ArgSize(a13) + ArgSize(a14) + ArgSize(a15)]; \ + MakeArg15(0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) + +#define MakeArray16(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) \ + DWORD_PTR __rgArgs[ArgSize(a1) + ArgSize(a2) + ArgSize(a3) + ArgSize(a4) + ArgSize(a5) + ArgSize(a6) + ArgSize(a7) + ArgSize(a8) + ArgSize(a9) + ArgSize(a10) + ArgSize(a11) + ArgSize(a12) + ArgSize(a13) + ArgSize(a14) + ArgSize(a15) + ArgSize(a16)]; \ + MakeArg16(0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) + + + +#define ValidateParameters1( m, a1 ) +#define ValidateParameters2( m, a1, a2 ) \ + { HRESULT _hr_; \ + MakeArray1(a2); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return (_hr_); } +#define ValidateParameters3( m, a1, a2, a3 ) \ + { HRESULT _hr_; \ + MakeArray2(a2, a3); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return (_hr_); } +#define ValidateParameters4( m, a1, a2, a3, a4 ) \ + { HRESULT _hr_; \ + MakeArray3(a2, a3, a4); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return (_hr_); } +#define ValidateParameters5( m, a1, a2, a3, a4, a5 ) \ + { HRESULT _hr_; \ + MakeArray4(a2, a3, a4, a5); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return (_hr_); } +#define ValidateParameters6( m, a1, a2, a3, a4, a5, a6 ) \ + { HRESULT _hr_; \ + MakeArray5(a2, a3, a4, a5, a6); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return (_hr_); } +#define ValidateParameters7( m, a1, a2, a3, a4, a5, a6, a7 ) \ + { HRESULT _hr_; \ + MakeArray6(a2, a3, a4, a5, a6, a7); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return (_hr_); } +#define ValidateParameters8( m, a1, a2, a3, a4, a5, a6, a7, a8 ) \ + { HRESULT _hr_; \ + MakeArray7(a2, a3, a4, a5, a6, a7, a8); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return (_hr_); } +#define ValidateParameters9( m, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) \ + { HRESULT _hr_; \ + MakeArray8(a2, a3, a4, a5, a6, a7, a8, a9); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return (_hr_); } +#define ValidateParameters10( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 ) \ + { HRESULT _hr_; \ + MakeArray9(a2, a3, a4, a5, a6, a7, a8, a9, a10); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return (_hr_); } +#define ValidateParameters11( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11 ) \ + { HRESULT _hr_; \ + MakeArray10(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return (_hr_); } +#define ValidateParameters12( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 ) \ + { HRESULT _hr_; \ + MakeArray11(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return (_hr_); } +#define ValidateParameters13( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) \ + { HRESULT _hr_; \ + MakeArray12(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return (_hr_); } +#define ValidateParameters14( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14 ) \ + { HRESULT _hr_; \ + MakeArray13(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return (_hr_); } +#define ValidateParameters15( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 ) \ + { HRESULT _hr_; \ + MakeArray14(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return (_hr_); } +#define ValidateParameters16( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16 ) \ + { HRESULT _hr_; \ + MakeArray15(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return (_hr_); } + +#define UlValidateParameters1( m, a1 ) +#define UlValidateParameters2( m, a1, a2 ) \ + { HRESULT _hr_; \ + MakeArray1(a2); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return ((ULONG)_hr_); } +#define UlValidateParameters3( m, a1, a2, a3 ) \ + { HRESULT _hr_; \ + MakeArray2(a2, a3); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return ((ULONG)_hr_); } +#define UlValidateParameters4( m, a1, a2, a3, a4 ) \ + { HRESULT _hr_; \ + MakeArray3(a2, a3, a4); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return ((ULONG)_hr_); } +#define UlValidateParameters5( m, a1, a2, a3, a4, a5 ) \ + { HRESULT _hr_; \ + MakeArray4(a2, a3, a4, a5); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return ((ULONG)_hr_); } +#define UlValidateParameters6( m, a1, a2, a3, a4, a5, a6 ) \ + { HRESULT _hr_; \ + MakeArray5(a2, a3, a4, a5, a6); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return ((ULONG)_hr_); } +#define UlValidateParameters7( m, a1, a2, a3, a4, a5, a6, a7 ) \ + { HRESULT _hr_; \ + MakeArray6(a2, a3, a4, a5, a6, a7); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return ((ULONG)_hr_); } +#define UlValidateParameters8( m, a1, a2, a3, a4, a5, a6, a7, a8 ) \ + { HRESULT _hr_; \ + MakeArray7(a2, a3, a4, a5, a6, a7, a8); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return ((ULONG)_hr_); } +#define UlValidateParameters9( m, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) \ + { HRESULT _hr_; \ + MakeArray8(a2, a3, a4, a5, a6, a7, a8, a9); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return ((ULONG)_hr_); } +#define UlValidateParameters10( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 ) \ + { HRESULT _hr_; \ + MakeArray9(a2, a3, a4, a5, a6, a7, a8, a9, a10); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return ((ULONG)_hr_); } +#define UlValidateParameters11( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11 ) \ + { HRESULT _hr_; \ + MakeArray10(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return ((ULONG)_hr_); } +#define UlValidateParameters12( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 ) \ + { HRESULT _hr_; \ + MakeArray11(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return ((ULONG)_hr_); } +#define UlValidateParameters13( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) \ + { HRESULT _hr_; \ + MakeArray12(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return ((ULONG)_hr_); } +#define UlValidateParameters14( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14 ) \ + { HRESULT _hr_; \ + MakeArray13(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return ((ULONG)_hr_); } +#define UlValidateParameters15( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 ) \ + { HRESULT _hr_; \ + MakeArray14(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return ((ULONG)_hr_); } +#define UlValidateParameters16( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16 ) \ + { HRESULT _hr_; \ + MakeArray15(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); \ + _hr_ = HrValidateParameters(m, (void **)__rgArgs); if (HR_FAILED(_hr_)) return ((ULONG)_hr_); } + +#ifdef DEBUG +#define CheckParameters1( m, a1 ) +#define CheckParameters2( m, a1, a2 ) \ + { \ + MakeArray1(a2); \ + AssertSz(HR_SUCCEEDED( HrValidateParameters(m, (void **)__rgArgs)), "Parameter validation failed for method called by MAPI!"); } +#define CheckParameters3( m, a1, a2, a3 ) \ + { \ + MakeArray2(a2, a3); \ + AssertSz(HR_SUCCEEDED( HrValidateParameters(m, (void **)__rgArgs)), "Parameter validation failed for method called by MAPI!"); } +#define CheckParameters4( m, a1, a2, a3, a4 ) \ + { \ + MakeArray3(a2, a3, a4); \ + AssertSz(HR_SUCCEEDED( HrValidateParameters(m, (void **)__rgArgs)), "Parameter validation failed for method called by MAPI!"); } +#define CheckParameters5( m, a1, a2, a3, a4, a5 ) \ + { \ + MakeArray4(a2, a3, a4, a5); \ + AssertSz(HR_SUCCEEDED( HrValidateParameters(m, (void **)__rgArgs)), "Parameter validation failed for method called by MAPI!"); } +#define CheckParameters6( m, a1, a2, a3, a4, a5, a6 ) \ + { \ + MakeArray5(a2, a3, a4, a5, a6); \ + AssertSz(HR_SUCCEEDED( HrValidateParameters(m, (void **)__rgArgs)), "Parameter validation failed for method called by MAPI!"); } +#define CheckParameters7( m, a1, a2, a3, a4, a5, a6, a7 ) \ + { \ + MakeArray6(a2, a3, a4, a5, a6, a7); \ + AssertSz(HR_SUCCEEDED( HrValidateParameters(m, (void **)__rgArgs)), "Parameter validation failed for method called by MAPI!"); } +#define CheckParameters8( m, a1, a2, a3, a4, a5, a6, a7, a8 ) \ + { \ + MakeArray7(a2, a3, a4, a5, a6, a7, a8); \ + AssertSz(HR_SUCCEEDED( HrValidateParameters(m, (void **)__rgArgs)), "Parameter validation failed for method called by MAPI!"); } +#define CheckParameters9( m, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) \ + { \ + MakeArray8(a2, a3, a4, a5, a6, a7, a8, a9); \ + AssertSz(HR_SUCCEEDED( HrValidateParameters(m, (void **)__rgArgs)), "Parameter validation failed for method called by MAPI!"); } +#define CheckParameters10( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 ) \ + { \ + MakeArray9(a2, a3, a4, a5, a6, a7, a8, a9, a10); \ + AssertSz(HR_SUCCEEDED( HrValidateParameters(m, (void **)__rgArgs)), "Parameter validation failed for method called by MAPI!"); } +#define CheckParameters11( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11 ) \ + { \ + MakeArray10(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); \ + AssertSz(HR_SUCCEEDED( HrValidateParameters(m, (void **)__rgArgs)), "Parameter validation failed for method called by MAPI!"); } +#define CheckParameters12( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 ) \ + { \ + MakeArray11(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); \ + AssertSz(HR_SUCCEEDED( HrValidateParameters(m, (void **)__rgArgs)), "Parameter validation failed for method called by MAPI!"); } +#define CheckParameters13( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) \ + { \ + MakeArray12(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); \ + AssertSz(HR_SUCCEEDED( HrValidateParameters(m, (void **)__rgArgs)), "Parameter validation failed for method called by MAPI!"); } +#define CheckParameters14( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14 ) \ + { \ + MakeArray13(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); \ + AssertSz(HR_SUCCEEDED( HrValidateParameters(m, (void **)__rgArgs)), "Parameter validation failed for method called by MAPI!"); } +#define CheckParameters15( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 ) \ + { \ + MakeArray14(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); \ + AssertSz(HR_SUCCEEDED( HrValidateParameters(m, (void **)__rgArgs)), "Parameter validation failed for method called by MAPI!"); } +#define CheckParameters16( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16 ) \ + { \ + MakeArray15(a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); \ + AssertSz(HR_SUCCEEDED( HrValidateParameters(m, (void **)__rgArgs)), "Parameter validation failed for method called by MAPI!"); } +#else /* DEBUG */ +#define CheckParameters1( m, a1 ) +#define CheckParameters2( m, a1, a2 ) +#define CheckParameters3( m, a1, a2, a3 ) +#define CheckParameters4( m, a1, a2, a3, a4 ) +#define CheckParameters5( m, a1, a2, a3, a4, a5 ) +#define CheckParameters6( m, a1, a2, a3, a4, a5, a6 ) +#define CheckParameters7( m, a1, a2, a3, a4, a5, a6, a7 ) +#define CheckParameters8( m, a1, a2, a3, a4, a5, a6, a7, a8 ) +#define CheckParameters9( m, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) +#define CheckParameters10( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 ) +#define CheckParameters11( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11 ) +#define CheckParameters12( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 ) +#define CheckParameters13( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) +#define CheckParameters14( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14 ) +#define CheckParameters15( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 ) +#define CheckParameters16( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16 ) +#endif /* DEBUG */ +#else /* !_AMD64_ && !_X86_ */ +#define ValidateParms(x) { HRESULT _hr_ = HrValidateParametersV x; if (HR_FAILED(_hr_)) return (_hr_); } +#define UlValidateParms(x) { HRESULT _hr_ = HrValidateParametersV x; if (HR_FAILED(_hr_)) return (ULONG)(_hr_); } +#define CheckParms(x) AssertSz(HR_SUCCEEDED( HrValidateParametersV x ), "Parameter validation failed for method called by MAPI!") + +#define ValidateParameters1( m, a1 ) \ + ValidateParms( ( m, a1 ) ) +#define ValidateParameters2( m, a1, a2 ) \ + ValidateParms( ( m, a1, a2 )) +#define ValidateParameters3( m, a1, a2, a3 ) \ + ValidateParms( ( m, a1, a2, a3 )) +#define ValidateParameters4( m, a1, a2, a3, a4 ) \ + ValidateParms( ( m, a1, a2, a3, a4 )) +#define ValidateParameters5( m, a1, a2, a3, a4, a5 ) \ + ValidateParms( ( m, a1, a2, a3, a4, a5 )) +#define ValidateParameters6( m, a1, a2, a3, a4, a5, a6 ) \ + ValidateParms( ( m, a1, a2, a3, a4, a5, a6 )) +#define ValidateParameters7( m, a1, a2, a3, a4, a5, a6, a7 ) \ + ValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7 )) +#define ValidateParameters8( m, a1, a2, a3, a4, a5, a6, a7, a8 ) \ + ValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8 )) +#define ValidateParameters9( m, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) \ + ValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9 )) +#define ValidateParameters10( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 ) \ + ValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 )) +#define ValidateParameters11( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11 ) \ + ValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11 )) +#define ValidateParameters12( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 ) \ + ValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 )) +#define ValidateParameters13( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) \ + ValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 )) +#define ValidateParameters14( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14 ) \ + ValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14 )) +#define ValidateParameters15( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 ) \ + ValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 )) +#define ValidateParameters16( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16 ) \ + ValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16 )) + +#define UlValidateParameters1( m, a1 ) \ + UlValidateParms( ( m, a1 ) ) +#define UlValidateParameters2( m, a1, a2 ) \ + UlValidateParms( ( m, a1, a2 )) +#define UlValidateParameters3( m, a1, a2, a3 ) \ + UlValidateParms( ( m, a1, a2, a3 )) +#define UlValidateParameters4( m, a1, a2, a3, a4 ) \ + UlValidateParms( ( m, a1, a2, a3, a4 )) +#define UlValidateParameters5( m, a1, a2, a3, a4, a5 ) \ + UlValidateParms( ( m, a1, a2, a3, a4, a5 )) +#define UlValidateParameters6( m, a1, a2, a3, a4, a5, a6 ) \ + UlValidateParms( ( m, a1, a2, a3, a4, a5, a6 )) +#define UlValidateParameters7( m, a1, a2, a3, a4, a5, a6, a7 ) \ + UlValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7 )) +#define UlValidateParameters8( m, a1, a2, a3, a4, a5, a6, a7, a8 ) \ + UlValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8 )) +#define UlValidateParameters9( m, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) \ + UlValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9 )) +#define UlValidateParameters10( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 ) \ + UlValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 )) +#define UlValidateParameters11( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11 ) \ + UlValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11 )) +#define UlValidateParameters12( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 ) \ + UlValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 )) +#define UlValidateParameters13( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) \ + UlValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 )) +#define UlValidateParameters14( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14 ) \ + UlValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14 )) +#define UlValidateParameters15( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 ) \ + UlValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 )) +#define UlValidateParameters16( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16 ) \ + UlValidateParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16 )) + +#define CheckParameters1( m, a1 ) \ + CheckParms( ( m, a1 ) ) +#define CheckParameters2( m, a1, a2 ) \ + CheckParms( ( m, a1, a2 )) +#define CheckParameters3( m, a1, a2, a3 ) \ + CheckParms( ( m, a1, a2, a3 )) +#define CheckParameters4( m, a1, a2, a3, a4 ) \ + CheckParms( ( m, a1, a2, a3, a4 )) +#define CheckParameters5( m, a1, a2, a3, a4, a5 ) \ + CheckParms( ( m, a1, a2, a3, a4, a5 )) +#define CheckParameters6( m, a1, a2, a3, a4, a5, a6 ) \ + CheckParms( ( m, a1, a2, a3, a4, a5, a6 )) +#define CheckParameters7( m, a1, a2, a3, a4, a5, a6, a7 ) \ + CheckParms( ( m, a1, a2, a3, a4, a5, a6, a7 )) +#define CheckParameters8( m, a1, a2, a3, a4, a5, a6, a7, a8 ) \ + CheckParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8 )) +#define CheckParameters9( m, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) \ + CheckParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9 )) +#define CheckParameters10( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 ) \ + CheckParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 )) +#define CheckParameters11( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11 ) \ + CheckParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11 )) +#define CheckParameters12( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 ) \ + CheckParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 )) +#define CheckParameters13( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) \ + CheckParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 )) +#define CheckParameters14( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14 ) \ + CheckParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14 )) +#define CheckParameters15( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 ) \ + CheckParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 )) +#define CheckParameters16( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16 ) \ + CheckParms( ( m, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16 )) + +#endif /* _AMD64_ || _X86_ */ + + +/* + * M A P I P A R A M E T E R V A L I D A T I O N M A C R O S + */ + + +/* IUnknown */ + +#define Validate_IUnknown_QueryInterface( a1, a2, a3 ) \ + ValidateParameters3( IUnknown_QueryInterface, a1, a2, a3 ) +#define UlValidate_IUnknown_QueryInterface( a1, a2, a3 ) \ + UlValidateParameters3( IUnknown_QueryInterface, a1, a2, a3 ) +#define CheckParameters_IUnknown_QueryInterface( a1, a2, a3 ) \ + CheckParameters3( IUnknown_QueryInterface, a1, a2, a3 ) + +#define Validate_IUnknown_AddRef( a1 ) \ + ValidateParameters1( IUnknown_AddRef, a1 ) +#define UlValidate_IUnknown_AddRef( a1 ) \ + UlValidateParameters1( IUnknown_AddRef, a1 ) +#define CheckParameters_IUnknown_AddRef( a1 ) \ + CheckParameters1( IUnknown_AddRef, a1 ) + +#define Validate_IUnknown_Release( a1 ) \ + ValidateParameters1( IUnknown_Release, a1 ) +#define UlValidate_IUnknown_Release( a1 ) \ + UlValidateParameters1( IUnknown_Release, a1 ) +#define CheckParameters_IUnknown_Release( a1 ) \ + CheckParameters1( IUnknown_Release, a1 ) + + +/* IMAPIProp */ + +#define Validate_IMAPIProp_GetLastError( a1, a2, a3, a4 ) \ + ValidateParameters4( IMAPIProp_GetLastError, a1, a2, a3, a4 ) +#define UlValidate_IMAPIProp_GetLastError( a1, a2, a3, a4 ) \ + UlValidateParameters4( IMAPIProp_GetLastError, a1, a2, a3, a4 ) +#define CheckParameters_IMAPIProp_GetLastError( a1, a2, a3, a4 ) \ + CheckParameters4( IMAPIProp_GetLastError, a1, a2, a3, a4 ) + +#define Validate_IMAPIProp_SaveChanges( a1, a2 ) \ + ValidateParameters2( IMAPIProp_SaveChanges, a1, a2 ) +#define UlValidate_IMAPIProp_SaveChanges( a1, a2 ) \ + UlValidateParameters2( IMAPIProp_SaveChanges, a1, a2 ) +#define CheckParameters_IMAPIProp_SaveChanges( a1, a2 ) \ + CheckParameters2( IMAPIProp_SaveChanges, a1, a2 ) + +#define Validate_IMAPIProp_GetProps( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IMAPIProp_GetProps, a1, a2, a3, a4, a5 ) +#define UlValidate_IMAPIProp_GetProps( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IMAPIProp_GetProps, a1, a2, a3, a4, a5 ) +#define CheckParameters_IMAPIProp_GetProps( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IMAPIProp_GetProps, a1, a2, a3, a4, a5 ) + +#define Validate_IMAPIProp_GetPropList( a1, a2, a3 ) \ + ValidateParameters3( IMAPIProp_GetPropList, a1, a2, a3 ) +#define UlValidate_IMAPIProp_GetPropList( a1, a2, a3 ) \ + UlValidateParameters3( IMAPIProp_GetPropList, a1, a2, a3 ) +#define CheckParameters_IMAPIProp_GetPropList( a1, a2, a3 ) \ + CheckParameters3( IMAPIProp_GetPropList, a1, a2, a3 ) + +#define Validate_IMAPIProp_OpenProperty( a1, a2, a3, a4, a5, a6 ) \ + ValidateParameters6( IMAPIProp_OpenProperty, a1, a2, a3, a4, a5, a6 ) +#define UlValidate_IMAPIProp_OpenProperty( a1, a2, a3, a4, a5, a6 ) \ + UlValidateParameters6( IMAPIProp_OpenProperty, a1, a2, a3, a4, a5, a6 ) +#define CheckParameters_IMAPIProp_OpenProperty( a1, a2, a3, a4, a5, a6 ) \ + CheckParameters6( IMAPIProp_OpenProperty, a1, a2, a3, a4, a5, a6 ) + +#define Validate_IMAPIProp_SetProps( a1, a2, a3, a4 ) \ + ValidateParameters4( IMAPIProp_SetProps, a1, a2, a3, a4 ) +#define UlValidate_IMAPIProp_SetProps( a1, a2, a3, a4 ) \ + UlValidateParameters4( IMAPIProp_SetProps, a1, a2, a3, a4 ) +#define CheckParameters_IMAPIProp_SetProps( a1, a2, a3, a4 ) \ + CheckParameters4( IMAPIProp_SetProps, a1, a2, a3, a4 ) + +#define Validate_IMAPIProp_DeleteProps( a1, a2, a3 ) \ + ValidateParameters3( IMAPIProp_DeleteProps, a1, a2, a3 ) +#define UlValidate_IMAPIProp_DeleteProps( a1, a2, a3 ) \ + UlValidateParameters3( IMAPIProp_DeleteProps, a1, a2, a3 ) +#define CheckParameters_IMAPIProp_DeleteProps( a1, a2, a3 ) \ + CheckParameters3( IMAPIProp_DeleteProps, a1, a2, a3 ) + +#define Validate_IMAPIProp_CopyTo( a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 ) \ + ValidateParameters10( IMAPIProp_CopyTo, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 ) +#define UlValidate_IMAPIProp_CopyTo( a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 ) \ + UlValidateParameters10( IMAPIProp_CopyTo, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 ) +#define CheckParameters_IMAPIProp_CopyTo( a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 ) \ + CheckParameters10( IMAPIProp_CopyTo, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 ) + +#define Validate_IMAPIProp_CopyProps( a1, a2, a3, a4, a5, a6, a7, a8 ) \ + ValidateParameters8( IMAPIProp_CopyProps, a1, a2, a3, a4, a5, a6, a7, a8 ) +#define UlValidate_IMAPIProp_CopyProps( a1, a2, a3, a4, a5, a6, a7, a8 ) \ + UlValidateParameters8( IMAPIProp_CopyProps, a1, a2, a3, a4, a5, a6, a7, a8 ) +#define CheckParameters_IMAPIProp_CopyProps( a1, a2, a3, a4, a5, a6, a7, a8 ) \ + CheckParameters8( IMAPIProp_CopyProps, a1, a2, a3, a4, a5, a6, a7, a8 ) + +#define Validate_IMAPIProp_GetNamesFromIDs( a1, a2, a3, a4, a5, a6 ) \ + ValidateParameters6( IMAPIProp_GetNamesFromIDs, a1, a2, a3, a4, a5, a6 ) +#define UlValidate_IMAPIProp_GetNamesFromIDs( a1, a2, a3, a4, a5, a6 ) \ + UlValidateParameters6( IMAPIProp_GetNamesFromIDs, a1, a2, a3, a4, a5, a6 ) +#define CheckParameters_IMAPIProp_GetNamesFromIDs( a1, a2, a3, a4, a5, a6 ) \ + CheckParameters6( IMAPIProp_GetNamesFromIDs, a1, a2, a3, a4, a5, a6 ) + +#define Validate_IMAPIProp_GetIDsFromNames( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IMAPIProp_GetIDsFromNames, a1, a2, a3, a4, a5 ) +#define UlValidate_IMAPIProp_GetIDsFromNames( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IMAPIProp_GetIDsFromNames, a1, a2, a3, a4, a5 ) +#define CheckParameters_IMAPIProp_GetIDsFromNames( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IMAPIProp_GetIDsFromNames, a1, a2, a3, a4, a5 ) + + +/* IMAPITable */ + +#define Validate_IMAPITable_GetLastError( a1, a2, a3, a4 ) \ + ValidateParameters4( IMAPITable_GetLastError, a1, a2, a3, a4 ) +#define UlValidate_IMAPITable_GetLastError( a1, a2, a3, a4 ) \ + UlValidateParameters4( IMAPITable_GetLastError, a1, a2, a3, a4 ) +#define CheckParameters_IMAPITable_GetLastError( a1, a2, a3, a4 ) \ + CheckParameters4( IMAPITable_GetLastError, a1, a2, a3, a4 ) + +#define Validate_IMAPITable_Advise( a1, a2, a3, a4 ) \ + ValidateParameters4( IMAPITable_Advise, a1, a2, a3, a4 ) +#define UlValidate_IMAPITable_Advise( a1, a2, a3, a4 ) \ + UlValidateParameters4( IMAPITable_Advise, a1, a2, a3, a4 ) +#define CheckParameters_IMAPITable_Advise( a1, a2, a3, a4 ) \ + CheckParameters4( IMAPITable_Advise, a1, a2, a3, a4 ) + +#define Validate_IMAPITable_Unadvise( a1, a2 ) \ + ValidateParameters2( IMAPITable_Unadvise, a1, a2 ) +#define UlValidate_IMAPITable_Unadvise( a1, a2 ) \ + UlValidateParameters2( IMAPITable_Unadvise, a1, a2 ) +#define CheckParameters_IMAPITable_Unadvise( a1, a2 ) \ + CheckParameters2( IMAPITable_Unadvise, a1, a2 ) + +#define Validate_IMAPITable_GetStatus( a1, a2, a3 ) \ + ValidateParameters3( IMAPITable_GetStatus, a1, a2, a3 ) +#define UlValidate_IMAPITable_GetStatus( a1, a2, a3 ) \ + UlValidateParameters3( IMAPITable_GetStatus, a1, a2, a3 ) +#define CheckParameters_IMAPITable_GetStatus( a1, a2, a3 ) \ + CheckParameters3( IMAPITable_GetStatus, a1, a2, a3 ) + +#define Validate_IMAPITable_SetColumns( a1, a2, a3 ) \ + ValidateParameters3( IMAPITable_SetColumns, a1, a2, a3 ) +#define UlValidate_IMAPITable_SetColumns( a1, a2, a3 ) \ + UlValidateParameters3( IMAPITable_SetColumns, a1, a2, a3 ) +#define CheckParameters_IMAPITable_SetColumns( a1, a2, a3 ) \ + CheckParameters3( IMAPITable_SetColumns, a1, a2, a3 ) + +#define Validate_IMAPITable_QueryColumns( a1, a2, a3 ) \ + ValidateParameters3( IMAPITable_QueryColumns, a1, a2, a3 ) +#define UlValidate_IMAPITable_QueryColumns( a1, a2, a3 ) \ + UlValidateParameters3( IMAPITable_QueryColumns, a1, a2, a3 ) +#define CheckParameters_IMAPITable_QueryColumns( a1, a2, a3 ) \ + CheckParameters3( IMAPITable_QueryColumns, a1, a2, a3 ) + +#define Validate_IMAPITable_GetRowCount( a1, a2, a3 ) \ + ValidateParameters3( IMAPITable_GetRowCount, a1, a2, a3 ) +#define UlValidate_IMAPITable_GetRowCount( a1, a2, a3 ) \ + UlValidateParameters3( IMAPITable_GetRowCount, a1, a2, a3 ) +#define CheckParameters_IMAPITable_GetRowCount( a1, a2, a3 ) \ + CheckParameters3( IMAPITable_GetRowCount, a1, a2, a3 ) + +#define Validate_IMAPITable_SeekRow( a1, a2, a3, a4 ) \ + ValidateParameters4( IMAPITable_SeekRow, a1, a2, a3, a4 ) +#define UlValidate_IMAPITable_SeekRow( a1, a2, a3, a4 ) \ + UlValidateParameters4( IMAPITable_SeekRow, a1, a2, a3, a4 ) +#define CheckParameters_IMAPITable_SeekRow( a1, a2, a3, a4 ) \ + CheckParameters4( IMAPITable_SeekRow, a1, a2, a3, a4 ) + +#define Validate_IMAPITable_SeekRowApprox( a1, a2, a3 ) \ + ValidateParameters3( IMAPITable_SeekRowApprox, a1, a2, a3 ) +#define UlValidate_IMAPITable_SeekRowApprox( a1, a2, a3 ) \ + UlValidateParameters3( IMAPITable_SeekRowApprox, a1, a2, a3 ) +#define CheckParameters_IMAPITable_SeekRowApprox( a1, a2, a3 ) \ + CheckParameters3( IMAPITable_SeekRowApprox, a1, a2, a3 ) + +#define Validate_IMAPITable_QueryPosition( a1, a2, a3, a4 ) \ + ValidateParameters4( IMAPITable_QueryPosition, a1, a2, a3, a4 ) +#define UlValidate_IMAPITable_QueryPosition( a1, a2, a3, a4 ) \ + UlValidateParameters4( IMAPITable_QueryPosition, a1, a2, a3, a4 ) +#define CheckParameters_IMAPITable_QueryPosition( a1, a2, a3, a4 ) \ + CheckParameters4( IMAPITable_QueryPosition, a1, a2, a3, a4 ) + +#define Validate_IMAPITable_FindRow( a1, a2, a3, a4 ) \ + ValidateParameters4( IMAPITable_FindRow, a1, a2, a3, a4 ) +#define UlValidate_IMAPITable_FindRow( a1, a2, a3, a4 ) \ + UlValidateParameters4( IMAPITable_FindRow, a1, a2, a3, a4 ) +#define CheckParameters_IMAPITable_FindRow( a1, a2, a3, a4 ) \ + CheckParameters4( IMAPITable_FindRow, a1, a2, a3, a4 ) + +#define Validate_IMAPITable_Restrict( a1, a2, a3 ) \ + ValidateParameters3( IMAPITable_Restrict, a1, a2, a3 ) +#define UlValidate_IMAPITable_Restrict( a1, a2, a3 ) \ + UlValidateParameters3( IMAPITable_Restrict, a1, a2, a3 ) +#define CheckParameters_IMAPITable_Restrict( a1, a2, a3 ) \ + CheckParameters3( IMAPITable_Restrict, a1, a2, a3 ) + +#define Validate_IMAPITable_CreateBookmark( a1, a2 ) \ + ValidateParameters2( IMAPITable_CreateBookmark, a1, a2 ) +#define UlValidate_IMAPITable_CreateBookmark( a1, a2 ) \ + UlValidateParameters2( IMAPITable_CreateBookmark, a1, a2 ) +#define CheckParameters_IMAPITable_CreateBookmark( a1, a2 ) \ + CheckParameters2( IMAPITable_CreateBookmark, a1, a2 ) + +#define Validate_IMAPITable_FreeBookmark( a1, a2 ) \ + ValidateParameters2( IMAPITable_FreeBookmark, a1, a2 ) +#define UlValidate_IMAPITable_FreeBookmark( a1, a2 ) \ + UlValidateParameters2( IMAPITable_FreeBookmark, a1, a2 ) +#define CheckParameters_IMAPITable_FreeBookmark( a1, a2 ) \ + CheckParameters2( IMAPITable_FreeBookmark, a1, a2 ) + +#define Validate_IMAPITable_SortTable( a1, a2, a3 ) \ + ValidateParameters3( IMAPITable_SortTable, a1, a2, a3 ) +#define UlValidate_IMAPITable_SortTable( a1, a2, a3 ) \ + UlValidateParameters3( IMAPITable_SortTable, a1, a2, a3 ) +#define CheckParameters_IMAPITable_SortTable( a1, a2, a3 ) \ + CheckParameters3( IMAPITable_SortTable, a1, a2, a3 ) + +#define Validate_IMAPITable_QuerySortOrder( a1, a2 ) \ + ValidateParameters2( IMAPITable_QuerySortOrder, a1, a2 ) +#define UlValidate_IMAPITable_QuerySortOrder( a1, a2 ) \ + UlValidateParameters2( IMAPITable_QuerySortOrder, a1, a2 ) +#define CheckParameters_IMAPITable_QuerySortOrder( a1, a2 ) \ + CheckParameters2( IMAPITable_QuerySortOrder, a1, a2 ) + +#define Validate_IMAPITable_QueryRows( a1, a2, a3, a4 ) \ + ValidateParameters4( IMAPITable_QueryRows, a1, a2, a3, a4 ) +#define UlValidate_IMAPITable_QueryRows( a1, a2, a3, a4 ) \ + UlValidateParameters4( IMAPITable_QueryRows, a1, a2, a3, a4 ) +#define CheckParameters_IMAPITable_QueryRows( a1, a2, a3, a4 ) \ + CheckParameters4( IMAPITable_QueryRows, a1, a2, a3, a4 ) + +#define Validate_IMAPITable_Abort( a1 ) \ + ValidateParameters1( IMAPITable_Abort, a1 ) +#define UlValidate_IMAPITable_Abort( a1 ) \ + UlValidateParameters1( IMAPITable_Abort, a1 ) +#define CheckParameters_IMAPITable_Abort( a1 ) \ + CheckParameters1( IMAPITable_Abort, a1 ) + +#define Validate_IMAPITable_ExpandRow( a1, a2, a3, a4, a5, a6, a7 ) \ + ValidateParameters7( IMAPITable_ExpandRow, a1, a2, a3, a4, a5, a6, a7 ) +#define UlValidate_IMAPITable_ExpandRow( a1, a2, a3, a4, a5, a6, a7 ) \ + UlValidateParameters7( IMAPITable_ExpandRow, a1, a2, a3, a4, a5, a6, a7 ) +#define CheckParameters_IMAPITable_ExpandRow( a1, a2, a3, a4, a5, a6, a7 ) \ + CheckParameters7( IMAPITable_ExpandRow, a1, a2, a3, a4, a5, a6, a7 ) + +#define Validate_IMAPITable_CollapseRow( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IMAPITable_CollapseRow, a1, a2, a3, a4, a5 ) +#define UlValidate_IMAPITable_CollapseRow( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IMAPITable_CollapseRow, a1, a2, a3, a4, a5 ) +#define CheckParameters_IMAPITable_CollapseRow( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IMAPITable_CollapseRow, a1, a2, a3, a4, a5 ) + +#define Validate_IMAPITable_WaitForCompletion( a1, a2, a3, a4 ) \ + ValidateParameters4( IMAPITable_WaitForCompletion, a1, a2, a3, a4 ) +#define UlValidate_IMAPITable_WaitForCompletion( a1, a2, a3, a4 ) \ + UlValidateParameters4( IMAPITable_WaitForCompletion, a1, a2, a3, a4 ) +#define CheckParameters_IMAPITable_WaitForCompletion( a1, a2, a3, a4 ) \ + CheckParameters4( IMAPITable_WaitForCompletion, a1, a2, a3, a4 ) + +#define Validate_IMAPITable_GetCollapseState( a1, a2, a3, a4, a5, a6 ) \ + ValidateParameters6( IMAPITable_GetCollapseState, a1, a2, a3, a4, a5, a6 ) +#define UlValidate_IMAPITable_GetCollapseState( a1, a2, a3, a4, a5, a6 ) \ + UlValidateParameters6( IMAPITable_GetCollapseState, a1, a2, a3, a4, a5, a6 ) +#define CheckParameters_IMAPITable_GetCollapseState( a1, a2, a3, a4, a5, a6 ) \ + CheckParameters6( IMAPITable_GetCollapseState, a1, a2, a3, a4, a5, a6 ) + +#define Validate_IMAPITable_SetCollapseState( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IMAPITable_SetCollapseState, a1, a2, a3, a4, a5 ) +#define UlValidate_IMAPITable_SetCollapseState( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IMAPITable_SetCollapseState, a1, a2, a3, a4, a5 ) +#define CheckParameters_IMAPITable_SetCollapseState( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IMAPITable_SetCollapseState, a1, a2, a3, a4, a5 ) + + +/* IMAPIContainer */ + +#define Validate_IMAPIContainer_GetContentsTable( a1, a2, a3 ) \ + ValidateParameters3( IMAPIContainer_GetContentsTable, a1, a2, a3 ) +#define UlValidate_IMAPIContainer_GetContentsTable( a1, a2, a3 ) \ + UlValidateParameters3( IMAPIContainer_GetContentsTable, a1, a2, a3 ) +#define CheckParameters_IMAPIContainer_GetContentsTable( a1, a2, a3 ) \ + CheckParameters3( IMAPIContainer_GetContentsTable, a1, a2, a3 ) + +#define Validate_IMAPIContainer_GetHierarchyTable( a1, a2, a3 ) \ + ValidateParameters3( IMAPIContainer_GetHierarchyTable, a1, a2, a3 ) +#define UlValidate_IMAPIContainer_GetHierarchyTable( a1, a2, a3 ) \ + UlValidateParameters3( IMAPIContainer_GetHierarchyTable, a1, a2, a3 ) +#define CheckParameters_IMAPIContainer_GetHierarchyTable( a1, a2, a3 ) \ + CheckParameters3( IMAPIContainer_GetHierarchyTable, a1, a2, a3 ) + +#define Validate_IMAPIContainer_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ + ValidateParameters7( IMAPIContainer_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) +#define UlValidate_IMAPIContainer_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ + UlValidateParameters7( IMAPIContainer_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) +#define CheckParameters_IMAPIContainer_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ + CheckParameters7( IMAPIContainer_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) + +#define Validate_IMAPIContainer_SetSearchCriteria( a1, a2, a3, a4 ) \ + ValidateParameters4( IMAPIContainer_SetSearchCriteria, a1, a2, a3, a4 ) +#define UlValidate_IMAPIContainer_SetSearchCriteria( a1, a2, a3, a4 ) \ + UlValidateParameters4( IMAPIContainer_SetSearchCriteria, a1, a2, a3, a4 ) +#define CheckParameters_IMAPIContainer_SetSearchCriteria( a1, a2, a3, a4 ) \ + CheckParameters4( IMAPIContainer_SetSearchCriteria, a1, a2, a3, a4 ) + +#define Validate_IMAPIContainer_GetSearchCriteria( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IMAPIContainer_GetSearchCriteria, a1, a2, a3, a4, a5 ) +#define UlValidate_IMAPIContainer_GetSearchCriteria( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IMAPIContainer_GetSearchCriteria, a1, a2, a3, a4, a5 ) +#define CheckParameters_IMAPIContainer_GetSearchCriteria( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IMAPIContainer_GetSearchCriteria, a1, a2, a3, a4, a5 ) + + +/* IABContainer */ + +#define Validate_IABContainer_CreateEntry( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IABContainer_CreateEntry, a1, a2, a3, a4, a5 ) +#define UlValidate_IABContainer_CreateEntry( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IABContainer_CreateEntry, a1, a2, a3, a4, a5 ) +#define CheckParameters_IABContainer_CreateEntry( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IABContainer_CreateEntry, a1, a2, a3, a4, a5 ) + +#define Validate_IABContainer_CopyEntries( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IABContainer_CopyEntries, a1, a2, a3, a4, a5 ) +#define UlValidate_IABContainer_CopyEntries( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IABContainer_CopyEntries, a1, a2, a3, a4, a5 ) +#define CheckParameters_IABContainer_CopyEntries( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IABContainer_CopyEntries, a1, a2, a3, a4, a5 ) + +#define Validate_IABContainer_DeleteEntries( a1, a2, a3 ) \ + ValidateParameters3( IABContainer_DeleteEntries, a1, a2, a3 ) +#define UlValidate_IABContainer_DeleteEntries( a1, a2, a3 ) \ + UlValidateParameters3( IABContainer_DeleteEntries, a1, a2, a3 ) +#define CheckParameters_IABContainer_DeleteEntries( a1, a2, a3 ) \ + CheckParameters3( IABContainer_DeleteEntries, a1, a2, a3 ) + +#define Validate_IABContainer_ResolveNames( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IABContainer_ResolveNames, a1, a2, a3, a4, a5 ) +#define UlValidate_IABContainer_ResolveNames( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IABContainer_ResolveNames, a1, a2, a3, a4, a5 ) +#define CheckParameters_IABContainer_ResolveNames( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IABContainer_ResolveNames, a1, a2, a3, a4, a5 ) + + +/* IDistList */ + +#define Validate_IDistList_CreateEntry( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IDistList_CreateEntry, a1, a2, a3, a4, a5 ) +#define UlValidate_IDistList_CreateEntry( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IDistList_CreateEntry, a1, a2, a3, a4, a5 ) +#define CheckParameters_IDistList_CreateEntry( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IDistList_CreateEntry, a1, a2, a3, a4, a5 ) + +#define Validate_IDistList_CopyEntries( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IDistList_CopyEntries, a1, a2, a3, a4, a5 ) +#define UlValidate_IDistList_CopyEntries( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IDistList_CopyEntries, a1, a2, a3, a4, a5 ) +#define CheckParameters_IDistList_CopyEntries( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IDistList_CopyEntries, a1, a2, a3, a4, a5 ) + +#define Validate_IDistList_DeleteEntries( a1, a2, a3 ) \ + ValidateParameters3( IDistList_DeleteEntries, a1, a2, a3 ) +#define UlValidate_IDistList_DeleteEntries( a1, a2, a3 ) \ + UlValidateParameters3( IDistList_DeleteEntries, a1, a2, a3 ) +#define CheckParameters_IDistList_DeleteEntries( a1, a2, a3 ) \ + CheckParameters3( IDistList_DeleteEntries, a1, a2, a3 ) + +#define Validate_IDistList_ResolveNames( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IDistList_ResolveNames, a1, a2, a3, a4, a5 ) +#define UlValidate_IDistList_ResolveNames( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IDistList_ResolveNames, a1, a2, a3, a4, a5 ) +#define CheckParameters_IDistList_ResolveNames( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IDistList_ResolveNames, a1, a2, a3, a4, a5 ) + + +/* IMAPIFolder */ + +#define Validate_IMAPIFolder_CreateMessage( a1, a2, a3, a4 ) \ + ValidateParameters4( IMAPIFolder_CreateMessage, a1, a2, a3, a4 ) +#define UlValidate_IMAPIFolder_CreateMessage( a1, a2, a3, a4 ) \ + UlValidateParameters4( IMAPIFolder_CreateMessage, a1, a2, a3, a4 ) +#define CheckParameters_IMAPIFolder_CreateMessage( a1, a2, a3, a4 ) \ + CheckParameters4( IMAPIFolder_CreateMessage, a1, a2, a3, a4 ) + +#define Validate_IMAPIFolder_CopyMessages( a1, a2, a3, a4, a5, a6, a7 ) \ + ValidateParameters7( IMAPIFolder_CopyMessages, a1, a2, a3, a4, a5, a6, a7 ) +#define UlValidate_IMAPIFolder_CopyMessages( a1, a2, a3, a4, a5, a6, a7 ) \ + UlValidateParameters7( IMAPIFolder_CopyMessages, a1, a2, a3, a4, a5, a6, a7 ) +#define CheckParameters_IMAPIFolder_CopyMessages( a1, a2, a3, a4, a5, a6, a7 ) \ + CheckParameters7( IMAPIFolder_CopyMessages, a1, a2, a3, a4, a5, a6, a7 ) + +#define Validate_IMAPIFolder_DeleteMessages( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IMAPIFolder_DeleteMessages, a1, a2, a3, a4, a5 ) +#define UlValidate_IMAPIFolder_DeleteMessages( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IMAPIFolder_DeleteMessages, a1, a2, a3, a4, a5 ) +#define CheckParameters_IMAPIFolder_DeleteMessages( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IMAPIFolder_DeleteMessages, a1, a2, a3, a4, a5 ) + +#define Validate_IMAPIFolder_CreateFolder( a1, a2, a3, a4, a5, a6, a7 ) \ + ValidateParameters7( IMAPIFolder_CreateFolder, a1, a2, a3, a4, a5, a6, a7 ) +#define UlValidate_IMAPIFolder_CreateFolder( a1, a2, a3, a4, a5, a6, a7 ) \ + UlValidateParameters7( IMAPIFolder_CreateFolder, a1, a2, a3, a4, a5, a6, a7 ) +#define CheckParameters_IMAPIFolder_CreateFolder( a1, a2, a3, a4, a5, a6, a7 ) \ + CheckParameters7( IMAPIFolder_CreateFolder, a1, a2, a3, a4, a5, a6, a7 ) + +#define Validate_IMAPIFolder_CopyFolder( a1, a2, a3, a4, a5, a6, a7, a8, a9 ) \ + ValidateParameters9( IMAPIFolder_CopyFolder, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) +#define UlValidate_IMAPIFolder_CopyFolder( a1, a2, a3, a4, a5, a6, a7, a8, a9 ) \ + UlValidateParameters9( IMAPIFolder_CopyFolder, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) +#define CheckParameters_IMAPIFolder_CopyFolder( a1, a2, a3, a4, a5, a6, a7, a8, a9 ) \ + CheckParameters9( IMAPIFolder_CopyFolder, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) + +#define Validate_IMAPIFolder_DeleteFolder( a1, a2, a3, a4, a5, a6 ) \ + ValidateParameters6( IMAPIFolder_DeleteFolder, a1, a2, a3, a4, a5, a6 ) +#define UlValidate_IMAPIFolder_DeleteFolder( a1, a2, a3, a4, a5, a6 ) \ + UlValidateParameters6( IMAPIFolder_DeleteFolder, a1, a2, a3, a4, a5, a6 ) +#define CheckParameters_IMAPIFolder_DeleteFolder( a1, a2, a3, a4, a5, a6 ) \ + CheckParameters6( IMAPIFolder_DeleteFolder, a1, a2, a3, a4, a5, a6 ) + +#define Validate_IMAPIFolder_SetReadFlags( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IMAPIFolder_SetReadFlags, a1, a2, a3, a4, a5 ) +#define UlValidate_IMAPIFolder_SetReadFlags( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IMAPIFolder_SetReadFlags, a1, a2, a3, a4, a5 ) +#define CheckParameters_IMAPIFolder_SetReadFlags( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IMAPIFolder_SetReadFlags, a1, a2, a3, a4, a5 ) + +#define Validate_IMAPIFolder_GetMessageStatus( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IMAPIFolder_GetMessageStatus, a1, a2, a3, a4, a5 ) +#define UlValidate_IMAPIFolder_GetMessageStatus( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IMAPIFolder_GetMessageStatus, a1, a2, a3, a4, a5 ) +#define CheckParameters_IMAPIFolder_GetMessageStatus( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IMAPIFolder_GetMessageStatus, a1, a2, a3, a4, a5 ) + +#define Validate_IMAPIFolder_SetMessageStatus( a1, a2, a3, a4, a5, a6 ) \ + ValidateParameters6( IMAPIFolder_SetMessageStatus, a1, a2, a3, a4, a5, a6 ) +#define UlValidate_IMAPIFolder_SetMessageStatus( a1, a2, a3, a4, a5, a6 ) \ + UlValidateParameters6( IMAPIFolder_SetMessageStatus, a1, a2, a3, a4, a5, a6 ) +#define CheckParameters_IMAPIFolder_SetMessageStatus( a1, a2, a3, a4, a5, a6 ) \ + CheckParameters6( IMAPIFolder_SetMessageStatus, a1, a2, a3, a4, a5, a6 ) + +#define Validate_IMAPIFolder_SaveContentsSort( a1, a2, a3 ) \ + ValidateParameters3( IMAPIFolder_SaveContentsSort, a1, a2, a3 ) +#define UlValidate_IMAPIFolder_SaveContentsSort( a1, a2, a3 ) \ + UlValidateParameters3( IMAPIFolder_SaveContentsSort, a1, a2, a3 ) +#define CheckParameters_IMAPIFolder_SaveContentsSort( a1, a2, a3 ) \ + CheckParameters3( IMAPIFolder_SaveContentsSort, a1, a2, a3 ) + +#define Validate_IMAPIFolder_EmptyFolder( a1, a2, a3, a4 ) \ + ValidateParameters4( IMAPIFolder_EmptyFolder, a1, a2, a3, a4 ) +#define UlValidate_IMAPIFolder_EmptyFolder( a1, a2, a3, a4 ) \ + UlValidateParameters4( IMAPIFolder_EmptyFolder, a1, a2, a3, a4 ) +#define CheckParameters_IMAPIFolder_EmptyFolder( a1, a2, a3, a4 ) \ + CheckParameters4( IMAPIFolder_EmptyFolder, a1, a2, a3, a4 ) + + +/* IMsgStore */ + +#define Validate_IMsgStore_Advise( a1, a2, a3, a4, a5, a6 ) \ + ValidateParameters6( IMsgStore_Advise, a1, a2, a3, a4, a5, a6 ) +#define UlValidate_IMsgStore_Advise( a1, a2, a3, a4, a5, a6 ) \ + UlValidateParameters6( IMsgStore_Advise, a1, a2, a3, a4, a5, a6 ) +#define CheckParameters_IMsgStore_Advise( a1, a2, a3, a4, a5, a6 ) \ + CheckParameters6( IMsgStore_Advise, a1, a2, a3, a4, a5, a6 ) + +#define Validate_IMsgStore_Unadvise( a1, a2 ) \ + ValidateParameters2( IMsgStore_Unadvise, a1, a2 ) +#define UlValidate_IMsgStore_Unadvise( a1, a2 ) \ + UlValidateParameters2( IMsgStore_Unadvise, a1, a2 ) +#define CheckParameters_IMsgStore_Unadvise( a1, a2 ) \ + CheckParameters2( IMsgStore_Unadvise, a1, a2 ) + +#define Validate_IMsgStore_CompareEntryIDs( a1, a2, a3, a4, a5, a6, a7 ) \ + ValidateParameters7( IMsgStore_CompareEntryIDs, a1, a2, a3, a4, a5, a6, a7 ) +#define UlValidate_IMsgStore_CompareEntryIDs( a1, a2, a3, a4, a5, a6, a7 ) \ + UlValidateParameters7( IMsgStore_CompareEntryIDs, a1, a2, a3, a4, a5, a6, a7 ) +#define CheckParameters_IMsgStore_CompareEntryIDs( a1, a2, a3, a4, a5, a6, a7 ) \ + CheckParameters7( IMsgStore_CompareEntryIDs, a1, a2, a3, a4, a5, a6, a7 ) + +#define Validate_IMsgStore_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ + ValidateParameters7( IMsgStore_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) +#define UlValidate_IMsgStore_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ + UlValidateParameters7( IMsgStore_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) +#define CheckParameters_IMsgStore_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ + CheckParameters7( IMsgStore_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) + +#define Validate_IMsgStore_SetReceiveFolder( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IMsgStore_SetReceiveFolder, a1, a2, a3, a4, a5 ) +#define UlValidate_IMsgStore_SetReceiveFolder( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IMsgStore_SetReceiveFolder, a1, a2, a3, a4, a5 ) +#define CheckParameters_IMsgStore_SetReceiveFolder( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IMsgStore_SetReceiveFolder, a1, a2, a3, a4, a5 ) + +#define Validate_IMsgStore_GetReceiveFolder( a1, a2, a3, a4, a5, a6 ) \ + ValidateParameters6( IMsgStore_GetReceiveFolder, a1, a2, a3, a4, a5, a6 ) +#define UlValidate_IMsgStore_GetReceiveFolder( a1, a2, a3, a4, a5, a6 ) \ + UlValidateParameters6( IMsgStore_GetReceiveFolder, a1, a2, a3, a4, a5, a6 ) +#define CheckParameters_IMsgStore_GetReceiveFolder( a1, a2, a3, a4, a5, a6 ) \ + CheckParameters6( IMsgStore_GetReceiveFolder, a1, a2, a3, a4, a5, a6 ) + +#define Validate_IMsgStore_GetReceiveFolderTable( a1, a2, a3 ) \ + ValidateParameters3( IMsgStore_GetReceiveFolderTable, a1, a2, a3 ) +#define UlValidate_IMsgStore_GetReceiveFolderTable( a1, a2, a3 ) \ + UlValidateParameters3( IMsgStore_GetReceiveFolderTable, a1, a2, a3 ) +#define CheckParameters_IMsgStore_GetReceiveFolderTable( a1, a2, a3 ) \ + CheckParameters3( IMsgStore_GetReceiveFolderTable, a1, a2, a3 ) + +#define Validate_IMsgStore_StoreLogoff( a1, a2 ) \ + ValidateParameters2( IMsgStore_StoreLogoff, a1, a2 ) +#define UlValidate_IMsgStore_StoreLogoff( a1, a2 ) \ + UlValidateParameters2( IMsgStore_StoreLogoff, a1, a2 ) +#define CheckParameters_IMsgStore_StoreLogoff( a1, a2 ) \ + CheckParameters2( IMsgStore_StoreLogoff, a1, a2 ) + +#define Validate_IMsgStore_AbortSubmit( a1, a2, a3, a4 ) \ + ValidateParameters4( IMsgStore_AbortSubmit, a1, a2, a3, a4 ) +#define UlValidate_IMsgStore_AbortSubmit( a1, a2, a3, a4 ) \ + UlValidateParameters4( IMsgStore_AbortSubmit, a1, a2, a3, a4 ) +#define CheckParameters_IMsgStore_AbortSubmit( a1, a2, a3, a4 ) \ + CheckParameters4( IMsgStore_AbortSubmit, a1, a2, a3, a4 ) + +#define Validate_IMsgStore_GetOutgoingQueue( a1, a2, a3 ) \ + ValidateParameters3( IMsgStore_GetOutgoingQueue, a1, a2, a3 ) +#define UlValidate_IMsgStore_GetOutgoingQueue( a1, a2, a3 ) \ + UlValidateParameters3( IMsgStore_GetOutgoingQueue, a1, a2, a3 ) +#define CheckParameters_IMsgStore_GetOutgoingQueue( a1, a2, a3 ) \ + CheckParameters3( IMsgStore_GetOutgoingQueue, a1, a2, a3 ) + +#define Validate_IMsgStore_SetLockState( a1, a2, a3 ) \ + ValidateParameters3( IMsgStore_SetLockState, a1, a2, a3 ) +#define UlValidate_IMsgStore_SetLockState( a1, a2, a3 ) \ + UlValidateParameters3( IMsgStore_SetLockState, a1, a2, a3 ) +#define CheckParameters_IMsgStore_SetLockState( a1, a2, a3 ) \ + CheckParameters3( IMsgStore_SetLockState, a1, a2, a3 ) + +#define Validate_IMsgStore_FinishedMsg( a1, a2, a3, a4 ) \ + ValidateParameters4( IMsgStore_FinishedMsg, a1, a2, a3, a4 ) +#define UlValidate_IMsgStore_FinishedMsg( a1, a2, a3, a4 ) \ + UlValidateParameters4( IMsgStore_FinishedMsg, a1, a2, a3, a4 ) +#define CheckParameters_IMsgStore_FinishedMsg( a1, a2, a3, a4 ) \ + CheckParameters4( IMsgStore_FinishedMsg, a1, a2, a3, a4 ) + +#define Validate_IMsgStore_NotifyNewMail( a1, a2 ) \ + ValidateParameters2( IMsgStore_NotifyNewMail, a1, a2 ) +#define UlValidate_IMsgStore_NotifyNewMail( a1, a2 ) \ + UlValidateParameters2( IMsgStore_NotifyNewMail, a1, a2 ) +#define CheckParameters_IMsgStore_NotifyNewMail( a1, a2 ) \ + CheckParameters2( IMsgStore_NotifyNewMail, a1, a2 ) + + +/* IMessage */ + +#define Validate_IMessage_GetAttachmentTable( a1, a2, a3 ) \ + ValidateParameters3( IMessage_GetAttachmentTable, a1, a2, a3 ) +#define UlValidate_IMessage_GetAttachmentTable( a1, a2, a3 ) \ + UlValidateParameters3( IMessage_GetAttachmentTable, a1, a2, a3 ) +#define CheckParameters_IMessage_GetAttachmentTable( a1, a2, a3 ) \ + CheckParameters3( IMessage_GetAttachmentTable, a1, a2, a3 ) + +#define Validate_IMessage_OpenAttach( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IMessage_OpenAttach, a1, a2, a3, a4, a5 ) +#define UlValidate_IMessage_OpenAttach( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IMessage_OpenAttach, a1, a2, a3, a4, a5 ) +#define CheckParameters_IMessage_OpenAttach( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IMessage_OpenAttach, a1, a2, a3, a4, a5 ) + +#define Validate_IMessage_CreateAttach( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IMessage_CreateAttach, a1, a2, a3, a4, a5 ) +#define UlValidate_IMessage_CreateAttach( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IMessage_CreateAttach, a1, a2, a3, a4, a5 ) +#define CheckParameters_IMessage_CreateAttach( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IMessage_CreateAttach, a1, a2, a3, a4, a5 ) + +#define Validate_IMessage_DeleteAttach( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IMessage_DeleteAttach, a1, a2, a3, a4, a5 ) +#define UlValidate_IMessage_DeleteAttach( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IMessage_DeleteAttach, a1, a2, a3, a4, a5 ) +#define CheckParameters_IMessage_DeleteAttach( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IMessage_DeleteAttach, a1, a2, a3, a4, a5 ) + +#define Validate_IMessage_GetRecipientTable( a1, a2, a3 ) \ + ValidateParameters3( IMessage_GetRecipientTable, a1, a2, a3 ) +#define UlValidate_IMessage_GetRecipientTable( a1, a2, a3 ) \ + UlValidateParameters3( IMessage_GetRecipientTable, a1, a2, a3 ) +#define CheckParameters_IMessage_GetRecipientTable( a1, a2, a3 ) \ + CheckParameters3( IMessage_GetRecipientTable, a1, a2, a3 ) + +#define Validate_IMessage_ModifyRecipients( a1, a2, a3 ) \ + ValidateParameters3( IMessage_ModifyRecipients, a1, a2, a3 ) +#define UlValidate_IMessage_ModifyRecipients( a1, a2, a3 ) \ + UlValidateParameters3( IMessage_ModifyRecipients, a1, a2, a3 ) +#define CheckParameters_IMessage_ModifyRecipients( a1, a2, a3 ) \ + CheckParameters3( IMessage_ModifyRecipients, a1, a2, a3 ) + +#define Validate_IMessage_SubmitMessage( a1, a2 ) \ + ValidateParameters2( IMessage_SubmitMessage, a1, a2 ) +#define UlValidate_IMessage_SubmitMessage( a1, a2 ) \ + UlValidateParameters2( IMessage_SubmitMessage, a1, a2 ) +#define CheckParameters_IMessage_SubmitMessage( a1, a2 ) \ + CheckParameters2( IMessage_SubmitMessage, a1, a2 ) + +#define Validate_IMessage_SetReadFlag( a1, a2 ) \ + ValidateParameters2( IMessage_SetReadFlag, a1, a2 ) +#define UlValidate_IMessage_SetReadFlag( a1, a2 ) \ + UlValidateParameters2( IMessage_SetReadFlag, a1, a2 ) +#define CheckParameters_IMessage_SetReadFlag( a1, a2 ) \ + CheckParameters2( IMessage_SetReadFlag, a1, a2 ) + + +/* IABProvider */ + +#define Validate_IABProvider_Shutdown( a1, a2 ) \ + ValidateParameters2( IABProvider_Shutdown, a1, a2 ) +#define UlValidate_IABProvider_Shutdown( a1, a2 ) \ + UlValidateParameters2( IABProvider_Shutdown, a1, a2 ) +#define CheckParameters_IABProvider_Shutdown( a1, a2 ) \ + CheckParameters2( IABProvider_Shutdown, a1, a2 ) + +#define Validate_IABProvider_Logon( a1, a2, a3, a4, a5, a6, a7, a8, a9 ) \ + ValidateParameters9( IABProvider_Logon, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) +#define UlValidate_IABProvider_Logon( a1, a2, a3, a4, a5, a6, a7, a8, a9 ) \ + UlValidateParameters9( IABProvider_Logon, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) +#define CheckParameters_IABProvider_Logon( a1, a2, a3, a4, a5, a6, a7, a8, a9 ) \ + CheckParameters9( IABProvider_Logon, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) + + +/* IABLogon */ + +#define Validate_IABLogon_GetLastError( a1, a2, a3, a4 ) \ + ValidateParameters4( IABLogon_GetLastError, a1, a2, a3, a4 ) +#define UlValidate_IABLogon_GetLastError( a1, a2, a3, a4 ) \ + UlValidateParameters4( IABLogon_GetLastError, a1, a2, a3, a4 ) +#define CheckParameters_IABLogon_GetLastError( a1, a2, a3, a4 ) \ + CheckParameters4( IABLogon_GetLastError, a1, a2, a3, a4 ) + +#define Validate_IABLogon_Logoff( a1, a2 ) \ + ValidateParameters2( IABLogon_Logoff, a1, a2 ) +#define UlValidate_IABLogon_Logoff( a1, a2 ) \ + UlValidateParameters2( IABLogon_Logoff, a1, a2 ) +#define CheckParameters_IABLogon_Logoff( a1, a2 ) \ + CheckParameters2( IABLogon_Logoff, a1, a2 ) + +#define Validate_IABLogon_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ + ValidateParameters7( IABLogon_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) +#define UlValidate_IABLogon_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ + UlValidateParameters7( IABLogon_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) +#define CheckParameters_IABLogon_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ + CheckParameters7( IABLogon_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) + +#define Validate_IABLogon_CompareEntryIDs( a1, a2, a3, a4, a5, a6, a7 ) \ + ValidateParameters7( IABLogon_CompareEntryIDs, a1, a2, a3, a4, a5, a6, a7 ) +#define UlValidate_IABLogon_CompareEntryIDs( a1, a2, a3, a4, a5, a6, a7 ) \ + UlValidateParameters7( IABLogon_CompareEntryIDs, a1, a2, a3, a4, a5, a6, a7 ) +#define CheckParameters_IABLogon_CompareEntryIDs( a1, a2, a3, a4, a5, a6, a7 ) \ + CheckParameters7( IABLogon_CompareEntryIDs, a1, a2, a3, a4, a5, a6, a7 ) + +#define Validate_IABLogon_Advise( a1, a2, a3, a4, a5, a6 ) \ + ValidateParameters6( IABLogon_Advise, a1, a2, a3, a4, a5, a6 ) +#define UlValidate_IABLogon_Advise( a1, a2, a3, a4, a5, a6 ) \ + UlValidateParameters6( IABLogon_Advise, a1, a2, a3, a4, a5, a6 ) +#define CheckParameters_IABLogon_Advise( a1, a2, a3, a4, a5, a6 ) \ + CheckParameters6( IABLogon_Advise, a1, a2, a3, a4, a5, a6 ) + +#define Validate_IABLogon_Unadvise( a1, a2 ) \ + ValidateParameters2( IABLogon_Unadvise, a1, a2 ) +#define UlValidate_IABLogon_Unadvise( a1, a2 ) \ + UlValidateParameters2( IABLogon_Unadvise, a1, a2 ) +#define CheckParameters_IABLogon_Unadvise( a1, a2 ) \ + CheckParameters2( IABLogon_Unadvise, a1, a2 ) + +#define Validate_IABLogon_OpenStatusEntry( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IABLogon_OpenStatusEntry, a1, a2, a3, a4, a5 ) +#define UlValidate_IABLogon_OpenStatusEntry( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IABLogon_OpenStatusEntry, a1, a2, a3, a4, a5 ) +#define CheckParameters_IABLogon_OpenStatusEntry( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IABLogon_OpenStatusEntry, a1, a2, a3, a4, a5 ) + +#define Validate_IABLogon_OpenTemplateID( a1, a2, a3, a4, a5, a6, a7, a8 ) \ + ValidateParameters8( IABLogon_OpenTemplateID, a1, a2, a3, a4, a5, a6, a7, a8 ) +#define UlValidate_IABLogon_OpenTemplateID( a1, a2, a3, a4, a5, a6, a7, a8 ) \ + UlValidateParameters8( IABLogon_OpenTemplateID, a1, a2, a3, a4, a5, a6, a7, a8 ) +#define CheckParameters_IABLogon_OpenTemplateID( a1, a2, a3, a4, a5, a6, a7, a8 ) \ + CheckParameters8( IABLogon_OpenTemplateID, a1, a2, a3, a4, a5, a6, a7, a8 ) + +#define Validate_IABLogon_GetOneOffTable( a1, a2, a3 ) \ + ValidateParameters3( IABLogon_GetOneOffTable, a1, a2, a3 ) +#define UlValidate_IABLogon_GetOneOffTable( a1, a2, a3 ) \ + UlValidateParameters3( IABLogon_GetOneOffTable, a1, a2, a3 ) +#define CheckParameters_IABLogon_GetOneOffTable( a1, a2, a3 ) \ + CheckParameters3( IABLogon_GetOneOffTable, a1, a2, a3 ) + +#define Validate_IABLogon_PrepareRecips( a1, a2, a3, a4 ) \ + ValidateParameters4( IABLogon_PrepareRecips, a1, a2, a3, a4 ) +#define UlValidate_IABLogon_PrepareRecips( a1, a2, a3, a4 ) \ + UlValidateParameters4( IABLogon_PrepareRecips, a1, a2, a3, a4 ) +#define CheckParameters_IABLogon_PrepareRecips( a1, a2, a3, a4 ) \ + CheckParameters4( IABLogon_PrepareRecips, a1, a2, a3, a4 ) + + +/* IXPProvider */ + +#define Validate_IXPProvider_Shutdown( a1, a2 ) \ + ValidateParameters2( IXPProvider_Shutdown, a1, a2 ) +#define UlValidate_IXPProvider_Shutdown( a1, a2 ) \ + UlValidateParameters2( IXPProvider_Shutdown, a1, a2 ) +#define CheckParameters_IXPProvider_Shutdown( a1, a2 ) \ + CheckParameters2( IXPProvider_Shutdown, a1, a2 ) + +#define Validate_IXPProvider_TransportLogon( a1, a2, a3, a4, a5, a6, a7 ) \ + ValidateParameters7( IXPProvider_TransportLogon, a1, a2, a3, a4, a5, a6, a7 ) +#define UlValidate_IXPProvider_TransportLogon( a1, a2, a3, a4, a5, a6, a7 ) \ + UlValidateParameters7( IXPProvider_TransportLogon, a1, a2, a3, a4, a5, a6, a7 ) +#define CheckParameters_IXPProvider_TransportLogon( a1, a2, a3, a4, a5, a6, a7 ) \ + CheckParameters7( IXPProvider_TransportLogon, a1, a2, a3, a4, a5, a6, a7 ) + + +/* IXPLogon */ + +#define Validate_IXPLogon_AddressTypes( a1, a2, a3, a4, a5, a6 ) \ + ValidateParameters6( IXPLogon_AddressTypes, a1, a2, a3, a4, a5, a6 ) +#define UlValidate_IXPLogon_AddressTypes( a1, a2, a3, a4, a5, a6 ) \ + UlValidateParameters6( IXPLogon_AddressTypes, a1, a2, a3, a4, a5, a6 ) +#define CheckParameters_IXPLogon_AddressTypes( a1, a2, a3, a4, a5, a6 ) \ + CheckParameters6( IXPLogon_AddressTypes, a1, a2, a3, a4, a5, a6 ) + +#define Validate_IXPLogon_RegisterOptions( a1, a2, a3, a4 ) \ + ValidateParameters4( IXPLogon_RegisterOptions, a1, a2, a3, a4 ) +#define UlValidate_IXPLogon_RegisterOptions( a1, a2, a3, a4 ) \ + UlValidateParameters4( IXPLogon_RegisterOptions, a1, a2, a3, a4 ) +#define CheckParameters_IXPLogon_RegisterOptions( a1, a2, a3, a4 ) \ + CheckParameters4( IXPLogon_RegisterOptions, a1, a2, a3, a4 ) + +#define Validate_IXPLogon_TransportNotify( a1, a2, a3 ) \ + ValidateParameters3( IXPLogon_TransportNotify, a1, a2, a3 ) +#define UlValidate_IXPLogon_TransportNotify( a1, a2, a3 ) \ + UlValidateParameters3( IXPLogon_TransportNotify, a1, a2, a3 ) +#define CheckParameters_IXPLogon_TransportNotify( a1, a2, a3 ) \ + CheckParameters3( IXPLogon_TransportNotify, a1, a2, a3 ) + +#define Validate_IXPLogon_Idle( a1, a2 ) \ + ValidateParameters2( IXPLogon_Idle, a1, a2 ) +#define UlValidate_IXPLogon_Idle( a1, a2 ) \ + UlValidateParameters2( IXPLogon_Idle, a1, a2 ) +#define CheckParameters_IXPLogon_Idle( a1, a2 ) \ + CheckParameters2( IXPLogon_Idle, a1, a2 ) + +#define Validate_IXPLogon_TransportLogoff( a1, a2 ) \ + ValidateParameters2( IXPLogon_TransportLogoff, a1, a2 ) +#define UlValidate_IXPLogon_TransportLogoff( a1, a2 ) \ + UlValidateParameters2( IXPLogon_TransportLogoff, a1, a2 ) +#define CheckParameters_IXPLogon_TransportLogoff( a1, a2 ) \ + CheckParameters2( IXPLogon_TransportLogoff, a1, a2 ) + +#define Validate_IXPLogon_SubmitMessage( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IXPLogon_SubmitMessage, a1, a2, a3, a4, a5 ) +#define UlValidate_IXPLogon_SubmitMessage( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IXPLogon_SubmitMessage, a1, a2, a3, a4, a5 ) +#define CheckParameters_IXPLogon_SubmitMessage( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IXPLogon_SubmitMessage, a1, a2, a3, a4, a5 ) + +#define Validate_IXPLogon_EndMessage( a1, a2, a3 ) \ + ValidateParameters3( IXPLogon_EndMessage, a1, a2, a3 ) +#define UlValidate_IXPLogon_EndMessage( a1, a2, a3 ) \ + UlValidateParameters3( IXPLogon_EndMessage, a1, a2, a3 ) +#define CheckParameters_IXPLogon_EndMessage( a1, a2, a3 ) \ + CheckParameters3( IXPLogon_EndMessage, a1, a2, a3 ) + +#define Validate_IXPLogon_Poll( a1, a2 ) \ + ValidateParameters2( IXPLogon_Poll, a1, a2 ) +#define UlValidate_IXPLogon_Poll( a1, a2 ) \ + UlValidateParameters2( IXPLogon_Poll, a1, a2 ) +#define CheckParameters_IXPLogon_Poll( a1, a2 ) \ + CheckParameters2( IXPLogon_Poll, a1, a2 ) + +#define Validate_IXPLogon_StartMessage( a1, a2, a3, a4 ) \ + ValidateParameters4( IXPLogon_StartMessage, a1, a2, a3, a4 ) +#define UlValidate_IXPLogon_StartMessage( a1, a2, a3, a4 ) \ + UlValidateParameters4( IXPLogon_StartMessage, a1, a2, a3, a4 ) +#define CheckParameters_IXPLogon_StartMessage( a1, a2, a3, a4 ) \ + CheckParameters4( IXPLogon_StartMessage, a1, a2, a3, a4 ) + +#define Validate_IXPLogon_OpenStatusEntry( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IXPLogon_OpenStatusEntry, a1, a2, a3, a4, a5 ) +#define UlValidate_IXPLogon_OpenStatusEntry( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IXPLogon_OpenStatusEntry, a1, a2, a3, a4, a5 ) +#define CheckParameters_IXPLogon_OpenStatusEntry( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IXPLogon_OpenStatusEntry, a1, a2, a3, a4, a5 ) + +#define Validate_IXPLogon_ValidateState( a1, a2, a3 ) \ + ValidateParameters3( IXPLogon_ValidateState, a1, a2, a3 ) +#define UlValidate_IXPLogon_ValidateState( a1, a2, a3 ) \ + UlValidateParameters3( IXPLogon_ValidateState, a1, a2, a3 ) +#define CheckParameters_IXPLogon_ValidateState( a1, a2, a3 ) \ + CheckParameters3( IXPLogon_ValidateState, a1, a2, a3 ) + +#define Validate_IXPLogon_FlushQueues( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IXPLogon_FlushQueues, a1, a2, a3, a4, a5 ) +#define UlValidate_IXPLogon_FlushQueues( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IXPLogon_FlushQueues, a1, a2, a3, a4, a5 ) +#define CheckParameters_IXPLogon_FlushQueues( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IXPLogon_FlushQueues, a1, a2, a3, a4, a5 ) + + +/* IMSProvider */ + +#define Validate_IMSProvider_Shutdown( a1, a2 ) \ + ValidateParameters2( IMSProvider_Shutdown, a1, a2 ) +#define UlValidate_IMSProvider_Shutdown( a1, a2 ) \ + UlValidateParameters2( IMSProvider_Shutdown, a1, a2 ) +#define CheckParameters_IMSProvider_Shutdown( a1, a2 ) \ + CheckParameters2( IMSProvider_Shutdown, a1, a2 ) + +#define Validate_IMSProvider_Logon( a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) \ + ValidateParameters13( IMSProvider_Logon, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) +#define UlValidate_IMSProvider_Logon( a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) \ + UlValidateParameters13( IMSProvider_Logon, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) +#define CheckParameters_IMSProvider_Logon( a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) \ + CheckParameters13( IMSProvider_Logon, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) + +#define Validate_IMSProvider_SpoolerLogon( a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) \ + ValidateParameters13( IMSProvider_SpoolerLogon, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) +#define UlValidate_IMSProvider_SpoolerLogon( a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) \ + UlValidateParameters13( IMSProvider_SpoolerLogon, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) +#define CheckParameters_IMSProvider_SpoolerLogon( a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) \ + CheckParameters13( IMSProvider_SpoolerLogon, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) + +#define Validate_IMSProvider_CompareStoreIDs( a1, a2, a3, a4, a5, a6, a7 ) \ + ValidateParameters7( IMSProvider_CompareStoreIDs, a1, a2, a3, a4, a5, a6, a7 ) +#define UlValidate_IMSProvider_CompareStoreIDs( a1, a2, a3, a4, a5, a6, a7 ) \ + UlValidateParameters7( IMSProvider_CompareStoreIDs, a1, a2, a3, a4, a5, a6, a7 ) +#define CheckParameters_IMSProvider_CompareStoreIDs( a1, a2, a3, a4, a5, a6, a7 ) \ + CheckParameters7( IMSProvider_CompareStoreIDs, a1, a2, a3, a4, a5, a6, a7 ) + + +/* IMSLogon */ + +#define Validate_IMSLogon_GetLastError( a1, a2, a3, a4 ) \ + ValidateParameters4( IMSLogon_GetLastError, a1, a2, a3, a4 ) +#define UlValidate_IMSLogon_GetLastError( a1, a2, a3, a4 ) \ + UlValidateParameters4( IMSLogon_GetLastError, a1, a2, a3, a4 ) +#define CheckParameters_IMSLogon_GetLastError( a1, a2, a3, a4 ) \ + CheckParameters4( IMSLogon_GetLastError, a1, a2, a3, a4 ) + +#define Validate_IMSLogon_Logoff( a1, a2 ) \ + ValidateParameters2( IMSLogon_Logoff, a1, a2 ) +#define UlValidate_IMSLogon_Logoff( a1, a2 ) \ + UlValidateParameters2( IMSLogon_Logoff, a1, a2 ) +#define CheckParameters_IMSLogon_Logoff( a1, a2 ) \ + CheckParameters2( IMSLogon_Logoff, a1, a2 ) + +#define Validate_IMSLogon_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ + ValidateParameters7( IMSLogon_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) +#define UlValidate_IMSLogon_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ + UlValidateParameters7( IMSLogon_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) +#define CheckParameters_IMSLogon_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ + CheckParameters7( IMSLogon_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) + +#define Validate_IMSLogon_CompareEntryIDs( a1, a2, a3, a4, a5, a6, a7 ) \ + ValidateParameters7( IMSLogon_CompareEntryIDs, a1, a2, a3, a4, a5, a6, a7 ) +#define UlValidate_IMSLogon_CompareEntryIDs( a1, a2, a3, a4, a5, a6, a7 ) \ + UlValidateParameters7( IMSLogon_CompareEntryIDs, a1, a2, a3, a4, a5, a6, a7 ) +#define CheckParameters_IMSLogon_CompareEntryIDs( a1, a2, a3, a4, a5, a6, a7 ) \ + CheckParameters7( IMSLogon_CompareEntryIDs, a1, a2, a3, a4, a5, a6, a7 ) + +#define Validate_IMSLogon_Advise( a1, a2, a3, a4, a5, a6 ) \ + ValidateParameters6( IMSLogon_Advise, a1, a2, a3, a4, a5, a6 ) +#define UlValidate_IMSLogon_Advise( a1, a2, a3, a4, a5, a6 ) \ + UlValidateParameters6( IMSLogon_Advise, a1, a2, a3, a4, a5, a6 ) +#define CheckParameters_IMSLogon_Advise( a1, a2, a3, a4, a5, a6 ) \ + CheckParameters6( IMSLogon_Advise, a1, a2, a3, a4, a5, a6 ) + +#define Validate_IMSLogon_Unadvise( a1, a2 ) \ + ValidateParameters2( IMSLogon_Unadvise, a1, a2 ) +#define UlValidate_IMSLogon_Unadvise( a1, a2 ) \ + UlValidateParameters2( IMSLogon_Unadvise, a1, a2 ) +#define CheckParameters_IMSLogon_Unadvise( a1, a2 ) \ + CheckParameters2( IMSLogon_Unadvise, a1, a2 ) + +#define Validate_IMSLogon_OpenStatusEntry( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IMSLogon_OpenStatusEntry, a1, a2, a3, a4, a5 ) +#define UlValidate_IMSLogon_OpenStatusEntry( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IMSLogon_OpenStatusEntry, a1, a2, a3, a4, a5 ) +#define CheckParameters_IMSLogon_OpenStatusEntry( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IMSLogon_OpenStatusEntry, a1, a2, a3, a4, a5 ) + + +/* IMAPIControl */ + +#define Validate_IMAPIControl_GetLastError( a1, a2, a3, a4 ) \ + ValidateParameters4( IMAPIControl_GetLastError, a1, a2, a3, a4 ) +#define UlValidate_IMAPIControl_GetLastError( a1, a2, a3, a4 ) \ + UlValidateParameters4( IMAPIControl_GetLastError, a1, a2, a3, a4 ) +#define CheckParameters_IMAPIControl_GetLastError( a1, a2, a3, a4 ) \ + CheckParameters4( IMAPIControl_GetLastError, a1, a2, a3, a4 ) + +#define Validate_IMAPIControl_Activate( a1, a2, a3 ) \ + ValidateParameters3( IMAPIControl_Activate, a1, a2, a3 ) +#define UlValidate_IMAPIControl_Activate( a1, a2, a3 ) \ + UlValidateParameters3( IMAPIControl_Activate, a1, a2, a3 ) +#define CheckParameters_IMAPIControl_Activate( a1, a2, a3 ) \ + CheckParameters3( IMAPIControl_Activate, a1, a2, a3 ) + +#define Validate_IMAPIControl_GetState( a1, a2, a3 ) \ + ValidateParameters3( IMAPIControl_GetState, a1, a2, a3 ) +#define UlValidate_IMAPIControl_GetState( a1, a2, a3 ) \ + UlValidateParameters3( IMAPIControl_GetState, a1, a2, a3 ) +#define CheckParameters_IMAPIControl_GetState( a1, a2, a3 ) \ + CheckParameters3( IMAPIControl_GetState, a1, a2, a3 ) + + +/* IMAPIStatus */ + +#define Validate_IMAPIStatus_ValidateState( a1, a2, a3 ) \ + ValidateParameters3( IMAPIStatus_ValidateState, a1, a2, a3 ) +#define UlValidate_IMAPIStatus_ValidateState( a1, a2, a3 ) \ + UlValidateParameters3( IMAPIStatus_ValidateState, a1, a2, a3 ) +#define CheckParameters_IMAPIStatus_ValidateState( a1, a2, a3 ) \ + CheckParameters3( IMAPIStatus_ValidateState, a1, a2, a3 ) + +#define Validate_IMAPIStatus_SettingsDialog( a1, a2, a3 ) \ + ValidateParameters3( IMAPIStatus_SettingsDialog, a1, a2, a3 ) +#define UlValidate_IMAPIStatus_SettingsDialog( a1, a2, a3 ) \ + UlValidateParameters3( IMAPIStatus_SettingsDialog, a1, a2, a3 ) +#define CheckParameters_IMAPIStatus_SettingsDialog( a1, a2, a3 ) \ + CheckParameters3( IMAPIStatus_SettingsDialog, a1, a2, a3 ) + +#define Validate_IMAPIStatus_ChangePassword( a1, a2, a3, a4 ) \ + ValidateParameters4( IMAPIStatus_ChangePassword, a1, a2, a3, a4 ) +#define UlValidate_IMAPIStatus_ChangePassword( a1, a2, a3, a4 ) \ + UlValidateParameters4( IMAPIStatus_ChangePassword, a1, a2, a3, a4 ) +#define CheckParameters_IMAPIStatus_ChangePassword( a1, a2, a3, a4 ) \ + CheckParameters4( IMAPIStatus_ChangePassword, a1, a2, a3, a4 ) + +#define Validate_IMAPIStatus_FlushQueues( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IMAPIStatus_FlushQueues, a1, a2, a3, a4, a5 ) +#define UlValidate_IMAPIStatus_FlushQueues( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IMAPIStatus_FlushQueues, a1, a2, a3, a4, a5 ) +#define CheckParameters_IMAPIStatus_FlushQueues( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IMAPIStatus_FlushQueues, a1, a2, a3, a4, a5 ) + + +/* IStream */ + +#define Validate_IStream_Read( a1, a2, a3, a4 ) \ + ValidateParameters4( IStream__Read, a1, a2, a3, a4 ) +#define UlValidate_IStream_Read( a1, a2, a3, a4 ) \ + UlValidateParameters4( IStream__Read, a1, a2, a3, a4 ) +#define CheckParameters_IStream_Read( a1, a2, a3, a4 ) \ + CheckParameters4( IStream__Read, a1, a2, a3, a4 ) + +#define Validate_IStream_Write( a1, a2, a3, a4 ) \ + ValidateParameters4( IStream__Write, a1, a2, a3, a4 ) +#define UlValidate_IStream_Write( a1, a2, a3, a4 ) \ + UlValidateParameters4( IStream__Write, a1, a2, a3, a4 ) +#define CheckParameters_IStream_Write( a1, a2, a3, a4 ) \ + CheckParameters4( IStream__Write, a1, a2, a3, a4 ) + +#define Validate_IStream_Seek( a1, a2, a3, a4 ) \ + ValidateParameters4( IStream_Seek, a1, a2, a3, a4 ) +#define UlValidate_IStream_Seek( a1, a2, a3, a4 ) \ + UlValidateParameters4( IStream_Seek, a1, a2, a3, a4 ) +#define CheckParameters_IStream_Seek( a1, a2, a3, a4 ) \ + CheckParameters4( IStream_Seek, a1, a2, a3, a4 ) + +#define Validate_IStream_SetSize( a1, a2 ) \ + ValidateParameters2( IStream_SetSize, a1, a2 ) +#define UlValidate_IStream_SetSize( a1, a2 ) \ + UlValidateParameters2( IStream_SetSize, a1, a2 ) +#define CheckParameters_IStream_SetSize( a1, a2 ) \ + CheckParameters2( IStream_SetSize, a1, a2 ) + +#define Validate_IStream_CopyTo( a1, a2, a3, a4, a5 ) \ + ValidateParameters5( IStream_CopyTo, a1, a2, a3, a4, a5 ) +#define UlValidate_IStream_CopyTo( a1, a2, a3, a4, a5 ) \ + UlValidateParameters5( IStream_CopyTo, a1, a2, a3, a4, a5 ) +#define CheckParameters_IStream_CopyTo( a1, a2, a3, a4, a5 ) \ + CheckParameters5( IStream_CopyTo, a1, a2, a3, a4, a5 ) + +#define Validate_IStream_Commit( a1, a2 ) \ + ValidateParameters2( IStream_Commit, a1, a2 ) +#define UlValidate_IStream_Commit( a1, a2 ) \ + UlValidateParameters2( IStream_Commit, a1, a2 ) +#define CheckParameters_IStream_Commit( a1, a2 ) \ + CheckParameters2( IStream_Commit, a1, a2 ) + +#define Validate_IStream_Revert( a1 ) \ + ValidateParameters1( IStream_Revert, a1 ) +#define UlValidate_IStream_Revert( a1 ) \ + UlValidateParameters1( IStream_Revert, a1 ) +#define CheckParameters_IStream_Revert( a1 ) \ + CheckParameters1( IStream_Revert, a1 ) + +#define Validate_IStream_LockRegion( a1, a2, a3, a4 ) \ + ValidateParameters4( IStream_LockRegion, a1, a2, a3, a4 ) +#define UlValidate_IStream_LockRegion( a1, a2, a3, a4 ) \ + UlValidateParameters4( IStream_LockRegion, a1, a2, a3, a4 ) +#define CheckParameters_IStream_LockRegion( a1, a2, a3, a4 ) \ + CheckParameters4( IStream_LockRegion, a1, a2, a3, a4 ) + +#define Validate_IStream_UnlockRegion( a1, a2, a3, a4 ) \ + ValidateParameters4( IStream_UnlockRegion, a1, a2, a3, a4 ) +#define UlValidate_IStream_UnlockRegion( a1, a2, a3, a4 ) \ + UlValidateParameters4( IStream_UnlockRegion, a1, a2, a3, a4 ) +#define CheckParameters_IStream_UnlockRegion( a1, a2, a3, a4 ) \ + CheckParameters4( IStream_UnlockRegion, a1, a2, a3, a4 ) + +#define Validate_IStream_Stat( a1, a2, a3 ) \ + ValidateParameters3( IStream_Stat, a1, a2, a3 ) +#define UlValidate_IStream_Stat( a1, a2, a3 ) \ + UlValidateParameters3( IStream_Stat, a1, a2, a3 ) +#define CheckParameters_IStream_Stat( a1, a2, a3 ) \ + CheckParameters3( IStream_Stat, a1, a2, a3 ) + +#define Validate_IStream_Clone( a1, a2 ) \ + ValidateParameters2( IStream_Clone, a1, a2 ) +#define UlValidate_IStream_Clone( a1, a2 ) \ + UlValidateParameters2( IStream_Clone, a1, a2 ) +#define CheckParameters_IStream_Clone( a1, a2 ) \ + CheckParameters2( IStream_Clone, a1, a2 ) + + +/* IMAPIAdviseSink */ + +#define Validate_IMAPIAdviseSink_OnNotify( a1, a2, a3 ) \ + ValidateParameters3( IMAPIAdviseSink_OnNotify, a1, a2, a3 ) +#define UlValidate_IMAPIAdviseSink_OnNotify( a1, a2, a3 ) \ + UlValidateParameters3( IMAPIAdviseSink_OnNotify, a1, a2, a3 ) +#define CheckParameters_IMAPIAdviseSink_OnNotify( a1, a2, a3 ) \ + CheckParameters3( IMAPIAdviseSink_OnNotify, a1, a2, a3 ) + +#if defined(_AMD64_) || defined(_X86_) +STDAPI HrValidateParameters( METHODS eMethod, LPVOID FAR *ppFirstArg ); +#elif defined(DOS) || defined(_MAC) +STDAPIV HrValidateParametersV( METHODS eMethod, ... ); +STDAPIV HrValidateParametersValist( METHODS eMethod, va_list arglist ); +#else +#error "Unknown Platform: MAPI is currently supported on Win32 and Win64" +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _INC_VALIDATE */ + + diff --git a/comm/mailnews/mapi/include/mapiwin.h b/comm/mailnews/mapi/include/mapiwin.h new file mode 100644 index 0000000000..6dc00c45ee --- /dev/null +++ b/comm/mailnews/mapi/include/mapiwin.h @@ -0,0 +1,274 @@ +/* + * M A P I W I N . H + * + * Definitions used by the MAPI Development Team to aid in + * developing single-source service providers that run on + * both WIN32 and WIN16 platforms. + * There are three sections. + * + * The first section defines how to call something that + * is available by different methods in WIN16 vs. WIN32. + * As such, they are totally new mechanisms. + * + * The second section establishes things that are available + * AS-IS in one environment but we have to define for the + * other environment. + * + * The third section simply defines a few conventions + * (simplifications) for common operations. + * + * Copyright (c) 2009 Microsoft Corporation. All Rights Reserved. + */ + +/* + * Routines are included in the first section to manage per-instance + * global variables for DLLs. They assume that all of the DLL's + * per-instance global variables live in a single block of memory. + * Functions are provided to install and retrieve the correct block of + * memory for the current instance. + * + * There are only two functions: + * + * PvGetInstanceGlobals Call this to get the address of the + * per-instance globals structure. + * ScSetinstanceGlobals Call this to install the + * per-instance globals structure. It + * may fail if the number of instances + * exceeds a certain limit. + * + * The caller is free to choose the name, size, and allocation + * method of the per-instance global variables structure. + * + * The WIN32 implementation uses a pointer in the DLL's data + * segment. This assumes that the DLL gets a separate instance + * of the default data segment per calling process. + * + * The WIN16 implementation uses a fixed array of pointers and a + * matching fixed array of keys unique to the calling process. + */ + +/* + * The second section consists largely of Win32 file I/O functions + * that are not supported under Win16. These functions are + * implemented in mapiwin.c, using DOS calls. Most have limitations + * relative to their Win32 counterparts, which are spelled out in + * the comments to the source code. + */ + +#ifndef __MAPIWIN_H__ +#define __MAPIWIN_H__ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#if defined (WIN32) && !defined (_WIN32) +#define _WIN32 +#endif + +#include "mapinls.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +#if defined(_MAC) + +#define MULDIV(x,y,z) MulDiv(x,y,z) + +LPVOID FAR PASCAL PvGetInstanceGlobals(WORD wDataSet); +LONG FAR PASCAL ScSetInstanceGlobals(LPVOID pv, WORD wDataSet); +LONG FAR PASCAL ScSetVerifyInstanceGlobals(LPVOID pv, DWORD dwPid, + WORD wDataSet); +LPVOID FAR PASCAL PvGetVerifyInstanceGlobals(DWORD dwPid, DWORD wDataSet); +LPVOID FAR PASCAL PvSlowGetInstanceGlobals(DWORD dwPid, DWORD wDataSet); +BOOL FAR PASCAL FCleanupInstanceGlobals(WORD, DWORD); + +#elif defined(_WIN64) || defined(_WIN32) + +#define MULDIV(x,y,z) MulDiv(x,y,z) + +extern LPVOID pinstX; +#define PvGetInstanceGlobals() pinstX +#define ScSetInstanceGlobals(_pv) (pinstX = _pv, 0) +#define PvGetVerifyInstanceGlobals(_pid) pinstX +#define ScSetVerifyInstanceGlobals(_pv,_pid) (pinstX = _pv, 0) +#define PvSlowGetInstanceGlobals(_pid) pinstX + +#else +#error "Unknown Platform: MAPI is currently supported on Win32 and Win64" +#endif + +#if (defined(_WIN64) || defined(_WIN32)) && !defined(_MAC) +#define szMAPIDLLSuffix "32" +#elif defined(DOS) +#define szMAPIDLLSuffix "" +#elif defined(_MAC) +#define szMAPIDLLSuffix "M" +#else +#error "Don't know the suffix for DLLs on this platform" +#endif + +/********************************/ +/* Things missing from one */ +/* system-provided environment */ +/* or the other. */ +/********************************/ + +#if !defined(_WIN64) && !defined(_WIN32) +#define ZeroMemory(pb,cb) memset((pb),0,(cb)) +#define FillMemory(pb,cb,b) memset((pb),(b),(cb)) +#define CopyMemory(pbDst,pbSrc,cb) do \ + { \ + size_t _cb = (size_t)(cb); \ + if (_cb) \ + memcpy(pbDst,pbSrc,_cb);\ + } while (FALSE) +#define MoveMemory(pbDst,pbSrc,cb) memmove((pbDst),(pbSrc),(cb)) + +#define UNALIGNED + +#endif + +#if defined(_MAC) + +typedef int INT; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; +typedef double LONGLONG; +typedef double DWORDLONG; +typedef unsigned char UCHAR; +typedef unsigned char FAR* PUCHAR; +typedef int BOOL; + + +/* Synchronization */ +#define InterlockedIncrement(plong) (++(*(plong))) +#define InterlockedDecrement(plong) (--(*(plong))) + +#ifndef CreateMutex +#define CreateMutexA CreateMutex +#define CreateMutexW CreateMutex +#define CreateMutex(pv, bool, sz) (INVALID_HANDLE_VALUE) +#endif + +#define WaitForSingleObject(hObj, dw) ((void)0) +#define ReleaseMutex(hObj) ((BOOL)1) +#define CloseMutexHandle(hObj) TRUE + +#define CRITICAL_SECTION ULONG +#define InitializeCriticalSection(_pcs) ((void)0) +#define DeleteCriticalSection(_pcs) ((void)0) +#define EnterCriticalSection(_pcs) ((void)0) +#define LeaveCriticalSection(_pcs) ((void)0) + +#define MAX_PATH 260 + +#define FILE_FLAG_SEQUENTIAL_SCAN 0x08000000 + +#define CREATE_NEW 1 +#define CREATE_ALWAYS 2 +#define OPEN_EXISTING 3 +#define OPEN_ALWAYS 4 +#define TRUNCATE_EXISTING 5 + +#define FILE_ATTRIBUTE_READONLY 0x00000001 +#define FILE_ATTRIBUTE_HIDDEN 0x00000002 +#define FILE_ATTRIBUTE_SYSTEM 0x00000004 +#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 +#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 +#define FILE_ATTRIBUTE_NORMAL 0x00000080 +#define FILE_ATTRIBUTE_TEMPORARY 0x00000100 + +#define FILE_FLAG_WRITE_THROUGH 0x80000000 +#define FILE_FLAG_RANDOM_ACCESS 0x10000000 + +#define TIME_ZONE_ID_UNKNOWN 0 +#define TIME_ZONE_ID_STANDARD 1 +#define TIME_ZONE_ID_DAYLIGHT 2 + + + +DWORD WINAPI GetLastError(void); +DWORD WINAPI GetFileAttributes(LPCSTR lpFileName); +DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh); +BOOL WINAPI GetFileTime(HANDLE hFile, FILETIME FAR *lpftCreation, + FILETIME FAR *lpftLastAccess, FILETIME FAR *lpftLastWrite); +BOOL WINAPI SetFileTime(HANDLE hFile, const FILETIME FAR *lpftCreation, + const FILETIME FAR *lpftLastAccess, + const FILETIME FAR *lpftLastWrite); +DWORD WINAPI SetFilePointer(HANDLE hFile, LONG lDistanceToMove, + LONG FAR *lpDistanceToMoveHigh, DWORD dwMoveMethod); +BOOL WINAPI SetEndOfFile(HANDLE hFile); +BOOL WINAPI CloseHandle(HANDLE hObject); +DWORD WINAPI GetTempPath(DWORD nBufferLength, LPSTR lpBuffer); +UINT WINAPI GetTempFileName32 (LPCSTR lpPathName, LPCSTR lpPrefixString, + UINT uUnique, LPSTR lpTempFileName); +BOOL WINAPI DeleteFile(LPCSTR lpFileName); +BOOL WINAPI RemoveDirectory(LPCSTR lpPathName); +BOOL WINAPI CopyFile(LPCSTR szSrc, LPCSTR szDst, BOOL fFailIfExists); +BOOL WINAPI MoveFile(LPCSTR lpExistingFileName, LPCSTR lpNewFileName); +HANDLE WINAPI FindFirstFile(LPCSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData); +BOOL WINAPI FindNextFile(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData); +BOOL WINAPI FindClose(HANDLE hFindFile); +DWORD WINAPI GetFullPathName(LPCSTR lpFileName, DWORD nBufferLength, + LPSTR lpBuffer, LPSTR *lpFilePart); +void WINAPI Sleep(DWORD dwMilliseconds); +LONG WINAPI CompareFileTime(const FILETIME FAR *, const FILETIME FAR *); +BOOL WINAPI LocalFileTimeToFileTime(const FILETIME FAR *, FILETIME FAR *); +BOOL WINAPI FileTimeToLocalFileTime(const FILETIME FAR *, FILETIME FAR *); +BOOL WINAPI FileTimeToSystemTime(const FILETIME FAR *, SYSTEMTIME FAR *); +BOOL WINAPI SystemTimeToFileTime(const SYSTEMTIME FAR *, FILETIME FAR *); +void WINAPI GetSystemTime(SYSTEMTIME FAR *); +void WINAPI GetLocalTime(SYSTEMTIME FAR *); +BOOL WINAPI FileTimeToDosDateTime(const FILETIME FAR * lpFileTime, + WORD FAR *lpFatDate, WORD FAR *lpFatTime); +BOOL WINAPI DosDateTimeToFileTime(WORD wFatDate, WORD wFatTime, + FILETIME FAR * lpFileTime); +DWORD WINAPI GetTimeZoneInformation( + LPTIME_ZONE_INFORMATION lpTimeZoneInformation); +BOOL WINAPI SetTimeZoneInformation( + const TIME_ZONE_INFORMATION FAR *lpTimeZoneInformation); + +DWORD WINAPI GetCurrentProcessId(void); +long WINAPI MulDiv32(long, long, long); + +#else /* _MAC */ + +/* Remaps GetTempFileName32() to the real 32bit version */ + +#define GetTempFileName32(_szPath,_szPfx,_n,_lpbuf) GetTempFileName(_szPath,_szPfx,_n,_lpbuf) + +#define CloseMutexHandle CloseHandle + +#endif /* _MAC */ + + +#ifdef _MAC +#define CRITICAL_SECTION ULONG +#define InitializeCriticalSection(_pcs) ((void)0) +#define DeleteCriticalSection(_pcs) ((void)0) +#define EnterCriticalSection(_pcs) ((void)0) +#define LeaveCriticalSection(_pcs) ((void)0) +#endif + +/********************************/ +/* Our private conventions */ +/* (common to WIN32/WIN64) */ +/********************************/ + +#define Cbtszsize(_a) ((lstrlen(_a)+1)*sizeof(TCHAR)) +#define CbtszsizeA(_a) ((lstrlenA(_a) + 1)) +#define CbtszsizeW(_a) ((lstrlenW(_a) + 1) * sizeof(WCHAR)) +#define HexCchOf(_s) (sizeof(_s)*2+1) +#define HexSizeOf(_s) (HexCchOf(_s)*sizeof(TCHAR)) + +BOOL WINAPI IsBadBoundedStringPtr(const void FAR* lpsz, UINT cchMax); + +#ifdef __cplusplus +} +#endif + +#endif /* __MAPIWIN_H__ */ diff --git a/comm/mailnews/mapi/include/mapiwz.h b/comm/mailnews/mapi/include/mapiwz.h new file mode 100644 index 0000000000..0ebe69fcbf --- /dev/null +++ b/comm/mailnews/mapi/include/mapiwz.h @@ -0,0 +1,73 @@ +/* + * M A P I W Z . H + * + * Definitions for the Profile Wizard. Includes all prototypes + * and constants required by the provider-wizard code consumers. + * + * Copyright (c) 2009 Microsoft Corporation. All Rights Reserved. + */ + +#ifndef _MAPIWZ_H +#define _MAPIWZ_H + +#if _MSC_VER > 1000 +#pragma once +#endif + +#define WIZ_QUERYNUMPAGES (WM_USER +10) +#define WIZ_NEXT (WM_USER +11) +#define WIZ_PREV (WM_USER +12) +/* + * NOTE: Provider-Wizards should not use ids ranging between + * (WM_USER + 1) and (WM_USER +20) as these have been reserved for + * future releases. + */ + +/* Flags for LaunchWizard API */ + +#define MAPI_PW_FIRST_PROFILE 0x00000001 +#define MAPI_PW_LAUNCHED_BY_CONFIG 0x00000002 +#define MAPI_PW_ADD_SERVICE_ONLY 0x00000004 +#define MAPI_PW_PROVIDER_UI_ONLY 0x00000008 +#define MAPI_PW_HIDE_SERVICES_LIST 0x00000010 + +/* + * Provider should set this property to TRUE if it does not + * want the Profile Wizard to display the PST setup page. + */ +#define PR_WIZARD_NO_PST_PAGE PROP_TAG(PT_BOOLEAN, 0x6700) +#define PR_WIZARD_NO_PAB_PAGE PROP_TAG(PT_BOOLEAN, 0x6701) + +typedef HRESULT (STDAPICALLTYPE LAUNCHWIZARDENTRY) +( + HWND hParentWnd, + ULONG ulFlags, + LPCTSTR FAR * lppszServiceNameToAdd, + ULONG cbBufferMax, + LPTSTR lpszNewProfileName +); +typedef LAUNCHWIZARDENTRY FAR * LPLAUNCHWIZARDENTRY; + +typedef BOOL (STDAPICALLTYPE SERVICEWIZARDDLGPROC) +( + HWND hDlg, + UINT wMsgID, + WPARAM wParam, + LPARAM lParam +); +typedef SERVICEWIZARDDLGPROC FAR * LPSERVICEWIZARDDLGPROC; + +typedef ULONG (STDAPICALLTYPE WIZARDENTRY) +( + HINSTANCE hProviderDLLInstance, + LPTSTR FAR * lppcsResourceName, + DLGPROC FAR * lppDlgProc, + LPMAPIPROP lpMapiProp, + LPVOID lpMapiSupportObject +); +typedef WIZARDENTRY FAR * LPWIZARDENTRY; + +#define LAUNCHWIZARDENTRYNAME "LAUNCHWIZARD" + +#endif /* _MAPIWZ_H */ + diff --git a/comm/mailnews/mapi/include/mapix.h b/comm/mailnews/mapi/include/mapix.h new file mode 100644 index 0000000000..d9694bd565 --- /dev/null +++ b/comm/mailnews/mapi/include/mapix.h @@ -0,0 +1,545 @@ +/* + * M A P I X . H + * + * Definitions of objects/flags, etc used by Extended MAPI. + * + * Copyright (c) 2009 Microsoft Corporation. All Rights Reserved. + */ + +#ifndef MAPIX_H +#define MAPIX_H + +#if _MSC_VER > 1000 +#pragma once +#endif + +/* Include common MAPI header files if they haven't been already. */ +#ifndef MAPIDEFS_H +#include "mapidefs.h" +#endif +#ifndef MAPICODE_H +#include "mapicode.h" +#endif +#ifndef MAPIGUID_H +#include "mapiguid.h" +#endif +#ifndef MAPITAGS_H +#include "mapitags.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef BEGIN_INTERFACE +#define BEGIN_INTERFACE +#endif + +/* Forward interface declarations */ + +DECLARE_MAPI_INTERFACE_PTR(IProfAdmin, LPPROFADMIN); +DECLARE_MAPI_INTERFACE_PTR(IMsgServiceAdmin, LPSERVICEADMIN); +DECLARE_MAPI_INTERFACE_PTR(IMAPISession, LPMAPISESSION); + +/* ------------------------------------------------------ */ +/* shared with simple mapi */ + +typedef ULONG FLAGS; + +/* MAPILogon() flags. */ + +#define MAPI_LOGON_UI 0x00000001 /* Display logon UI */ +#define MAPI_NEW_SESSION 0x00000002 /* Don't use shared session */ +#define MAPI_ALLOW_OTHERS 0x00000008 /* Make this a shared session */ +#define MAPI_EXPLICIT_PROFILE 0x00000010 /* Don't use default profile */ +#define MAPI_EXTENDED 0x00000020 /* Extended MAPI Logon */ +#define MAPI_FORCE_DOWNLOAD 0x00001000 /* Get new mail before return */ +#define MAPI_SERVICE_UI_ALWAYS 0x00002000 /* Do logon UI in all providers */ +#define MAPI_NO_MAIL 0x00008000 /* Do not activate transports */ +/* #define MAPI_NT_SERVICE 0x00010000 Allow logon from an NT service */ +#ifndef MAPI_PASSWORD_UI +#define MAPI_PASSWORD_UI 0x00020000 /* Display password UI only */ +#endif +#define MAPI_TIMEOUT_SHORT 0x00100000 /* Minimal wait for logon resources */ + +#define MAPI_SIMPLE_DEFAULT (MAPI_LOGON_UI | MAPI_FORCE_DOWNLOAD | MAPI_ALLOW_OTHERS) +#define MAPI_SIMPLE_EXPLICIT (MAPI_NEW_SESSION | MAPI_FORCE_DOWNLOAD | MAPI_EXPLICIT_PROFILE) + +/* Structure passed to MAPIInitialize(), and its ulFlags values */ + +typedef struct +{ + ULONG ulVersion; + ULONG ulFlags; +} MAPIINIT_0, FAR *LPMAPIINIT_0; + +typedef MAPIINIT_0 MAPIINIT; +typedef MAPIINIT FAR *LPMAPIINIT; + +#define MAPI_INIT_VERSION 0 + +#define MAPI_MULTITHREAD_NOTIFICATIONS 0x00000001 +/* Reserved for MAPI 0x40000000 */ +/* #define MAPI_NT_SERVICE 0x00010000 Use from NT service */ + +/* MAPI base functions */ + +typedef HRESULT (STDAPICALLTYPE MAPIINITIALIZE)( + LPVOID lpMapiInit +); +typedef MAPIINITIALIZE FAR *LPMAPIINITIALIZE; + +typedef void (STDAPICALLTYPE MAPIUNINITIALIZE)(void); +typedef MAPIUNINITIALIZE FAR *LPMAPIUNINITIALIZE; + +MAPIINITIALIZE MAPIInitialize; +MAPIUNINITIALIZE MAPIUninitialize; + + +/* Extended MAPI Logon function */ + + +typedef HRESULT (STDMETHODCALLTYPE MAPILOGONEX)( + ULONG_PTR ulUIParam, + /*OFFICEDEV add _opt*/ __in_opt LPTSTR lpszProfileName, + /*OFFICEDEV add _opt*/ __in_opt LPTSTR lpszPassword, + ULONG ulFlags, /* ulFlags takes all that SimpleMAPI does + MAPI_UNICODE */ + LPMAPISESSION FAR * lppSession +); +typedef MAPILOGONEX FAR *LPMAPILOGONEX; + +MAPILOGONEX MAPILogonEx; + + +typedef SCODE (STDMETHODCALLTYPE MAPIALLOCATEBUFFER)( + ULONG cbSize, + LPVOID FAR * lppBuffer +); + +typedef SCODE (STDMETHODCALLTYPE MAPIALLOCATEMORE)( + ULONG cbSize, + LPVOID lpObject, + LPVOID FAR * lppBuffer +); + +typedef ULONG (STDAPICALLTYPE MAPIFREEBUFFER)( + LPVOID lpBuffer +); + +typedef MAPIALLOCATEBUFFER FAR *LPMAPIALLOCATEBUFFER; +typedef MAPIALLOCATEMORE FAR *LPMAPIALLOCATEMORE; +typedef MAPIFREEBUFFER FAR *LPMAPIFREEBUFFER; + +MAPIALLOCATEBUFFER MAPIAllocateBuffer; +MAPIALLOCATEMORE MAPIAllocateMore; +MAPIFREEBUFFER MAPIFreeBuffer; + +typedef HRESULT (STDMETHODCALLTYPE MAPIADMINPROFILES)( + ULONG ulFlags, + LPPROFADMIN FAR *lppProfAdmin +); + +typedef MAPIADMINPROFILES FAR *LPMAPIADMINPROFILES; + +MAPIADMINPROFILES MAPIAdminProfiles; + +/* IMAPISession Interface -------------------------------------------------- */ + +/* Flags for OpenEntry and others */ + +/*#define MAPI_MODIFY ((ULONG) 0x00000001) */ + +/* Flags for Logoff */ + +#define MAPI_LOGOFF_SHARED 0x00000001 /* Close all shared sessions */ +#define MAPI_LOGOFF_UI 0x00000002 /* It's OK to present UI */ + +/* Flags for SetDefaultStore. They are mutually exclusive. */ + +#define MAPI_DEFAULT_STORE 0x00000001 /* for incoming messages */ +#define MAPI_SIMPLE_STORE_TEMPORARY 0x00000002 /* for simple MAPI and CMC */ +#define MAPI_SIMPLE_STORE_PERMANENT 0x00000003 /* for simple MAPI and CMC */ +#define MAPI_PRIMARY_STORE 0x00000004 /* Used by some clients */ +#define MAPI_SECONDARY_STORE 0x00000005 /* Used by some clients */ + +/* Flags for ShowForm. */ + +#define MAPI_POST_MESSAGE 0x00000001 /* Selects post/send semantics */ +#define MAPI_NEW_MESSAGE 0x00000002 /* Governs copying during submission */ + +/* MessageOptions */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) */ + +/* QueryDefaultMessageOpt */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) */ + +#define MAPI_IMAPISESSION_METHODS(IPURE) \ + MAPIMETHOD(GetLastError) \ + (THIS_ HRESULT hResult, \ + ULONG ulFlags, \ + LPMAPIERROR FAR * lppMAPIError) IPURE; \ + MAPIMETHOD(GetMsgStoresTable) \ + (THIS_ ULONG ulFlags, \ + LPMAPITABLE FAR * lppTable) IPURE; \ + MAPIMETHOD(OpenMsgStore) \ + (THIS_ ULONG_PTR ulUIParam, \ + ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + LPCIID lpInterface, \ + ULONG ulFlags, \ + LPMDB FAR * lppMDB) IPURE; \ + MAPIMETHOD(OpenAddressBook) \ + (THIS_ ULONG_PTR ulUIParam, \ + LPCIID lpInterface, \ + ULONG ulFlags, \ + LPADRBOOK FAR * lppAdrBook) IPURE; \ + MAPIMETHOD(OpenProfileSection) \ + (THIS_ LPMAPIUID lpUID, \ + LPCIID lpInterface, \ + ULONG ulFlags, \ + LPPROFSECT FAR * lppProfSect) IPURE; \ + MAPIMETHOD(GetStatusTable) \ + (THIS_ ULONG ulFlags, \ + LPMAPITABLE FAR * lppTable) IPURE; \ + MAPIMETHOD(OpenEntry) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + LPCIID lpInterface, \ + ULONG ulFlags, \ + ULONG FAR * lpulObjType, \ + LPUNKNOWN FAR * lppUnk) IPURE; \ + MAPIMETHOD(CompareEntryIDs) \ + (THIS_ ULONG cbEntryID1, \ + LPENTRYID lpEntryID1, \ + ULONG cbEntryID2, \ + LPENTRYID lpEntryID2, \ + ULONG ulFlags, \ + ULONG FAR * lpulResult) IPURE; \ + MAPIMETHOD(Advise) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + ULONG ulEventMask, \ + LPMAPIADVISESINK lpAdviseSink, \ + ULONG_PTR FAR * lpulConnection) IPURE; \ + MAPIMETHOD(Unadvise) \ + (THIS_ ULONG_PTR ulConnection) IPURE; \ + MAPIMETHOD(MessageOptions) \ + (THIS_ ULONG_PTR ulUIParam, \ + ULONG ulFlags, \ + LPTSTR lpszAdrType, \ + LPMESSAGE lpMessage) IPURE; \ + MAPIMETHOD(QueryDefaultMessageOpt) \ + (THIS_ LPTSTR lpszAdrType, \ + ULONG ulFlags, \ + ULONG FAR * lpcValues, \ + LPSPropValue FAR * lppOptions) IPURE; \ + MAPIMETHOD(EnumAdrTypes) \ + (THIS_ ULONG ulFlags, \ + ULONG FAR * lpcAdrTypes, \ + LPTSTR FAR * FAR * lpppszAdrTypes) IPURE; \ + MAPIMETHOD(QueryIdentity) \ + (THIS_ ULONG FAR * lpcbEntryID, \ + LPENTRYID FAR * lppEntryID) IPURE; \ + MAPIMETHOD(Logoff) \ + (THIS_ ULONG_PTR ulUIParam, \ + ULONG ulFlags, \ + ULONG ulReserved) IPURE; \ + MAPIMETHOD(SetDefaultStore) \ + (THIS_ ULONG ulFlags, \ + ULONG cbEntryID, \ + LPENTRYID lpEntryID) IPURE; \ + MAPIMETHOD(AdminServices) \ + (THIS_ ULONG ulFlags, \ + LPSERVICEADMIN FAR * lppServiceAdmin) IPURE; \ + MAPIMETHOD(ShowForm) \ + (THIS_ ULONG_PTR ulUIParam, \ + LPMDB lpMsgStore, \ + LPMAPIFOLDER lpParentFolder, \ + LPCIID lpInterface, \ + ULONG_PTR ulMessageToken, \ + LPMESSAGE lpMessageSent, \ + ULONG ulFlags, \ + ULONG ulMessageStatus, \ + ULONG ulMessageFlags, \ + ULONG ulAccess, \ + LPSTR lpszMessageClass) IPURE; \ + MAPIMETHOD(PrepareForm) \ + (THIS_ LPCIID lpInterface, \ + LPMESSAGE lpMessage, \ + ULONG_PTR FAR * lpulMessageToken) IPURE; \ + + +#undef INTERFACE +#define INTERFACE IMAPISession +DECLARE_MAPI_INTERFACE_(IMAPISession, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPISESSION_METHODS(PURE) +}; + +/*DECLARE_MAPI_INTERFACE_PTR(IMAPISession, LPMAPISESSION);*/ + +/* IAddrBook Interface ----------------------------------------------------- */ + +/* CreateOneOff */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) */ +/****** MAPI_SEND_NO_RICH_INFO ((ULONG) 0x00010000) */ + +/* RecipOptions */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) */ + +/* QueryDefaultRecipOpt */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) */ + +/* GetSearchPath */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) */ + + +#define MAPI_IADDRBOOK_METHODS(IPURE) \ + MAPIMETHOD(OpenEntry) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + LPCIID lpInterface, \ + ULONG ulFlags, \ + ULONG FAR * lpulObjType, \ + LPUNKNOWN FAR * lppUnk) IPURE; \ + MAPIMETHOD(CompareEntryIDs) \ + (THIS_ ULONG cbEntryID1, \ + LPENTRYID lpEntryID1, \ + ULONG cbEntryID2, \ + LPENTRYID lpEntryID2, \ + ULONG ulFlags, \ + ULONG FAR * lpulResult) IPURE; \ + MAPIMETHOD(Advise) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + ULONG ulEventMask, \ + LPMAPIADVISESINK lpAdviseSink, \ + ULONG_PTR FAR * lpulConnection) IPURE; \ + MAPIMETHOD(Unadvise) \ + (THIS_ ULONG_PTR ulConnection) IPURE; \ + MAPIMETHOD(CreateOneOff) \ + (THIS_ LPTSTR lpszName, \ + LPTSTR lpszAdrType, \ + LPTSTR lpszAddress, \ + ULONG ulFlags, \ + ULONG FAR * lpcbEntryID, \ + LPENTRYID FAR * lppEntryID) IPURE; \ + MAPIMETHOD(NewEntry) \ + (THIS_ ULONG_PTR ulUIParam, \ + ULONG ulFlags, \ + ULONG cbEIDContainer, \ + LPENTRYID lpEIDContainer, \ + ULONG cbEIDNewEntryTpl, \ + LPENTRYID lpEIDNewEntryTpl, \ + ULONG FAR * lpcbEIDNewEntry, \ + LPENTRYID FAR * lppEIDNewEntry) IPURE; \ + MAPIMETHOD(ResolveName) \ + (THIS_ ULONG_PTR ulUIParam, \ + ULONG ulFlags, \ + LPTSTR lpszNewEntryTitle, \ + LPADRLIST lpAdrList) IPURE; \ + MAPIMETHOD(Address) \ + (THIS_ ULONG_PTR FAR * lpulUIParam, \ + LPADRPARM lpAdrParms, \ + LPADRLIST FAR * lppAdrList) IPURE; \ + MAPIMETHOD(Details) \ + (THIS_ ULONG_PTR FAR * lpulUIParam, \ + LPFNDISMISS lpfnDismiss, \ + LPVOID lpvDismissContext, \ + ULONG cbEntryID, \ + LPENTRYID lpEntryID, \ + LPFNBUTTON lpfButtonCallback, \ + LPVOID lpvButtonContext, \ + LPTSTR lpszButtonText, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(RecipOptions) \ + (THIS_ ULONG_PTR ulUIParam, \ + ULONG ulFlags, \ + LPADRENTRY lpRecip) IPURE; \ + MAPIMETHOD(QueryDefaultRecipOpt) \ + (THIS_ LPTSTR lpszAdrType, \ + ULONG ulFlags, \ + ULONG FAR * lpcValues, \ + LPSPropValue FAR * lppOptions) IPURE; \ + MAPIMETHOD(GetPAB) \ + (THIS_ ULONG FAR * lpcbEntryID, \ + LPENTRYID FAR * lppEntryID) IPURE; \ + MAPIMETHOD(SetPAB) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID) IPURE; \ + MAPIMETHOD(GetDefaultDir) \ + (THIS_ ULONG FAR * lpcbEntryID, \ + LPENTRYID FAR * lppEntryID) IPURE; \ + MAPIMETHOD(SetDefaultDir) \ + (THIS_ ULONG cbEntryID, \ + LPENTRYID lpEntryID) IPURE; \ + MAPIMETHOD(GetSearchPath) \ + (THIS_ ULONG ulFlags, \ + LPSRowSet FAR * lppSearchPath) IPURE; \ + MAPIMETHOD(SetSearchPath) \ + (THIS_ ULONG ulFlags, \ + LPSRowSet lpSearchPath) IPURE; \ + MAPIMETHOD(PrepareRecips) \ + (THIS_ ULONG ulFlags, \ + LPSPropTagArray lpPropTagArray, \ + LPADRLIST lpRecipList) IPURE; \ + +#undef INTERFACE +#define INTERFACE IAddrBook +DECLARE_MAPI_INTERFACE_(IAddrBook, IMAPIProp) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMAPIPROP_METHODS(PURE) + MAPI_IADDRBOOK_METHODS(PURE) +}; + +DECLARE_MAPI_INTERFACE_PTR(IAddrBook, LPADRBOOK); + +/* IProfAdmin Interface ---------------------------------------------------- */ + +/* Flags for CreateProfile */ +#define MAPI_DEFAULT_SERVICES 0x00000001 + +/* GetProfileTable */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) */ + +#define MAPI_IPROFADMIN_METHODS(IPURE) \ + MAPIMETHOD(GetLastError) \ + (THIS_ HRESULT hResult, \ + ULONG ulFlags, \ + LPMAPIERROR FAR * lppMAPIError) IPURE; \ + MAPIMETHOD(GetProfileTable) \ + (THIS_ ULONG ulFlags, \ + LPMAPITABLE FAR * lppTable) IPURE; \ + MAPIMETHOD(CreateProfile) \ + (THIS_ LPTSTR lpszProfileName, \ + LPTSTR lpszPassword, \ + ULONG_PTR ulUIParam, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(DeleteProfile) \ + (THIS_ LPTSTR lpszProfileName, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(ChangeProfilePassword) \ + (THIS_ LPTSTR lpszProfileName, \ + LPTSTR lpszOldPassword, \ + LPTSTR lpszNewPassword, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(CopyProfile) \ + (THIS_ LPTSTR lpszOldProfileName, \ + LPTSTR lpszOldPassword, \ + LPTSTR lpszNewProfileName, \ + ULONG_PTR ulUIParam, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(RenameProfile) \ + (THIS_ LPTSTR lpszOldProfileName, \ + LPTSTR lpszOldPassword, \ + LPTSTR lpszNewProfileName, \ + ULONG_PTR ulUIParam, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(SetDefaultProfile) \ + (THIS_ LPTSTR lpszProfileName, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(AdminServices) \ + (THIS_ LPTSTR lpszProfileName, \ + LPTSTR lpszPassword, \ + ULONG_PTR ulUIParam, \ + ULONG ulFlags, \ + LPSERVICEADMIN FAR * lppServiceAdmin) IPURE; \ + + +#undef INTERFACE +#define INTERFACE IProfAdmin +DECLARE_MAPI_INTERFACE_(IProfAdmin, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IPROFADMIN_METHODS(PURE) +}; + +/* IMsgServiceAdmin Interface ---------------------------------------------- */ + +/* Values for PR_RESOURCE_FLAGS in message service table */ + +#define SERVICE_DEFAULT_STORE 0x00000001 +#define SERVICE_SINGLE_COPY 0x00000002 +#define SERVICE_CREATE_WITH_STORE 0x00000004 +#define SERVICE_PRIMARY_IDENTITY 0x00000008 +#define SERVICE_NO_PRIMARY_IDENTITY 0x00000020 + +/* GetMsgServiceTable */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) */ + +/* GetProviderTable */ +/****** MAPI_UNICODE ((ULONG) 0x80000000) */ + +#define MAPI_IMSGSERVICEADMIN_METHODS(IPURE) \ + MAPIMETHOD(GetLastError) \ + (THIS_ HRESULT hResult, \ + ULONG ulFlags, \ + LPMAPIERROR FAR * lppMAPIError) IPURE; \ + MAPIMETHOD(GetMsgServiceTable) \ + (THIS_ ULONG ulFlags, \ + LPMAPITABLE FAR * lppTable) IPURE; \ + MAPIMETHOD(CreateMsgService) \ + (THIS_ LPTSTR lpszService, \ + LPTSTR lpszDisplayName, \ + ULONG_PTR ulUIParam, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(DeleteMsgService) \ + (THIS_ LPMAPIUID lpUID) IPURE; \ + MAPIMETHOD(CopyMsgService) \ + (THIS_ LPMAPIUID lpUID, \ + LPTSTR lpszDisplayName, \ + LPCIID lpInterfaceToCopy, \ + LPCIID lpInterfaceDst, \ + LPVOID lpObjectDst, \ + ULONG_PTR ulUIParam, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(RenameMsgService) \ + (THIS_ LPMAPIUID lpUID, \ + ULONG ulFlags, \ + LPTSTR lpszDisplayName) IPURE; \ + MAPIMETHOD(ConfigureMsgService) \ + (THIS_ LPMAPIUID lpUID, \ + ULONG_PTR ulUIParam, \ + ULONG ulFlags, \ + ULONG cValues, \ + LPSPropValue lpProps) IPURE; \ + MAPIMETHOD(OpenProfileSection) \ + (THIS_ LPMAPIUID lpUID, \ + LPCIID lpInterface, \ + ULONG ulFlags, \ + LPPROFSECT FAR * lppProfSect) IPURE; \ + MAPIMETHOD(MsgServiceTransportOrder) \ + (THIS_ ULONG cUID, \ + LPMAPIUID lpUIDList, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(AdminProviders) \ + (THIS_ LPMAPIUID lpUID, \ + ULONG ulFlags, \ + LPPROVIDERADMIN FAR * lppProviderAdmin) IPURE; \ + MAPIMETHOD(SetPrimaryIdentity) \ + (THIS_ LPMAPIUID lpUID, \ + ULONG ulFlags) IPURE; \ + MAPIMETHOD(GetProviderTable) \ + (THIS_ ULONG ulFlags, \ + LPMAPITABLE FAR * lppTable) IPURE; \ + + +#undef INTERFACE +#define INTERFACE IMsgServiceAdmin +DECLARE_MAPI_INTERFACE_(IMsgServiceAdmin, IUnknown) +{ + BEGIN_INTERFACE + MAPI_IUNKNOWN_METHODS(PURE) + MAPI_IMSGSERVICEADMIN_METHODS(PURE) +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MAPIX_H */ diff --git a/comm/mailnews/mapi/include/mspst.h b/comm/mailnews/mapi/include/mspst.h new file mode 100644 index 0000000000..d063e25c58 --- /dev/null +++ b/comm/mailnews/mapi/include/mspst.h @@ -0,0 +1,99 @@ +/* + * M S P S T . H + * + * This file lists internal properties of the Microsoft Personal + * Information Store + * + * Copyright (c) 2009 Microsoft Corporation. All Rights Reserved. + */ + +#ifndef _MSPST_H_ +#define _MSPST_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + + +/* The following is a list of properties that may be passed in + as the properties in the array of SPropValue structure on the + MsgServiceConfigure function. + + Creating a PST profile section through CreateMsgService. + The creation of the actual PST file is a two step process. First the + client should call CreateMsgService to setup the profile section and then + ConfigureMsgService to create the PST file. + The CreateMsgService call will setup the PR_DISPLAY_NAME property in the + profile section to be used on the PST when it is created. + + Configuring an PST file through ConfigureMsgService. + The configuration of an PST can take two forms, either configuring an + existing PST or creating a new PST. The Microsoft Personal Information + Store provider will try to find the necessary properties by first looking + in the array of SPropValue structures provided by the client and then in the + profile section, except for PR_PST_PW_SZ_OLD for which it will only look + in the array of properties. + + The Microsoft PST provider will try to open the file specified by the + PR_PST_PATH property, using the password given in the PR_PST_PW_SZ_OLD + property. If it finds a file and it recognizes it as a PST + file, it will start the configuration routine. Otherwise it will start the + creation routine. + + The configuration routine will look for the PR_DISPLAY_NAME_A and + PR_COMMENT_A properties and set them in the message store object. Then it + will look for the PR_PST_REMEMBER_PW property to decide if it should + remember the password in the profile. (If not found then it will defaut to + the current status of the profile password.) Then if it is supposed to + use UI, it will display the configuration property sheet to the user. After + all has succeeded, it will update the profile. + + The creation routine will follow one of two paths to get the PR_PST_PATH + property. If it is supposed to use UI it will always display the file open + dialog to confirm the path passed in or allow the user to change it. If + the user chooses an existing file and it recognizes it as an PST it will + drop back to the configuration routine. If the user chooses an existing + file and it is not recognized as an PST file, the user will be given the + option of choosing another file or creating a new PST in its place, in + which case is will continue with the create routine. If the user chooses + a new file it will continue with the create routine. If the routine is not + allowed to use UI, then the routine will create a file at the given path + even if another file exists there. + + Once it decides to continue with the creation process it will get the + PR_DISPLAY_NAME, PR_COMMENT, PR_PST_ENCRYPTION, and PR_PST_SZ_PW_NEW + properties. If it is supposed to use UI, it will use these to initialize + the creation dialog and get any changes the user want. Then it will create + a new file and update the profile. + + PR_DISPLAY_NAME_A display name for the PST service + PR_COMMENT_A comment to the place on the PST store object + PR_PST_PATH location the store to create or configure + PR_PST_REMEMBER_PW whether or not the remember the password in the profile + PR_PST_ENCRYPTION encryption level at which to create the file + PR_PST_PW_SZ_OLD password of the PST being configured + PR_PST_PW_SZ_NEW password to use for future access to the PST +*/ + +#define PST_EXTERN_PROPID_BASE (0x6700) +#define PR_PST_PATH PROP_TAG(PT_STRING8, PST_EXTERN_PROPID_BASE + 0) +#define PR_PST_REMEMBER_PW PROP_TAG(PT_BOOLEAN, PST_EXTERN_PROPID_BASE + 1) +#define PR_PST_ENCRYPTION PROP_TAG(PT_LONG, PST_EXTERN_PROPID_BASE + 2) +#define PR_PST_PW_SZ_OLD PROP_TAG(PT_STRING8, PST_EXTERN_PROPID_BASE + 3) +#define PR_PST_PW_SZ_NEW PROP_TAG(PT_STRING8, PST_EXTERN_PROPID_BASE + 4) + +#define PSTF_NO_ENCRYPTION ((DWORD)0x80000000) +#define PSTF_COMPRESSABLE_ENCRYPTION ((DWORD)0x40000000) +#define PSTF_BEST_ENCRYPTION ((DWORD)0x20000000) + +/* + * PR_MDB_PROVIDER is the GUID that represent the Microsoft Personal + * Information Store. This guid is available as a property in the stores + * table and on the message store and status objects. + */ +#define MSPST_UID_PROVIDER { 0x4e, 0x49, 0x54, 0x41, \ + 0xf9, 0xbf, 0xb8, 0x01, \ + 0x00, 0xaa, 0x00, 0x37, \ + 0xd9, 0x6e, 0x00, 0x00 } + +#endif /* _MSPST_H_ */ diff --git a/comm/mailnews/mapi/mapiDll/Makefile.in b/comm/mailnews/mapi/mapiDll/Makefile.in new file mode 100644 index 0000000000..b6769e3144 --- /dev/null +++ b/comm/mailnews/mapi/mapiDll/Makefile.in @@ -0,0 +1,6 @@ +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +EMBED_MANIFEST_AT = 2 diff --git a/comm/mailnews/mapi/mapiDll/Mapi32.def b/comm/mailnews/mapi/mapiDll/Mapi32.def new file mode 100644 index 0000000000..cc8dcef449 --- /dev/null +++ b/comm/mailnews/mapi/mapiDll/Mapi32.def @@ -0,0 +1,22 @@ +; This Source Code Form is subject to the terms of the Mozilla Public +; License, v. 2.0. If a copy of the MPL was not distributed with this +; file, You can obtain one at http://mozilla.org/MPL/2.0/. + +LIBRARY mozMapi32.dll + +EXPORTS + MAPILogon + MAPILogoff + MAPISendMail + MAPISendDocuments + MAPIFindNext + MAPIReadMail + MAPISaveMail + MAPIDeleteMail + MAPIAddress + MAPIDetails + MAPIResolveName + MAPIFreeBuffer + MAPISendMailW + GetMapiDllVersion + diff --git a/comm/mailnews/mapi/mapiDll/MapiDll.cpp b/comm/mailnews/mapi/mapiDll/MapiDll.cpp new file mode 100644 index 0000000000..027257a111 --- /dev/null +++ b/comm/mailnews/mapi/mapiDll/MapiDll.cpp @@ -0,0 +1,577 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#pragma warning(disable : 4996) // MAPILogoff is deprecated + +#include <windows.h> +#include <mapidefs.h> +#include <mapi.h> +#include "msgMapi.h" + +// Ensure that our COM structs match MS MAPI structs - thoroughly check each +// struct layout This needs that MAPI.h is not used from +// https://www.microsoft.com/en-us/download/details.aspx?id=12905 because the +// newer MAPI.h is the part of Windows SDK, and it includes MapiFileDescW and +// friends. + +static_assert(sizeof(nsMapiFileDesc) == sizeof(MapiFileDesc), "Size mismatch!"); +static_assert(offsetof(nsMapiFileDesc, ulReserved) == + offsetof(MapiFileDesc, ulReserved), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiFileDesc, flFlags) == + offsetof(MapiFileDesc, flFlags), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiFileDesc, nPosition_NotUsed) == + offsetof(MapiFileDesc, nPosition), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiFileDesc, lpszPathName) == + offsetof(MapiFileDesc, lpszPathName), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiFileDesc, lpszFileName) == + offsetof(MapiFileDesc, lpszFileName), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiFileDesc, lpFileType_NotUsed) == + offsetof(MapiFileDesc, lpFileType), + "Member offset mismatch!"); + +static_assert(sizeof(nsMapiRecipDesc) == sizeof(MapiRecipDesc), + "Size mismatch!"); +static_assert(offsetof(nsMapiRecipDesc, ulReserved) == + offsetof(MapiRecipDesc, ulReserved), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiRecipDesc, ulRecipClass) == + offsetof(MapiRecipDesc, ulRecipClass), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiRecipDesc, lpszName) == + offsetof(MapiRecipDesc, lpszName), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiRecipDesc, lpszAddress) == + offsetof(MapiRecipDesc, lpszAddress), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiRecipDesc, ulEIDSize_NotUsed) == + offsetof(MapiRecipDesc, ulEIDSize), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiRecipDesc, lpEntryID_NotUsed) == + offsetof(MapiRecipDesc, lpEntryID), + "Member offset mismatch!"); + +static_assert(sizeof(nsMapiMessage) == sizeof(MapiMessage), "Size mismatch!"); +static_assert(offsetof(nsMapiMessage, ulReserved) == + offsetof(MapiMessage, ulReserved), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessage, lpszSubject) == + offsetof(MapiMessage, lpszSubject), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessage, lpszNoteText) == + offsetof(MapiMessage, lpszNoteText), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessage, lpszMessageType) == + offsetof(MapiMessage, lpszMessageType), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessage, lpszDateReceived) == + offsetof(MapiMessage, lpszDateReceived), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessage, lpszConversationID_NotUsed) == + offsetof(MapiMessage, lpszConversationID), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessage, flFlags) == + offsetof(MapiMessage, flFlags), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessage, lpOriginator) == + offsetof(MapiMessage, lpOriginator), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessage, nRecipCount) == + offsetof(MapiMessage, nRecipCount), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessage, lpRecips) == + offsetof(MapiMessage, lpRecips), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessage, nFileCount) == + offsetof(MapiMessage, nFileCount), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessage, lpFiles) == + offsetof(MapiMessage, lpFiles), + "Member offset mismatch!"); + +static_assert(sizeof(nsMapiFileDescW) == sizeof(MapiFileDescW), + "Size mismatch!"); +static_assert(offsetof(nsMapiFileDescW, ulReserved) == + offsetof(MapiFileDescW, ulReserved), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiFileDescW, flFlags) == + offsetof(MapiFileDescW, flFlags), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiFileDescW, nPosition_NotUsed) == + offsetof(MapiFileDescW, nPosition), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiFileDescW, lpszPathName) == + offsetof(MapiFileDescW, lpszPathName), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiFileDescW, lpszFileName) == + offsetof(MapiFileDescW, lpszFileName), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiFileDescW, lpFileType_NotUsed) == + offsetof(MapiFileDescW, lpFileType), + "Member offset mismatch!"); + +static_assert(sizeof(nsMapiRecipDescW) == sizeof(MapiRecipDescW), + "Size mismatch!"); +static_assert(offsetof(nsMapiRecipDescW, ulReserved) == + offsetof(MapiRecipDescW, ulReserved), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiRecipDescW, ulRecipClass) == + offsetof(MapiRecipDescW, ulRecipClass), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiRecipDescW, lpszName) == + offsetof(MapiRecipDescW, lpszName), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiRecipDescW, lpszAddress) == + offsetof(MapiRecipDescW, lpszAddress), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiRecipDescW, ulEIDSize_NotUsed) == + offsetof(MapiRecipDescW, ulEIDSize), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiRecipDescW, lpEntryID_NotUsed) == + offsetof(MapiRecipDescW, lpEntryID), + "Member offset mismatch!"); + +static_assert(sizeof(nsMapiMessageW) == sizeof(MapiMessageW), "Size mismatch!"); +static_assert(offsetof(nsMapiMessageW, ulReserved) == + offsetof(MapiMessageW, ulReserved), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessageW, lpszSubject) == + offsetof(MapiMessageW, lpszSubject), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessageW, ulReserved) == + offsetof(MapiMessageW, ulReserved), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessageW, lpszSubject) == + offsetof(MapiMessageW, lpszSubject), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessageW, lpszNoteText) == + offsetof(MapiMessageW, lpszNoteText), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessageW, lpszMessageType) == + offsetof(MapiMessageW, lpszMessageType), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessageW, lpszDateReceived) == + offsetof(MapiMessageW, lpszDateReceived), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessageW, lpszConversationID_NotUsed) == + offsetof(MapiMessageW, lpszConversationID), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessageW, flFlags) == + offsetof(MapiMessageW, flFlags), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessageW, lpOriginator) == + offsetof(MapiMessageW, lpOriginator), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessageW, nRecipCount) == + offsetof(MapiMessageW, nRecipCount), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessageW, lpRecips) == + offsetof(MapiMessageW, lpRecips), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessageW, nFileCount) == + offsetof(MapiMessageW, nFileCount), + "Member offset mismatch!"); +static_assert(offsetof(nsMapiMessageW, lpFiles) == + offsetof(MapiMessageW, lpFiles), + "Member offset mismatch!"); + +#define MAX_RECIPS 2000 +#define MAX_FILES 100 + +#define MAX_NAME_LEN 256 +#define MAX_PW_LEN 256 +#define MAX_MSGINFO_LEN 512 +#define MAX_POINTERS 32 + +const CLSID CLSID_CMapiImp = {0x29f458be, + 0x8866, + 0x11d5, + {0xa3, 0xdd, 0x0, 0xb0, 0xd0, 0xf3, 0xba, 0xa7}}; +const IID IID_nsIMapi = {0x6EDCD38E, + 0x8861, + 0x11d5, + {0xA3, 0xDD, 0x00, 0xB0, 0xD0, 0xF3, 0xBA, 0xA7}}; + +DWORD tId = 0; + +#define MAPI_MESSAGE_TYPE 0 +#define MAPI_RECIPIENT_TYPE 1 + +typedef struct { + LPVOID lpMem; + UCHAR memType; +} memTrackerType; + +// this can't be right. +memTrackerType memArray[MAX_POINTERS]; + +// +// For remembering memory...how ironic. +// +void SetPointerArray(LPVOID ptr, BYTE type) { + int i; + + for (i = 0; i < MAX_POINTERS; i++) { + if (memArray[i].lpMem == NULL) { + memArray[i].lpMem = ptr; + memArray[i].memType = type; + break; + } + } +} + +BOOL WINAPI DllMain(HINSTANCE aInstance, DWORD aReason, LPVOID aReserved) { + switch (aReason) { + case DLL_PROCESS_ATTACH: + tId = TlsAlloc(); + if (tId == 0xFFFFFFFF) return FALSE; + break; + + case DLL_PROCESS_DETACH: + TlsFree(tId); + break; + } + return TRUE; +} + +BOOL InitMozillaReference(nsIMapi** aRetValue) { + // Check whether this thread has a valid Interface + // by looking into thread-specific-data variable + + *aRetValue = (nsIMapi*)TlsGetValue(tId); + + // Check whether the pointer actually resolves to + // a valid method call; otherwise mozilla is not running + + if ((*aRetValue) && (*aRetValue)->IsValid() == S_OK) return TRUE; + + HRESULT hRes = ::CoInitialize(NULL); + + hRes = ::CoCreateInstance(CLSID_CMapiImp, NULL, CLSCTX_LOCAL_SERVER, + IID_nsIMapi, (LPVOID*)aRetValue); + + if (hRes == S_OK && (*aRetValue)->Initialize() == S_OK) + if (TlsSetValue(tId, (LPVOID)(*aRetValue))) return TRUE; + + // Either CoCreate or TlsSetValue failed; so return FALSE + + if ((*aRetValue)) (*aRetValue)->Release(); + + ::CoUninitialize(); + return FALSE; +} + +///////////////////////////////////////////////////////////////////////////// +// The MAPILogon function begins a Simple MAPI session, loading the default +// message store and address book providers +///////////////////////////////////////////////////////////////////////////// + +ULONG FAR PASCAL MAPILogon(ULONG aUIParam, LPSTR aProfileName, LPSTR aPassword, + FLAGS aFlags, ULONG aReserved, LPLHANDLE aSession) { + HRESULT hr = 0; + ULONG nSessionId = 0; + nsIMapi* pNsMapi = NULL; + + if (!InitMozillaReference(&pNsMapi)) return MAPI_E_FAILURE; + + hr = pNsMapi->Login(aUIParam, aProfileName, aPassword, aFlags, &nSessionId); + if (hr == S_OK) + (*aSession) = (LHANDLE)nSessionId; + else + return nSessionId; + + return SUCCESS_SUCCESS; +} + +ULONG FAR PASCAL MAPILogoff(LHANDLE aSession, ULONG aUIParam, FLAGS aFlags, + ULONG aReserved) { + nsIMapi* pNsMapi = (nsIMapi*)TlsGetValue(tId); + if (pNsMapi != NULL) { + if (pNsMapi->Logoff((ULONG)aSession) == S_OK) pNsMapi->Release(); + pNsMapi = NULL; + } + + TlsSetValue(tId, NULL); + + ::CoUninitialize(); + + return SUCCESS_SUCCESS; +} + +ULONG FAR PASCAL MAPISendMail(LHANDLE lhSession, ULONG ulUIParam, + nsMapiMessage* lpMessage, FLAGS flFlags, + ULONG ulReserved) { + HRESULT hr = 0; + BOOL bTempSession = FALSE; + nsIMapi* pNsMapi = NULL; + + if (!InitMozillaReference(&pNsMapi)) return MAPI_E_FAILURE; + + if (lpMessage->nRecipCount > MAX_RECIPS) return MAPI_E_TOO_MANY_RECIPIENTS; + + if (lpMessage->nFileCount > MAX_FILES) return MAPI_E_TOO_MANY_FILES; + + if ((!(flFlags & MAPI_DIALOG)) && (lpMessage->lpRecips == NULL)) + return MAPI_E_UNKNOWN_RECIPIENT; + + if (!lhSession || pNsMapi->IsValidSession(lhSession) != S_OK) { + FLAGS LoginFlag = flFlags & (MAPI_LOGON_UI | MAPI_NEW_SESSION); + hr = MAPILogon(ulUIParam, nullptr, nullptr, LoginFlag, 0, &lhSession); + if (hr != SUCCESS_SUCCESS) return MAPI_E_LOGIN_FAILURE; + bTempSession = TRUE; + } + + hr = pNsMapi->SendMail(lhSession, lpMessage, flFlags, ulReserved); + + // we are seeing a problem when using Word, although we return success from + // the MAPI support MS COM interface in mozilla, we are getting this error + // here. This is a temporary hack !! + if (hr == (HRESULT)0x800703e6) hr = SUCCESS_SUCCESS; + + if (bTempSession) MAPILogoff(lhSession, ulUIParam, 0, 0); + + return hr; +} + +ULONG FAR PASCAL MAPISendMailW(LHANDLE lhSession, ULONG ulUIParam, + nsMapiMessageW* lpMessage, FLAGS flFlags, + ULONG ulReserved) { + HRESULT hr = 0; + BOOL bTempSession = FALSE; + nsIMapi* pNsMapi = nullptr; + + if (!InitMozillaReference(&pNsMapi)) return MAPI_E_FAILURE; + + if (lpMessage->nRecipCount > MAX_RECIPS) return MAPI_E_TOO_MANY_RECIPIENTS; + + if (lpMessage->nFileCount > MAX_FILES) return MAPI_E_TOO_MANY_FILES; + + if ((!(flFlags & MAPI_DIALOG)) && (lpMessage->lpRecips == nullptr)) + return MAPI_E_UNKNOWN_RECIPIENT; + + if (!lhSession || pNsMapi->IsValidSession(lhSession) != S_OK) { + FLAGS LoginFlag = flFlags & (MAPI_LOGON_UI | MAPI_NEW_SESSION); + hr = MAPILogon(ulUIParam, nullptr, nullptr, LoginFlag, 0, &lhSession); + if (hr != SUCCESS_SUCCESS) return MAPI_E_LOGIN_FAILURE; + bTempSession = TRUE; + } + + hr = pNsMapi->SendMailW(lhSession, lpMessage, flFlags, ulReserved); + + // we are seeing a problem when using Word, although we return success from + // the MAPI support MS COM interface in mozilla, we are getting this error + // here. This is a temporary hack !! + if (hr == (HRESULT)0x800703e6) hr = SUCCESS_SUCCESS; + + if (bTempSession) MAPILogoff(lhSession, ulUIParam, 0, 0); + + return hr; +} + +ULONG FAR PASCAL MAPISendDocuments(ULONG ulUIParam, LPSTR lpszDelimChar, + LPSTR lpszFilePaths, LPSTR lpszFileNames, + ULONG ulReserved) { + LHANDLE lhSession; + nsIMapi* pNsMapi = NULL; + + if (!InitMozillaReference(&pNsMapi)) return MAPI_E_FAILURE; + + unsigned long result = + MAPILogon(ulUIParam, nullptr, nullptr, MAPI_LOGON_UI, 0, &lhSession); + if (result != SUCCESS_SUCCESS) return MAPI_E_LOGIN_FAILURE; + + HRESULT hr; + + hr = pNsMapi->SendDocuments(lhSession, lpszDelimChar, lpszFilePaths, + lpszFileNames, ulReserved); + + MAPILogoff(lhSession, ulUIParam, 0, 0); + + return hr; +} + +ULONG FAR PASCAL MAPIFindNext(LHANDLE lhSession, ULONG ulUIParam, + const LPSTR lpszMessageType, + const LPSTR lpszSeedMessageID, FLAGS flFlags, + ULONG ulReserved, + unsigned char lpszMessageID[64]) { + nsIMapi* pNsMapi = NULL; + + if (!InitMozillaReference(&pNsMapi)) return MAPI_E_FAILURE; + + if (lhSession == 0) return MAPI_E_INVALID_SESSION; + + return pNsMapi->FindNext(lhSession, ulUIParam, lpszMessageType, + lpszSeedMessageID, flFlags, ulReserved, + lpszMessageID); +} + +ULONG FAR PASCAL MAPIReadMail(LHANDLE lhSession, ULONG ulUIParam, + LPSTR lpszMessageID, FLAGS flFlags, + ULONG ulReserved, nsMapiMessage** lppMessage) { + nsIMapi* pNsMapi = NULL; + + if (!InitMozillaReference(&pNsMapi)) return MAPI_E_FAILURE; + + if (lhSession == 0) return MAPI_E_INVALID_SESSION; + + return pNsMapi->ReadMail(lhSession, ulUIParam, lpszMessageID, flFlags, + ulReserved, lppMessage); +} + +ULONG FAR PASCAL MAPISaveMail(LHANDLE lhSession, ULONG ulUIParam, + lpnsMapiMessage lpMessage, FLAGS flFlags, + ULONG ulReserved, LPSTR lpszMessageID) { + nsIMapi* pNsMapi = NULL; + + if (lhSession == 0) return MAPI_E_INVALID_SESSION; + + if (!InitMozillaReference(&pNsMapi)) return MAPI_E_FAILURE; + + return MAPI_E_FAILURE; +} + +ULONG FAR PASCAL MAPIDeleteMail(LHANDLE lhSession, ULONG ulUIParam, + LPSTR lpszMessageID, FLAGS flFlags, + ULONG ulReserved) { + nsIMapi* pNsMapi = NULL; + + if (lhSession == 0) return MAPI_E_INVALID_SESSION; + + if (!InitMozillaReference(&pNsMapi)) return MAPI_E_FAILURE; + + return pNsMapi->DeleteMail(lhSession, ulUIParam, lpszMessageID, flFlags, + ulReserved); +} + +ULONG FAR PASCAL MAPIAddress(LHANDLE lhSession, ULONG ulUIParam, + LPSTR lpszCaption, ULONG nEditFields, + LPSTR lpszLabels, ULONG nRecips, + lpMapiRecipDesc lpRecips, FLAGS flFlags, + ULONG ulReserved, LPULONG lpnNewRecips, + lpMapiRecipDesc FAR* lppNewRecips) { + return MAPI_E_NOT_SUPPORTED; +} + +ULONG FAR PASCAL MAPIDetails(LHANDLE lhSession, ULONG ulUIParam, + lpMapiRecipDesc lpRecip, FLAGS flFlags, + ULONG ulReserved) { + return MAPI_E_NOT_SUPPORTED; +} + +ULONG FAR PASCAL MAPIResolveName(LHANDLE lhSession, ULONG ulUIParam, + LPSTR lpszName, FLAGS flFlags, + ULONG ulReserved, + lpMapiRecipDesc FAR* lppRecip) { + char* lpszRecipName = new char[(strlen((const char*)lpszName) + 1)]; + if (lpszRecipName == NULL) return MAPI_E_INSUFFICIENT_MEMORY; + char* lpszRecipAddress = new char[(strlen((const char*)lpszName) + 6)]; + if (!lpszRecipAddress) { + delete[] lpszRecipName; + return MAPI_E_INSUFFICIENT_MEMORY; + } + strcpy(lpszRecipName, (const char*)lpszName); + strcpy(lpszRecipAddress, (const char*)lpszName); + (*lppRecip) = (lpMapiRecipDesc FAR)malloc(sizeof(MapiRecipDesc)); + if (!(*lppRecip)) { + delete[] lpszRecipName; + delete[] lpszRecipAddress; + return MAPI_E_INSUFFICIENT_MEMORY; + } + (*lppRecip)->ulRecipClass = 1; + (*lppRecip)->lpszName = lpszRecipName; + (*lppRecip)->lpszAddress = lpszRecipAddress; + (*lppRecip)->ulEIDSize = 0; + (*lppRecip)->lpEntryID = 0; + return SUCCESS_SUCCESS; +} + +void FreeMAPIRecipient(lpMapiRecipDesc pv); +void FreeMAPIMessage(lpMapiMessage pv); + +ULONG FAR PASCAL MAPIFreeBuffer(LPVOID pv) { + int i; + + if (!pv) return S_OK; + + for (i = 0; i < MAX_POINTERS; i++) { + if (pv == memArray[i].lpMem) { + if (memArray[i].memType == MAPI_MESSAGE_TYPE) { + FreeMAPIMessage((MapiMessage*)pv); + memArray[i].lpMem = NULL; + } else if (memArray[i].memType == MAPI_RECIPIENT_TYPE) { + FreeMAPIRecipient((MapiRecipDesc*)pv); + memArray[i].lpMem = NULL; + } + } + } + + pv = NULL; + return S_OK; +} + +ULONG FAR PASCAL GetMapiDllVersion() { return 94; } + +void FreeMAPIFile(lpMapiFileDesc pv) { + if (!pv) return; + + if (pv->lpszPathName != NULL) free(pv->lpszPathName); + + if (pv->lpszFileName != NULL) free(pv->lpszFileName); +} + +void FreeMAPIMessage(lpMapiMessage pv) { + ULONG i; + + if (!pv) return; + + if (pv->lpszSubject != NULL) free(pv->lpszSubject); + + if (pv->lpszNoteText) free(pv->lpszNoteText); + + if (pv->lpszMessageType) free(pv->lpszMessageType); + + if (pv->lpszDateReceived) free(pv->lpszDateReceived); + + if (pv->lpszConversationID) free(pv->lpszConversationID); + + if (pv->lpOriginator) FreeMAPIRecipient(pv->lpOriginator); + + for (i = 0; i < pv->nRecipCount; i++) { + if (&(pv->lpRecips[i]) != NULL) { + FreeMAPIRecipient(&(pv->lpRecips[i])); + } + } + + if (pv->lpRecips != NULL) { + free(pv->lpRecips); + } + + for (i = 0; i < pv->nFileCount; i++) { + if (&(pv->lpFiles[i]) != NULL) { + FreeMAPIFile(&(pv->lpFiles[i])); + } + } + + if (pv->lpFiles != NULL) { + free(pv->lpFiles); + } + + free(pv); + pv = NULL; +} + +void FreeMAPIRecipient(lpMapiRecipDesc pv) { + if (!pv) return; + + if (pv->lpszName != NULL) free(pv->lpszName); + + if (pv->lpszAddress != NULL) free(pv->lpszAddress); + + if (pv->lpEntryID != NULL) free(pv->lpEntryID); +} diff --git a/comm/mailnews/mapi/mapiDll/module.ver b/comm/mailnews/mapi/mapiDll/module.ver new file mode 100644 index 0000000000..d62b9e99cb --- /dev/null +++ b/comm/mailnews/mapi/mapiDll/module.ver @@ -0,0 +1,7 @@ +WIN32_MODULE_FILEVERSION=0,8,0,0 +WIN32_MODULE_FILEVERSION_STRING=0.8 +WIN32_MODULE_COPYRIGHT=©Thunderbird and Mozilla Developers, according to the MPL 1.1/GPL 2.0/LGPL 2.1 licenses, as applicable. +WIN32_MODULE_COMPANYNAME=Mozilla.org +WIN32_MODULE_TRADEMARKS=Mozilla +WIN32_MODULE_COMMENT=Mozilla Thunderbird MAPI Dll + diff --git a/comm/mailnews/mapi/mapiDll/moz.build b/comm/mailnews/mapi/mapiDll/moz.build new file mode 100644 index 0000000000..a013feffec --- /dev/null +++ b/comm/mailnews/mapi/mapiDll/moz.build @@ -0,0 +1,24 @@ +# vim: set filetype=python: +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# Statically link against the CRT, so that we don't go hunting around for it +# and not find it when we're loaded into explorer.exe or similar +SharedLibrary("mozMapi32") +USE_STATIC_LIBS = True + +LOCAL_INCLUDES += ["../include"] + +SOURCES += [ + "MapiDll.cpp", +] + +OS_LIBS += [ + "ole32", +] + +DEFINES["UNICODE"] = True +DEFINES["_UNICODE"] = True + +DEFFILE = "Mapi32.def" diff --git a/comm/mailnews/mapi/mapihook/build/MapiProxy.def b/comm/mailnews/mapi/mapihook/build/MapiProxy.def new file mode 100644 index 0000000000..4da08eb7d3 --- /dev/null +++ b/comm/mailnews/mapi/mapihook/build/MapiProxy.def @@ -0,0 +1,13 @@ +; This Source Code Form is subject to the terms of the Mozilla Public +; License, v. 2.0. If a copy of the MPL was not distributed with this +; file, You can obtain one at http://mozilla.org/MPL/2.0/. + +LIBRARY MapiProxy.dll + +EXPORTS + DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE + GetProxyDllInfo PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE + diff --git a/comm/mailnews/mapi/mapihook/build/module.ver b/comm/mailnews/mapi/mapihook/build/module.ver new file mode 100644 index 0000000000..7691020c26 --- /dev/null +++ b/comm/mailnews/mapi/mapihook/build/module.ver @@ -0,0 +1,6 @@ +WIN32_MODULE_FILEVERSION=0,8,0,0 +WIN32_MODULE_FILEVERSION_STRING=0.8 +WIN32_MODULE_COPYRIGHT=©Thunderbird and Mozilla Developers, according to the MPL 1.1/GPL 2.0/LGPL 2.1 licenses, as applicable. +WIN32_MODULE_COMPANYNAME=Mozilla.org +WIN32_MODULE_TRADEMARKS=Mozilla +WIN32_MODULE_COMMENT=Mozilla Thunderbird Thunderbird MAPI Proxy Dll diff --git a/comm/mailnews/mapi/mapihook/build/moz.build b/comm/mailnews/mapi/mapihook/build/moz.build new file mode 100644 index 0000000000..9832a5cb05 --- /dev/null +++ b/comm/mailnews/mapi/mapihook/build/moz.build @@ -0,0 +1,56 @@ +# vim: set filetype=python: +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +SharedLibrary("MapiProxy") + +OS_LIBS += [ + "rpcrt4", +] + +LOCAL_INCLUDES += ["/comm/mailnews/mapi/include"] + +SOURCES += ["!dlldata.c", "!msgMapi_i.c", "!msgMapi_p.c"] + +GeneratedFile( + "dlldata.c", + "msgMapi.h", + "msgMapi_i.c", + "msgMapi_p.c", + inputs=["msgMapi.idl"], + script="/build/midl.py", + entry_point="midl", + flags=[ + "-I", + SRCDIR, + "-I", + TOPSRCDIR + "/comm/mailnews/mapi/include", + ], +) + +EXPORTS += [ + "!msgMapi.h", + "!msgMapi_i.c", +] + +for var in ("REGISTER_PROXY_DLL", "UNICODE", "_UNICODE"): + DEFINES[var] = True + +DEFFILE = "MapiProxy.def" + +# The Windows MIDL code generator creates things like: +# +# #endif !_MIDL_USE_GUIDDEF_ +# +# which clang-cl complains about. MSVC doesn't, so turn this warning off. +if CONFIG["CC_TYPE"] == "clang-cl": + CFLAGS += ["-Wno-extra-tokens"] + +# clang-cl complains about these in generated code: +if CONFIG["CC_TYPE"] == "clang-cl": + CFLAGS += [ + "-Wno-extern-initializer", + "-Wno-missing-braces", + "-Wno-unused-const-variable", + ] diff --git a/comm/mailnews/mapi/mapihook/build/msgMapi.idl b/comm/mailnews/mapi/mapihook/build/msgMapi.idl new file mode 100644 index 0000000000..e2738ae8e1 --- /dev/null +++ b/comm/mailnews/mapi/mapihook/build/msgMapi.idl @@ -0,0 +1,125 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// This idl will be compiled by MIDL. MS-COM is used +// as bridge between MAPI clients and the Mozilla. + +import "unknwn.idl"; + +typedef struct +{ + unsigned long ulReserved; + unsigned long flFlags; /* Flags */ + unsigned long nPosition_NotUsed; /* character in text to be replaced by attachment */ + LPSTR lpszPathName; /* Full path name including file name */ + LPSTR lpszFileName; /* Real (original) file name */ + unsigned char * lpFileType_NotUsed ; +} nsMapiFileDesc, * lpnsMapiFileDesc; + + +typedef struct +{ + unsigned long ulReserved; + unsigned long ulRecipClass; /* MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG */ + LPSTR lpszName; /* Recipient name to display */ + LPSTR lpszAddress; /* Recipient email address */ + unsigned long ulEIDSize_NotUsed; + unsigned char * lpEntryID_NotUsed ; +} nsMapiRecipDesc, * lpnsMapiRecipDesc; + +typedef struct +{ + unsigned long ulReserved; + LPSTR lpszSubject; /* Message Subject */ + LPSTR lpszNoteText; /* Message Text */ + LPSTR lpszMessageType; + LPSTR lpszDateReceived; /* in YYYY/MM/DD HH:MM format */ + LPSTR lpszConversationID_NotUsed; /* conversation thread ID */ + unsigned long flFlags; /* unread,return receipt */ + lpnsMapiRecipDesc lpOriginator; /* Originator descriptor */ + unsigned long nRecipCount; /* Number of recipients */ + [size_is (nRecipCount)] lpnsMapiRecipDesc lpRecips; /* Recipient descriptors */ + unsigned long nFileCount; /* # of file attachments */ + [size_is (nFileCount)] lpnsMapiFileDesc lpFiles; /* Attachment descriptors */ +} nsMapiMessage, * lpnsMapiMessage; + +typedef struct +{ + unsigned long ulReserved; + unsigned long flFlags; /* Flags */ + unsigned long nPosition_NotUsed; /* character in text to be replaced by attachment */ + LPWSTR lpszPathName; /* Full path name including file name */ + LPWSTR lpszFileName; /* Real (original) file name */ + unsigned char* lpFileType_NotUsed; +} nsMapiFileDescW, *lpnsMapiFileDescW; + +typedef struct +{ + unsigned long ulReserved; + unsigned long ulRecipClass; /* MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG */ + LPWSTR lpszName; /* Recipient name to display */ + LPWSTR lpszAddress; /* Recipient email address */ + unsigned long ulEIDSize_NotUsed; + unsigned char* lpEntryID_NotUsed; +} nsMapiRecipDescW, *lpnsMapiRecipDescW; + +typedef struct +{ + unsigned long ulReserved; + LPWSTR lpszSubject; /* Message Subject */ + LPWSTR lpszNoteText; /* Message Text */ + LPWSTR lpszMessageType; + LPWSTR lpszDateReceived; /* in YYYY/MM/DD HH:MM format */ + LPWSTR lpszConversationID_NotUsed; /* conversation thread ID */ + unsigned long flFlags; /* unread,return receipt */ + lpnsMapiRecipDescW lpOriginator; /* Originator descriptor */ + unsigned long nRecipCount; /* Number of recipients */ + [size_is (nRecipCount)] lpnsMapiRecipDescW lpRecips; /* Recipient descriptors */ + unsigned long nFileCount; /* # of file attachments */ + [size_is (nFileCount)] lpnsMapiFileDescW lpFiles; /* Attachment descriptors */ +} nsMapiMessageW, *lpnsMapiMessageW; + +[ + object, + uuid(6EDCD38E-8861-11d5-A3DD-00B0D0F3BAA7), + helpstring("nsIMapi Interface"), + pointer_default(unique) +] + +interface nsIMapi : IUnknown +{ + HRESULT Login([in] unsigned long aUIArg, [in, unique, max_is(256)] LPSTR aLogin, + [in, unique, max_is(256)] LPSTR aPassWord, [in] unsigned long aFlags, + [out] unsigned long *aSessionId); + + HRESULT Initialize(); + HRESULT IsValid(); + HRESULT IsValidSession([in] unsigned long aSession); + + HRESULT SendMail([in] unsigned long aSession, [in, unique] lpnsMapiMessage aMessage, + [in] unsigned long aFlags, [in] unsigned long aReserved) ; + + HRESULT SendDocuments([in] unsigned long aSession, + [in, unique] LPSTR aDelimChar, [in, unique] LPSTR aFilePaths, + [in, unique] LPSTR aFileNames, [in] ULONG aFlags); + + HRESULT FindNext([in] unsigned long aSession, [in] ULONG ulUIParam, [in, unique] const LPSTR lpszMessageType, + [in, unique] const LPSTR lpszSeedMessageID, [in] ULONG flFlags, [in] ULONG ulReserved, + [in] [out] char lpszMessageID[64] ) ; + + HRESULT ReadMail([in] unsigned long lhSession, [in] ULONG ulUIParam, [in, unique] LPSTR lpszMessageID, + [in] ULONG flFlags, [in] ULONG ulReserved, [out] lpnsMapiMessage *lppMessage); + + HRESULT DeleteMail([in] unsigned long lhSession, [in] ULONG ulUIParam, [in, unique] LPSTR lpszMessageID, + [in] ULONG flFlags, [in] ULONG ulReserved); + + HRESULT SaveMail([in] unsigned long lhSession, [in] ULONG ulUIParam, [in, unique] lpnsMapiMessage lppMessage, + [in] ULONG flFlags, [in] ULONG ulReserved, [in, unique] LPSTR lpszMessageID); + + HRESULT SendMailW([in] unsigned long aSession, [in, unique] lpnsMapiMessageW aMessage, + [in] unsigned long aFlags, [in] unsigned long aReserved); + + HRESULT Logoff(unsigned long aSession); + HRESULT CleanUp(); +}; diff --git a/comm/mailnews/mapi/mapihook/moz.build b/comm/mailnews/mapi/mapihook/moz.build new file mode 100644 index 0000000000..2160ce3345 --- /dev/null +++ b/comm/mailnews/mapi/mapihook/moz.build @@ -0,0 +1,10 @@ +# vim: set filetype=python: +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +DIRS += [ + "public", + "build", + "src", +] diff --git a/comm/mailnews/mapi/mapihook/public/moz.build b/comm/mailnews/mapi/mapihook/public/moz.build new file mode 100644 index 0000000000..12f8019242 --- /dev/null +++ b/comm/mailnews/mapi/mapihook/public/moz.build @@ -0,0 +1,10 @@ +# vim: set filetype=python: +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +XPIDL_SOURCES += [ + "nsIMapiSupport.idl", +] + +XPIDL_MODULE = "mapihook" diff --git a/comm/mailnews/mapi/mapihook/public/nsIMapiSupport.idl b/comm/mailnews/mapi/mapihook/public/nsIMapiSupport.idl new file mode 100644 index 0000000000..39a947ae7a --- /dev/null +++ b/comm/mailnews/mapi/mapihook/public/nsIMapiSupport.idl @@ -0,0 +1,42 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "nsISupports.idl" + +/** + * This interface provides support for registering Mozilla as a COM component + * for extending the use of Mail/News through Simple MAPI. + * + */ + +[uuid(2907B676-C4BD-49af-880A-E27A0616291E)] +interface nsIMapiSupport : nsISupports { + + /** Initiates MAPI support + */ + + void initializeMAPISupport(); + + /** Shuts down the MAPI support + */ + + void shutdownMAPISupport(); + + /** registerServer - register the mapi DLL with the desktop + * Typically called by the window shell service when we are + * made the default mail app + */ + void registerServer(); + + /** unRegisterServer - unregister the mapi DLL with the desktop + * Typically called by the window shell service when we are + * removed as the default mail app. + */ + void unRegisterServer(); +}; + +%{C++ +#define NS_IMAPISUPPORT_CONTRACTID "@mozilla.org/mapisupport;1" +#define NS_IMAPISUPPORT_CLASSNAME "Mozilla MAPI Support" +%} diff --git a/comm/mailnews/mapi/mapihook/src/Registry.cpp b/comm/mailnews/mapi/mapihook/src/Registry.cpp new file mode 100644 index 0000000000..bf57e31e57 --- /dev/null +++ b/comm/mailnews/mapi/mapihook/src/Registry.cpp @@ -0,0 +1,249 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#undef _UNICODE +#undef UNICODE + +#include <objbase.h> +#include "nsString.h" +#include "Registry.h" + +#define MAPI_PROXY_DLL_NAME u"MapiProxy.dll" +#define MAPI_STARTUP_ARG L" /MAPIStartUp" +#define MAX_SIZE 2048 + +// Size of a CLSID as a string +const int CLSID_STRING_SIZE = 39; + +// Proxy/Stub Dll Routines + +typedef HRESULT(__stdcall ProxyServer)(); + +// Convert a CLSID to a WCHAR string. + +BOOL CLSIDtoWchar(const CLSID& clsid, WCHAR* szCLSID) { + // Get CLSID + HRESULT hr = StringFromCLSID(clsid, &szCLSID); + if (FAILED(hr)) return FALSE; + return TRUE; +} + +// Create a key and set its value. + +BOOL setKeyAndValue(nsAutoString keyName, const WCHAR* subKey, + const WCHAR* theValue) { + HKEY hKey; + BOOL retValue = TRUE; + + nsAutoString theKey(keyName); + if (subKey != NULL) { + theKey += L"\\"; + theKey += subKey; + } + + // Create and open key and subkey. + long lResult = RegCreateKeyExW(HKEY_CLASSES_ROOT, theKey.get(), 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, + &hKey, NULL); + if (lResult != ERROR_SUCCESS) return FALSE; + + // Set the Value. + if (theValue != NULL) { + lResult = RegSetValueExW(hKey, NULL, 0, REG_SZ, (BYTE*)theValue, + wcslen(theValue) + 1); + if (lResult != ERROR_SUCCESS) retValue = FALSE; + } + + RegCloseKey(hKey); + return retValue; +} + +// Delete a key and all of its descendents. + +LONG recursiveDeleteKey(HKEY hKeyParent, // Parent of key to delete + const WCHAR* lpszKeyChild) // Key to delete +{ + // Open the child. + HKEY hKeyChild; + LONG lRes = + RegOpenKeyExW(hKeyParent, lpszKeyChild, 0, KEY_ALL_ACCESS, &hKeyChild); + if (lRes != ERROR_SUCCESS) { + return lRes; + } + + // Enumerate all of the descendants of this child. + FILETIME time; + WCHAR szBuffer[MAX_SIZE]; + DWORD dwSize = MAX_SIZE; + while (RegEnumKeyExW(hKeyChild, 0, szBuffer, &dwSize, NULL, NULL, NULL, + &time) == S_OK) { + // Delete the descendants of this child. + lRes = recursiveDeleteKey(hKeyChild, szBuffer); + if (lRes != ERROR_SUCCESS) { + // Cleanup before exiting. + RegCloseKey(hKeyChild); + return lRes; + } + dwSize = MAX_SIZE; + } + + // Close the child. + RegCloseKey(hKeyChild); + + // Delete this child. + return RegDeleteKeyW(hKeyParent, lpszKeyChild); +} + +void RegisterProxy() { + HINSTANCE h = NULL; + ProxyServer* RegisterFunc = NULL; + + WCHAR szModule[MAX_SIZE]; + WCHAR* pTemp = NULL; + + HMODULE hModule = GetModuleHandleW(NULL); + DWORD dwResult = + ::GetModuleFileNameW(hModule, szModule, sizeof(szModule) / sizeof(WCHAR)); + if (dwResult == 0) return; + + pTemp = wcsrchr(szModule, L'\\'); + if (pTemp == NULL) return; + + *pTemp = '\0'; + nsAutoString proxyPath(szModule); + + proxyPath += u"\\"; + proxyPath += MAPI_PROXY_DLL_NAME; + + h = LoadLibraryW(proxyPath.get()); + if (h == NULL) return; + + RegisterFunc = (ProxyServer*)GetProcAddress(h, "DllRegisterServer"); + if (RegisterFunc) RegisterFunc(); + + FreeLibrary(h); +} + +void UnRegisterProxy() { + HINSTANCE h = NULL; + ProxyServer* UnRegisterFunc = NULL; + + WCHAR szModule[MAX_SIZE]; + WCHAR* pTemp = NULL; + + HMODULE hModule = GetModuleHandleW(NULL); + DWORD dwResult = + ::GetModuleFileNameW(hModule, szModule, sizeof(szModule) / sizeof(WCHAR)); + if (dwResult == 0) return; + + pTemp = wcsrchr(szModule, L'\\'); + if (pTemp == NULL) return; + + *pTemp = '\0'; + nsAutoString proxyPath(szModule); + + proxyPath += u"\\"; + proxyPath += MAPI_PROXY_DLL_NAME; + + h = LoadLibraryW(proxyPath.get()); + if (h == NULL) return; + + UnRegisterFunc = (ProxyServer*)GetProcAddress(h, "DllUnregisterServer"); + if (UnRegisterFunc) UnRegisterFunc(); + + FreeLibrary(h); +} + +// Register the component in the registry. + +HRESULT RegisterServer(const CLSID& clsid, // Class ID + const WCHAR* szFriendlyName, // Friendly Name + const WCHAR* szVerIndProgID, // Programmatic + const WCHAR* szProgID) // IDs +{ + HMODULE hModule = GetModuleHandleW(NULL); + WCHAR szModuleName[MAX_SIZE]; + WCHAR szCLSID[CLSID_STRING_SIZE]; + + nsAutoString independentProgId(szVerIndProgID); + nsAutoString progId(szProgID); + + DWORD dwResult = ::GetModuleFileNameW(hModule, szModuleName, + sizeof(szModuleName) / sizeof(WCHAR)); + + if (dwResult == 0) return S_FALSE; + + nsAutoString moduleName(szModuleName); + nsAutoString registryKey(L"CLSID\\"); + + moduleName += MAPI_STARTUP_ARG; + + // Convert the CLSID into a WCHAR. + if (!CLSIDtoWchar(clsid, szCLSID)) return S_FALSE; + registryKey += szCLSID; + + // Add the CLSID to the registry. + if (!setKeyAndValue(registryKey, NULL, szFriendlyName)) return S_FALSE; + + if (!setKeyAndValue(registryKey, L"LocalServer32", moduleName.get())) + return S_FALSE; + + // Add the ProgID subkey under the CLSID key. + if (!setKeyAndValue(registryKey, L"ProgID", szProgID)) return S_FALSE; + + // Add the version-independent ProgID subkey under CLSID key. + if (!setKeyAndValue(registryKey, L"VersionIndependentProgID", szVerIndProgID)) + return S_FALSE; + + // Add the version-independent ProgID subkey under HKEY_CLASSES_ROOT. + if (!setKeyAndValue(independentProgId, NULL, szFriendlyName)) return S_FALSE; + if (!setKeyAndValue(independentProgId, L"CLSID", szCLSID)) return S_FALSE; + if (!setKeyAndValue(independentProgId, L"CurVer", szProgID)) return S_FALSE; + + // Add the versioned ProgID subkey under HKEY_CLASSES_ROOT. + if (!setKeyAndValue(progId, NULL, szFriendlyName)) return S_FALSE; + if (!setKeyAndValue(progId, L"CLSID", szCLSID)) return S_FALSE; + + RegisterProxy(); + + return S_OK; +} + +LONG UnregisterServer(const CLSID& clsid, // Class ID + const WCHAR* szVerIndProgID, // Programmatic + const WCHAR* szProgID) // IDs +{ + LONG lResult = S_OK; + + // Convert the CLSID into a char. + + WCHAR szCLSID[CLSID_STRING_SIZE]; + if (!CLSIDtoWchar(clsid, szCLSID)) return S_FALSE; + + UnRegisterProxy(); + + nsAutoString registryKey(L"CLSID\\"); + registryKey += szCLSID; + + lResult = recursiveDeleteKey(HKEY_CLASSES_ROOT, registryKey.get()); + if (lResult == ERROR_SUCCESS || lResult == ERROR_FILE_NOT_FOUND) + return lResult; + + registryKey += L"\\LocalServer32"; + + // Delete only the path for this server. + + lResult = recursiveDeleteKey(HKEY_CLASSES_ROOT, registryKey.get()); + if (lResult != ERROR_SUCCESS && lResult != ERROR_FILE_NOT_FOUND) + return lResult; + + // Delete the version-independent ProgID Key. + lResult = recursiveDeleteKey(HKEY_CLASSES_ROOT, szVerIndProgID); + if (lResult != ERROR_SUCCESS && lResult != ERROR_FILE_NOT_FOUND) + return lResult; + + lResult = recursiveDeleteKey(HKEY_CLASSES_ROOT, szProgID); + + return lResult; +} diff --git a/comm/mailnews/mapi/mapihook/src/Registry.h b/comm/mailnews/mapi/mapihook/src/Registry.h new file mode 100644 index 0000000000..7207694e55 --- /dev/null +++ b/comm/mailnews/mapi/mapihook/src/Registry.h @@ -0,0 +1,20 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef _REGISTRY_H_ +#define _REGISTRY_H_ + +#include <objbase.h> + +// This function will register a component in the Registry. + +HRESULT RegisterServer(const CLSID& clsid, const WCHAR* szFriendlyName, + const WCHAR* szVerIndProgID, const WCHAR* szProgID); + +// This function will unregister a component. + +HRESULT UnregisterServer(const CLSID& clsid, const WCHAR* szVerIndProgID, + const WCHAR* szProgID); + +#endif diff --git a/comm/mailnews/mapi/mapihook/src/components.conf b/comm/mailnews/mapi/mapihook/src/components.conf new file mode 100644 index 0000000000..d69a1df0d5 --- /dev/null +++ b/comm/mailnews/mapi/mapihook/src/components.conf @@ -0,0 +1,18 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, you can obtain one at http://mozilla.org/MPL/2.0/. + +Classes = [ + { + "cid": "{8967fed2-c8bb-11d5-a3e9-00b0d0f3baa7}", + "contract_ids": ["@mozilla.org/mapisupport;1"], + "type": "nsMapiSupport", + "headers": ["/comm/mailnews/mapi/mapihook/src/msgMapiSupport.h"], + } +] + +Categories = { + "app-startup": { + "Mapi Support": "@mozilla.org/mapisupport;1", + } +} diff --git a/comm/mailnews/mapi/mapihook/src/moz.build b/comm/mailnews/mapi/mapihook/src/moz.build new file mode 100644 index 0000000000..f2ef529008 --- /dev/null +++ b/comm/mailnews/mapi/mapihook/src/moz.build @@ -0,0 +1,33 @@ +# vim: set filetype=python: +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +SOURCES += [ + "!../build/msgMapi_i.c", + "msgMapiFactory.cpp", + "msgMapiHook.cpp", + "msgMapiImp.cpp", + "msgMapiMain.cpp", + "msgMapiSupport.cpp", + "Registry.cpp", +] + +LOCAL_INCLUDES += ["/comm/mailnews/mapi/include"] + +FINAL_LIBRARY = "xul" + +OS_LIBS += [ + "ole32", +] + +DEFINES["UNICODE"] = True +DEFINES["_UNICODE"] = True + +# clang-cl rightly complains about switch on nsresult. +if CONFIG["CC_TYPE"] == "clang-cl": + CXXFLAGS += ["-Wno-switch"] + +XPCOM_MANIFESTS += [ + "components.conf", +] diff --git a/comm/mailnews/mapi/mapihook/src/msgMapiFactory.cpp b/comm/mailnews/mapi/mapihook/src/msgMapiFactory.cpp new file mode 100644 index 0000000000..cb99fc04fd --- /dev/null +++ b/comm/mailnews/mapi/mapihook/src/msgMapiFactory.cpp @@ -0,0 +1,64 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#undef UNICODE +#undef _UNICODE + +#include "msgMapiFactory.h" +#include "msgMapiImp.h" +#include "msgMapi.h" + +CMapiFactory ::CMapiFactory() : m_cRef(1) {} + +CMapiFactory::~CMapiFactory() {} + +STDMETHODIMP CMapiFactory::QueryInterface(const IID& aIid, void** aPpv) { + if ((aIid == IID_IUnknown) || (aIid == IID_IClassFactory)) { + *aPpv = static_cast<IClassFactory*>(this); + } else { + *aPpv = nullptr; + return E_NOINTERFACE; + } + reinterpret_cast<IUnknown*>(*aPpv)->AddRef(); + return S_OK; +} + +STDMETHODIMP_(ULONG) CMapiFactory::AddRef() { return ++m_cRef; } + +STDMETHODIMP_(ULONG) CMapiFactory::Release() { + int32_t temp = --m_cRef; + if (m_cRef == 0) { + delete this; + return 0; + } + + return temp; +} + +STDMETHODIMP CMapiFactory::CreateInstance(IUnknown* aUnknownOuter, + const IID& aIid, void** aPpv) { + // Cannot aggregate. + + if (aUnknownOuter != nullptr) { + return CLASS_E_NOAGGREGATION; + } + + // Create component. + + CMapiImp* pImp = new CMapiImp(); + if (pImp == nullptr) { + return E_OUTOFMEMORY; + } + + // Get the requested interface. + HRESULT hr = pImp->QueryInterface(aIid, aPpv); + + // Release the IUnknown pointer. + // (If QueryInterface failed, component will delete itself.) + + pImp->Release(); + return hr; +} + +STDMETHODIMP CMapiFactory::LockServer(BOOL aLock) { return S_OK; } diff --git a/comm/mailnews/mapi/mapihook/src/msgMapiFactory.h b/comm/mailnews/mapi/mapihook/src/msgMapiFactory.h new file mode 100644 index 0000000000..3970b3fa99 --- /dev/null +++ b/comm/mailnews/mapi/mapihook/src/msgMapiFactory.h @@ -0,0 +1,35 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef MSG_MAPI_FACTORY_H +#define MSG_MAPI_FACTORY_H + +#include <windows.h> +#include <objbase.h> +#include "nspr.h" +#include "nsISupportsImpl.h" // ThreadSafeAutoRefCnt +#include <stdint.h> + +class CMapiFactory : public IClassFactory { + public: + // IUnknown + + STDMETHODIMP QueryInterface(REFIID aIid, void** aPpv); + STDMETHODIMP_(ULONG) AddRef(void); + STDMETHODIMP_(ULONG) Release(void); + + // IClassFactory + + STDMETHODIMP CreateInstance(LPUNKNOWN aUnkOuter, REFIID aIid, void** aPpv); + STDMETHODIMP LockServer(BOOL aLock); + + CMapiFactory(); + + private: + mozilla::ThreadSafeAutoRefCnt m_cRef; + + virtual ~CMapiFactory(); +}; + +#endif // MSG_MAPI_FACTORY_H diff --git a/comm/mailnews/mapi/mapihook/src/msgMapiHook.cpp b/comm/mailnews/mapi/mapihook/src/msgMapiHook.cpp new file mode 100644 index 0000000000..eb8c9b9fe8 --- /dev/null +++ b/comm/mailnews/mapi/mapihook/src/msgMapiHook.cpp @@ -0,0 +1,934 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#define MAPI_STARTUP_ARG "/MAPIStartUp" + +#include <mapidefs.h> +#include <mapi.h> +#include <direct.h> +#include "nsCOMPtr.h" +#include "nsISupports.h" +#include "nsIPromptService.h" +#include "nsIAppShellService.h" +#include "mozIDOMWindow.h" +#include "nsIMsgAccountManager.h" +#include "nsIStringBundle.h" +#include "nsIPrefService.h" +#include "nsIPrefBranch.h" +#include "nsString.h" +#include "nsUnicharUtils.h" +#include "nsNativeCharsetUtils.h" +#include "nsIMsgAttachment.h" +#include "nsIMsgCompFields.h" +#include "nsIMsgComposeParams.h" +#include "nsIMsgCompose.h" +#include "nsIMsgSend.h" +#include "nsIMsgComposeService.h" +#include "nsDirectoryServiceDefs.h" +#include "nsDirectoryServiceUtils.h" +#include "msgMapi.h" +#include "msgMapiHook.h" +#include "msgMapiSupport.h" +#include "msgMapiMain.h" +#include "nsThreadUtils.h" +#include "nsMsgUtils.h" +#include "nsNetUtil.h" +#include "mozilla/dom/Promise.h" +#include "mozilla/ReentrantMonitor.h" +#include "mozilla/Components.h" +#include "nsEmbedCID.h" +#include "mozilla/Logging.h" +#include "mozilla/SpinEventLoopUntil.h" + +using namespace mozilla::dom; + +extern mozilla::LazyLogModule MAPI; // defined in msgMapiImp.cpp + +class MAPISendListener : public nsIMsgSendListener, + public mozilla::ReentrantMonitor { + public: + MAPISendListener() + : ReentrantMonitor("MAPISendListener monitor"), m_done(false) {} + + // nsISupports interface + NS_DECL_THREADSAFE_ISUPPORTS + + /* void OnStartSending (in string aMsgID, in uint32_t aMsgSize); */ + NS_IMETHOD OnStartSending(const char* aMsgID, uint32_t aMsgSize) { + return NS_OK; + } + + /* void OnProgress (in string aMsgID, in uint32_t aProgress, in uint32_t + * aProgressMax); */ + NS_IMETHOD OnProgress(const char* aMsgID, uint32_t aProgress, + uint32_t aProgressMax) { + return NS_OK; + } + + /* void OnStatus (in string aMsgID, in wstring aMsg); */ + NS_IMETHOD OnStatus(const char* aMsgID, const char16_t* aMsg) { + return NS_OK; + } + + /* void OnStopSending (in string aMsgID, in nsresult aStatus, in wstring aMsg, + * in nsIFile returnFile); */ + NS_IMETHOD OnStopSending(const char* aMsgID, nsresult aStatus, + const char16_t* aMsg, nsIFile* returnFile) { + mozilla::ReentrantMonitorAutoEnter mon(*this); + m_done = true; + NotifyAll(); + return NS_OK; + } + + /* void OnTransportSecurityError( in string msgID, in nsresult status, in + * nsITransportSecurityInfo secInfo, in ACString location); */ + NS_IMETHOD OnTransportSecurityError(const char* msgID, nsresult status, + nsITransportSecurityInfo* secInfo, + nsACString const& location) { + return NS_OK; + } + + /* void OnSendNotPerformed */ + NS_IMETHOD OnSendNotPerformed(const char* aMsgID, nsresult aStatus) { + return OnStopSending(aMsgID, aStatus, nullptr, nullptr); + } + + /* void OnGetDraftFolderURI (); */ + NS_IMETHOD OnGetDraftFolderURI(const char* aMsgID, + const nsACString& aFolderURI) { + return NS_OK; + } + + bool IsDone() { return m_done; } + + private: + bool m_done; + virtual ~MAPISendListener() {} +}; + +/// Helper for setting up the hidden window for blind MAPI. +class MOZ_STACK_CLASS AutoHiddenWindow { + public: + explicit AutoHiddenWindow(nsresult& rv) + : mAppService(do_GetService("@mozilla.org/appshell/appShellService;1")) { + mCreatedHiddenWindow = false; + rv = mAppService->GetHiddenDOMWindow(getter_AddRefs(mHiddenWindow)); + if (rv == NS_ERROR_FAILURE) { + // Try to get a hidden window. If it doesn't exist, create a hidden + // window for us to use. + rv = mAppService->CreateHiddenWindow(); + NS_ENSURE_SUCCESS_VOID(rv); + mCreatedHiddenWindow = true; + rv = mAppService->GetHiddenDOMWindow(getter_AddRefs(mHiddenWindow)); + } + NS_ENSURE_SUCCESS_VOID(rv); + } + ~AutoHiddenWindow() { + if (mCreatedHiddenWindow) mAppService->DestroyHiddenWindow(); + } + mozIDOMWindowProxy* operator->() { return mHiddenWindow; } + operator mozIDOMWindowProxy*() { return mHiddenWindow; } + + private: + nsCOMPtr<nsIAppShellService> mAppService; + nsCOMPtr<mozIDOMWindowProxy> mHiddenWindow; + bool mCreatedHiddenWindow; +}; + +NS_IMPL_ISUPPORTS(MAPISendListener, nsIMsgSendListener) + +bool nsMapiHook::isMapiService = false; + +void nsMapiHook::CleanUp() { + // This routine will be fully implemented in future + // to cleanup mapi related stuff inside mozilla code. +} + +bool nsMapiHook::DisplayLoginDialog(bool aLogin, char16_t** aUsername, + char16_t** aPassword) { + nsresult rv; + bool btnResult = false; + + nsCOMPtr<nsIPromptService> dlgService( + do_GetService(NS_PROMPTSERVICE_CONTRACTID, &rv)); + if (NS_SUCCEEDED(rv) && dlgService) { + nsCOMPtr<nsIStringBundleService> bundleService = + mozilla::components::StringBundle::Service(); + if (!bundleService) return false; + + nsCOMPtr<nsIStringBundle> bundle; + rv = bundleService->CreateBundle(MAPI_PROPERTIES_CHROME, + getter_AddRefs(bundle)); + if (NS_FAILED(rv) || !bundle) return false; + + nsCOMPtr<nsIStringBundle> brandBundle; + rv = + bundleService->CreateBundle("chrome://branding/locale/brand.properties", + getter_AddRefs(brandBundle)); + if (NS_FAILED(rv)) return false; + + nsString brandName; + rv = brandBundle->GetStringFromName("brandFullName", brandName); + if (NS_FAILED(rv)) return false; + + nsString loginTitle; + AutoTArray<nsString, 1> brandStrings = {brandName}; + rv = bundle->FormatStringFromName("loginTitle", brandStrings, loginTitle); + if (NS_FAILED(rv)) return false; + + if (aLogin) { + nsString loginText; + rv = bundle->GetStringFromName("loginTextwithName", loginText); + if (NS_FAILED(rv) || loginText.IsEmpty()) return false; + + rv = dlgService->PromptUsernameAndPassword(nullptr, loginTitle.get(), + loginText.get(), aUsername, + aPassword, &btnResult); + } else { + // nsString loginString; + nsString loginText; + AutoTArray<nsString, 1> userNameStrings = {nsDependentString(*aUsername)}; + rv = + bundle->FormatStringFromName("loginText", userNameStrings, loginText); + if (NS_FAILED(rv)) return false; + + rv = dlgService->PromptPassword(nullptr, loginTitle.get(), + loginText.get(), aPassword, &btnResult); + } + } + + return btnResult; +} + +bool nsMapiHook::VerifyUserName(const nsCString& aUsername, nsCString& aIdKey) { + nsresult rv; + + if (aUsername.IsEmpty()) return false; + + nsCOMPtr<nsIMsgAccountManager> accountManager( + do_GetService("@mozilla.org/messenger/account-manager;1", &rv)); + if (NS_FAILED(rv)) return false; + nsTArray<RefPtr<nsIMsgIdentity>> identities; + rv = accountManager->GetAllIdentities(identities); + if (NS_FAILED(rv)) return false; + + for (auto thisIdentity : identities) { + if (thisIdentity) { + nsCString email; + rv = thisIdentity->GetEmail(email); + if (NS_FAILED(rv)) continue; + + // get the username from the email and compare with the username + int32_t index = email.FindChar('@'); + if (index != -1) email.SetLength(index); + + if (aUsername.Equals(email)) + return NS_SUCCEEDED(thisIdentity->GetKey(aIdKey)); + } + } + + return false; +} + +bool nsMapiHook::IsBlindSendAllowed() { + bool enabled = false; + bool warn = true; + nsCOMPtr<nsIPrefBranch> prefBranch = do_GetService(NS_PREFSERVICE_CONTRACTID); + if (prefBranch) { + prefBranch->GetBoolPref(PREF_MAPI_WARN_PRIOR_TO_BLIND_SEND, &warn); + prefBranch->GetBoolPref(PREF_MAPI_BLIND_SEND_ENABLED, &enabled); + } + if (!enabled) return false; + + if (!warn) return true; // Everything is okay. + + nsresult rv; + nsCOMPtr<nsIStringBundleService> bundleService = + mozilla::components::StringBundle::Service(); + if (!bundleService) return false; + + nsCOMPtr<nsIStringBundle> bundle; + rv = bundleService->CreateBundle(MAPI_PROPERTIES_CHROME, + getter_AddRefs(bundle)); + if (NS_FAILED(rv) || !bundle) return false; + + nsString warningMsg; + rv = bundle->GetStringFromName("mapiBlindSendWarning", warningMsg); + if (NS_FAILED(rv)) return false; + + nsString dontShowAgainMessage; + rv = bundle->GetStringFromName("mapiBlindSendDontShowAgain", + dontShowAgainMessage); + if (NS_FAILED(rv)) return false; + + nsCOMPtr<nsIPromptService> dlgService( + do_GetService(NS_PROMPTSERVICE_CONTRACTID, &rv)); + if (NS_FAILED(rv) || !dlgService) return false; + + bool continueToWarn = true; + bool okayToContinue = false; + dlgService->ConfirmCheck(nullptr, nullptr, warningMsg.get(), + dontShowAgainMessage.get(), &continueToWarn, + &okayToContinue); + + if (!continueToWarn && okayToContinue && prefBranch) + prefBranch->SetBoolPref(PREF_MAPI_WARN_PRIOR_TO_BLIND_SEND, false); + + return okayToContinue; +} + +// this is used for Send without UI +nsresult nsMapiHook::BlindSendMail(unsigned long aSession, + nsIMsgCompFields* aCompFields) { + nsresult rv = NS_OK; + + if (!IsBlindSendAllowed()) return NS_ERROR_FAILURE; + + // Get a hidden window to use for compose. + AutoHiddenWindow hiddenWindow(rv); + NS_ENSURE_SUCCESS(rv, rv); + + // smtp password and Logged in used IdKey from MapiConfig (session obj) + nsMAPIConfiguration* pMapiConfig = + nsMAPIConfiguration::GetMAPIConfiguration(); + if (!pMapiConfig) return NS_ERROR_FAILURE; // get the singleton obj + char16_t* password = pMapiConfig->GetPassword(aSession); + + // Id key + nsCString MsgIdKey; + pMapiConfig->GetIdKey(aSession, MsgIdKey); + + // get the MsgIdentity for the above key using AccountManager + nsCOMPtr<nsIMsgAccountManager> accountManager = + do_GetService("@mozilla.org/messenger/account-manager;1"); + if (NS_FAILED(rv) || (!accountManager)) return rv; + + nsCOMPtr<nsIMsgIdentity> pMsgId; + rv = accountManager->GetIdentity(MsgIdKey, getter_AddRefs(pMsgId)); + if (NS_FAILED(rv)) return rv; + + // create a send listener to get back the send status + RefPtr<MAPISendListener> sendListener = new MAPISendListener; + + // create the compose params object + nsCOMPtr<nsIMsgComposeParams> pMsgComposeParams( + do_CreateInstance("@mozilla.org/messengercompose/composeparams;1", &rv)); + if (NS_FAILED(rv) || (!pMsgComposeParams)) return rv; + + // populate the compose params + bool forcePlainText; + aCompFields->GetForcePlainText(&forcePlainText); + pMsgComposeParams->SetType(nsIMsgCompType::New); + pMsgComposeParams->SetFormat(forcePlainText ? nsIMsgCompFormat::PlainText + : nsIMsgCompFormat::HTML); + pMsgComposeParams->SetIdentity(pMsgId); + pMsgComposeParams->SetComposeFields(aCompFields); + pMsgComposeParams->SetSendListener(sendListener); + if (password) pMsgComposeParams->SetSmtpPassword(nsDependentString(password)); + + // create the nsIMsgCompose object to send the object + nsCOMPtr<nsIMsgCompose> pMsgCompose( + do_CreateInstance("@mozilla.org/messengercompose/compose;1", &rv)); + NS_ENSURE_SUCCESS(rv, rv); + rv = pMsgCompose->Initialize(pMsgComposeParams, hiddenWindow, nullptr); + NS_ENSURE_SUCCESS(rv, rv); + + // If we're in offline mode, we'll need to queue it for later. + RefPtr<Promise> promise; + rv = pMsgCompose->SendMsg(WeAreOffline() ? nsIMsgSend::nsMsgQueueForLater + : nsIMsgSend::nsMsgDeliverNow, + pMsgId, nullptr, nullptr, nullptr, + getter_AddRefs(promise)); + NS_ENSURE_SUCCESS(rv, rv); + + // When offline, the message is saved to Outbox and OnStopSending won't be + // called. + if (WeAreOffline()) return NS_OK; + + // Wait for OnStopSending to be called. + mozilla::SpinEventLoopUntil("nsIMsgCompose::SendMsg is async"_ns, + [=]() { return sendListener->IsDone(); }); + + return rv; +} + +nsresult nsMapiHook::HandleAttachments(nsIMsgCompFields* aCompFields, + int32_t aFileCount, + lpnsMapiFileDesc aFiles, bool aIsUTF8) { + nsresult rv = NS_OK; + // Do nothing if there are no files to process. + if (!aFiles || aFileCount <= 0) return NS_OK; + + nsAutoCString Attachments; + nsAutoCString TempFiles; + + nsCOMPtr<nsIFile> pFile = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv); + if (NS_FAILED(rv) || (!pFile)) return rv; + nsCOMPtr<nsIFile> pTempDir = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv); + if (NS_FAILED(rv) || (!pTempDir)) return rv; + + for (int i = 0; i < aFileCount; i++) { + if (aFiles[i].lpszPathName) { + // check if attachment exists + if (!aIsUTF8) + pFile->InitWithNativePath(nsDependentCString(aFiles[i].lpszPathName)); + else + pFile->InitWithPath(NS_ConvertUTF8toUTF16(aFiles[i].lpszPathName)); + + bool bExist; + rv = pFile->Exists(&bExist); + MOZ_LOG( + MAPI, mozilla::LogLevel::Debug, + ("nsMapiHook::HandleAttachments: filename: %s path: %s exists = %s\n", + (const char*)aFiles[i].lpszFileName, + (const char*)aFiles[i].lpszPathName, bExist ? "true" : "false")); + if (NS_FAILED(rv) || (!bExist)) return NS_ERROR_FILE_NOT_FOUND; + + // Temp Directory + nsCOMPtr<nsIFile> pTempDir; + NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(pTempDir)); + + // create a new sub directory called moz_mapi underneath the temp + // directory + pTempDir->AppendRelativePath(u"moz_mapi"_ns); + pTempDir->Exists(&bExist); + if (!bExist) { + rv = pTempDir->Create(nsIFile::DIRECTORY_TYPE, 777); + if (NS_FAILED(rv)) return rv; + } + + // rename or copy the existing temp file with the real file name + + nsAutoString leafName; + // convert to Unicode using Platform charset + // leafName already contains a unicode leafName from lpszPathName. If we + // were given a value for lpszFileName, use it. Otherwise stick with + // leafName + if (aFiles[i].lpszFileName) { + nsAutoString wholeFileName; + if (!aIsUTF8) + NS_CopyNativeToUnicode(nsDependentCString(aFiles[i].lpszFileName), + wholeFileName); + else + wholeFileName.Append(NS_ConvertUTF8toUTF16(aFiles[i].lpszFileName)); + // need to find the last '\' and find the leafname from that. + int32_t lastSlash = wholeFileName.RFindChar(char16_t('\\')); + if (lastSlash != kNotFound) + leafName.Assign(Substring(wholeFileName, lastSlash + 1)); + else + leafName.Assign(wholeFileName); + } else + pFile->GetLeafName(leafName); + + nsCOMPtr<nsIMsgAttachment> attachment = + do_CreateInstance("@mozilla.org/messengercompose/attachment;1", &rv); + NS_ENSURE_SUCCESS(rv, rv); + attachment->SetName(leafName); + + nsCOMPtr<nsIFile> pTempFile; + rv = pTempDir->Clone(getter_AddRefs(pTempFile)); + if (NS_FAILED(rv) || !pTempFile) return rv; + + pTempFile->Append(leafName); + pTempFile->Exists(&bExist); + if (bExist) { + rv = pTempFile->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 0777); + NS_ENSURE_SUCCESS(rv, rv); + pTempFile->Remove(false); // remove so we can copy over it. + pTempFile->GetLeafName(leafName); + } + // copy the file to its new location and file name + pFile->CopyTo(pTempDir, leafName); + // point pFile to the new location of the attachment + pFile->InitWithFile(pTempDir); + pFile->Append(leafName); + + // create MsgCompose attachment object + attachment->SetTemporary( + true); // this one is a temp file so set the flag for MsgCompose + + // now set the attachment object + nsAutoCString pURL; + NS_GetURLSpecFromFile(pFile, pURL); + attachment->SetUrl(pURL); + + // set the file size + int64_t fileSize; + pFile->GetFileSize(&fileSize); + attachment->SetSize(fileSize); + + // add the attachment + rv = aCompFields->AddAttachment(attachment); + if (NS_FAILED(rv)) + MOZ_LOG( + MAPI, mozilla::LogLevel::Debug, + ("nsMapiHook::HandleAttachments: AddAttachment rv = %x\n", rv)); + } + } + return rv; +} + +nsresult nsMapiHook::HandleAttachmentsW(nsIMsgCompFields* aCompFields, + int32_t aFileCount, + lpnsMapiFileDescW aFiles) { + nsresult rv = NS_OK; + // Do nothing if there are no files to process. + if (!aFiles || aFileCount <= 0) return NS_OK; + + nsAutoCString Attachments; + nsAutoCString TempFiles; + + nsCOMPtr<nsIFile> pFile = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv); + if (NS_FAILED(rv) || (!pFile)) return rv; + nsCOMPtr<nsIFile> pTempDir = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv); + if (NS_FAILED(rv) || (!pTempDir)) return rv; + + for (int i = 0; i < aFileCount; i++) { + if (aFiles[i].lpszPathName) { + // Check if attachment exists. + pFile->InitWithPath(nsDependentString(aFiles[i].lpszPathName)); + + bool bExist; + rv = pFile->Exists(&bExist); + MOZ_LOG(MAPI, mozilla::LogLevel::Debug, + ("nsMapiHook::HandleAttachmentsW: filename: %s path: %s exists = " + "%s \n", + NS_ConvertUTF16toUTF8(aFiles[i].lpszFileName).get(), + NS_ConvertUTF16toUTF8(aFiles[i].lpszPathName).get(), + bExist ? "true" : "false")); + if (NS_FAILED(rv) || (!bExist)) return NS_ERROR_FILE_NOT_FOUND; + + // Temp Directory. + nsCOMPtr<nsIFile> pTempDir; + NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(pTempDir)); + + // Create a new sub directory called moz_mapi underneath the temp + // directory. + pTempDir->AppendRelativePath(u"moz_mapi"_ns); + pTempDir->Exists(&bExist); + if (!bExist) { + rv = pTempDir->Create(nsIFile::DIRECTORY_TYPE, 777); + if (NS_FAILED(rv)) return rv; + } + + // Rename or copy the existing temp file with the real file name. + + nsAutoString leafName; + // leafName already contains a unicode leafName from lpszPathName. If we + // were given a value for lpszFileName, use it. Otherwise stick with + // leafName. + if (aFiles[i].lpszFileName) { + nsAutoString wholeFileName(aFiles[i].lpszFileName); + // Need to find the last '\' and find the leafname from that. + int32_t lastSlash = wholeFileName.RFindChar(char16_t('\\')); + if (lastSlash != kNotFound) + leafName.Assign(Substring(wholeFileName, lastSlash + 1)); + else + leafName.Assign(wholeFileName); + } else + pFile->GetLeafName(leafName); + + nsCOMPtr<nsIMsgAttachment> attachment = + do_CreateInstance("@mozilla.org/messengercompose/attachment;1", &rv); + NS_ENSURE_SUCCESS(rv, rv); + attachment->SetName(leafName); + + nsCOMPtr<nsIFile> pTempFile; + rv = pTempDir->Clone(getter_AddRefs(pTempFile)); + if (NS_FAILED(rv) || !pTempFile) return rv; + + pTempFile->Append(leafName); + pTempFile->Exists(&bExist); + if (bExist) { + rv = pTempFile->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 0777); + NS_ENSURE_SUCCESS(rv, rv); + pTempFile->Remove(false); // remove so we can copy over it. + pTempFile->GetLeafName(leafName); + } + // Copy the file to its new location and file name. + pFile->CopyTo(pTempDir, leafName); + // Point pFile to the new location of the attachment. + pFile->InitWithFile(pTempDir); + pFile->Append(leafName); + + // Create MsgCompose attachment object. + attachment->SetTemporary( + true); // this one is a temp file so set the flag for MsgCompose + + // Now set the attachment object. + nsAutoCString pURL; + NS_GetURLSpecFromFile(pFile, pURL); + attachment->SetUrl(pURL); + + // Set the file size. + int64_t fileSize; + pFile->GetFileSize(&fileSize); + attachment->SetSize(fileSize); + + // Add the attachment. + rv = aCompFields->AddAttachment(attachment); + if (NS_FAILED(rv)) + MOZ_LOG( + MAPI, mozilla::LogLevel::Debug, + ("nsMapiHook::HandleAttachmentsW: AddAttachment rv = %x\n", rv)); + } + } + return rv; +} + +// this is used to convert non Unicode data and then populate comp fields +nsresult nsMapiHook::PopulateCompFieldsWithConversion( + lpnsMapiMessage aMessage, nsIMsgCompFields* aCompFields) { + bool isUTF8 = aMessage->ulReserved == CP_UTF8; + + if (aMessage->lpOriginator && aMessage->lpOriginator->lpszAddress) { + nsAutoString From; + if (!isUTF8) + From.Append(NS_ConvertASCIItoUTF16(aMessage->lpOriginator->lpszAddress)); + else + From.Append(NS_ConvertUTF8toUTF16(aMessage->lpOriginator->lpszAddress)); + aCompFields->SetFrom(From); + } + + nsAutoString To; + nsAutoString Cc; + nsAutoString Bcc; + constexpr auto Comma = u","_ns; + if (aMessage->lpRecips) { + for (int i = 0; i < (int)aMessage->nRecipCount; i++) { + if (aMessage->lpRecips[i].lpszAddress || aMessage->lpRecips[i].lpszName) { + const char* addressWithoutType = (aMessage->lpRecips[i].lpszAddress) + ? aMessage->lpRecips[i].lpszAddress + : aMessage->lpRecips[i].lpszName; + if (!PL_strncasecmp(addressWithoutType, "SMTP:", 5)) + addressWithoutType += 5; + + switch (aMessage->lpRecips[i].ulRecipClass) { + case MAPI_TO: + if (!To.IsEmpty()) To += Comma; + if (!isUTF8) + To.Append(NS_ConvertASCIItoUTF16(addressWithoutType)); + else + To.Append(NS_ConvertUTF8toUTF16(addressWithoutType)); + break; + + case MAPI_CC: + if (!Cc.IsEmpty()) Cc += Comma; + if (!isUTF8) + Cc.Append(NS_ConvertASCIItoUTF16(addressWithoutType)); + else + Cc.Append(NS_ConvertUTF8toUTF16(addressWithoutType)); + break; + + case MAPI_BCC: + if (!Bcc.IsEmpty()) Bcc += Comma; + if (!isUTF8) + Bcc.Append(NS_ConvertASCIItoUTF16(addressWithoutType)); + else + Bcc.Append(NS_ConvertUTF8toUTF16(addressWithoutType)); + break; + } + } + } + } + + // set To, Cc, Bcc + aCompFields->SetTo(To); + aCompFields->SetCc(Cc); + aCompFields->SetBcc(Bcc); + + MOZ_LOG(MAPI, mozilla::LogLevel::Debug, + ("to: %s cc: %s bcc: %s \n", NS_ConvertUTF16toUTF8(To).get(), + NS_ConvertUTF16toUTF8(Cc).get(), NS_ConvertUTF16toUTF8(Bcc).get())); + + // set subject + nsresult rv = NS_OK; + if (aMessage->lpszSubject) { + nsAutoString Subject; + if (!isUTF8) + rv = NS_CopyNativeToUnicode(nsDependentCString(aMessage->lpszSubject), + Subject); + else + Subject.Append(NS_ConvertUTF8toUTF16(aMessage->lpszSubject)); + if (NS_FAILED(rv)) return rv; + aCompFields->SetSubject(Subject); + } + + // handle attachments as File URL + rv = HandleAttachments(aCompFields, aMessage->nFileCount, aMessage->lpFiles, + isUTF8); + if (NS_FAILED(rv)) return rv; + + // set body + if (aMessage->lpszNoteText) { + nsAutoString Body; + if (!isUTF8) + rv = NS_CopyNativeToUnicode(nsDependentCString(aMessage->lpszNoteText), + Body); + else + Body.Append(NS_ConvertUTF8toUTF16(aMessage->lpszNoteText)); + if (NS_FAILED(rv)) return rv; + if (Body.IsEmpty() || Body.Last() != '\n') Body.AppendLiteral(CRLF); + + // This is needed when Simple MAPI is used without a compose window. + // See bug 1366196. + if (Body.Find(u"<html>") == kNotFound) aCompFields->SetForcePlainText(true); + + rv = aCompFields->SetBody(Body); + } else { + // No body: Assume that we can do plaintext. This will trigger the default + // compose format in ShowComposerWindow(). + aCompFields->SetForcePlainText(true); + } + +#ifdef RAJIV_DEBUG + // testing what all was set in CompFields + printf("To : %S \n", To.get()); + printf("CC : %S \n", Cc.get()); + printf("BCC : %S \n", Bcc.get()); +#endif + + return rv; +} + +// This is used to populate comp fields with UTF-16 data from MAPISendMailW +// function. +nsresult nsMapiHook::PopulateCompFieldsW(lpnsMapiMessageW aMessage, + nsIMsgCompFields* aCompFields) { + if (aMessage->lpOriginator && aMessage->lpOriginator->lpszAddress) + aCompFields->SetFrom( + nsDependentString(aMessage->lpOriginator->lpszAddress)); + + nsAutoString To; + nsAutoString Cc; + nsAutoString Bcc; + + constexpr auto Comma = u","_ns; + + if (aMessage->lpRecips) { + for (int i = 0; i < (int)aMessage->nRecipCount; i++) { + if (aMessage->lpRecips[i].lpszAddress || aMessage->lpRecips[i].lpszName) { + const wchar_t* addressWithoutType = + (aMessage->lpRecips[i].lpszAddress) + ? aMessage->lpRecips[i].lpszAddress + : aMessage->lpRecips[i].lpszName; + if (_wcsnicmp(addressWithoutType, L"SMTP:", 5) == 0) + addressWithoutType += 5; + switch (aMessage->lpRecips[i].ulRecipClass) { + case MAPI_TO: + if (!To.IsEmpty()) To += Comma; + To.Append(nsDependentString(addressWithoutType)); + break; + + case MAPI_CC: + if (!Cc.IsEmpty()) Cc += Comma; + Cc.Append(nsDependentString(addressWithoutType)); + break; + + case MAPI_BCC: + if (!Bcc.IsEmpty()) Bcc += Comma; + Bcc.Append(nsDependentString(addressWithoutType)); + break; + } + } + } + } + + MOZ_LOG(MAPI, mozilla::LogLevel::Debug, + ("to: %s cc: %s bcc: %s \n", NS_ConvertUTF16toUTF8(To).get(), + NS_ConvertUTF16toUTF8(Cc).get(), NS_ConvertUTF16toUTF8(Bcc).get())); + // set To, Cc, Bcc + aCompFields->SetTo(To); + aCompFields->SetCc(Cc); + aCompFields->SetBcc(Bcc); + + // Set subject. + if (aMessage->lpszSubject) + aCompFields->SetSubject(nsDependentString(aMessage->lpszSubject)); + + // handle attachments as File URL + nsresult rv = + HandleAttachmentsW(aCompFields, aMessage->nFileCount, aMessage->lpFiles); + if (NS_FAILED(rv)) return rv; + + // Set body. + if (aMessage->lpszNoteText) { + nsString Body(aMessage->lpszNoteText); + if (Body.IsEmpty() || Body.Last() != '\n') Body.AppendLiteral(CRLF); + + // This is needed when Simple MAPI is used without a compose window. + // See bug 1366196. + if (Body.Find(u"<html>") == kNotFound) aCompFields->SetForcePlainText(true); + + rv = aCompFields->SetBody(Body); + } else { + // No body: Assume that we can do plaintext. This will trigger the default + // compose format in ShowComposerWindow(). + aCompFields->SetForcePlainText(true); + } + return rv; +} + +// this is used to populate the docs as attachments in the Comp fields for Send +// Documents +nsresult nsMapiHook::PopulateCompFieldsForSendDocs( + nsIMsgCompFields* aCompFields, ULONG aFlags, LPSTR aDelimChar, + LPSTR aFilePaths) { + nsAutoCString strDelimChars; + nsAutoCString strFilePaths; + nsresult rv = NS_OK; + bool bExist; + + if (aDelimChar) strDelimChars.Assign(aDelimChar); + if (aFilePaths) strFilePaths.Assign(aFilePaths); + + // check for comma in filename + if (strDelimChars.FindChar(',') == + kNotFound) // if comma is not in the delimiter specified by user + { + if (strFilePaths.FindChar(',') != + kNotFound) // if comma found in filenames return error + return NS_ERROR_FILE_INVALID_PATH; + } + + nsCString Attachments; + + // only 1 file is to be sent, no delim specified + if (strDelimChars.IsEmpty()) strDelimChars.Assign(';'); + + int32_t offset = 0; + int32_t FilePathsLen = strFilePaths.Length(); + if (FilePathsLen) { + nsAutoString Subject; + + // multiple files to be sent, delim specified + nsCOMPtr<nsIFile> pFile = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv); + if (NS_FAILED(rv) || (!pFile)) return rv; + + char* newFilePaths = (char*)strFilePaths.get(); + while (offset != kNotFound) { + // Temp Directory + nsCOMPtr<nsIFile> pTempDir; + NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(pTempDir)); + + // if not already existing, create another temp dir for mapi within Win + // temp dir this is windows only so we can do "\\" + pTempDir->AppendRelativePath(u"moz_mapi"_ns); + pTempDir->Exists(&bExist); + if (!bExist) { + rv = pTempDir->Create(nsIFile::DIRECTORY_TYPE, 777); + if (NS_FAILED(rv)) return rv; + } + + nsAutoCString RemainingPaths; + RemainingPaths.Assign(newFilePaths); + offset = RemainingPaths.Find(strDelimChars); + if (offset != kNotFound) { + RemainingPaths.SetLength(offset); + if ((offset + (int32_t)strDelimChars.Length()) < FilePathsLen) + newFilePaths += offset + strDelimChars.Length(); + else + offset = kNotFound; + FilePathsLen -= offset + strDelimChars.Length(); + } + + if (RemainingPaths[1] != ':' && RemainingPaths[1] != '\\') { + char cwd[MAX_PATH]; + if (_getdcwd(_getdrive(), cwd, MAX_PATH)) { + nsAutoCString cwdStr; + cwdStr.Assign(cwd); + cwdStr.Append('\\'); + RemainingPaths.Insert(cwdStr, 0); + } + } + + pFile->InitWithNativePath(RemainingPaths); + + rv = pFile->Exists(&bExist); + if (NS_FAILED(rv) || (!bExist)) return NS_ERROR_FILE_NOT_FOUND; + + // filename of the file attachment + nsAutoString leafName; + pFile->GetLeafName(leafName); + if (NS_FAILED(rv) || leafName.IsEmpty()) return rv; + + if (!Subject.IsEmpty()) Subject.AppendLiteral(", "); + Subject += leafName; + + // create MsgCompose attachment object + nsCOMPtr<nsIMsgAttachment> attachment = + do_CreateInstance("@mozilla.org/messengercompose/attachment;1", &rv); + NS_ENSURE_SUCCESS(rv, rv); + + nsDependentString fileNameNative(leafName.get()); + rv = pFile->CopyTo(pTempDir, fileNameNative); + if (NS_FAILED(rv)) return rv; + + // now turn pTempDir into a full file path to the temp file + pTempDir->Append(fileNameNative); + + // this one is a temp file so set the flag for MsgCompose + attachment->SetTemporary(true); + + // now set the attachment object + nsAutoCString pURL; + NS_GetURLSpecFromFile(pTempDir, pURL); + attachment->SetUrl(pURL); + + // set the file size + int64_t fileSize; + pFile->GetFileSize(&fileSize); + attachment->SetSize(fileSize); + + // add the attachment + rv = aCompFields->AddAttachment(attachment); + if (NS_FAILED(rv)) return rv; + } + + rv = aCompFields->SetBody(Subject); + } + + return rv; +} + +// this used for Send with UI +nsresult nsMapiHook::ShowComposerWindow(unsigned long aSession, + nsIMsgCompFields* aCompFields) { + nsresult rv = NS_OK; + + // create a send listener to get back the send status + RefPtr<MAPISendListener> sendListener = new MAPISendListener; + + // create the compose params object + nsCOMPtr<nsIMsgComposeParams> pMsgComposeParams( + do_CreateInstance("@mozilla.org/messengercompose/composeparams;1", &rv)); + if (NS_FAILED(rv) || (!pMsgComposeParams)) return rv; + + // If we found HTML, compose in HTML. + bool forcePlainText; + aCompFields->GetForcePlainText(&forcePlainText); + pMsgComposeParams->SetFormat(forcePlainText ? nsIMsgCompFormat::Default + : nsIMsgCompFormat::HTML); + + // populate the compose params + pMsgComposeParams->SetType(nsIMsgCompType::New); + + // Never force to plain text, the default format will take care of that. + // Undo the forcing that happened in + // PopulateCompFields/PopulateCompFieldsWithConversion. See bug 1095629 and + // bug 1366196. + aCompFields->SetForcePlainText(false); + pMsgComposeParams->SetComposeFields(aCompFields); + pMsgComposeParams->SetSendListener(sendListener); + + /** get the nsIMsgComposeService object to open the compose window **/ + nsCOMPtr<nsIMsgComposeService> compService = + do_GetService("@mozilla.org/messengercompose;1"); + if (NS_FAILED(rv) || (!compService)) return rv; + + rv = compService->OpenComposeWindowWithParams(nullptr, pMsgComposeParams); + if (NS_FAILED(rv)) return rv; + + return rv; +} diff --git a/comm/mailnews/mapi/mapihook/src/msgMapiHook.h b/comm/mailnews/mapi/mapihook/src/msgMapiHook.h new file mode 100644 index 0000000000..aa6ad1d66f --- /dev/null +++ b/comm/mailnews/mapi/mapihook/src/msgMapiHook.h @@ -0,0 +1,39 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef MSG_MAPI_HOOK_H_ +#define MSG_MAPI_HOOK_H_ + +#include "prtypes.h" + +class nsMapiHook { + public: + static bool DisplayLoginDialog(bool aLogin, char16_t** aUsername, + char16_t** aPassword); + static bool VerifyUserName(const nsCString& aUsername, nsCString& aIdKey); + + static bool IsBlindSendAllowed(); + static nsresult BlindSendMail(unsigned long aSession, + nsIMsgCompFields* aCompFields); + static nsresult ShowComposerWindow(unsigned long aSession, + nsIMsgCompFields* aCompFields); + static nsresult PopulateCompFieldsWithConversion( + lpnsMapiMessage aMessage, nsIMsgCompFields* aCompFields); + static nsresult PopulateCompFieldsW(lpnsMapiMessageW aMessage, + nsIMsgCompFields* aCompFields); + static nsresult PopulateCompFieldsForSendDocs(nsIMsgCompFields* aCompFields, + ULONG aFlags, LPSTR aDelimChar, + LPSTR aFilePaths); + static nsresult HandleAttachments(nsIMsgCompFields* aCompFields, + int32_t aFileCount, lpnsMapiFileDesc aFiles, + bool aIsUTF8); + static nsresult HandleAttachmentsW(nsIMsgCompFields* aCompFields, + int32_t aFileCount, + lpnsMapiFileDescW aFiles); + static void CleanUp(); + + static bool isMapiService; +}; + +#endif // MSG_MAPI_HOOK_H_ diff --git a/comm/mailnews/mapi/mapihook/src/msgMapiImp.cpp b/comm/mailnews/mapi/mapihook/src/msgMapiImp.cpp new file mode 100644 index 0000000000..62abed1f7b --- /dev/null +++ b/comm/mailnews/mapi/mapihook/src/msgMapiImp.cpp @@ -0,0 +1,801 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include <mapidefs.h> +#include <mapi.h> +#include <winstring.h> +#include "msgMapiImp.h" +#include "msgMapiFactory.h" +#include "msgMapiMain.h" + +#include "nsIMsgCompFields.h" +#include "msgMapiHook.h" +#include "nsString.h" +#include "nsCOMPtr.h" +#include "nsISupports.h" +#include "nsIMsgDatabase.h" +#include "nsMsgFolderFlags.h" +#include "nsIMsgHdr.h" +#include "MailNewsTypes.h" +#include "nsIMsgAccountManager.h" +#include "nsIMsgFolder.h" +#include "nsIMsgImapMailFolder.h" +#include <time.h> +#include "nsIInputStream.h" +#include "nsILineInputStream.h" +#include "nsISeekableStream.h" +#include "nsIFile.h" +#include "nsIFileStreams.h" +#include "nsNetCID.h" +#include "nsMsgMessageFlags.h" +#include "mozilla/mailnews/MimeHeaderParser.h" +#include "mozilla/Logging.h" + +using namespace mozilla::mailnews; + +mozilla::LazyLogModule MAPI("MAPI"); + +CMapiImp::CMapiImp() : m_cRef(1) { m_Lock = PR_NewLock(); } + +CMapiImp::~CMapiImp() { + if (m_Lock) PR_DestroyLock(m_Lock); +} + +STDMETHODIMP CMapiImp::QueryInterface(const IID& aIid, void** aPpv) { + if (aIid == IID_IUnknown) { + *aPpv = static_cast<nsIMapi*>(this); + } else if (aIid == IID_nsIMapi) { + *aPpv = static_cast<nsIMapi*>(this); + } else { + *aPpv = nullptr; + return E_NOINTERFACE; + } + + reinterpret_cast<IUnknown*>(*aPpv)->AddRef(); + return S_OK; +} + +STDMETHODIMP_(ULONG) CMapiImp::AddRef() { return ++m_cRef; } + +STDMETHODIMP_(ULONG) CMapiImp::Release() { + int32_t temp = --m_cRef; + if (m_cRef == 0) { + delete this; + return 0; + } + + return temp; +} + +STDMETHODIMP CMapiImp::IsValid() { return S_OK; } + +STDMETHODIMP CMapiImp::IsValidSession(unsigned long aSession) { + nsMAPIConfiguration* pConfig = nsMAPIConfiguration::GetMAPIConfiguration(); + if (pConfig && pConfig->IsSessionValid(aSession)) return S_OK; + + return E_FAIL; +} + +STDMETHODIMP CMapiImp::Initialize() { + HRESULT hr = E_FAIL; + + if (!m_Lock) return E_FAIL; + + PR_Lock(m_Lock); + + // Initialize MAPI Configuration + + nsMAPIConfiguration* pConfig = nsMAPIConfiguration::GetMAPIConfiguration(); + if (pConfig != nullptr) hr = S_OK; + + PR_Unlock(m_Lock); + + return hr; +} + +STDMETHODIMP CMapiImp::Login(unsigned long aUIArg, LPSTR aLogin, + LPSTR aPassWord, unsigned long aFlags, + unsigned long* aSessionId) { + HRESULT hr = E_FAIL; + bool bNewSession = false; + nsCString id_key; + + MOZ_LOG(MAPI, mozilla::LogLevel::Debug, + ("CMapiImp::Login using flags %lu", aFlags)); + if (aFlags & MAPI_NEW_SESSION) bNewSession = true; + + // Check For Profile Name + if (aLogin != nullptr && aLogin[0] != '\0') { + if (!nsMapiHook::VerifyUserName(nsDependentCString(aLogin), id_key)) { + *aSessionId = MAPI_E_LOGIN_FAILURE; + MOZ_LOG(MAPI, mozilla::LogLevel::Debug, + ("CMapiImp::Login failed for username %s", aLogin)); + NS_ASSERTION(false, "failed verifying user name"); + return hr; + } + } else { + // get default account + nsresult rv; + nsCOMPtr<nsIMsgAccountManager> accountManager = + do_GetService("@mozilla.org/messenger/account-manager;1", &rv); + NS_ENSURE_SUCCESS(rv, MAPI_E_LOGIN_FAILURE); + + nsCOMPtr<nsIMsgAccount> account; + rv = accountManager->GetDefaultAccount(getter_AddRefs(account)); + NS_ENSURE_SUCCESS(rv, MAPI_E_LOGIN_FAILURE); + if (!account) return MAPI_E_LOGIN_FAILURE; + + nsCOMPtr<nsIMsgIdentity> identity; + rv = account->GetDefaultIdentity(getter_AddRefs(identity)); + NS_ENSURE_SUCCESS(rv, MAPI_E_LOGIN_FAILURE); + if (!identity) return MAPI_E_LOGIN_FAILURE; + identity->GetKey(id_key); + } + + // finally register(create) the session. + uint32_t nSession_Id; + int16_t nResult = 0; + + nsMAPIConfiguration* pConfig = nsMAPIConfiguration::GetMAPIConfiguration(); + if (pConfig != nullptr) + nResult = pConfig->RegisterSession( + aUIArg, aLogin ? nsDependentCString(aLogin) : EmptyCString(), + aPassWord ? nsDependentCString(aPassWord) : EmptyCString(), + (aFlags & MAPI_FORCE_DOWNLOAD), bNewSession, &nSession_Id, + id_key.get()); + switch (nResult) { + case -1: { + *aSessionId = MAPI_E_TOO_MANY_SESSIONS; + return hr; + } + case 0: { + *aSessionId = MAPI_E_INSUFFICIENT_MEMORY; + return hr; + } + default: { + *aSessionId = nSession_Id; + MOZ_LOG(MAPI, mozilla::LogLevel::Debug, ("CMapiImp::Login succeeded")); + break; + } + } + + return S_OK; +} + +STDMETHODIMP CMapiImp::SendMail(unsigned long aSession, + lpnsMapiMessage aMessage, unsigned long aFlags, + unsigned long aReserved) { + MOZ_LOG(MAPI, mozilla::LogLevel::Debug, + ("CMapiImp::SendMail flags=%lx subject: %s sender: %s", aFlags, + (aMessage && aMessage->lpszSubject) ? aMessage->lpszSubject + : "(no subject)", + (aMessage && aMessage->lpOriginator && + aMessage->lpOriginator->lpszAddress) + ? aMessage->lpOriginator->lpszAddress + : "(no sender)")); + + /** create nsIMsgCompFields obj and populate it **/ + nsresult rv = NS_OK; + nsCOMPtr<nsIMsgCompFields> pCompFields = + do_CreateInstance("@mozilla.org/messengercompose/composefields;1", &rv); + if (NS_FAILED(rv) || (!pCompFields)) return MAPI_E_INSUFFICIENT_MEMORY; + + if (aMessage) + rv = nsMapiHook::PopulateCompFieldsWithConversion(aMessage, pCompFields); + + if (NS_SUCCEEDED(rv)) { + // see flag to see if UI needs to be brought up + if (!(aFlags & MAPI_DIALOG)) { + rv = nsMapiHook::BlindSendMail(aSession, pCompFields); + } else { + rv = nsMapiHook::ShowComposerWindow(aSession, pCompFields); + } + } + + return nsMAPIConfiguration::GetMAPIErrorFromNSError(rv); +} + +STDMETHODIMP CMapiImp::SendMailW(unsigned long aSession, + lpnsMapiMessageW aMessage, + unsigned long aFlags, + unsigned long aReserved) { + MOZ_LOG( + MAPI, mozilla::LogLevel::Debug, + ("CMapiImp::SendMailW flags=%lx subject: %s sender: %s", aFlags, + (aMessage && aMessage->lpszSubject) + ? NS_ConvertUTF16toUTF8(aMessage->lpszSubject).get() + : "(no subject)", + (aMessage && aMessage->lpOriginator && + aMessage->lpOriginator->lpszAddress) + ? NS_ConvertUTF16toUTF8(aMessage->lpOriginator->lpszAddress).get() + : "(no sender)")); + + // Create nsIMsgCompFields obj and populate it. + nsresult rv = NS_OK; + nsCOMPtr<nsIMsgCompFields> pCompFields = + do_CreateInstance("@mozilla.org/messengercompose/composefields;1", &rv); + if (NS_FAILED(rv) || !pCompFields) return MAPI_E_INSUFFICIENT_MEMORY; + + if (aMessage) rv = nsMapiHook::PopulateCompFieldsW(aMessage, pCompFields); + + if (NS_SUCCEEDED(rv)) { + // Check flag to see if UI needs to be brought up. + if (!(aFlags & MAPI_DIALOG)) { + rv = nsMapiHook::BlindSendMail(aSession, pCompFields); + } else { + rv = nsMapiHook::ShowComposerWindow(aSession, pCompFields); + } + } + + return nsMAPIConfiguration::GetMAPIErrorFromNSError(rv); +} + +STDMETHODIMP CMapiImp::SendDocuments(unsigned long aSession, LPSTR aDelimChar, + LPSTR aFilePaths, LPSTR aFileNames, + ULONG aFlags) { + nsresult rv = NS_OK; + + MOZ_LOG(MAPI, mozilla::LogLevel::Debug, + ("CMapiImp::SendDocument using flags %lu", aFlags)); + /** create nsIMsgCompFields obj and populate it **/ + nsCOMPtr<nsIMsgCompFields> pCompFields = + do_CreateInstance("@mozilla.org/messengercompose/composefields;1", &rv); + if (NS_FAILED(rv) || (!pCompFields)) return MAPI_E_INSUFFICIENT_MEMORY; + + if (aFilePaths) { + rv = nsMapiHook::PopulateCompFieldsForSendDocs(pCompFields, aFlags, + aDelimChar, aFilePaths); + } + + if (NS_SUCCEEDED(rv)) + rv = nsMapiHook::ShowComposerWindow(aSession, pCompFields); + else + MOZ_LOG(MAPI, mozilla::LogLevel::Debug, + ("CMapiImp::SendDocument error rv = %x, paths = %s names = %s", rv, + aFilePaths, aFileNames)); + + return nsMAPIConfiguration::GetMAPIErrorFromNSError(rv); +} + +nsresult CMapiImp::GetDefaultInbox(nsIMsgFolder** inboxFolder) { + // get default account + nsresult rv; + nsCOMPtr<nsIMsgAccountManager> accountManager = + do_GetService("@mozilla.org/messenger/account-manager;1", &rv); + NS_ENSURE_SUCCESS(rv, rv); + + nsCOMPtr<nsIMsgAccount> account; + rv = accountManager->GetDefaultAccount(getter_AddRefs(account)); + NS_ENSURE_SUCCESS(rv, rv); + if (!account) return NS_ERROR_FAILURE; + + // get incoming server + nsCOMPtr<nsIMsgIncomingServer> server; + rv = account->GetIncomingServer(getter_AddRefs(server)); + NS_ENSURE_SUCCESS(rv, rv); + + nsCString type; + rv = server->GetType(type); + NS_ENSURE_SUCCESS(rv, rv); + + // we only care about imap and pop3 + if (type.EqualsLiteral("imap") || type.EqualsLiteral("pop3")) { + // imap and pop3 account should have an Inbox + nsCOMPtr<nsIMsgFolder> rootMsgFolder; + rv = server->GetRootMsgFolder(getter_AddRefs(rootMsgFolder)); + NS_ENSURE_SUCCESS(rv, rv); + + if (!rootMsgFolder) return NS_ERROR_FAILURE; + + rootMsgFolder->GetFolderWithFlags(nsMsgFolderFlags::Inbox, inboxFolder); + if (!*inboxFolder) return NS_ERROR_FAILURE; + } + return NS_OK; +} + +//***************************************************************************** +// Encapsulate the XP DB stuff required to enumerate messages + +class MsgMapiListContext { + public: + MsgMapiListContext() {} + ~MsgMapiListContext(); + + nsresult OpenDatabase(nsIMsgFolder* folder); + + nsMsgKey GetNext(); + nsresult MarkRead(nsMsgKey key, bool read); + + lpnsMapiMessage GetMessage(nsMsgKey, unsigned long flFlags); + bool IsIMAPHost(void); + bool DeleteMessage(nsMsgKey key); + + protected: + char* ConvertDateToMapiFormat(time_t); + char* ConvertBodyToMapiFormat(nsIMsgDBHdr* hdr); + void ConvertRecipientsToMapiFormat( + const nsCOMArray<msgIAddressObject>& ourRecips, + lpnsMapiRecipDesc mapiRecips, int mapiRecipClass); + + nsCOMPtr<nsIMsgFolder> m_folder; + nsCOMPtr<nsIMsgDatabase> m_db; + nsCOMPtr<nsIMsgEnumerator> m_msgEnumerator; +}; + +LONG CMapiImp::InitContext(unsigned long session, + MsgMapiListContext** listContext) { + nsMAPIConfiguration* pMapiConfig = + nsMAPIConfiguration::GetMAPIConfiguration(); + if (!pMapiConfig) return MAPI_E_FAILURE; // get the singleton obj + *listContext = (MsgMapiListContext*)pMapiConfig->GetMapiListContext(session); + // This is the first message + if (!*listContext) { + nsCOMPtr<nsIMsgFolder> inboxFolder; + nsresult rv = GetDefaultInbox(getter_AddRefs(inboxFolder)); + if (NS_FAILED(rv)) { + NS_ASSERTION(false, "in init context, no inbox"); + return (MAPI_E_NO_MESSAGES); + } + + *listContext = new MsgMapiListContext; + if (!*listContext) return MAPI_E_INSUFFICIENT_MEMORY; + + rv = (*listContext)->OpenDatabase(inboxFolder); + if (NS_FAILED(rv)) { + pMapiConfig->SetMapiListContext(session, NULL); + delete *listContext; + NS_ASSERTION(false, "in init context, unable to open db"); + return MAPI_E_NO_MESSAGES; + } else + pMapiConfig->SetMapiListContext(session, *listContext); + } + return SUCCESS_SUCCESS; +} + +STDMETHODIMP CMapiImp::FindNext(unsigned long aSession, unsigned long ulUIParam, + LPSTR lpszMessageType, LPSTR lpszSeedMessageID, + unsigned long flFlags, unsigned long ulReserved, + unsigned char lpszMessageID[64]) + +{ + // + // If this is true, then this is the first call to this FindNext function + // and we should start the enumeration operation. + // + + *lpszMessageID = '\0'; + nsMAPIConfiguration* pMapiConfig = + nsMAPIConfiguration::GetMAPIConfiguration(); + if (!pMapiConfig) { + NS_ASSERTION(false, "failed to get config in findnext"); + return MAPI_E_FAILURE; // get the singleton obj + } + MsgMapiListContext* listContext; + LONG ret = InitContext(aSession, &listContext); + if (ret != SUCCESS_SUCCESS) { + NS_ASSERTION(false, "init context failed"); + return ret; + } + NS_ASSERTION(listContext, "initContext returned null context"); + if (listContext) { + // NS_ASSERTION(false, "find next init context succeeded"); + nsMsgKey nextKey = listContext->GetNext(); + if (nextKey == nsMsgKey_None) { + pMapiConfig->SetMapiListContext(aSession, NULL); + delete listContext; + return (MAPI_E_NO_MESSAGES); + } + + // TRACE("MAPI: ProcessMAPIFindNext() Found message id = %d\n", nextKey); + + sprintf((char*)lpszMessageID, "%d", nextKey); + } + + MOZ_LOG(MAPI, mozilla::LogLevel::Debug, + ("CMapiImp::FindNext returning key %s", (char*)lpszMessageID)); + return (SUCCESS_SUCCESS); +} + +STDMETHODIMP CMapiImp::ReadMail(unsigned long aSession, unsigned long ulUIParam, + LPSTR lpszMessageID, unsigned long flFlags, + unsigned long ulReserved, + lpnsMapiMessage* lppMessage) { + nsresult irv; + nsAutoCString keyString((char*)lpszMessageID); + MOZ_LOG(MAPI, mozilla::LogLevel::Debug, + ("CMapiImp::ReadMail asking for key %s", (char*)lpszMessageID)); + nsMsgKey msgKey = keyString.ToInteger(&irv); + if (NS_FAILED(irv)) { + NS_ASSERTION(false, "invalid lpszMessageID"); + return MAPI_E_INVALID_MESSAGE; + } + MsgMapiListContext* listContext; + LONG ret = InitContext(aSession, &listContext); + if (ret != SUCCESS_SUCCESS) { + NS_ASSERTION(false, "init context failed in ReadMail"); + return ret; + } + *lppMessage = listContext->GetMessage(msgKey, flFlags); + NS_ASSERTION(*lppMessage, "get message failed"); + + return (*lppMessage) ? SUCCESS_SUCCESS : E_FAIL; +} + +STDMETHODIMP CMapiImp::DeleteMail(unsigned long aSession, + unsigned long ulUIParam, LPSTR lpszMessageID, + unsigned long flFlags, + unsigned long ulReserved) { + nsresult irv; + nsAutoCString keyString((char*)lpszMessageID); + nsMsgKey msgKey = keyString.ToInteger(&irv); + // XXX Why do we return success on failure? + if (NS_FAILED(irv)) return SUCCESS_SUCCESS; + MsgMapiListContext* listContext; + LONG ret = InitContext(aSession, &listContext); + if (ret != SUCCESS_SUCCESS) return ret; + return (listContext->DeleteMessage(msgKey)) ? SUCCESS_SUCCESS + : MAPI_E_INVALID_MESSAGE; +} + +STDMETHODIMP CMapiImp::SaveMail(unsigned long aSession, unsigned long ulUIParam, + lpnsMapiMessage lppMessage, + unsigned long flFlags, unsigned long ulReserved, + LPSTR lpszMessageID) { + MsgMapiListContext* listContext; + LONG ret = InitContext(aSession, &listContext); + if (ret != SUCCESS_SUCCESS) return ret; + return S_OK; +} + +STDMETHODIMP CMapiImp::Logoff(unsigned long aSession) { + nsMAPIConfiguration* pConfig = nsMAPIConfiguration::GetMAPIConfiguration(); + + if (pConfig->UnRegisterSession((uint32_t)aSession)) return S_OK; + + return E_FAIL; +} + +STDMETHODIMP CMapiImp::CleanUp() { + nsMapiHook::CleanUp(); + return S_OK; +} + +#define MAX_NAME_LEN 256 + +MsgMapiListContext::~MsgMapiListContext() { + if (m_db) m_db->Close(false); +} + +nsresult MsgMapiListContext::OpenDatabase(nsIMsgFolder* folder) { + nsresult dbErr = NS_ERROR_FAILURE; + if (folder) { + m_folder = folder; + dbErr = folder->GetMsgDatabase(getter_AddRefs(m_db)); + if (m_db) dbErr = m_db->EnumerateMessages(getter_AddRefs(m_msgEnumerator)); + } + return dbErr; +} + +bool MsgMapiListContext::IsIMAPHost(void) { + if (!m_folder) return FALSE; + nsCOMPtr<nsIMsgImapMailFolder> imapFolder = do_QueryInterface(m_folder); + + return imapFolder != nullptr; +} + +nsMsgKey MsgMapiListContext::GetNext() { + nsMsgKey key = nsMsgKey_None; + bool keepTrying = TRUE; + + // NS_ASSERTION (m_msgEnumerator && m_db, "need enumerator and db"); + if (m_msgEnumerator && m_db) { + do { + keepTrying = FALSE; + nsCOMPtr<nsIMsgDBHdr> msgHdr; + if (NS_SUCCEEDED(m_msgEnumerator->GetNext(getter_AddRefs(msgHdr))) && + msgHdr) { + msgHdr->GetMessageKey(&key); + + // Check here for IMAP message...if not, just return... + if (!IsIMAPHost()) return key; + + // If this is an IMAP message, we have to make sure we have a valid + // body to work with. + uint32_t flags = 0; + + (void)msgHdr->GetFlags(&flags); + if (flags & nsMsgMessageFlags::Offline) return key; + + // Ok, if we get here, we have an IMAP message without a body! + // We need to keep trying by calling the GetNext member recursively... + keepTrying = TRUE; + } + } while (keepTrying); + } + + return key; +} + +nsresult MsgMapiListContext::MarkRead(nsMsgKey key, bool read) { + nsresult err = NS_ERROR_FAILURE; + NS_ASSERTION(m_db, "no db"); + if (m_db) err = m_db->MarkRead(key, read, nullptr); + return err; +} + +lpnsMapiMessage MsgMapiListContext::GetMessage(nsMsgKey key, + unsigned long flFlags) { + lpnsMapiMessage message = + (lpnsMapiMessage)CoTaskMemAlloc(sizeof(nsMapiMessage)); + memset(message, 0, sizeof(nsMapiMessage)); + if (message) { + nsCString subject; + nsCString author; + nsCOMPtr<nsIMsgDBHdr> msgHdr; + + m_db->GetMsgHdrForKey(key, getter_AddRefs(msgHdr)); + if (msgHdr) { + msgHdr->GetSubject(subject); + message->lpszSubject = (char*)CoTaskMemAlloc(subject.Length() + 1); + strcpy((char*)message->lpszSubject, subject.get()); + uint32_t date; + (void)msgHdr->GetDateInSeconds(&date); + message->lpszDateReceived = ConvertDateToMapiFormat(date); + + // Pull out the flags info + // anything to do with MAPI_SENT? Since we're only reading the Inbox, I + // guess not + uint32_t ourFlags; + (void)msgHdr->GetFlags(&ourFlags); + if (!(ourFlags & nsMsgMessageFlags::Read)) + message->flFlags |= MAPI_UNREAD; + if (ourFlags & (nsMsgMessageFlags::MDNReportNeeded | + nsMsgMessageFlags::MDNReportSent)) + message->flFlags |= MAPI_RECEIPT_REQUESTED; + + // Pull out the author/originator info + message->lpOriginator = + (lpnsMapiRecipDesc)CoTaskMemAlloc(sizeof(nsMapiRecipDesc)); + memset(message->lpOriginator, 0, sizeof(nsMapiRecipDesc)); + if (message->lpOriginator) { + msgHdr->GetAuthor(getter_Copies(author)); + ConvertRecipientsToMapiFormat(EncodedHeader(author), + message->lpOriginator, MAPI_ORIG); + } + // Pull out the To/CC info + nsCString recipients, ccList; + msgHdr->GetRecipients(getter_Copies(recipients)); + msgHdr->GetCcList(getter_Copies(ccList)); + + nsCOMArray<msgIAddressObject> parsedToRecips = EncodedHeader(recipients); + nsCOMArray<msgIAddressObject> parsedCCRecips = EncodedHeader(ccList); + uint32_t numToRecips = parsedToRecips.Length(); + uint32_t numCCRecips = parsedCCRecips.Length(); + + message->lpRecips = (lpnsMapiRecipDesc)CoTaskMemAlloc( + (numToRecips + numCCRecips) * sizeof(MapiRecipDesc)); + memset(message->lpRecips, 0, + (numToRecips + numCCRecips) * sizeof(MapiRecipDesc)); + if (message->lpRecips) { + ConvertRecipientsToMapiFormat(parsedToRecips, message->lpRecips, + MAPI_TO); + ConvertRecipientsToMapiFormat(parsedCCRecips, + &message->lpRecips[numToRecips], MAPI_CC); + } + + MOZ_LOG(MAPI, mozilla::LogLevel::Debug, + ("MsgMapiListContext::GetMessage flags=%lu subject %s date %s " + "sender %s", + flFlags, (char*)message->lpszSubject, + (char*)message->lpszDateReceived, author.get())); + + // Convert any body text that we have locally + if (!(flFlags & MAPI_ENVELOPE_ONLY)) + message->lpszNoteText = (char*)ConvertBodyToMapiFormat(msgHdr); + } + if (!(flFlags & (MAPI_PEEK | MAPI_ENVELOPE_ONLY))) + m_db->MarkRead(key, true, nullptr); + } + return message; +} + +char* MsgMapiListContext::ConvertDateToMapiFormat(time_t ourTime) { + char* date = (char*)CoTaskMemAlloc(32); + if (date) { + // MAPI time format is YYYY/MM/DD HH:MM + // Note that we're not using XP_StrfTime because that localizes the time + // format, and the way I read the MAPI spec is that their format is + // canonical, not localized. + struct tm* local = localtime(&ourTime); + if (local) + strftime(date, 32, "%Y/%m/%d %I:%M", + local); // use %H if hours should be 24 hour format + } + return date; +} + +void MsgMapiListContext::ConvertRecipientsToMapiFormat( + const nsCOMArray<msgIAddressObject>& recipients, + lpnsMapiRecipDesc mapiRecips, int mapiRecipClass) { + nsTArray<nsCString> names, addresses; + ExtractAllAddresses(recipients, UTF16ArrayAdapter<>(names), + UTF16ArrayAdapter<>(addresses)); + + size_t numAddresses = names.Length(); + for (size_t i = 0; i < numAddresses; i++) { + if (!names[i].IsEmpty()) { + mapiRecips[i].lpszName = (char*)CoTaskMemAlloc(names[i].Length() + 1); + if (mapiRecips[i].lpszName) + strcpy((char*)mapiRecips[i].lpszName, names[i].get()); + } + if (!addresses[i].IsEmpty()) { + mapiRecips[i].lpszName = (char*)CoTaskMemAlloc(addresses[i].Length() + 1); + if (mapiRecips[i].lpszName) + strcpy((char*)mapiRecips[i].lpszName, addresses[i].get()); + } + mapiRecips[i].ulRecipClass = mapiRecipClass; + } +} + +char* MsgMapiListContext::ConvertBodyToMapiFormat(nsIMsgDBHdr* hdr) { + const int kBufLen = + 64000; // I guess we only return the first 64K of a message. +#define EMPTY_MESSAGE_LINE(buf) \ + (buf[0] == '\r' || buf[0] == '\n' || buf[0] == '\0') + + nsCOMPtr<nsIMsgFolder> folder; + hdr->GetFolder(getter_AddRefs(folder)); + if (!folder) return nullptr; + + nsCOMPtr<nsIFile> localFile; + folder->GetFilePath(getter_AddRefs(localFile)); + + nsresult rv; + nsCOMPtr<nsIFileInputStream> fileStream = + do_CreateInstance(NS_LOCALFILEINPUTSTREAM_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, nullptr); + + rv = fileStream->Init(localFile, PR_RDONLY, 0664, + false); // just have to read the messages + NS_ENSURE_SUCCESS(rv, nullptr); + + nsCOMPtr<nsILineInputStream> fileLineStream = do_QueryInterface(fileStream); + if (!fileLineStream) return nullptr; + + // ### really want to skip past headers... + uint64_t messageOffset; + uint32_t lineCount; + hdr->GetMessageOffset(&messageOffset); + hdr->GetLineCount(&lineCount); + nsCOMPtr<nsISeekableStream> seekableStream = do_QueryInterface(fileStream); + seekableStream->Seek(PR_SEEK_SET, messageOffset); + bool hasMore = true; + nsAutoCString curLine; + + while (hasMore) // advance past message headers + { + nsresult rv = fileLineStream->ReadLine(curLine, &hasMore); + if (NS_FAILED(rv) || EMPTY_MESSAGE_LINE(curLine)) break; + } + uint32_t msgSize; + hdr->GetMessageSize(&msgSize); + if (msgSize > kBufLen) msgSize = kBufLen - 1; + // this is too big, since it includes the msg hdr size...oh well + char* body = (char*)CoTaskMemAlloc(msgSize + 1); + + if (!body) return nullptr; + int32_t bytesCopied = 0; + for (hasMore = TRUE; lineCount > 0 && hasMore && NS_SUCCEEDED(rv); + lineCount--) { + rv = fileLineStream->ReadLine(curLine, &hasMore); + if (NS_FAILED(rv)) break; + curLine.Append(CRLF); + // make sure we have room left + if (bytesCopied + curLine.Length() < msgSize) { + strcpy(body + bytesCopied, curLine.get()); + bytesCopied += curLine.Length(); + } + } + MOZ_LOG(MAPI, mozilla::LogLevel::Debug, + ("ConvertBodyToMapiFormat size=%x allocated size %x body = %100.100s", + bytesCopied, msgSize + 1, (char*)body)); + body[bytesCopied] = '\0'; // rhp - fix last line garbage... + return body; +} + +//***************************************************************************** +// MSGMAPI API implementation + +static void msg_FreeMAPIFile(lpMapiFileDesc f) { + if (f) { + CoTaskMemFree(f->lpszPathName); + CoTaskMemFree(f->lpszFileName); + } +} + +static void msg_FreeMAPIRecipient(lpMapiRecipDesc rd) { + if (rd) { + if (rd->lpszName) CoTaskMemFree(rd->lpszName); + if (rd->lpszAddress) CoTaskMemFree(rd->lpszAddress); + // CoTaskMemFree(rd->lpEntryID); + } +} + +extern "C" void MSG_FreeMapiMessage(lpMapiMessage msg) { + ULONG i; + + if (msg) { + CoTaskMemFree(msg->lpszSubject); + CoTaskMemFree(msg->lpszNoteText); + CoTaskMemFree(msg->lpszMessageType); + CoTaskMemFree(msg->lpszDateReceived); + CoTaskMemFree(msg->lpszConversationID); + + if (msg->lpOriginator) msg_FreeMAPIRecipient(msg->lpOriginator); + + for (i = 0; i < msg->nRecipCount; i++) + if (&(msg->lpRecips[i]) != nullptr) + msg_FreeMAPIRecipient(&(msg->lpRecips[i])); + + CoTaskMemFree(msg->lpRecips); + + for (i = 0; i < msg->nFileCount; i++) + if (&(msg->lpFiles[i]) != nullptr) msg_FreeMAPIFile(&(msg->lpFiles[i])); + + CoTaskMemFree(msg->lpFiles); + + CoTaskMemFree(msg); + } +} + +extern "C" bool MsgMarkMapiMessageRead(nsIMsgFolder* folder, nsMsgKey key, + bool read) { + bool success = FALSE; + MsgMapiListContext* context = new MsgMapiListContext(); + if (context) { + if (NS_SUCCEEDED(context->OpenDatabase(folder))) { + if (NS_SUCCEEDED(context->MarkRead(key, read))) success = TRUE; + } + delete context; + } + return success; +} + +bool MsgMapiListContext::DeleteMessage(nsMsgKey key) { + if (!m_db) return FALSE; + + if (!IsIMAPHost()) { + nsTArray<nsMsgKey> doomed({key}); + return NS_SUCCEEDED((m_db->DeleteMessages(doomed, nullptr))); + } +#if 0 + else if ( m_folder->GetIMAPFolderInfoMail() ) + { + AutoTArray<nsMsgKey, 1> messageKeys; + messageKeys.AppendElement(key); + + (m_folder->GetIMAPFolderInfoMail())->DeleteSpecifiedMessages(pane, messageKeys, nsMsgKey_None); + m_db->DeleteMessage(key, nullptr, FALSE); + return TRUE; + } +#endif + else { + return FALSE; + } +} + +/* Return TRUE on success, FALSE on failure */ +extern "C" bool MSG_DeleteMapiMessage(nsIMsgFolder* folder, nsMsgKey key) { + bool success = FALSE; + MsgMapiListContext* context = new MsgMapiListContext(); + if (context) { + if (NS_SUCCEEDED(context->OpenDatabase(folder))) { + success = context->DeleteMessage(key); + } + + delete context; + } + + return success; +} diff --git a/comm/mailnews/mapi/mapihook/src/msgMapiImp.h b/comm/mailnews/mapi/mapihook/src/msgMapiImp.h new file mode 100644 index 0000000000..b83f0566a0 --- /dev/null +++ b/comm/mailnews/mapi/mapihook/src/msgMapiImp.h @@ -0,0 +1,79 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef MSG_MAPI_IMP_H +#define MSG_MAPI_IMP_H + +#include "msgMapi.h" +#include "nspr.h" +#include "nscore.h" +#include "nsISupportsImpl.h" // ThreadSafeAutoRefCnt + +class nsIMsgFolder; +class MsgMapiListContext; + +const CLSID CLSID_CMapiImp = {0x29f458be, + 0x8866, + 0x11d5, + {0xa3, 0xdd, 0x0, 0xb0, 0xd0, 0xf3, 0xba, 0xa7}}; + +// this class implements the MS COM interface nsIMapi that provides the methods +// called by mapi32.dll to perform the mail operations as specified by MAPI. +// These class methods in turn use the Mozilla Mail XPCOM interfaces to do so. +class CMapiImp : public nsIMapi { + public: + // IUnknown + + STDMETHODIMP QueryInterface(const IID& aIid, void** aPpv); + STDMETHODIMP_(ULONG) AddRef(); + STDMETHODIMP_(ULONG) Release(); + + // Interface INsMapi + + STDMETHODIMP Login(unsigned long aUIArg, LPSTR aLogin, LPSTR aPassWord, + unsigned long aFlags, unsigned long* aSessionId); + + STDMETHODIMP SendMail(unsigned long aSession, lpnsMapiMessage aMessage, + unsigned long aFlags, unsigned long aReserved); + + STDMETHODIMP SendDocuments(unsigned long aSession, LPSTR aDelimChar, + LPSTR aFilePaths, LPSTR aFileNames, ULONG aFlags); + + STDMETHODIMP FindNext(unsigned long aSession, unsigned long ulUIParam, + LPSTR lpszMessageType, LPSTR lpszSeedMessageID, + unsigned long flFlags, unsigned long ulReserved, + unsigned char lpszMessageID[64]); + + STDMETHODIMP ReadMail(unsigned long lhSession, unsigned long ulUIParam, + LPSTR lpszMessageID, unsigned long flFlags, + unsigned long ulReserved, lpnsMapiMessage* lppMessage); + STDMETHODIMP DeleteMail(unsigned long lhSession, unsigned long ulUIParam, + LPSTR lpszMessageID, unsigned long flFlags, + unsigned long ulReserved); + STDMETHODIMP SaveMail(unsigned long lhSession, unsigned long ulUIParam, + lpnsMapiMessage lppMessage, unsigned long flFlags, + unsigned long ulReserved, LPSTR lpszMessageID); + + STDMETHODIMP Initialize(); + STDMETHODIMP IsValid(); + STDMETHODIMP IsValidSession(unsigned long aSession); + + STDMETHODIMP SendMailW(unsigned long aSession, lpnsMapiMessageW aMessage, + unsigned long aFlags, unsigned long aReserved); + + STDMETHODIMP Logoff(unsigned long aSession); + STDMETHODIMP CleanUp(); + + CMapiImp(); + virtual ~CMapiImp(); + + LONG InitContext(unsigned long session, MsgMapiListContext** listContext); + nsresult GetDefaultInbox(nsIMsgFolder** inboxFolder); + + private: + PRLock* m_Lock; + mozilla::ThreadSafeAutoRefCnt m_cRef; +}; + +#endif // MSG_MAPI_IMP_H diff --git a/comm/mailnews/mapi/mapihook/src/msgMapiMain.cpp b/comm/mailnews/mapi/mapihook/src/msgMapiMain.cpp new file mode 100644 index 0000000000..0e8d4cacac --- /dev/null +++ b/comm/mailnews/mapi/mapihook/src/msgMapiMain.cpp @@ -0,0 +1,248 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include <mapidefs.h> +#include <mapi.h> + +#include "msgCore.h" +#include "nsComposeStrings.h" +#include "msgMapiMain.h" +#include "nsCOMPtr.h" + +nsMAPIConfiguration* nsMAPIConfiguration::m_pSelfRef = nullptr; +uint32_t nsMAPIConfiguration::session_generator = 0; +uint32_t nsMAPIConfiguration::sessionCount = 0; + +nsMAPIConfiguration* nsMAPIConfiguration::GetMAPIConfiguration() { + if (m_pSelfRef == nullptr) m_pSelfRef = new nsMAPIConfiguration(); + + return m_pSelfRef; +} + +nsMAPIConfiguration::nsMAPIConfiguration() : m_nMaxSessions(MAX_SESSIONS) { + m_Lock = PR_NewLock(); +} + +nsMAPIConfiguration::~nsMAPIConfiguration() { + if (m_Lock) PR_DestroyLock(m_Lock); +} + +void nsMAPIConfiguration::OpenConfiguration() { + // No. of max. sessions is set to MAX_SESSIONS. In future + // if it is decided to have configuration (registry) + // parameter, this function can be used to set the + // max sessions; + + return; +} + +int16_t nsMAPIConfiguration::RegisterSession( + uint32_t aHwnd, const nsCString& aUserName, const nsCString& aPassword, + bool aForceDownLoad, bool aNewSession, uint32_t* aSession, + const char* aIdKey) { + int16_t nResult = 0; + uint32_t n_SessionId = 0; + + PR_Lock(m_Lock); + + // Check whether max sessions is exceeded + + if (sessionCount >= m_nMaxSessions) { + PR_Unlock(m_Lock); + return -1; + } + + if (!aUserName.IsEmpty()) n_SessionId = m_ProfileMap.Get(aUserName); + + // try to share a session; if not create a session + if (n_SessionId > 0) { + nsMAPISession* pTemp = nullptr; + m_SessionMap.Get(n_SessionId, &pTemp); + if (pTemp != nullptr) { + pTemp->IncrementSession(); + *aSession = n_SessionId; + nResult = 1; + } + } else if (aNewSession || + n_SessionId == 0) // checking for n_SessionId is a concession + { + // create a new session; if new session is specified OR there is no session + session_generator++; + + // I don't think there will be (2 power 32) sessions alive + // in a cycle. This is an assumption. + if (session_generator == 0) session_generator++; + m_SessionMap.InsertOrUpdate( + session_generator, + mozilla::MakeUnique<nsMAPISession>(aHwnd, aUserName, aPassword, + aForceDownLoad, aIdKey)); + if (!aUserName.IsEmpty()) + m_ProfileMap.InsertOrUpdate(aUserName, session_generator); + *aSession = session_generator; + sessionCount++; + nResult = 1; + } + + PR_Unlock(m_Lock); + return nResult; +} + +bool nsMAPIConfiguration::UnRegisterSession(uint32_t aSessionID) { + bool bResult = false; + + PR_Lock(m_Lock); + + if (aSessionID != 0) { + nsMAPISession* pTemp = nullptr; + m_SessionMap.Get(aSessionID, &pTemp); + + if (pTemp != nullptr) { + if (pTemp->DecrementSession() == 0) { + if (pTemp->m_pProfileName.get() != nullptr) + m_ProfileMap.Remove(pTemp->m_pProfileName); + m_SessionMap.Remove(aSessionID); + sessionCount--; + bResult = true; + } + } + } + + PR_Unlock(m_Lock); + return bResult; +} + +bool nsMAPIConfiguration::IsSessionValid(uint32_t aSessionID) { + if (aSessionID == 0) return false; + bool retValue = false; + PR_Lock(m_Lock); + retValue = m_SessionMap.Get(aSessionID, NULL); + PR_Unlock(m_Lock); + return retValue; +} + +char16_t* nsMAPIConfiguration::GetPassword(uint32_t aSessionID) { + char16_t* pResult = nullptr; + + PR_Lock(m_Lock); + + if (aSessionID != 0) { + nsMAPISession* pTemp = nullptr; + m_SessionMap.Get(aSessionID, &pTemp); + + if (pTemp) pResult = pTemp->GetPassword(); + } + PR_Unlock(m_Lock); + return pResult; +} + +void* nsMAPIConfiguration::GetMapiListContext(uint32_t aSessionID) { + void* pResult = nullptr; + + PR_Lock(m_Lock); + + if (aSessionID != 0) { + nsMAPISession* pTemp = nullptr; + m_SessionMap.Get(aSessionID, &pTemp); + if (pTemp) pResult = pTemp->GetMapiListContext(); + } + + PR_Unlock(m_Lock); + return pResult; +} + +void nsMAPIConfiguration::SetMapiListContext(uint32_t aSessionID, + void* mapiListContext) { + PR_Lock(m_Lock); + + if (aSessionID != 0) { + nsMAPISession* pTemp = nullptr; + m_SessionMap.Get(aSessionID, &pTemp); + if (pTemp) pTemp->SetMapiListContext(mapiListContext); + } + + PR_Unlock(m_Lock); +} + +void nsMAPIConfiguration::GetIdKey(uint32_t aSessionID, nsCString& aKey) { + PR_Lock(m_Lock); + if (aSessionID != 0) { + nsMAPISession* pTemp = nullptr; + m_SessionMap.Get(aSessionID, &pTemp); + if (pTemp) pTemp->GetIdKey(aKey); + } + PR_Unlock(m_Lock); + return; +} + +// util func +HRESULT nsMAPIConfiguration::GetMAPIErrorFromNSError(nsresult res) { + HRESULT hr = SUCCESS_SUCCESS; + + if (NS_SUCCEEDED(res)) return hr; + + // if failure return the related MAPI failure code + switch (res) { + case NS_MSG_NO_RECIPIENTS: + hr = MAPI_E_BAD_RECIPTYPE; + break; + case NS_ERROR_COULD_NOT_GET_USERS_MAIL_ADDRESS: + case NS_ERROR_COULD_NOT_GET_SENDERS_IDENTITY: + // Something went wrong with the sender. There's no error we can map to + // so we use a general error, see: + // https://msdn.microsoft.com/en-us/library/hh802867(v=vs.85).aspx + hr = MAPI_E_FAILURE; + break; + case NS_ERROR_SMTP_AUTH_FAILURE: + case NS_ERROR_SMTP_AUTH_GSSAPI: + case NS_ERROR_SMTP_AUTH_MECH_NOT_SUPPORTED: + case NS_ERROR_SMTP_AUTH_CHANGE_ENCRYPT_TO_PLAIN_NO_SSL: + case NS_ERROR_SMTP_AUTH_CHANGE_ENCRYPT_TO_PLAIN_SSL: + case NS_ERROR_SMTP_AUTH_CHANGE_PLAIN_TO_ENCRYPT: + hr = MAPI_E_LOGIN_FAILURE; + break; + case NS_MSG_UNABLE_TO_OPEN_FILE: + case NS_MSG_UNABLE_TO_OPEN_TMP_FILE: + case NS_MSG_COULDNT_OPEN_FCC_FOLDER: + case NS_ERROR_FILE_INVALID_PATH: + hr = MAPI_E_ATTACHMENT_OPEN_FAILURE; + break; + case NS_ERROR_FILE_NOT_FOUND: + hr = MAPI_E_ATTACHMENT_NOT_FOUND; + break; + case NS_MSG_ERROR_WRITING_FILE: + case NS_MSG_UNABLE_TO_SAVE_TEMPLATE: + case NS_MSG_UNABLE_TO_SAVE_DRAFT: + hr = MAPI_E_ATTACHMENT_WRITE_FAILURE; + break; + default: + hr = MAPI_E_FAILURE; + break; + } + + return hr; +} + +nsMAPISession::nsMAPISession(uint32_t aHwnd, const nsCString& aUserName, + const nsCString& aPassword, bool aForceDownLoad, + const char* aKey) + : m_nShared(1), m_pIdKey(aKey) { + m_listContext = NULL; + m_pProfileName = aUserName; + m_pPassword = aPassword; +} + +nsMAPISession::~nsMAPISession() {} + +uint32_t nsMAPISession::IncrementSession() { return ++m_nShared; } + +uint32_t nsMAPISession::DecrementSession() { return --m_nShared; } + +uint32_t nsMAPISession::GetSessionCount() { return m_nShared; } + +char16_t* nsMAPISession::GetPassword() { return (char16_t*)m_pPassword.get(); } + +void nsMAPISession::GetIdKey(nsCString& aKey) { + aKey = m_pIdKey; + return; +} diff --git a/comm/mailnews/mapi/mapihook/src/msgMapiMain.h b/comm/mailnews/mapi/mapihook/src/msgMapiMain.h new file mode 100644 index 0000000000..fcca6ca541 --- /dev/null +++ b/comm/mailnews/mapi/mapihook/src/msgMapiMain.h @@ -0,0 +1,80 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef MSG_MAPI_MAIN_H_ +#define MSG_MAPI_MAIN_H_ + +#define MAX_NAME_LEN 256 +#define MAX_PW_LEN 256 +#define MAX_SESSIONS 50 +#define MAPI_SENDCOMPLETE_EVENT "SendCompletionEvent" + +#define MAPI_PROPERTIES_CHROME "chrome://messenger-mapi/locale/mapi.properties" +#define PREF_MAPI_WARN_PRIOR_TO_BLIND_SEND "mapi.blind-send.warn" +#define PREF_MAPI_BLIND_SEND_ENABLED "mapi.blind-send.enabled" + +#include "nspr.h" +#include "nsTHashMap.h" +#include "nsClassHashtable.h" +#include "nsString.h" + +class nsMAPISession; + +class nsMAPIConfiguration { + private: + static uint32_t session_generator; + static uint32_t sessionCount; + static nsMAPIConfiguration* m_pSelfRef; + PRLock* m_Lock; + uint32_t m_nMaxSessions; + + nsTHashMap<nsCStringHashKey, uint32_t> m_ProfileMap; + nsClassHashtable<nsUint32HashKey, nsMAPISession> m_SessionMap; + nsMAPIConfiguration(); + ~nsMAPIConfiguration(); + + public: + static nsMAPIConfiguration* GetMAPIConfiguration(); + void OpenConfiguration(); + int16_t RegisterSession(uint32_t aHwnd, const nsCString& aUserName, + const nsCString& aPassword, bool aForceDownLoad, + bool aNewSession, uint32_t* aSession, + const char* aIdKey); + bool IsSessionValid(uint32_t aSessionID); + bool UnRegisterSession(uint32_t aSessionID); + char16_t* GetPassword(uint32_t aSessionID); + void GetIdKey(uint32_t aSessionID, nsCString& aKey); + void* GetMapiListContext(uint32_t aSessionID); + void SetMapiListContext(uint32_t aSessionID, void* mapiListContext); + + // a util func + static HRESULT GetMAPIErrorFromNSError(nsresult res); +}; + +class nsMAPISession { + friend class nsMAPIConfiguration; + + private: + uint32_t m_nShared; + nsCString m_pIdKey; + nsCString m_pProfileName; + nsCString m_pPassword; + void* m_listContext; // used by findNext + + public: + nsMAPISession(uint32_t aHwnd, const nsCString& aUserName, + const nsCString& aPassword, bool aForceDownLoad, + const char* aKey); + uint32_t IncrementSession(); + uint32_t DecrementSession(); + uint32_t GetSessionCount(); + char16_t* GetPassword(); + void GetIdKey(nsCString& aKey); + ~nsMAPISession(); + // For enumerating Messages... + void SetMapiListContext(void* listContext) { m_listContext = listContext; } + void* GetMapiListContext() { return m_listContext; } +}; + +#endif // MSG_MAPI_MAIN_H_ diff --git a/comm/mailnews/mapi/mapihook/src/msgMapiSupport.cpp b/comm/mailnews/mapi/mapihook/src/msgMapiSupport.cpp new file mode 100644 index 0000000000..9fd1655526 --- /dev/null +++ b/comm/mailnews/mapi/mapihook/src/msgMapiSupport.cpp @@ -0,0 +1,101 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "nsCOMPtr.h" +#include "objbase.h" +#include "nsISupports.h" + +#include "mozilla/ModuleUtils.h" +#include "mozilla/Services.h" +#include "nsIObserverService.h" +#include "Registry.h" +#include "msgMapiSupport.h" + +#include "msgMapiImp.h" + +/** Implementation of the nsIMapiSupport interface. + * Use standard implementation of nsISupports stuff. + */ + +NS_IMPL_ISUPPORTS(nsMapiSupport, nsIMapiSupport, nsIObserver) + +NS_IMETHODIMP +nsMapiSupport::Observe(nsISupports* aSubject, const char* aTopic, + const char16_t* aData) { + nsresult rv = NS_OK; + + if (!strcmp(aTopic, "profile-after-change")) return InitializeMAPISupport(); + + if (!strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID)) + return ShutdownMAPISupport(); + + nsCOMPtr<nsIObserverService> observerService = + mozilla::services::GetObserverService(); + NS_ENSURE_TRUE(observerService, NS_ERROR_UNEXPECTED); + + rv = observerService->AddObserver(this, "profile-after-change", false); + if (NS_FAILED(rv)) return rv; + + rv = observerService->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false); + if (NS_FAILED(rv)) return rv; + + return rv; +} + +nsMapiSupport::nsMapiSupport() : m_dwRegister(0), m_nsMapiFactory(nullptr) {} + +nsMapiSupport::~nsMapiSupport() {} + +NS_IMETHODIMP +nsMapiSupport::InitializeMAPISupport() { + ::OleInitialize(nullptr); + + if (m_nsMapiFactory == + nullptr) // No Registering if already done. Sanity Check!! + { + m_nsMapiFactory = new CMapiFactory(); + + if (m_nsMapiFactory != nullptr) { + HRESULT hr = ::CoRegisterClassObject(CLSID_CMapiImp, m_nsMapiFactory, + CLSCTX_LOCAL_SERVER, + REGCLS_MULTIPLEUSE, &m_dwRegister); + + if (FAILED(hr)) { + m_nsMapiFactory->Release(); + m_nsMapiFactory = nullptr; + return NS_ERROR_FAILURE; + } + } + } + + return NS_OK; +} + +NS_IMETHODIMP +nsMapiSupport::ShutdownMAPISupport() { + if (m_dwRegister != 0) ::CoRevokeClassObject(m_dwRegister); + + if (m_nsMapiFactory != nullptr) { + m_nsMapiFactory->Release(); + m_nsMapiFactory = nullptr; + } + + ::OleUninitialize(); + + return NS_OK; +} + +NS_IMETHODIMP +nsMapiSupport::RegisterServer() { + // TODO: Figure out what kind of error propagation to pass back + ::RegisterServer(CLSID_CMapiImp, L"Mozilla MAPI", L"MozillaMapi", + L"MozillaMapi.1"); + return NS_OK; +} + +NS_IMETHODIMP +nsMapiSupport::UnRegisterServer() { + // TODO: Figure out what kind of error propagation to pass back + ::UnregisterServer(CLSID_CMapiImp, L"MozillaMapi", L"MozillaMapi.1"); + return NS_OK; +} diff --git a/comm/mailnews/mapi/mapihook/src/msgMapiSupport.h b/comm/mailnews/mapi/mapihook/src/msgMapiSupport.h new file mode 100644 index 0000000000..af17ea637c --- /dev/null +++ b/comm/mailnews/mapi/mapihook/src/msgMapiSupport.h @@ -0,0 +1,35 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef MSG_MAPI_SUPPORT_H_ +#define MSG_MAPI_SUPPORT_H_ + +#include "nsIObserver.h" +#include "nsIMapiSupport.h" +#include "msgMapiFactory.h" + +#define NS_IMAPISUPPORT_CID \ + { \ + 0x8967fed2, 0xc8bb, 0x11d5, { \ + 0xa3, 0xe9, 0x00, 0xb0, 0xd0, 0xf3, 0xba, 0xa7 \ + } \ + } + +class nsMapiSupport : public nsIMapiSupport, public nsIObserver { + public: + nsMapiSupport(); + + // Declare all interface methods we must implement. + NS_DECL_THREADSAFE_ISUPPORTS + NS_DECL_NSIOBSERVER + NS_DECL_NSIMAPISUPPORT + + private: + virtual ~nsMapiSupport(); + + DWORD m_dwRegister; + CMapiFactory* m_nsMapiFactory; +}; + +#endif // MSG_MAPI_SUPPORT_H_ diff --git a/comm/mailnews/mapi/test/moz.build b/comm/mailnews/mapi/test/moz.build new file mode 100644 index 0000000000..6b37fdbe09 --- /dev/null +++ b/comm/mailnews/mapi/test/moz.build @@ -0,0 +1,6 @@ +# vim: set filetype=python: +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +XPCSHELL_TESTS_MANIFESTS += ["unit/xpcshell.ini"] diff --git a/comm/mailnews/mapi/test/unit/head_mapi.js b/comm/mailnews/mapi/test/unit/head_mapi.js new file mode 100644 index 0000000000..d80b7da173 --- /dev/null +++ b/comm/mailnews/mapi/test/unit/head_mapi.js @@ -0,0 +1,243 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +var { MailServices } = ChromeUtils.import( + "resource:///modules/MailServices.jsm" +); +var { ctypes } = ChromeUtils.importESModule( + "resource://gre/modules/ctypes.sys.mjs" +); +var { localAccountUtils } = ChromeUtils.import( + "resource://testing-common/mailnews/LocalAccountUtils.jsm" +); + +// Ensure the profile directory is set up. +do_get_profile(); + +// Import fakeserver +var { nsMailServer } = ChromeUtils.import( + "resource://testing-common/mailnews/Maild.jsm" +); +var { SmtpDaemon, SMTP_RFC2821_handler } = ChromeUtils.import( + "resource://testing-common/mailnews/Smtpd.jsm" +); + +var SMTP_PORT = 1024 + 120; +var POP3_PORT = 1024 + 121; + +// Setup the daemon and server +function setupServerDaemon(handler) { + if (!handler) { + handler = function (d) { + return new SMTP_RFC2821_handler(d); + }; + } + let daemon = new SmtpDaemon(); + let server = new nsMailServer(handler, daemon); + return [daemon, server]; +} + +function getBasicSmtpServer() { + // We need to have a default account for MAPI. + localAccountUtils.loadLocalMailAccount(); + let incoming = localAccountUtils.create_incoming_server( + "pop3", + POP3_PORT, + "user", + "password" + ); + let server = localAccountUtils.create_outgoing_server( + SMTP_PORT, + "user", + "password" + ); + // We also need to have a working identity, including an email address. + let account = MailServices.accounts.FindAccountForServer(incoming); + localAccountUtils.associate_servers(account, server, true); + let identity = account.defaultIdentity; + identity.email = "tinderbox@tinderbox.invalid"; + MailServices.accounts.defaultAccount = account; + + return server; +} + +/** + * Returns a structure allowing access to all of the Simple MAPI functions. + * The functions do not have the MAPI prefix on the variables. Also added are + * the three structures needed for MAPI. + */ +function loadMAPILibrary() { + // This is a hack to load the MAPI support in the current environment, as the + // profile-after-change event is never sent out. + var gMapiSupport = Cc["@mozilla.org/mapisupport;1"].getService( + Ci.nsIObserver + ); + gMapiSupport.observe(null, "profile-after-change", null); + // Set some preferences to make MAPI (particularly blind MAPI, aka work + // without a dialog box) work properly. + Services.prefs.setBoolPref("mapi.blind-send.enabled", true); + Services.prefs.setBoolPref("mapi.blind-send.warn", false); + + // The macros that are used in the definitions + let WINAPI = ctypes.winapi_abi; + let ULONG = ctypes.unsigned_long; + let LHANDLE = ULONG.ptr; + let LPSTR = ctypes.char.ptr; + let LPVOID = ctypes.voidptr_t; + let FLAGS = ctypes.unsigned_long; + + // Define all of the MAPI structs we need to use. + let functionData = {}; + functionData.MapiRecipDesc = new ctypes.StructType("gMapi.MapiRecipDesc", [ + { ulReserved: ULONG }, + { ulRecipClass: ULONG }, + { lpszName: LPSTR }, + { lpszAddress: LPSTR }, + { ulEIDSize: ULONG }, + { lpEntryID: LPVOID }, + ]); + let lpMapiRecipDesc = functionData.MapiRecipDesc.ptr; + + functionData.MapiFileDesc = new ctypes.StructType("gMapi.MapiFileDesc", [ + { ulReserved: ULONG }, + { flFlags: ULONG }, + { nPosition: ULONG }, + { lpszPathName: LPSTR }, + { lpszFileName: LPSTR }, + { lpFileType: LPVOID }, + ]); + let lpMapiFileDesc = functionData.MapiFileDesc.ptr; + + functionData.MapiMessage = new ctypes.StructType("gMapi.MapiMessage", [ + { ulReserved: ULONG }, + { lpszSubject: LPSTR }, + { lpszNoteText: LPSTR }, + { lpszMessageType: LPSTR }, + { lpszDateReceived: LPSTR }, + { lpszConversationID: LPSTR }, + { flFlags: FLAGS }, + { lpOriginator: lpMapiRecipDesc }, + { nRecipCount: ULONG }, + { lpRecips: lpMapiRecipDesc }, + { nFileCount: ULONG }, + { lpFiles: lpMapiFileDesc }, + ]); + let lpMapiMessage = functionData.MapiMessage.ptr; + + // Load the MAPI library. We're using our definition instead of the global + // MAPI definition. + let mapi = ctypes.open("mozMapi32.dll"); + + // Load the MAPI functions, + // see https://developer.mozilla.org/en-US/docs/Mozilla/js-ctypes/Using_js-ctypes/Declaring_types + // for details. The first three parameters of the declaration are name, API flag and output value. + // This is followed by input parameters. + + // MAPIAddress is not supported. + + functionData.DeleteMail = mapi.declare( + "MAPIDeleteMail", + WINAPI, + ULONG, + LHANDLE, // lhSession + ULONG.ptr, // ulUIParam + LPSTR, // lpszMessageID + FLAGS, // flFlags + ULONG + ); // ulReserved + + // MAPIDetails is not supported. + + functionData.FindNext = mapi.declare( + "MAPIFindNext", + WINAPI, + ULONG, + LHANDLE, // lhSession + ULONG.ptr, // ulUIParam + LPSTR, // lpszMessageType + LPSTR, // lpszSeedMessageID + FLAGS, // flFlags + ULONG, // ulReserved + LPSTR + ); // lpszMessageID + + functionData.FreeBuffer = mapi.declare( + "MAPIFreeBuffer", + WINAPI, + ULONG, + LPVOID + ); // pv + + functionData.Logoff = mapi.declare( + "MAPILogoff", + WINAPI, + ULONG, + LHANDLE, // lhSession + ULONG.ptr, // ulUIParam + FLAGS, // flFlags + ULONG + ); // ulReserved + + functionData.Logon = mapi.declare( + "MAPILogon", + WINAPI, + ULONG, + ULONG.ptr, // ulUIParam + LPSTR, // lpszProfileName + LPSTR, // lpszPassword + FLAGS, // flFlags + ULONG, // ulReserved + LHANDLE.ptr + ); // lplhSession + + functionData.ReadMail = mapi.declare( + "MAPIReadMail", + WINAPI, + ULONG, + LHANDLE, // lhSession + ULONG.ptr, // ulUIParam + LPSTR, // lpszMessageID + FLAGS, // flFlags + ULONG, // ulReserved + lpMapiMessage.ptr + ); // *lppMessage + + functionData.ResolveName = mapi.declare( + "MAPIResolveName", + WINAPI, + ULONG, + LHANDLE, // lhSession + ULONG.ptr, // ulUIParam + LPSTR, // lpszName + FLAGS, // flFlags + ULONG, // ulReserved + lpMapiRecipDesc.ptr + ); // *lppRecip + + // MAPISaveMail is not supported. + + functionData.SendDocuments = mapi.declare( + "MAPISendDocuments", + WINAPI, + ULONG, + ULONG.ptr, // ulUIParam + LPSTR, // lpszDelimChar + LPSTR, // lpszFilePaths + LPSTR, // lpszFileNames + ULONG + ); // ulReserved + + functionData.SendMail = mapi.declare( + "MAPISendMail", + WINAPI, + ULONG, + LHANDLE, // lhSession + ULONG.ptr, // ulUIParam + lpMapiMessage, // lpMessage + FLAGS, // flFlags + ULONG + ); // ulReserved + + return functionData; +} diff --git a/comm/mailnews/mapi/test/unit/tail_mapi.js b/comm/mailnews/mapi/test/unit/tail_mapi.js new file mode 100644 index 0000000000..f64ae61317 --- /dev/null +++ b/comm/mailnews/mapi/test/unit/tail_mapi.js @@ -0,0 +1 @@ +load("../../../resources/mailShutdown.js"); diff --git a/comm/mailnews/mapi/test/unit/test_mapisendmail.js b/comm/mailnews/mapi/test/unit/test_mapisendmail.js new file mode 100644 index 0000000000..5dc480af9e --- /dev/null +++ b/comm/mailnews/mapi/test/unit/test_mapisendmail.js @@ -0,0 +1,97 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +var { ctypes } = ChromeUtils.importESModule( + "resource://gre/modules/ctypes.sys.mjs" +); +var { MimeParser } = ChromeUtils.import("resource:///modules/mimeParser.jsm"); +var { mailTestUtils } = ChromeUtils.import( + "resource://testing-common/mailnews/MailTestUtils.jsm" +); + +// Set up an SMTP server and the MAPI daemon. +getBasicSmtpServer(); +let [daemon, server] = setupServerDaemon(); +server.start(SMTP_PORT); +let mapi = loadMAPILibrary(); + +registerCleanupFunction(() => { + server.stop(); +}); + +/** + * Construct a MapiMessage, then send through MAPI. + * + * @param {boolean} offline - Switch to offline mode if true. + */ +function testMapiSendMail(offline) { + Services.io.offline = offline; + + // Build a message using the MAPI interface. + let message = new mapi.MapiMessage(); + message.lpszSubject = ctypes.char.array()(`Hello, MAPI offline=${offline}!`); + message.lpszNoteText = ctypes.char.array()("I successfully sent a message!"); + message.lpszMessageType = ctypes.char.array()(""); + + let file = do_get_file("../../../compose/test/unit/data/message1.eml"); + let attachment = new mapi.MapiFileDesc(); + attachment.lpszFileName = ctypes.char.array()(file.leafName); + attachment.lpszPathName = ctypes.char.array()(file.path); + message.nFileCount = 1; + message.lpFiles = attachment.address(); + + let recipient = new mapi.MapiRecipDesc(); + recipient.ulRecipClass = 1; /* MAPI_TO */ + recipient.lpszName = ctypes.char.array()("John Doe"); + recipient.lpszAddress = ctypes.char.array()("SMTP:john.doe@example.com"); + message.nRecipCount = 1; + message.lpRecips = recipient.address(); + + // Use MAPISendMail to send this message. + mapi.SendMail( + null /* No session */, + null /* No HWND */, + message.address(), + 0x2 /* MAPI_NEW_SESSION */, + 0 + ); +} + +/** + * Test that when we're online, the message can be sent correctly to the SMTP + * server. + */ +add_task(function mapiSendMailOnline() { + server.resetTest(); + testMapiSendMail(false); + + // Check that the post has the correct information. + let [headers, body] = MimeParser.extractHeadersAndBody(daemon.post); + Assert.equal(headers.get("from")[0].email, "tinderbox@tinderbox.invalid"); + Assert.equal(headers.get("to")[0].email, "john.doe@example.com"); + Assert.equal(headers.get("subject"), "Hello, MAPI offline=false!"); + Assert.ok(body.includes("I successfully sent a message!")); + Assert.ok(body.includes("this email is in dos format")); +}); + +/** + * Test that when we're offline, the message can be saved correctly to the Outbox. + */ +add_task(function mapiSendMailOffline() { + server.resetTest(); + testMapiSendMail(true); + + let outbox = localAccountUtils.rootFolder.getChildNamed("Outbox"); + let msgData = mailTestUtils.loadMessageToString( + outbox, + mailTestUtils.firstMsgHdr(outbox) + ); + // Check that the post has the correct information. + let [headers, body] = MimeParser.extractHeadersAndBody(msgData); + Assert.equal(headers.get("from")[0].email, "tinderbox@tinderbox.invalid"); + Assert.equal(headers.get("to")[0].email, "john.doe@example.com"); + Assert.equal(headers.get("subject"), "Hello, MAPI offline=true!"); + Assert.ok(body.includes("I successfully sent a message!")); + Assert.ok(body.includes("this email is in dos format")); +}); diff --git a/comm/mailnews/mapi/test/unit/xpcshell.ini b/comm/mailnews/mapi/test/unit/xpcshell.ini new file mode 100644 index 0000000000..8d4fe504ab --- /dev/null +++ b/comm/mailnews/mapi/test/unit/xpcshell.ini @@ -0,0 +1,7 @@ +[DEFAULT] +head = head_mapi.js +tail = tail_mapi.js +run-sequentially = Need to use well-known port for SMTP. + +[test_mapisendmail.js] +skip-if = true # Not yet enabled, see bug 1526807. |