1 /*
2  *	M A P I S P I . H
3  *
4  *  Defines the calls and structures exchanged between MAPI or the spooler
5  *  and the MAPI service providers
6  *
7  *  Copyright (c) 2009 Microsoft Corporation. All Rights Reserved.
8  */
9 
10 #ifndef MAPISPI_H
11 #define MAPISPI_H
12 #if _MSC_VER > 1000
13 #pragma once
14 #endif
15 
16 /* Include common MAPI header files if they haven't been already. */
17 #ifndef MAPIDEFS_H
18 #include <mapidefs.h>
19 #endif
20 #ifndef MAPICODE_H
21 #include <mapicode.h>
22 #endif
23 #ifndef MAPIGUID_H
24 #include <mapiguid.h>
25 #endif
26 #ifndef MAPITAGS_H
27 #include <mapitags.h>
28 #endif
29 
30 
31 #ifndef BEGIN_INTERFACE
32 #define BEGIN_INTERFACE
33 #endif
34 
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38 
39 /*	The MAPI SPI has a version number.  MAPIX.DLL knows and supports
40  *	one or more versions of the SPI.  Each provider supports one or
41  *	more versions of the SPI.  Checks are performed in both MAPIX.DLL
42  *	and in the provider to ensure that they agree to use exactly one
43  *	version of the MAPI SPI.
44  *
45  *	The SPI version number is composed of a major (8-bit) version,
46  *	minor (8-bit) version, and micro (16-bit) version.  The first
47  *	retail ship of MAPI 1.0 is expected to be version 1.0.0.
48  *	The major version number changes rarely.
49  *	The minor version number changes opon each retail ship of
50  *	MAPI if the SPI has been modified.
51  *	The micro version number changes internally at Microsoft
52  *	during development of MAPI.
53  *
54  *	The version of the SPI documented by this set of header files
55  *	is ALWAYS known as "CURRENT_SPI_VERSION".  If you write a
56  *	service provider, and get a new set of header files, and update
57  *	your code to the new interface, you'll be at the "current" version.
58  */
59 #define	CURRENT_SPI_VERSION	0x00010010L
60 
61 /*	Here are some well-known SPI version numbers:
62  *	(These will eventually be useful for provider-writers who
63  *	might choose to make provider DLLs that support more than
64  *	one version of the MAPI SPI.
65  */
66 #define	PDK1_SPI_VERSION	0x00010000L	/* 0.1.0  MAPI PDK1 Spring 1993 */
67 
68 #define	PDK2_SPI_VERSION	0x00010008L /* 0.1.8  MAPI PDK2 Spring 1994 */
69 
70 #define PDK3_SPI_VERSION	0x00010010L /* 0.1.16 MAPI PDK3 Fall 1994   */
71 
72 /*
73  * Forward declaration of interface pointers specific to the service
74  * provider interface.
75  */
76 DECLARE_MAPI_INTERFACE_PTR(IMAPISupport, LPMAPISUP);
77 
78 /* IMAPISupport Interface -------------------------------------------------- */
79 
80 /* Notification key structure for the MAPI notification engine */
81 
82 typedef struct
83 {
84 	ULONG		cb;				/* How big the key is */
85 	BYTE		ab[MAPI_DIM];	/* Key contents */
86 } NOTIFKEY, FAR * LPNOTIFKEY;
87 
88 #define CbNewNOTIFKEY(_cb)		(offsetof(NOTIFKEY,ab) + (_cb))
89 #define CbNOTIFKEY(_lpkey)		(offsetof(NOTIFKEY,ab) + (_lpkey)->cb)
90 #define SizedNOTIFKEY(_cb, _name) \
91 	struct _NOTIFKEY_ ## _name \
92 { \
93 	ULONG		cb; \
94 	BYTE		ab[_cb]; \
95 } _name
96 
97 
98 /* For Subscribe() */
99 
100 #define NOTIFY_SYNC				((ULONG) 0x40000000)
101 
102 /* For Notify() */
103 
104 #define NOTIFY_CANCELED			((ULONG) 0x80000000)
105 
106 
107 /* From the Notification Callback function (well, this is really a ulResult) */
108 
109 #define CALLBACK_DISCONTINUE	((ULONG) 0x80000000)
110 
111 /* For Transport's SpoolerNotify() */
112 
113 #define NOTIFY_NEWMAIL			((ULONG) 0x00000001)
114 #define NOTIFY_READYTOSEND		((ULONG) 0x00000002)
115 #define NOTIFY_SENTDEFERRED		((ULONG) 0x00000004)
116 #define NOTIFY_CRITSEC			((ULONG) 0x00001000)
117 #define NOTIFY_NONCRIT			((ULONG) 0x00002000)
118 #define NOTIFY_CONFIG_CHANGE	((ULONG) 0x00004000)
119 #define NOTIFY_CRITICAL_ERROR	((ULONG) 0x10000000)
120 
121 /* For Message Store's SpoolerNotify() */
122 
123 #define NOTIFY_NEWMAIL_RECEIVED	((ULONG) 0x20000000)
124 
125 /* For ModifyStatusRow() */
126 
127 #define	STATUSROW_UPDATE		((ULONG) 0x10000000)
128 
129 /* For IStorageFromStream() */
130 
131 #define STGSTRM_RESET			((ULONG) 0x00000000)
132 #define STGSTRM_CURRENT			((ULONG) 0x10000000)
133 #define STGSTRM_MODIFY			((ULONG) 0x00000002)
134 #define STGSTRM_CREATE			((ULONG) 0x00001000)
135 
136 /* For GetOneOffTable() */
137 /****** MAPI_UNICODE			((ULONG) 0x80000000) */
138 
139 /* For CreateOneOff() */
140 /****** MAPI_UNICODE			((ULONG) 0x80000000) */
141 /****** MAPI_SEND_NO_RICH_INFO	((ULONG) 0x00010000) */
142 
143 /* For ReadReceipt() */
144 #define MAPI_NON_READ			((ULONG) 0x00000001)
145 
146 /* For DoConfigPropSheet() */
147 /****** MAPI_UNICODE			((ULONG) 0x80000000) */
148 
149 /* Preprocessor calls: */
150 
151 /* PreprocessMessage, first ordinal in RegisterPreprocessor(). */
152 
153 typedef HRESULT (STDMETHODCALLTYPE PREPROCESSMESSAGE)(
154 					LPVOID lpvSession,
155 					LPMESSAGE lpMessage,
156 					LPADRBOOK lpAdrBook,
157 					LPMAPIFOLDER lpFolder,
158 					LPALLOCATEBUFFER AllocateBuffer,
159 					LPALLOCATEMORE AllocateMore,
160 					LPFREEBUFFER FreeBuffer,
161 					ULONG FAR *lpcOutbound,
162 					LPMESSAGE FAR * FAR *lpppMessage,
163 					LPADRLIST FAR *lppRecipList);
164 
165 /* RemovePreprocessInfo, second ordinal in RegisterPreprocessor(). */
166 
167 typedef HRESULT (STDMETHODCALLTYPE REMOVEPREPROCESSINFO)(LPMESSAGE lpMessage);
168 
169 /* Function pointer for GetReleaseInfo */
170 
171 #define MAPI_IMAPISUPPORT_METHODS1(IPURE)								\
172 	MAPIMETHOD(GetLastError)											\
173 		(THIS_	HRESULT						hResult,					\
174 				ULONG						ulFlags,					\
175 				LPMAPIERROR FAR *			lppMAPIError) IPURE;		\
176 	MAPIMETHOD(GetMemAllocRoutines)										\
177 		(THIS_	LPALLOCATEBUFFER FAR *		lpAllocateBuffer,			\
178 				LPALLOCATEMORE FAR *		lpAllocateMore,				\
179 				LPFREEBUFFER FAR *			lpFreeBuffer) IPURE;		\
180 	MAPIMETHOD(Subscribe)												\
181 		(THIS_	LPNOTIFKEY					lpKey,						\
182 				ULONG						ulEventMask,				\
183 				ULONG						ulFlags,					\
184 				LPMAPIADVISESINK			lpAdviseSink,				\
185 				ULONG_PTR FAR *				lpulConnection) IPURE;		\
186 	MAPIMETHOD(Unsubscribe)												\
187 		(THIS_	ULONG_PTR					ulConnection) IPURE;		\
188 	MAPIMETHOD(Notify)													\
189 		(THIS_	LPNOTIFKEY					lpKey,						\
190 				ULONG						cNotification,				\
191 				LPNOTIFICATION				lpNotifications,			\
192 				ULONG FAR *					lpulFlags) IPURE;			\
193 	MAPIMETHOD(ModifyStatusRow)											\
194 		(THIS_	ULONG						cValues,					\
195 				LPSPropValue				lpColumnVals,				\
196 				ULONG						ulFlags) IPURE;				\
197 	MAPIMETHOD(OpenProfileSection)										\
198 		(THIS_	LPMAPIUID					lpUid,						\
199 				ULONG						ulFlags,					\
200 				LPPROFSECT FAR *			lppProfileObj) IPURE;		\
201 	MAPIMETHOD(RegisterPreprocessor)									\
202 		(THIS_	LPMAPIUID					lpMuid,						\
203 				LPTSTR						lpszAdrType,				\
204 				LPTSTR						lpszDLLName,				\
205 				LPSTR	/* String8! */		lpszPreprocess,				\
206 				LPSTR	/* String8! */		lpszRemovePreprocessInfo,	\
207 				ULONG						ulFlags) IPURE;				\
208 	MAPIMETHOD(NewUID)													\
209 		(THIS_	LPMAPIUID					lpMuid) IPURE;				\
210 	MAPIMETHOD(MakeInvalid)												\
211 		(THIS_	ULONG						ulFlags,					\
212 				LPVOID						lpObject,					\
213 				ULONG						ulRefCount,					\
214 				ULONG						cMethods) IPURE;			\
215 
216 #define MAPI_IMAPISUPPORT_METHODS2(IPURE)								\
217 	MAPIMETHOD(SpoolerYield)											\
218 		(THIS_	ULONG						ulFlags) IPURE;				\
219 	MAPIMETHOD(SpoolerNotify)											\
220 		(THIS_	ULONG						ulFlags,					\
221 				LPVOID						lpvData) IPURE;				\
222 	MAPIMETHOD(CreateOneOff)											\
223 		(THIS_	LPTSTR						lpszName,					\
224 				LPTSTR						lpszAdrType,				\
225 				LPTSTR						lpszAddress,				\
226 				ULONG						ulFlags,					\
227 				ULONG FAR *					lpcbEntryID,				\
228 				LPENTRYID FAR *				lppEntryID) IPURE;			\
229 	MAPIMETHOD(SetProviderUID)											\
230 		(THIS_	LPMAPIUID					lpProviderID,				\
231 				ULONG						ulFlags) IPURE;				\
232 	MAPIMETHOD(CompareEntryIDs)											\
233 		(THIS_	ULONG						cbEntry1,					\
234 				LPENTRYID					lpEntry1,					\
235 				ULONG						cbEntry2,					\
236 				LPENTRYID					lpEntry2,					\
237 				ULONG						ulCompareFlags,				\
238 				ULONG FAR *					lpulResult) IPURE;			\
239 	MAPIMETHOD(OpenTemplateID)											\
240 		(THIS_	ULONG						cbTemplateID,				\
241 				LPENTRYID					lpTemplateID,				\
242 				ULONG						ulTemplateFlags,			\
243 				LPMAPIPROP					lpMAPIPropData,				\
244 				LPCIID						lpInterface,				\
245 				LPMAPIPROP FAR *			lppMAPIPropNew,				\
246 				LPMAPIPROP					lpMAPIPropSibling) IPURE;	\
247 	MAPIMETHOD(OpenEntry)												\
248 		(THIS_	ULONG						cbEntryID,					\
249 				LPENTRYID					lpEntryID,					\
250 				LPCIID						lpInterface,				\
251 				ULONG						ulOpenFlags,				\
252 				ULONG FAR *					lpulObjType,				\
253 				LPUNKNOWN FAR *				lppUnk) IPURE;				\
254 	MAPIMETHOD(GetOneOffTable)											\
255 		(THIS_	ULONG						ulFlags,					\
256 				LPMAPITABLE FAR *			lppTable) IPURE;			\
257 	MAPIMETHOD(Address)													\
258 		(THIS_	ULONG_PTR FAR *				lpulUIParam,				\
259 				LPADRPARM					lpAdrParms,					\
260 				LPADRLIST FAR *				lppAdrList) IPURE;			\
261 	MAPIMETHOD(Details)													\
262 		(THIS_	ULONG_PTR FAR *				lpulUIParam,				\
263 				LPFNDISMISS					lpfnDismiss,				\
264 				LPVOID						lpvDismissContext,			\
265 				ULONG						cbEntryID,					\
266 				LPENTRYID					lpEntryID,					\
267 				LPFNBUTTON					lpfButtonCallback,			\
268 				LPVOID						lpvButtonContext,			\
269 				LPTSTR						lpszButtonText,				\
270 				ULONG						ulFlags) IPURE;				\
271 	MAPIMETHOD(NewEntry)												\
272 		(THIS_	ULONG_PTR					ulUIParam,					\
273 				ULONG						ulFlags,					\
274 				ULONG						cbEIDContainer,				\
275 				LPENTRYID					lpEIDContainer,				\
276 				ULONG						cbEIDNewEntryTpl,			\
277 				LPENTRYID					lpEIDNewEntryTpl,			\
278 				ULONG FAR *					lpcbEIDNewEntry,			\
279 				LPENTRYID FAR *				lppEIDNewEntry) IPURE;		\
280 	MAPIMETHOD(DoConfigPropsheet)										\
281 		(THIS_	ULONG_PTR					ulUIParam,					\
282 				ULONG						ulFlags,					\
283 				LPTSTR						lpszTitle,					\
284 				LPMAPITABLE					lpDisplayTable,				\
285 				LPMAPIPROP					lpCOnfigData,				\
286 				ULONG						ulTopPage) IPURE;			\
287 	MAPIMETHOD(CopyMessages)											\
288 		(THIS_	LPCIID						lpSrcInterface,				\
289 				LPVOID						lpSrcFolder,				\
290 				LPENTRYLIST					lpMsgList,					\
291 				LPCIID						lpDestInterface,			\
292 				LPVOID 						lpDestFolder,				\
293 				ULONG_PTR					ulUIParam,					\
294 				LPMAPIPROGRESS				lpProgress,					\
295 				ULONG						ulFlags) IPURE;				\
296 	MAPIMETHOD(CopyFolder)												\
297 		(THIS_	LPCIID						lpSrcInterface,				\
298 				LPVOID						lpSrcFolder,				\
299 				ULONG						cbEntryID,					\
300 				LPENTRYID					lpEntryID,					\
301 				LPCIID						lpDestInterface,			\
302 				LPVOID 						lpDestFolder,				\
303 				LPTSTR 						lszNewFolderName,			\
304 				ULONG_PTR					ulUIParam,					\
305 				LPMAPIPROGRESS				lpProgress,					\
306 				ULONG						ulFlags) IPURE;				\
307 
308 #define MAPI_IMAPISUPPORT_METHODS3(IPURE)								\
309 	MAPIMETHOD(DoCopyTo)												\
310 		(THIS_	LPCIID						lpSrcInterface,				\
311 				LPVOID						lpSrcObj,					\
312 				ULONG						ciidExclude,				\
313 				LPCIID						rgiidExclude,				\
314 				LPSPropTagArray				lpExcludeProps,				\
315 				ULONG_PTR					ulUIParam,					\
316 				LPMAPIPROGRESS				lpProgress,					\
317 				LPCIID						lpDestInterface,			\
318 				LPVOID						lpDestObj,					\
319 				ULONG						ulFlags,					\
320 				LPSPropProblemArray FAR *	lppProblems) IPURE;			\
321 	MAPIMETHOD(DoCopyProps)												\
322 		(THIS_	LPCIID						lpSrcInterface,				\
323 				LPVOID						lpSrcObj,					\
324 				LPSPropTagArray				lpIncludeProps,				\
325 				ULONG_PTR					ulUIParam,					\
326 				LPMAPIPROGRESS				lpProgress,					\
327 				LPCIID						lpDestInterface,			\
328 				LPVOID						lpDestObj,					\
329 				ULONG						ulFlags,					\
330 				LPSPropProblemArray FAR *	lppProblems) IPURE;			\
331 	MAPIMETHOD(DoProgressDialog)										\
332 		(THIS_	ULONG_PTR					ulUIParam,					\
333 				ULONG						ulFlags,					\
334 				LPMAPIPROGRESS FAR *		lppProgress) IPURE;			\
335 	MAPIMETHOD(ReadReceipt)												\
336 		(THIS_	ULONG						ulFlags,					\
337 				LPMESSAGE					lpReadMessage,				\
338 				LPMESSAGE FAR *				lppEmptyMessage) IPURE;		\
339 	MAPIMETHOD(PrepareSubmit)											\
340 		(THIS_	LPMESSAGE					lpMessage,					\
341 				ULONG FAR *					lpulFlags) IPURE;			\
342 	MAPIMETHOD(ExpandRecips)											\
343 		(THIS_	LPMESSAGE					lpMessage,					\
344 				ULONG FAR *					lpulFlags) IPURE;			\
345 	MAPIMETHOD(UpdatePAB)												\
346 		(THIS_	ULONG						ulFlags,					\
347 				LPMESSAGE					lpMessage) IPURE;			\
348 	MAPIMETHOD(DoSentMail)												\
349 		(THIS_	ULONG						ulFlags,					\
350 				LPMESSAGE					lpMessage) IPURE;			\
351 	MAPIMETHOD(OpenAddressBook)											\
352 		(THIS_	LPCIID						lpInterface,				\
353 				ULONG						ulFlags,					\
354 				LPADRBOOK FAR *				lppAdrBook) IPURE;			\
355 	MAPIMETHOD(Preprocess)												\
356 		(THIS_	ULONG						ulFlags,					\
357 				ULONG						cbEntryID,					\
358 				LPENTRYID					lpEntryID) IPURE;			\
359 	MAPIMETHOD(CompleteMsg)												\
360 		(THIS_	ULONG						ulFlags,					\
361 				ULONG						cbEntryID,					\
362 				LPENTRYID					lpEntryID) IPURE;			\
363 	MAPIMETHOD(StoreLogoffTransports)									\
364 		(THIS_	ULONG FAR *					lpulFlags) IPURE;			\
365 	MAPIMETHOD(StatusRecips)											\
366 		(THIS_	LPMESSAGE					lpMessage,					\
367 				LPADRLIST					lpRecipList) IPURE;			\
368 	MAPIMETHOD(WrapStoreEntryID)										\
369 		(THIS_	ULONG						cbOrigEntry,				\
370 				LPENTRYID					lpOrigEntry,				\
371 				ULONG FAR *					lpcbWrappedEntry,			\
372 				LPENTRYID FAR *				lppWrappedEntry) IPURE;		\
373 	MAPIMETHOD(ModifyProfile)											\
374 		(THIS_	ULONG						ulFlags) IPURE;				\
375 	MAPIMETHOD(IStorageFromStream)										\
376 		(THIS_	LPUNKNOWN					lpUnkIn,					\
377 				LPCIID						lpInterface,				\
378 				ULONG						ulFlags,					\
379 				LPSTORAGE FAR *				lppStorageOut) IPURE;		\
380 	MAPIMETHOD(GetSvcConfigSupportObj)									\
381 		(THIS_	ULONG						ulFlags,					\
382 				LPMAPISUP FAR *				lppSvcSupport) IPURE;		\
383 
384 #undef		 INTERFACE
385 #define		 INTERFACE  IMAPISupport
DECLARE_MAPI_INTERFACE_(IMAPISupport,IUnknown)386 DECLARE_MAPI_INTERFACE_(IMAPISupport, IUnknown)
387 {
388 	BEGIN_INTERFACE
389 	MAPI_IUNKNOWN_METHODS(PURE)
390 	MAPI_IMAPISUPPORT_METHODS1(PURE)
391 	MAPI_IMAPISUPPORT_METHODS2(PURE)
392 	MAPI_IMAPISUPPORT_METHODS3(PURE)
393 };
394 
395 
396 /********************************************************************/
397 /*																	*/
398 /*							ADDRESS BOOK SPI						*/
399 /*																	*/
400 /********************************************************************/
401 
402 /* Address Book Provider ------------------------------------------------- */
403 
404 /* OpenTemplateID() */
405 #define FILL_ENTRY				((ULONG) 0x00000001)
406 
407 /* For Logon() */
408 
409 /*#define AB_NO_DIALOG			((ULONG) 0x00000001) in mapidefs.h */
410 /*#define MAPI_UNICODE			((ULONG) 0x80000000) in mapidefs.h */
411 
412 
413 
414 DECLARE_MAPI_INTERFACE_PTR(IABProvider, LPABPROVIDER);
415 DECLARE_MAPI_INTERFACE_PTR(IABLogon,    LPABLOGON);
416 
417 #define MAPI_IABPROVIDER_METHODS(IPURE)                                 \
418 	MAPIMETHOD(Shutdown)												\
419 		(THIS_	ULONG FAR *					lpulFlags) IPURE;			\
420     MAPIMETHOD(Logon)                                                   \
421         (THIS_  LPMAPISUP                   lpMAPISup,                  \
422                 ULONG_PTR                   ulUIParam,                  \
423                 LPTSTR                      lpszProfileName,            \
424                 ULONG                       ulFlags,                    \
425 				ULONG FAR *					lpulpcbSecurity,			\
426 				LPBYTE FAR *				lppbSecurity,				\
427                 LPMAPIERROR FAR *			lppMAPIError,				\
428                 LPABLOGON FAR *             lppABLogon) IPURE;          \
429 
430 #undef       INTERFACE
431 #define      INTERFACE  IABProvider
DECLARE_MAPI_INTERFACE_(IABProvider,IUnknown)432 DECLARE_MAPI_INTERFACE_(IABProvider, IUnknown)
433 {
434 	BEGIN_INTERFACE
435     MAPI_IUNKNOWN_METHODS(PURE)
436     MAPI_IABPROVIDER_METHODS(PURE)
437 };
438 
439 /* For GetOneOffTable() */
440 /****** MAPI_UNICODE			((ULONG) 0x80000000) */
441 
442 #define MAPI_IABLOGON_METHODS(IPURE)                                    \
443 	MAPIMETHOD(GetLastError)											\
444 		(THIS_	HRESULT						hResult,					\
445 				ULONG						ulFlags,					\
446 				LPMAPIERROR FAR *			lppMAPIError) IPURE;		\
447 	MAPIMETHOD(Logoff)													\
448 		(THIS_	ULONG						ulFlags) IPURE;				\
449     MAPIMETHOD(OpenEntry)                                               \
450         (THIS_  ULONG                       cbEntryID,                  \
451                 LPENTRYID                   lpEntryID,                  \
452                 LPCIID                      lpInterface,                \
453                 ULONG                       ulFlags,                    \
454                 ULONG FAR *                 lpulObjType,                \
455 				LPUNKNOWN FAR *				lppUnk) IPURE;				\
456     MAPIMETHOD(CompareEntryIDs)                                         \
457         (THIS_  ULONG                       cbEntryID1,                 \
458                 LPENTRYID                   lpEntryID1,                 \
459                 ULONG                       cbEntryID2,                 \
460                 LPENTRYID                   lpEntryID2,                 \
461                 ULONG                       ulFlags,                    \
462                 ULONG FAR *                 lpulResult) IPURE;          \
463     MAPIMETHOD(Advise)				                                    \
464         (THIS_  ULONG                       cbEntryID,                  \
465                 LPENTRYID                   lpEntryID,                  \
466                 ULONG                       ulEventMask,                \
467 				LPMAPIADVISESINK			lpAdviseSink,				\
468 				ULONG_PTR FAR *				lpulConnection) IPURE;		\
469 	MAPIMETHOD(Unadvise)												\
470 		(THIS_	ULONG_PTR					ulConnection) IPURE;		\
471     MAPIMETHOD(OpenStatusEntry)                                         \
472         (THIS_  LPCIID                       lpInterface,                \
473                 ULONG                       ulFlags,                    \
474                 ULONG FAR *                 lpulObjType,                \
475                 LPMAPISTATUS FAR *          lppEntry) IPURE;            \
476     MAPIMETHOD(OpenTemplateID)                                          \
477         (THIS_  ULONG                       cbTemplateID,               \
478                 LPENTRYID                   lpTemplateID,               \
479                 ULONG                       ulTemplateFlags,            \
480                 LPMAPIPROP                  lpMAPIPropData,             \
481                 LPCIID                       lpInterface,                \
482                 LPMAPIPROP FAR *            lppMAPIPropNew,             \
483                 LPMAPIPROP                  lpMAPIPropSibling) IPURE;   \
484     MAPIMETHOD(GetOneOffTable)                                          \
485         (THIS_	ULONG						ulFlags,					\
486 				LPMAPITABLE FAR *           lppTable) IPURE;            \
487 	MAPIMETHOD(PrepareRecips)											\
488 		(THIS_	ULONG						ulFlags,					\
489 				LPSPropTagArray				lpPropTagArray,				\
490 				LPADRLIST					lpRecipList) IPURE;			\
491 
492 #undef       INTERFACE
493 #define      INTERFACE  IABLogon
DECLARE_MAPI_INTERFACE_(IABLogon,IUnknown)494 DECLARE_MAPI_INTERFACE_(IABLogon, IUnknown)
495 {
496 	BEGIN_INTERFACE
497     MAPI_IUNKNOWN_METHODS(PURE)
498     MAPI_IABLOGON_METHODS(PURE)
499 };
500 
501 typedef HRESULT (STDMAPIINITCALLTYPE ABPROVIDERINIT)(
502 	HINSTANCE			hInstance,
503 	LPMALLOC			lpMalloc,
504 	LPALLOCATEBUFFER	lpAllocateBuffer,
505 	LPALLOCATEMORE 		lpAllocateMore,
506 	LPFREEBUFFER 		lpFreeBuffer,
507     ULONG				ulFlags,
508     ULONG				ulMAPIVer,
509     ULONG FAR *			lpulProviderVer,
510     LPABPROVIDER FAR *	lppABProvider
511 );
512 
513 ABPROVIDERINIT ABProviderInit;
514 
515 
516 
517 /********************************************************************/
518 /*																	*/
519 /*							TRANSPORT SPI							*/
520 /*																	*/
521 /********************************************************************/
522 
523 /* For DeinitTransport */
524 
525 #define	DEINIT_NORMAL				((ULONG) 0x00000001)
526 #define	DEINIT_HURRY				((ULONG) 0x80000000)
527 
528 /* For TransportLogon */
529 
530 /* Flags that the Spooler may pass to the transport: */
531 
532 #define LOGON_NO_DIALOG				((ULONG) 0x00000001)
533 #define	LOGON_NO_CONNECT			((ULONG) 0x00000004)
534 #define	LOGON_NO_INBOUND			((ULONG) 0x00000008)
535 #define	LOGON_NO_OUTBOUND			((ULONG) 0x00000010)
536 /*#define MAPI_UNICODE				((ULONG) 0x80000000) in mapidefs.h */
537 
538 /* Flags that the transport may pass to the Spooler: */
539 
540 #define	LOGON_SP_IDLE				((ULONG) 0x00010000)
541 #define	LOGON_SP_POLL				((ULONG) 0x00020000)
542 #define	LOGON_SP_RESOLVE			((ULONG) 0x00040000)
543 
544 
545 DECLARE_MAPI_INTERFACE_PTR(IXPProvider, LPXPPROVIDER);
546 DECLARE_MAPI_INTERFACE_PTR(IXPLogon, LPXPLOGON);
547 
548 #define MAPI_IXPPROVIDER_METHODS(IPURE)									\
549 	MAPIMETHOD(Shutdown)												\
550 		(THIS_	ULONG FAR *					lpulFlags) IPURE;			\
551 	MAPIMETHOD(TransportLogon)											\
552 		(THIS_	LPMAPISUP					lpMAPISup,					\
553 				ULONG_PTR					ulUIParam,					\
554 				__in LPTSTR						lpszProfileName,			\
555 				ULONG FAR *					lpulFlags,					\
556                 LPMAPIERROR FAR *			lppMAPIError,				\
557 				LPXPLOGON FAR *				lppXPLogon) IPURE;			\
558 
559 #undef		 INTERFACE
560 #define		 INTERFACE  IXPProvider
DECLARE_MAPI_INTERFACE_(IXPProvider,IUnknown)561 DECLARE_MAPI_INTERFACE_(IXPProvider, IUnknown)
562 {
563 	BEGIN_INTERFACE
564 	MAPI_IUNKNOWN_METHODS(PURE)
565 	MAPI_IXPPROVIDER_METHODS(PURE)
566 };
567 
568 /* OptionData returned from call to RegisterOptions */
569 
570 #define OPTION_TYPE_RECIPIENT		((ULONG) 0x00000001)
571 #define OPTION_TYPE_MESSAGE			((ULONG) 0x00000002)
572 
573 typedef struct _OPTIONDATA
574 {
575 	ULONG			ulFlags;		/* MAPI_RECIPIENT, MAPI_MESSAGE */
576 	LPGUID			lpRecipGUID;	/* Same as returned by AddressTypes() */
577 	LPTSTR			lpszAdrType;	/* Same as returned by AddressTypes() */
578 	LPTSTR			lpszDLLName;	/* Options DLL */
579 	ULONG			ulOrdinal;		/* Ordinal in that DLL */
580 	ULONG			cbOptionsData;	/* Count of bytes in lpbOptionsData */
581 	LPBYTE			lpbOptionsData;	/* Providers per [recip|message] option data */
582 	ULONG			cOptionsProps;	/* Count of Options default prop values */
583 	LPSPropValue	lpOptionsProps;	/* Default Options property values */
584 } OPTIONDATA, FAR *LPOPTIONDATA;
585 
586 typedef SCODE (STDMAPIINITCALLTYPE OPTIONCALLBACK)(
587 			HINSTANCE			hInst,
588 			LPMALLOC			lpMalloc,
589 			ULONG				ulFlags,
590 			ULONG				cbOptionData,
591 			LPBYTE				lpbOptionData,
592 			LPMAPISUP			lpMAPISup,
593 			LPMAPIPROP			lpDataSource,
594 			LPMAPIPROP FAR *	lppWrappedSource,
595             LPMAPIERROR FAR *	lppMAPIError);
596 
597 /* For XP_AddressTypes */
598 
599 /*#define MAPI_UNICODE				((ULONG) 0x80000000) in mapidefs.h */
600 
601 /* For XP_RegisterRecipOptions */
602 
603 /*#define MAPI_UNICODE				((ULONG) 0x80000000) in mapidefs.h */
604 
605 /* For XP_RegisterMessageOptions */
606 
607 /*#define MAPI_UNICODE				((ULONG) 0x80000000) in mapidefs.h */
608 
609 /* For TransportNotify */
610 
611 #define NOTIFY_ABORT_DEFERRED		((ULONG) 0x40000000)
612 #define NOTIFY_CANCEL_MESSAGE		((ULONG) 0x80000000)
613 #define NOTIFY_BEGIN_INBOUND		((ULONG) 0x00000001)
614 #define NOTIFY_END_INBOUND			((ULONG) 0x00010000)
615 #define NOTIFY_BEGIN_OUTBOUND		((ULONG) 0x00000002)
616 #define NOTIFY_END_OUTBOUND			((ULONG) 0x00020000)
617 #define NOTIFY_BEGIN_INBOUND_FLUSH	((ULONG) 0x00000004)
618 #define NOTIFY_END_INBOUND_FLUSH	((ULONG) 0x00040000)
619 #define NOTIFY_BEGIN_OUTBOUND_FLUSH	((ULONG) 0x00000008)
620 #define NOTIFY_END_OUTBOUND_FLUSH	((ULONG) 0x00080000)
621 
622 /* For TransportLogoff */
623 
624 #define	LOGOFF_NORMAL				((ULONG) 0x00000001)
625 #define LOGOFF_HURRY				((ULONG) 0x80000000)
626 
627 /* For SubmitMessage */
628 
629 #define BEGIN_DEFERRED				((ULONG) 0x00000001)
630 
631 /* For EndMessage */
632 
633 /* Flags that the Spooler may pass to the Transport: */
634 
635 /* Flags that the transport may pass to the Spooler: */
636 
637 #define END_RESEND_NOW				((ULONG) 0x00010000)
638 #define END_RESEND_LATER			((ULONG) 0x00020000)
639 #define END_DONT_RESEND				((ULONG) 0x00040000)
640 
641 #define MAPI_IXPLOGON_METHODS(IPURE)									\
642 	MAPIMETHOD(AddressTypes)											\
643 		(THIS_	ULONG FAR *					lpulFlags,					\
644 				ULONG FAR *					lpcAdrType,					\
645 				__deref_out_ecount_full(*lpcAdrType) LPTSTR FAR * FAR *			lpppAdrTypeArray,			\
646 				ULONG FAR *					lpcMAPIUID,					\
647 				LPMAPIUID FAR * FAR *		lpppUIDArray) IPURE;		\
648 	MAPIMETHOD(RegisterOptions)											\
649 		(THIS_	ULONG FAR *					lpulFlags,					\
650 				ULONG FAR *					lpcOptions,					\
651 				LPOPTIONDATA FAR *			lppOptions) IPURE;			\
652 	MAPIMETHOD(TransportNotify)											\
653 		(THIS_	ULONG FAR *					lpulFlags,					\
654 				LPVOID FAR *				lppvData) IPURE;			\
655 	MAPIMETHOD(Idle)													\
656 		(THIS_	ULONG						ulFlags) IPURE;				\
657 	MAPIMETHOD(TransportLogoff)											\
658 		(THIS_	ULONG						ulFlags) IPURE;				\
659 	MAPIMETHOD(SubmitMessage)											\
660 		(THIS_	ULONG						ulFlags,					\
661 				LPMESSAGE					lpMessage,					\
662 				ULONG_PTR FAR *				lpulMsgRef,					\
663 				ULONG_PTR FAR *				lpulReturnParm) IPURE;		\
664 	MAPIMETHOD(EndMessage)												\
665 		(THIS_	ULONG_PTR					ulMsgRef,					\
666 				ULONG FAR *					lpulFlags) IPURE;			\
667 	MAPIMETHOD(Poll)													\
668 		(THIS_	ULONG FAR *					lpulIncoming) IPURE;		\
669 	MAPIMETHOD(StartMessage)											\
670 		(THIS_	ULONG						ulFlags,					\
671 				LPMESSAGE					lpMessage,					\
672 				ULONG_PTR FAR *				lpulMsgRef) IPURE;			\
673     MAPIMETHOD(OpenStatusEntry)                                         \
674         (THIS_  LPCIID                      lpInterface,                \
675                 ULONG                       ulFlags,                    \
676                 ULONG FAR *                 lpulObjType,                \
677                 LPMAPISTATUS FAR *          lppEntry) IPURE;            \
678 	MAPIMETHOD(ValidateState)											\
679 		(THIS_	ULONG_PTR					ulUIParam,					\
680 				ULONG						ulFlags) IPURE;				\
681 	MAPIMETHOD(FlushQueues)												\
682 		(THIS_	ULONG_PTR					ulUIParam,					\
683 				ULONG						cbTargetTransport,			\
684 				LPENTRYID					lpTargetTransport,			\
685 				ULONG						ulFlags) IPURE;				\
686 
687 #undef       INTERFACE
688 #define      INTERFACE  IXPLogon
DECLARE_MAPI_INTERFACE_(IXPLogon,IUnknown)689 DECLARE_MAPI_INTERFACE_(IXPLogon, IUnknown)
690 {
691 	BEGIN_INTERFACE
692     MAPI_IUNKNOWN_METHODS(PURE)
693     MAPI_IXPLOGON_METHODS(PURE)
694 };
695 
696 
697 /* Transport Provider Entry Point */
698 
699 typedef HRESULT (STDMAPIINITCALLTYPE XPPROVIDERINIT)(
700 	HINSTANCE			hInstance,
701 	LPMALLOC			lpMalloc,
702 	LPALLOCATEBUFFER	lpAllocateBuffer,
703 	LPALLOCATEMORE 		lpAllocateMore,
704 	LPFREEBUFFER 		lpFreeBuffer,
705 	ULONG				ulFlags,
706 	ULONG				ulMAPIVer,
707 	ULONG FAR *			lpulProviderVer,
708 	LPXPPROVIDER FAR *	lppXPProvider);
709 
710 XPPROVIDERINIT XPProviderInit;
711 
712 /********************************************************************/
713 /*																	*/
714 /*							MESSAGE STORE SPI						*/
715 /*																	*/
716 /********************************************************************/
717 
718 /* Flags and enums */
719 
720 /* For Logon() */
721 
722 /*#define MAPI_UNICODE			((ULONG) 0x80000000) in mapidefs.h */
723 /*#define MDB_NO_DIALOG			((ULONG) 0x00000001) in mapidefs.h */
724 /*#define MDB_WRITE				((ULONG) 0x00000004) in mapidefs.h */
725 /*#define MAPI_DEFERRED_ERRORS	((ULONG) 0x00000008) in mapidefs.h */
726 /*#define MDB_TEMPORARY			((ULONG) 0x00000020) in mapidefs.h */
727 /*#define MDB_NO_MAIL			((ULONG) 0x00000080) in mapidefs.h */
728 
729 /* For SpoolerLogon() */
730 
731 /*#define MAPI_UNICODE			((ULONG) 0x80000000) in mapidefs.h */
732 /*#define MDB_NO_DIALOG			((ULONG) 0x00000001) in mapidefs.h */
733 /*#define MDB_WRITE				((ULONG) 0x00000004) in mapidefs.h */
734 /*#define MAPI_DEFERRED_ERRORS	((ULONG) 0x00000008) in mapidefs.h */
735 
736 /* GetCredentials, SetCredentials */
737 
738 #define LOGON_SP_TRANSPORT		((ULONG) 0x00000001)
739 #define LOGON_SP_PROMPT			((ULONG) 0x00000002)
740 #define LOGON_SP_NEWPW			((ULONG) 0x00000004)
741 #define LOGON_CHANGED			((ULONG) 0x00000008)
742 
743 /* DoMCDialog */
744 
745 #define DIALOG_FOLDER			((ULONG) 0x00000001)
746 #define DIALOG_MESSAGE			((ULONG) 0x00000002)
747 #define DIALOG_PROP				((ULONG) 0x00000004)
748 #define DIALOG_ATTACH			((ULONG) 0x00000008)
749 
750 #define DIALOG_MOVE				((ULONG) 0x00000010)
751 #define DIALOG_COPY				((ULONG) 0x00000020)
752 #define DIALOG_DELETE			((ULONG) 0x00000040)
753 
754 #define DIALOG_ALLOW_CANCEL		((ULONG) 0x00000080)
755 #define DIALOG_CONFIRM_CANCEL	((ULONG) 0x00000100)
756 
757 /* ExpandRecips */
758 
759 #define NEEDS_PREPROCESSING		((ULONG) 0x00000001)
760 #define NEEDS_SPOOLER			((ULONG) 0x00000002)
761 
762 /* PrepareSubmit */
763 
764 #define CHECK_SENDER			((ULONG) 0x00000001)
765 #define NON_STANDARD			((ULONG) 0x00010000)
766 
767 
768 DECLARE_MAPI_INTERFACE_PTR(IMSLogon, LPMSLOGON);
769 DECLARE_MAPI_INTERFACE_PTR(IMSProvider, LPMSPROVIDER);
770 
771 /* Message Store Provider Interface (IMSPROVIDER) */
772 
773 #define MAPI_IMSPROVIDER_METHODS(IPURE)									\
774 	MAPIMETHOD(Shutdown)												\
775 		(THIS_	ULONG FAR *					lpulFlags) IPURE;			\
776 	MAPIMETHOD(Logon)													\
777 		(THIS_	LPMAPISUP					lpMAPISup,					\
778 				ULONG_PTR					ulUIParam,					\
779 				LPTSTR						lpszProfileName,			\
780 				ULONG						cbEntryID,					\
781 				LPENTRYID					lpEntryID,					\
782 				ULONG						ulFlags,					\
783 				LPCIID						lpInterface,				\
784 				ULONG FAR *					lpcbSpoolSecurity,			\
785 				LPBYTE FAR *				lppbSpoolSecurity,			\
786                 LPMAPIERROR FAR *			lppMAPIError,				\
787 				LPMSLOGON FAR *				lppMSLogon,					\
788 				LPMDB FAR *					lppMDB) IPURE;				\
789 	MAPIMETHOD(SpoolerLogon)											\
790 		(THIS_	LPMAPISUP					lpMAPISup,					\
791 				ULONG_PTR					ulUIParam,					\
792 				LPTSTR						lpszProfileName,			\
793 				ULONG						cbEntryID,					\
794 				LPENTRYID					lpEntryID,					\
795 				ULONG						ulFlags,					\
796 				LPCIID						lpInterface,				\
797 				ULONG						cbSpoolSecurity,			\
798 				LPBYTE						lpbSpoolSecurity,			\
799                 LPMAPIERROR FAR *			lppMAPIError,				\
800 				LPMSLOGON FAR *				lppMSLogon,					\
801 				LPMDB FAR *					lppMDB) IPURE;				\
802 	MAPIMETHOD(CompareStoreIDs)											\
803 		(THIS_	ULONG						cbEntryID1,					\
804 				LPENTRYID					lpEntryID1,					\
805 				ULONG						cbEntryID2,					\
806 				LPENTRYID					lpEntryID2,					\
807 				ULONG						ulFlags,					\
808 				ULONG FAR *					lpulResult) IPURE;			\
809 
810 #undef		 INTERFACE
811 #define		 INTERFACE  IMSProvider
DECLARE_MAPI_INTERFACE_(IMSProvider,IUnknown)812 DECLARE_MAPI_INTERFACE_(IMSProvider, IUnknown)
813 {
814 	BEGIN_INTERFACE
815 	MAPI_IUNKNOWN_METHODS(PURE)
816 	MAPI_IMSPROVIDER_METHODS(PURE)
817 };
818 
819 /* The MSLOGON object is returned by the Logon() method of the
820  * MSPROVIDER interface.  This object is for use by MAPIX.DLL.
821  */
822 #define MAPI_IMSLOGON_METHODS(IPURE)									\
823 	MAPIMETHOD(GetLastError)											\
824 		(THIS_	HRESULT						hResult,					\
825 				ULONG						ulFlags,					\
826 				LPMAPIERROR FAR *			lppMAPIError) IPURE;		\
827 	MAPIMETHOD(Logoff)													\
828 		(THIS_	ULONG FAR *					lpulFlags) IPURE;			\
829 	MAPIMETHOD(OpenEntry)												\
830 		(THIS_	ULONG						cbEntryID,					\
831 				LPENTRYID					lpEntryID,					\
832 				LPCIID						lpInterface,				\
833 				ULONG						ulFlags,					\
834 				ULONG FAR *					lpulObjType,				\
835 				LPUNKNOWN FAR *				lppUnk) IPURE;				\
836 	MAPIMETHOD(CompareEntryIDs)											\
837 		(THIS_	ULONG						cbEntryID1,					\
838 				LPENTRYID					lpEntryID1,					\
839 				ULONG						cbEntryID2,					\
840 				LPENTRYID					lpEntryID2,					\
841 				ULONG						ulFlags,					\
842 				ULONG FAR *					lpulResult) IPURE;			\
843 	MAPIMETHOD(Advise)													\
844 		(THIS_	ULONG						cbEntryID,					\
845 				LPENTRYID					lpEntryID,					\
846 				ULONG						ulEventMask,				\
847 				LPMAPIADVISESINK			lpAdviseSink,				\
848 				ULONG_PTR FAR *				lpulConnection) IPURE;		\
849 	MAPIMETHOD(Unadvise)												\
850 		(THIS_	ULONG_PTR					ulConnection) IPURE;		\
851 	MAPIMETHOD(OpenStatusEntry)											\
852 		(THIS_	LPCIID						lpInterface,				\
853 				ULONG						ulFlags,					\
854 				ULONG FAR *					lpulObjType,				\
855 				LPVOID FAR *				lppEntry) IPURE;			\
856 
857 #undef		 INTERFACE
858 #define		 INTERFACE  IMSLogon
DECLARE_MAPI_INTERFACE_(IMSLogon,IUnknown)859 DECLARE_MAPI_INTERFACE_(IMSLogon, IUnknown)
860 {
861 	BEGIN_INTERFACE
862 	MAPI_IUNKNOWN_METHODS(PURE)
863 	MAPI_IMSLOGON_METHODS(PURE)
864 };
865 
866 /* Message Store Provider Entry Point */
867 
868 typedef HRESULT (STDMAPIINITCALLTYPE MSPROVIDERINIT)(
869 	HINSTANCE				hInstance,
870 	LPMALLOC				lpMalloc,			/* AddRef() if you keep it */
871 	LPALLOCATEBUFFER		lpAllocateBuffer,	/* -> AllocateBuffer */
872 	LPALLOCATEMORE			lpAllocateMore, 	/* -> AllocateMore   */
873 	LPFREEBUFFER			lpFreeBuffer, 		/* -> FreeBuffer     */
874 	ULONG					ulFlags,
875 	ULONG					ulMAPIVer,
876 	ULONG FAR *				lpulProviderVer,
877 	LPMSPROVIDER FAR *		lppMSProvider
878 );
879 
880 MSPROVIDERINIT MSProviderInit;
881 
882 
883 /********************************************************************/
884 /*																	*/
885 /*					  MESSAGE SERVICE CONFIGURATION					*/
886 /*																	*/
887 /********************************************************************/
888 
889 /* Flags for service configuration entry point */
890 
891 /* #define MAPI_UNICODE				 0x80000000 */
892 /* #define SERVICE_UI_ALWAYS  		 0x00000002	*/
893 /* #define SERVICE_UI_ALLOWED 		 0x00000010	*/
894 #define MSG_SERVICE_UI_READ_ONLY	 0x00000008	/* display parameters only */
895 #define SERVICE_LOGON_FAILED		 0x00000020 /* reconfigure provider */
896 
897 /* Contexts for service configuration entry point */
898 
899 #define MSG_SERVICE_INSTALL			0x00000001
900 #define MSG_SERVICE_CREATE			0x00000002
901 #define MSG_SERVICE_CONFIGURE		0x00000003
902 #define MSG_SERVICE_DELETE			0x00000004
903 #define MSG_SERVICE_UNINSTALL		0x00000005
904 #define MSG_SERVICE_PROVIDER_CREATE	0x00000006
905 #define MSG_SERVICE_PROVIDER_DELETE	0x00000007
906 
907 /* Prototype for service configuration entry point */
908 
909 typedef HRESULT (STDAPICALLTYPE MSGSERVICEENTRY)(
910 	HINSTANCE		hInstance,
911 	LPMALLOC		lpMalloc,
912 	LPMAPISUP		lpMAPISup,
913 	ULONG_PTR		ulUIParam,
914 	ULONG			ulFlags,
915 	ULONG			ulContext,
916 	ULONG			cValues,
917 	LPSPropValue	lpProps,
918 	LPPROVIDERADMIN lpProviderAdmin,
919 	LPMAPIERROR FAR *lppMapiError
920 );
921 typedef MSGSERVICEENTRY FAR *LPMSGSERVICEENTRY;
922 
923 
924 #ifdef __cplusplus
925 }
926 #endif
927 
928 #endif /* MAPISPI_H */
929 
930