home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / dbmsg / mapi / peer.xp / xpbase.h < prev    next >
C/C++ Source or Header  |  1996-04-11  |  11KB  |  261 lines

  1. /*
  2.  -  X P B A S E . H
  3.  -
  4.  *
  5.  *  Definitions, typedefs and prototypes used by the Sample Transport
  6.  *  Provider modules.
  7.  *
  8.  *  Copyright 1992-1995 Microsoft Corporation.  All Rights Reserved.
  9.  */
  10.  
  11. /* Make sure that we are thinking "C" here... */
  12. #ifdef __cplusplus
  13. extern "C"
  14. {
  15. #endif
  16.  
  17.  
  18. /*
  19.  *  Linked-List of deferred messages
  20.  */
  21.  
  22. typedef struct _DEFMSG *LPDEFMSG;
  23.  
  24. typedef struct _DEFMSG
  25. {
  26.     ULONG ulMsgRef;
  27.     SBinary sbinEIDDef;
  28.     LPDEFMSG lpNext;
  29.  
  30. } DEFMSG;
  31.  
  32. /*
  33.  *  Sample Transport Provider DLL exported entry points.
  34.  */
  35.  
  36. /* Transport Init Object */
  37.  
  38. #undef  INTERFACE
  39. #define INTERFACE struct _XPP
  40.  
  41. #undef  MAPIMETHOD_
  42. #define MAPIMETHOD_(type, method)   MAPIMETHOD_DECLARE(type, method, XPP_)
  43.         MAPI_IUNKNOWN_METHODS(IMPL)
  44.         MAPI_IXPPROVIDER_METHODS(IMPL)
  45. #undef  MAPIMETHOD_
  46. #define MAPIMETHOD_(type, method)   STDMETHOD_(type, method)
  47.  
  48. DECLARE_MAPI_INTERFACE(XPP_)
  49. {
  50.     MAPI_IUNKNOWN_METHODS(IMPL)
  51.     MAPI_IXPPROVIDER_METHODS(IMPL)
  52. };
  53.  
  54. typedef struct _XPP {
  55.     XPP_Vtbl FAR *      lpVtbl;         /* Methods                          */
  56.     LONG                lcInit;         /* Usage Count                      */
  57.     struct _XPP FAR *   lpxppMyAddress; /* Pointer to myself, for validation*/
  58.     CRITICAL_SECTION    csTransport;    /* Critical section for this object */
  59.     struct _XPL FAR *   XPSessionList;  /* List of logon sessions on obj    */
  60.     BOOL                fInited;        /* Are we in an inited state?       */
  61.     HINSTANCE           hInst;          /* Instance of our library          */
  62.     LPMALLOC            lpMalloc;       /* IMalloc object                   */
  63.     LPFREEBUFFER        lpFreeBuffer;   /* Need this to free the object     */
  64. } XPP, FAR *LPXPP;
  65.  
  66. /* Transport Logon Object */
  67.  
  68. #undef  INTERFACE
  69. #define INTERFACE struct _XPL
  70.  
  71. #undef  MAPIMETHOD_
  72. #define MAPIMETHOD_(type, method)   MAPIMETHOD_DECLARE(type, method, XPL_)
  73.         MAPI_IUNKNOWN_METHODS(IMPL)
  74.         MAPI_IXPLOGON_METHODS(IMPL)
  75. #undef  MAPIMETHOD_
  76. #define MAPIMETHOD_(type, method)   STDMETHOD_(type, method)
  77.  
  78. DECLARE_MAPI_INTERFACE(XPL_)
  79. {
  80.     MAPI_IUNKNOWN_METHODS(IMPL)
  81.     MAPI_IXPLOGON_METHODS(IMPL)
  82. };
  83.  
  84. /*
  85.  *  Logon object structure.
  86.  */
  87.  
  88. typedef struct _XPL
  89. {
  90.     XPL_Vtbl FAR *      lpVtbl;             /* Methods                                  */
  91.     LONG                lcInit;             /* Usage Count                              */
  92.     struct _XPL FAR *   lpNextSession;      /* Link to next session                 */
  93.     struct _XPL FAR *   lpMySession;        /* My address, used to validate         */
  94.     LPXPP               lpxppParent;        /* Parent XPP object                        */
  95.     LPMAPISTATUS        lpXPStatus;         /* Child Status Object                      */
  96.     ULONG               ulSessionFlags;     /* Session flags                            */
  97.     LPMAPISUP           lpMAPISup;          /* Support object for this session          */
  98.     LPALLOCATEBUFFER    AllocateBuffer;     /* MAPIAllocateBuffer pointer           */
  99.     LPALLOCATEMORE      AllocateMore;       /* MAPIAllocateMore pointer             */
  100.     LPFREEBUFFER        FreeBuffer;         /* MAPIFreeBuffer function pointer          */
  101.     ULONG               cLogonPropValues;   /* Number of Logon property values          */
  102.     LPSPropValue        lpPropArray;        /* Logon property array                     */
  103.     LPSPropValue        lpMyIDArray;        /* Properties to set on transmit            */
  104.     ULONG               cOptData;           /* Number of Options we support             */
  105.     LPOPTIONDATA        lpOptData;          /* Per-Message & Recip OptionData           */
  106.     LPTSTR              lpszAdrType;        /* Used to pass back on AddressType call    */
  107.     ULONG               ulTransportStatus;  /* Howzit going? Used by status             */
  108.     ULONG               ulResourceMethods;  /* Methods supported by our status object   */
  109.     
  110.     /* Deferred message handling elements */
  111.     ULONG               ulDeferredMsgRef;
  112.     BOOL                fResendDeferred;
  113.     LPDEFMSG            lpDeferredList;
  114.     
  115.     BOOL                fRefSupport;        /* We AddRef'd the support object */
  116.     BOOL                fFoundInMessage;    /* Found a inbound message flag   */
  117.     HANDLE              hInFindHandle;      /* Used in Poll(), StartMessage() */
  118.     WIN32_FIND_DATA     wfdInFindData;      /* Used in Poll(), StartMessage() */
  119.     HANDLE              hOutFindHandle;     /* Used in Outbound Queue         */
  120.     WIN32_FIND_DATA     wfdOutFindData;     /* Used in Outbound Queue         */
  121. } XPL, FAR *LPXPL;
  122.  
  123. /*
  124.  *  Properties we store in the Profile.
  125.  *
  126.  * NOTE!!! THE ORDERING OF THE PROPERTY ID'S HERE MUST BE THE SAME
  127.  * AS THE ORDERING OF PROP TAG ARRAY sptLogonArray IN SMPLXPT.C, WITH
  128.  * SEQUENTIAL NUMBERING!!!!
  129.  *
  130.  */
  131.  
  132. #define BASE_PROVIDER_ID    0x6600  /* From MAPITAGS.H comments */
  133. #define BASE_MSG_OPT_ID     0x4000  /* From MAPITAGS.H comments */
  134. #define BASE_RECIP_OPT_ID   0x5800  /* From MAPITAGS.H comments */
  135.  
  136. /* Display name of user. Optional property. If not present we will use
  137.    the email address as the display name -- ugly but effective.            */
  138.  
  139. #define PR_SAMPLE_DISPLAY_NAME      PROP_TAG (PT_TSTRING,   (BASE_PROVIDER_ID + 0x0001))
  140.  
  141. /* Address type of sample transport. This will be used to construct inbound
  142.    and outbound addresses where needed. It also will be used to tell the
  143.    Spooler what address types we should get.                               */
  144.  
  145. #define PR_SAMPLE_EMAIL_ADDR_TYPE   PROP_TAG (PT_TSTRING,   (BASE_PROVIDER_ID + 0x0002))
  146.  
  147. /* Email address. This will usually be the same as the inbound directory,
  148.    although this may tend to have a more canonical form for remote access. */
  149.  
  150. #define PR_SAMPLE_EMAIL_ADDRESS     PROP_TAG (PT_TSTRING,   (BASE_PROVIDER_ID + 0x0003))
  151.  
  152. /* Inbound directory. This is where the transport will look in order to
  153.    determine whether it has received any mail.                             */
  154.  
  155. #define PR_SAMPLE_INBOUND_DIR       PROP_TAG (PT_TSTRING,   (BASE_PROVIDER_ID + 0x0004))
  156.  
  157. /* Outbound directory. The transport will store its message files here
  158.    while it is in the process of sending them. The presence of a file
  159.    in this directory implies that the transport still has work to do.      */
  160.  
  161. #define PR_SAMPLE_OUTBOUND_DIR      PROP_TAG (PT_TSTRING,   (BASE_PROVIDER_ID + 0x0005))
  162.  
  163. /* Filename. This is an 8-character root for use by mail-enabled or
  164.    workgroup applications to build a complete file specification (by
  165.    adding an extension) for data they wish to store for this user.         */
  166.  
  167. #define PR_SAMPLE_FILENAME          PROP_TAG (PT_TSTRING,   (BASE_PROVIDER_ID + 0x0006))
  168.  
  169. /* Directory. This is a directory in which workgroup applications may
  170.    wish to store their files pertaining to this user.                      */
  171.  
  172. #define PR_SAMPLE_DIRECTORY         PROP_TAG (PT_TSTRING,   (BASE_PROVIDER_ID + 0x0007))
  173.  
  174. /* Flags. Contain various options for this transport provider.             */
  175.  
  176. #define PR_SAMPLE_FLAGS             PROP_TAG (PT_LONG,      (BASE_PROVIDER_ID + 0x0008))
  177.  
  178. #define PR_SAMPLE_FLAG_PEER_TO_PEER ((ULONG) 0x00000001)
  179. #define PR_SAMPLE_FLAG_UI_ALWAYS    ((ULONG) 0x00000002)
  180. #define PR_SAMPLE_FLAG_LOG_EVENTS   ((ULONG) 0x00000004)
  181. #define PR_SAMPLE_FLAG_SAVE_DATA    ((ULONG) 0x00000008)
  182.  
  183. /* Logfile. This is where logging information will be written. If this
  184.    property is not present, we will use (PR_SAMPLE_FILENAME)".LOG"         */
  185.  
  186. #define PR_SAMPLE_LOGFILE           PROP_TAG (PT_TSTRING,   (BASE_PROVIDER_ID + 0x0009))
  187.  
  188. /* Logfile high water mark. This is the point at which the log writer will
  189.    truncate the logfile so as not to fill up the disk.                     */
  190.  
  191. #define PR_SAMPLE_LOGHIGHWATER      PROP_TAG (PT_LONG,      (BASE_PROVIDER_ID + 0x000A))
  192.  
  193. /* Logfile low water mark. This is the approximate size that the logfile
  194.    writer will truncate the logfile to (modulo a line ending).             */
  195.  
  196. #define PR_SAMPLE_LOGLOWWATER       PROP_TAG (PT_LONG,      (BASE_PROVIDER_ID + 0x000B))
  197.  
  198. /* The following property tags are temporaries. They are here because
  199.    the configuration property sheets want one property tag for every
  200.    control; after we run the dialogs, we roll them back up into
  201.    PR_SAMPLE_FLAGS.                                                        */
  202.  
  203. #define PR_TEMP_PEER_TO_PEER        PROP_TAG (PT_BOOLEAN,   (BASE_PROVIDER_ID + 0x000C))
  204. #define PR_TEMP_UI_ALWAYS           PROP_TAG (PT_BOOLEAN,   (BASE_PROVIDER_ID + 0x000D))
  205. #define PR_TEMP_LOG_EVENTS          PROP_TAG (PT_BOOLEAN,   (BASE_PROVIDER_ID + 0x000E))
  206. #define PR_TEMP_SAVE_DATA           PROP_TAG (PT_BOOLEAN,   (BASE_PROVIDER_ID + 0x000F))
  207.  
  208. #define PR_TEMP_LOGHIGHWATER        PROP_TAG (PT_TSTRING,   (BASE_PROVIDER_ID + 0x0010))
  209. #define PR_TEMP_LOGLOWWATER         PROP_TAG (PT_TSTRING,   (BASE_PROVIDER_ID + 0x0011))
  210.  
  211. /* This property is a per-message option.  If TRUE, the message will be
  212.    deferred until the next message comes along that is not to be deferred.
  213.    At that point, the Transport will SpoolerNotify() to have all currently
  214.    deferred messages submitted to it for sending.                           */
  215.  
  216. #define PR_SAMPLE_PER_MSG_DEFER     PROP_TAG (PT_BOOLEAN,   (BASE_MSG_OPT_ID + 0x0001))
  217.  
  218. /* This property is a per-recipient option.  If TRUE, the message will be
  219.    deferred until the next message comes along that is not to be deferred.
  220.    At that point, the Transport will SpoolerNotify() to have all currently
  221.    deferred messages submitted to it for sending.  This property is ignored
  222.    if PR_SAMPLE_PER_MSG_DEFER is set.
  223.  
  224.    This property is also used as a flag on the message that says - we've seen
  225.    this message before and have deferred it due to some recipients with their
  226.    property PR_SAMPLE_PER_RECIP_DEFER flag set.  When we run across this, we'll
  227.    delete it from the message and send to the remaining recipients that
  228.    have not been handled.                                                  */
  229.  
  230. #define PR_SAMPLE_PER_RECIP_DEFER   PROP_TAG (PT_BOOLEAN,   (BASE_RECIP_OPT_ID + 0x0001))
  231.  
  232. /* The following is used to access the properties in the logon array.      */
  233.  
  234. #define MAX_LOGON_PROPERTIES        17
  235. #define TEMP_LOGON_PROPERTIES       6
  236. #define ArrayIndex(PROP, ARRAY) (ARRAY)[(PROP_ID(PROP) - BASE_PROVIDER_ID - 1)]
  237. #define NUM_SENDER_PROPS            3   /* How many sender ID properties?  */
  238.  
  239.  
  240. /* Display name for my transport. Used for the status row. */
  241.  
  242. #ifdef DEBUG
  243. #define MYDISPLAYNAME "Sample Transport Provider (Debug)"
  244. #elif defined (TEST)
  245. #define MYDISPLAYNAME "Sample Transport Provider (Test)"
  246. #else
  247. #define MYDISPLAYNAME "Sample Transport Provider"
  248. #endif
  249.  
  250. /* Common global data/code. */
  251.  
  252. BOOL    FIsValidSession(LPXPL);
  253. SCODE   ScCheckLogonProps(LPXPDLG lpXPDialog, BOOL fUIAllowed);
  254. HRESULT MapScodeSz(SCODE sc, LPXPL lpxpl, LPTSTR * lppszMessage);
  255. HRESULT HrCheckSpoolerYield(LPMAPISUP lpMAPISup, BOOL fReset);
  256. SCODE   ScCopySessionProps(LPXPL lpxpl, LPSPropValue FAR *lppPropArray, LPSPropValue FAR *lppMyIDArray);
  257.  
  258. #ifdef __cplusplus
  259. }
  260. #endif
  261.