MSP.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:28k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*
  2.  *  M S P . H
  3.  *
  4.  *  Definitions for the MAPI Sample Message Store Provider.
  5.  *
  6.  *  Copyright 1992-1995 Microsoft Corporation.  All Rights Reserved.
  7.  */
  8. #ifdef _WIN32
  9. #define _INC_OLE
  10. #define INC_OLE2 /* Get the OLE2 stuff */
  11. #define INC_RPC  /* harmless on NT 3.5; Win95 needs it */
  12. #endif
  13. #include <windows.h>
  14. #include <ole2.h>
  15. #include <mapispi.h>
  16. #include <mapidbg.h>
  17. #include <mapiwin.h>
  18. #include <mapiutil.h>
  19. #include <mapival.h>
  20. #include <smpms.h>
  21. #include <mapidefs.h>
  22. #include <mapicode.h>
  23. #include <mapitags.h>
  24. #include <mapiguid.h>
  25. #include <imessage.h>
  26. #include <limits.h>
  27. #include <memory.h>
  28. #if defined(_WIN32)
  29. #define OLE_CHAR WCHAR
  30. #else
  31. #define OLE_CHAR char
  32. #endif
  33. #define VALIDATE
  34. #ifdef VALIDATE
  35. #define OBJ_ValidateParameters(pobj, intf, method, cbObj, _lpVtbl, arglist) 
  36.     {                                                                       
  37.         Validate##_##intf##_##method arglist;                               
  38.         if (IsBadWritePtr(pobj, cbObj) || (pobj)->lpVtbl != _lpVtbl)        
  39.             return(ResultFromScode(MAPI_E_INVALID_PARAMETER)); }
  40. #define OBJ_CheckParameters(pobj, intf, method, cbObj, _lpVtbl, arglist)    
  41.     {                                                                       
  42.         CheckParameters##_##intf##_##method arglist;                        
  43.         AssertSz(!IsBadWritePtr(pobj, cbObj) && (pobj)->lpVtbl == _lpVtbl,  
  44.             "Bad object pointer"); }
  45. #else
  46. #define OBJ_ValidateParameters(pobj, intf, method, cbObj, _lpVtbl, arglist)
  47. #define OBJ_CheckParameters(pobj, intf, method, cbObj, _lpVtbl, arglist)
  48. #endif /* VALIDATE */
  49. typedef LPVOID *PPV;
  50. #define NUM_RETRIES 6           /* number of times to retry opening a file */
  51. /* Per-instance data. */
  52. typedef struct
  53. {
  54.     UINT        cRef;
  55.     LPMALLOC    lpmalloc;
  56. } INST, *PINST;
  57. /* Linked Memory Routines */
  58. typedef struct _lmr
  59. {
  60.     LPALLOCATEBUFFER    lpAllocBuf;
  61.     LPALLOCATEMORE      lpAllocMore;
  62.     LPFREEBUFFER        lpFreeBuf;
  63. }   LMR, *PLMR;
  64. #define         LMAlloc(plmr, lcb, ppv)             ((plmr)->lpAllocBuf(lcb, ppv))
  65. #define         LMAllocMore(plmr, lcb, pvLink, ppv) ((plmr)->lpAllocMore(lcb, pvLink, ppv))
  66. #define         LMFree(plmr, pv)                    ((plmr)->lpFreeBuf(pv))
  67. #define IsBadIfacePtr(param, iface)                 
  68.             (IsBadReadPtr((param), sizeof(iface))   
  69.         ||  IsBadReadPtr((param)->lpVtbl, sizeof(iface##Vtbl)))
  70. #define SMPMS_VERSION   (0x03)  /* For MAPI 1.0 */
  71. typedef struct _EID             /* Sample Message Store EntryID */
  72. {
  73.     BYTE abFlags[4];
  74.     MAPIUID uidResource;
  75.     BYTE bVersion;
  76.     BYTE bVerPad[3];
  77.     TCHAR szPath[1];
  78. } EID, *PEID;
  79. #define CbNewEID(_cbPath) 
  80.     (offsetof(EID,szPath) + (_cbPath)*sizeof(CHAR))
  81. /* This includes the NULL terminator */
  82. #define CbEID(_peid) 
  83.     (offsetof(EID,szPath) + 
  84.     (((UINT)(lstrlen((_peid)->szPath)))*sizeof(CHAR)) + sizeof(CHAR))
  85. /* This includes the NULL */
  86. #define CbEIDPath(peid) (CbEID(peid)-CbNewEID(0))
  87. #define PR_FILENAME_SEQUENCE_NUMBER PROP_TAG(PT_LONG,       0x6600)
  88. #define PR_SMS_CONTENTS_SORT_ORDER  PROP_TAG(PT_MV_LONG,    0x6601)
  89. #if defined(_WIN32)
  90. #define CRITICAL_SECTION_MEMBERS    CRITICAL_SECTION cs;
  91. #define CRITICAL_SECTION_MEMBERS_P  CRITICAL_SECTION *pcs;
  92. #else
  93. #define CRITICAL_SECTION_MEMBERS
  94. #define CRITICAL_SECTION_MEMBERS_P
  95. #endif
  96. /* Object typedefs ------------------------------------------------------- */
  97. typedef struct _OBJ     OBJ,        * POBJ,     ** PPOBJ;
  98. typedef struct _MSP     MSP,        * PMSP,     ** PPMSP;
  99. typedef struct _MSL     MSL,        * PMSL,     ** PPMSL;
  100. typedef struct _IMS     IMS,        * PIMS,     ** PPIMS;
  101. typedef struct _IFLD    IFLD,       * PIFLD,    ** PPIFLD;
  102. typedef struct _IMSG    IMSG,       * PIMSG,    ** PPIMSG;
  103. typedef struct _IATCH   IATCH,      * PIATCH,   ** PPIATCH;
  104. typedef struct _STM     STM,        * PSTM,     ** PPSTM;
  105. typedef struct _STG     STG,        * PSTG,     ** PPSTG;
  106. /* Standard Object --------------------------------------------------------- */
  107. #undef  INTERFACE
  108. #define INTERFACE struct _OBJ
  109. #undef  MAPIMETHOD_
  110. #define MAPIMETHOD_(type, method)   MAPIMETHOD_DECLARE(type, method, OBJ_)
  111.         MAPI_IUNKNOWN_METHODS(IMPL)
  112. #undef  MAPIMETHOD_
  113. #define MAPIMETHOD_(type, method)   STDMETHOD_(type, method)
  114. DECLARE_MAPI_INTERFACE(OBJ_)
  115. {
  116.     MAPI_IUNKNOWN_METHODS(IMPL)
  117. };
  118. #define STANDARD_OBJECT_MEMBERS     
  119.     LONG                cRef;       
  120.     WORD                wType;      
  121.     WORD                wFlags;     
  122.     POBJ                pobjParent; 
  123.     POBJ                pobjNext;   
  124.     POBJ                pobjHead;   
  125.     PIMS                pims;       
  126.     CRITICAL_SECTION_MEMBERS_P      
  127. /* NOTE: If you modify this enumeration, you must also update various */
  128. /* structures in mspobj.c which use the type as an index into lookup tables */
  129. enum {
  130.     OT_MSPROVIDER,
  131.     OT_MSLOGON,
  132.     OT_MSGSTORE,
  133.     OT_FOLDER,
  134.     OT_MESSAGE,
  135.     OT_ATTACH,
  136.     OT_STREAM,
  137.     OT_TABLE,
  138.     OT_MAX
  139. };
  140. #define OBJF_MODIFY     ((WORD)0x0001)
  141. struct _OBJ
  142. {
  143.     OBJ_Vtbl *      lpVtbl;
  144.     STANDARD_OBJECT_MEMBERS
  145. };
  146. typedef void (*LPFNNEUTER)(POBJ);
  147. extern LPFNNEUTER rgfnNeuter[];
  148. #define OBJ_SetFlag(pobj, f)    ((pobj)->wFlags |=  (f))
  149. #define OBJ_ClearFlag(pobj, f)  ((pobj)->wFlags &= ~(f))
  150. #define OBJ_TestFlag(pobj, f)   ((pobj)->wFlags &   (f))
  151. #ifdef _WIN32
  152. #define OBJ_Initialize(pobj, _vtbl, _wType, _pims, _pcs)    
  153.     (pobj)->lpVtbl      = _vtbl;    
  154.     (pobj)->cRef        = 1;        
  155.     (pobj)->wType       = _wType;   
  156.     (pobj)->pims        = _pims;    
  157.     (pobj)->pcs         = _pcs;
  158. #else
  159. #define OBJ_Initialize(pobj, _vtbl, _wType, _pims, _pcs)    
  160.     (pobj)->lpVtbl      = _vtbl;    
  161.     (pobj)->cRef        = 1;        
  162.     (pobj)->wType       = _wType;   
  163.     (pobj)->pims        = _pims;
  164. #endif
  165. #define OBJ_EnterCriticalSection(pobj)  EnterCriticalSection((pobj)->pcs)
  166. #define OBJ_LeaveCriticalSection(pobj)  LeaveCriticalSection((pobj)->pcs)
  167. #define MSP_EnterCriticalSection(pmsp)  OBJ_EnterCriticalSection((POBJ)pmsp)
  168. #define MSP_LeaveCriticalSection(pmsp)  OBJ_LeaveCriticalSection((POBJ)pmsp)
  169. #define IMS_EnterCriticalSection(pims)  OBJ_EnterCriticalSection((POBJ)pims)
  170. #define IMS_LeaveCriticalSection(pims)  OBJ_LeaveCriticalSection((POBJ)pims)
  171. /*
  172.  *  MSPOBJ.C
  173.  */
  174. BOOL    FQueryInterface(int wType, REFIID riid);
  175. void    OBJ_Enqueue(POBJ pobj, POBJ pobjParent);
  176. void    OBJ_Dequeue(POBJ pobj);
  177. void    OBJ_Destroy(POBJ pobj);
  178. extern CHAR szFolderTemplate[];         /*  "*.fld"         */
  179. extern CHAR szMessageTemplate[];        /*  "*.msg"         */
  180. extern CHAR szPropertyFileName[];       /*  "folder.prp"    */
  181. extern CHAR szHierarchyFileName[];      /*  "hierarch.tbl"  */
  182. extern CHAR szContentsFileName[];       /*  "contents.tbl"  */
  183. extern CHAR szOutgoingFileName[];       /*  "outgoing.tbl"  */
  184. /*
  185.  *  MSPRFS.C
  186.  */
  187. /* Manifest constants */
  188. #define RFS_CREATE      ((ULONG) 0x00000001)
  189. /* Typedefs */
  190. typedef struct _RFS         /* Receive Folder Storage */
  191. {
  192.     LPTSTR szFile;          /* Name of docfile containing RecFldr settings */
  193. } RFS, * PRFS;
  194. typedef struct _RFN         /* A single RFS Node */
  195. {
  196.     LPTSTR szClass;         /* Name of the message class */
  197.     LPTSTR szName;          /* Relative path name of receive folder, i.e. */
  198.                             /* EntryID minus the GUID                     */
  199. } RFN, * PRFN;
  200. /* Exported functions */
  201. BOOL FIsValidMessageClass(LPTSTR szMessageClass);
  202. HRESULT OpenRFS (LPTSTR szStoreRoot, LPTSTR szFile, ULONG ulFlags,
  203.     PRFS * lpprfs);
  204. HRESULT GetRFN (PRFS prfs, LPTSTR szClassName, PRFN * pprfn);
  205. VOID    FreeRFN (PRFN prfn);
  206. HRESULT DeleteRFN (PRFS prfs, LPTSTR szClassName);
  207. HRESULT AddRFN (PRFS, PRFN prfn);
  208. HRESULT CloseRFS (PRFS prfs);
  209. /*
  210.  *  MSPMS.C
  211.  */
  212. /* Manifest constants */
  213. #define IMS_CREATE      ((WORD) 0x0002)
  214. #define IMS_INVALID     ((WORD) 0x0004)
  215. /* Typedefs */
  216. #undef  INTERFACE
  217. #define INTERFACE   struct _IMS
  218. #undef  MAPIMETHOD_
  219. #define MAPIMETHOD_(type, method)   MAPIMETHOD_DECLARE(type, method, IMS_)
  220.         MAPI_IUNKNOWN_METHODS(IMPL)
  221.         MAPI_IMAPIPROP_METHODS(IMPL)
  222.         MAPI_IMSGSTORE_METHODS(IMPL)    
  223. #undef  MAPIMETHOD_
  224. #define MAPIMETHOD_(type, method)   MAPIMETHOD_TYPEDEF(type, method, IMS_)
  225.         MAPI_IUNKNOWN_METHODS(IMPL)
  226.         MAPI_IMAPIPROP_METHODS(IMPL)
  227.         MAPI_IMSGSTORE_METHODS(IMPL)
  228. #undef  MAPIMETHOD_
  229. #define MAPIMETHOD_(type, method)   STDMETHOD_(type, method)
  230. DECLARE_MAPI_INTERFACE(IMS_)
  231. {
  232.     MAPI_IUNKNOWN_METHODS(IMPL)
  233.     MAPI_IMAPIPROP_METHODS(IMPL)
  234.     MAPI_IMSGSTORE_METHODS(IMPL)    
  235. };
  236. struct _IMS             /* Implementation of IMsgStore */
  237. {
  238.     IMS_Vtbl *      lpVtbl;     /* -> vtblIMS */
  239.     STANDARD_OBJECT_MEMBERS
  240.     LPTSTR      szStorePath;    /* Full path to the store root */
  241.     MAPIUID     uidResource;    /* Message Store unique identifier */
  242.     LPTSTR      szProps;        /* Full path to property docfile */
  243.     PMSL        pmsl;           /* Logon object (MAPI session stuff) */
  244.     PMSP        pmsp;           /* Provider object (global stuff) */
  245.     LMR         lmr;            /* Linked memory routines */
  246.     PRFS        prfs;           /* Struct handling access to receive folder */
  247.     LPMAPISUP   psup;           /* MAPI Support object */
  248.     SBinary     eidStore;       /* PR_STORE_ENTRYID */
  249.     LPTABLEDATA lptblOutgoing;  /* outgoing queue for this store */
  250.     HANDLE      hOGQueueMutex;  /* Mutex for reading/writing the OG Queue */
  251.     FILETIME    ftOGQueue;      /* The time of the OQ file when we read it */
  252.     ULONG       cOutgoingViews; /* number of views open on the outgoing queue */
  253.     ULONG       ulOQConn;       /* Connection for OQ unadvise */
  254.     HANDLE      hContTblMutex;  /* Mutex for reading/writing ALL cont tbls */
  255.     ULONG       ulTblConn;      /* Connection for Tbl unadvise */
  256.     LPMSGSESS   pmsgsess;       /* IMSG Session to create all messages within */
  257.     ULONG       ulFlagsSLT;     /* Flags for StoreLogoffTransports */
  258. };
  259. #define MSF_SPOOLER         ((WORD)0x8000)
  260. #define MSF_BEINGDESTROYED  ((WORD)0x4000)
  261. #define SMS_SUPPORTMASK     (STORE_ENTRYID_UNIQUE |     
  262.                             STORE_ATTACH_OK |           
  263.                             STORE_OLE_OK |              
  264.                             STORE_NOTIFY_OK |           
  265.                             STORE_MV_PROPS_OK |         
  266.                             STORE_RESTRICTION_OK |      
  267.                             STORE_SORT_OK |             
  268.                             STORE_MODIFY_OK |           
  269.                             STORE_CREATE_OK |           
  270.                             STORE_SUBMIT_OK)
  271. /* Outgoing Queue Notification Block (ONB) */
  272. /* This is the format of our extended cross-process notification for the */
  273. /* outgoing queue table. We use this to update the table data in other */
  274. /* processes after we change it in the originating process. The changes */
  275. /* that we pass across are either deleting a row (for example, when the */
  276. /* spooler calls FinishedMsg), or adding a row (for example, when the */
  277. /* client submits a message). */
  278. typedef struct _ONB
  279. {
  280.     FILETIME ftBeforeUpdate;    /* time of the file before updating */
  281.     FILETIME ftAfterUpdate;     /* time of the file after applying the update */
  282.     LPVOID  pvRef;              /* memory offset from originating process */
  283.     ULONG   cbNtf;              /* # of bytes in abNtf (the flat notif below) */
  284.     BYTE    abNtf[1];           /* the update to apply to the table */
  285. } ONB, * PONB;
  286. #define CbNewONB(_cb)       (offsetof(ONB,abNtf) + (_cb))
  287. #define CbONB(_ponb) 
  288.     (offsetof(ONB,abNtf) + (UINT)((_ponb)->cbNtf))
  289. /* Table Notification Block (TNB) */
  290. /* This is the format of our extended cross-process notification for */
  291. /* Contents and Hierarchy Tables. We use this notification to update a */
  292. /* table in other processes after we change it in the originating process. */
  293. /* The notification consists of an object notification containing the */
  294. /* entryids we need. The fnev tells the event type. We only use two of */
  295. /* the entryids in the object notification. The ParentID fields refer to */
  296. /* the parent folder of the table we need to update. The EntryID fields */
  297. /* refer to the object that changed within the folder. The ulObjType field */
  298. /* will be either MAPI_MESSAGE (for contents table changes) or MAPI_FOLDER */
  299. /* (for hierarchy table changes).  All other fields in the structure are */
  300. /* unused and should be set to 0. */
  301. typedef struct _TNB
  302. {
  303.     ULONG   ulTableEvent;   /* TABLE_ROW_ (ADDED, DELETED, MODIFIED) */
  304.     LPVOID  pvRef;          /* memory offset from originating process */
  305.     ULONG   cbNtf;          /* # of bytes in abNtf (the flat notif below) */
  306.     BYTE    abNtf[1];       /* an object notification */
  307. } TNB, * PTNB;
  308. #define CbNewTNB(_cb)       (offsetof(TNB,abNtf) + (_cb))
  309. #define CbTNB(_ptnb) 
  310.     (offsetof(TNB,abNtf) + (UINT)((_ptnb)->cbNtf))
  311. /* Exported functions */
  312. HRESULT HrOpenIMSPropsFileRetry(LPMSGSESS pmsgsess, LPTSTR szFile, PLMR plmr,
  313.     LPMAPISUP psup, BOOL fModify, LPMESSAGE * lppmsg);
  314. BOOL IMS_IsInvalid(PIMS pims);
  315. /* Constructors */
  316. HRESULT HrNewIMS(LPTSTR szStorePath, LPTSTR szStoreProps, PMSP pmsp,
  317.     PMSL pmsl, PRFS prfs, LPPROFSECT pps, LPMAPISUP psup, BOOL fCreate,
  318.     PIMS *ppims);
  319. /* Non-virtual public methods */
  320. void IMS_Neuter(PIMS pims);
  321. HRESULT HrInitIMSProps (PIMS pims, LPTSTR szPswd);
  322. VOID GetResourceUID (PIMS pims, LPMAPIUID lpuid);
  323. HRESULT HrUniqueFileName (PIMS pims, ULONG * lpulSeqNumber, LPTSTR *
  324.     lppszNewName);
  325. BOOL FIsInvalidEID (ULONG, PEID, PIMS);
  326. /* Others */
  327. STDAPI_(void) MsgReleaseStg (ULONG ulCallerData, LPMESSAGE lpMessage);
  328. long STDAPICALLTYPE LSMSNotifCallback (LPVOID lpvContext,
  329.     ULONG cNotif, LPNOTIFICATION lpNotifs);
  330. /* column properties for outgoing queue */
  331. #define OUTGOING_COLUMNS    13      /* number of columns in outgoing queue */
  332. static const SizedSPropTagArray(OUTGOING_COLUMNS, sptaOutgoing) =
  333. {
  334.     OUTGOING_COLUMNS,
  335.     {
  336.         PR_ENTRYID,
  337.         PR_SUBMIT_FLAGS,
  338.         PR_INSTANCE_KEY,    /* the index column */
  339.         PR_DISPLAY_TO,
  340.         PR_DISPLAY_CC,
  341.         PR_DISPLAY_BCC,
  342.         PR_SENDER_NAME,
  343.         PR_SUBJECT,
  344.         PR_CLIENT_SUBMIT_TIME,
  345.         PR_PRIORITY,
  346.         PR_MESSAGE_FLAGS,
  347.         PR_MESSAGE_SIZE,
  348.         PR_SPOOLER_STATUS
  349.     }
  350. };
  351. /*
  352.  *  MSPFLD.C
  353.  */
  354. #define FAILED_SEARCH   (INVALID_HANDLE_VALUE)
  355. #define MODIFY_INDEX    1       /* index of LAST_MODIFICATION_TIME in tables */
  356. /* column properties for contents tables */
  357. #define CONTENTS_COLUMNS    22      /* number of columns in a table of messages */
  358. static const SizedSPropTagArray(CONTENTS_COLUMNS, sPropTagsContents) =
  359. {
  360.     CONTENTS_COLUMNS,
  361.     {
  362.         PR_ENTRYID,
  363.         PR_LAST_MODIFICATION_TIME,  /* must be in position MODIFY_INDEX */
  364.         PR_INSTANCE_KEY,            /* the index column */
  365.         PR_HASATTACH,
  366.         PR_SUBJECT,
  367.         PR_SENDER_NAME,
  368.         PR_DISPLAY_TO,
  369.         PR_DISPLAY_CC,
  370.         PR_CLIENT_SUBMIT_TIME,
  371.         PR_MESSAGE_DELIVERY_TIME,
  372.         PR_MESSAGE_FLAGS,
  373.         PR_PRIORITY,
  374.         PR_CONVERSATION_KEY,
  375.         PR_SEARCH_KEY,
  376.         PR_ICON,
  377.         PR_MINI_ICON,
  378.         PR_SENSITIVITY,
  379.         PR_MESSAGE_CLASS,
  380.         PR_RECORD_KEY,
  381.         PR_SPOOLER_STATUS,
  382.         PR_SENT_REPRESENTING_NAME,
  383.         PR_MSG_STATUS
  384.     }
  385. };
  386. /* column properties for hierarchy tables */
  387. #define HIERARCHY_COLUMNS   12
  388. static const SizedSPropTagArray(HIERARCHY_COLUMNS, sPropTagsHierarchy) =
  389. {
  390.     HIERARCHY_COLUMNS,
  391.     {
  392.         PR_ENTRYID,
  393.         PR_LAST_MODIFICATION_TIME, /* must be in postion MODIFY_INDEX */
  394.         PR_DISPLAY_NAME,    /* the folder name */
  395.         PR_INSTANCE_KEY,    /* the index column */
  396.         PR_OBJECT_TYPE,
  397.         PR_COMMENT,
  398.         PR_CONTENT_COUNT,
  399.         PR_CONTENT_UNREAD,
  400.         PR_STATUS,
  401.         PR_SUBFOLDERS,
  402.         PR_FOLDER_TYPE,
  403.         PR_DEPTH            /* depth in hierarchy, must be last */
  404.     }
  405. } ;
  406. #undef  INTERFACE
  407. #define INTERFACE struct _IFLD
  408.     
  409. #undef  MAPIMETHOD_
  410. #define MAPIMETHOD_(type, method)   MAPIMETHOD_DECLARE(type, method, IFLD_)
  411.         MAPI_IUNKNOWN_METHODS(IMPL)
  412.         MAPI_IMAPIPROP_METHODS(IMPL)
  413.         MAPI_IMAPICONTAINER_METHODS(IMPL)
  414.         MAPI_IMAPIFOLDER_METHODS(IMPL)
  415. #undef  MAPIMETHOD_
  416. #define MAPIMETHOD_(type, method)   MAPIMETHOD_TYPEDEF(type, method, IFLD_)
  417.         MAPI_IUNKNOWN_METHODS(IMPL)
  418.         MAPI_IMAPIPROP_METHODS(IMPL)
  419.         MAPI_IMAPICONTAINER_METHODS(IMPL)
  420.         MAPI_IMAPIFOLDER_METHODS(IMPL)
  421. #undef  MAPIMETHOD_
  422. #define MAPIMETHOD_(type, method)   STDMETHOD_(type, method)
  423. DECLARE_MAPI_INTERFACE(IFLD_)
  424. {
  425.     MAPI_IUNKNOWN_METHODS(IMPL)
  426.     MAPI_IMAPIPROP_METHODS(IMPL)
  427.     MAPI_IMAPICONTAINER_METHODS(IMPL)
  428.     MAPI_IMAPIFOLDER_METHODS(IMPL)
  429. };
  430. extern IFLD_Vtbl    vtblIFLD;
  431. /* we store PR_ENTRYID, PR_PARENT_ENTRYID and PR_INSTANCE_KEY internally */
  432. #define cpropIFLDInternal       3
  433. /* Folder's instance data */
  434. struct _IFLD
  435. {
  436.     IFLD_Vtbl *     lpVtbl; /* -> vtblIFLD */
  437.     STANDARD_OBJECT_MEMBERS
  438.     PEID peid;                  /* EntryID of this folder */
  439.     ULONG           cval;       /* # of internal props */
  440.     LPSPropValue    pval;       /* internal prop values */
  441.     LPTABLEDATA lptblContents;  /* contents table for this folder */
  442.     ULONG cContentsViews;       /* number of views open on contents table*/
  443.     LPTABLEDATA lptblHierarchy; /* hierarchy table for this folder */
  444.     ULONG cHierarchyViews;      /* number of views open on hierarchy table */
  445. };
  446. HRESULT HrNewIFLD(PEID peid, PIMS pims, BOOL fModify, PIFLD * ppifld);
  447. HRESULT HrCreateFolderStorage(PIFLD pifld, ULONG ulFolderType,
  448.     LPSTR szFolderName, LPSTR szFolderComment, BOOL fCreateDir,
  449.     PIMS pims, PEID *ppeid);
  450. HRESULT HrNewEID (PIFLD, PIMS, LPTSTR, ULONG *, PEID *);
  451. HRESULT HrIncrementOneROProp(PIFLD pifld, LONG lDelta, ULONG ulPT);
  452. HRESULT HrIsParent(PEID peidParent, PEID peidChild, BOOL *pfIsParent);
  453. HRESULT HrGetFileModTime(LPTSTR szStorePath, LPTSTR szFileName,
  454.     FILETIME *pft);
  455. HRESULT HrFullPathName (LPSTR, LPSTR, LPSTR, LPSTR *);
  456. HRESULT HrFullToRelative(LPTSTR, PIMS, LPTSTR *);
  457. HRESULT HrOpenPropertyMessageRetry(PEID peid, PIMS pims,
  458.     BOOL fModifyExclusive, LPMESSAGE *lppmsg);
  459. HRESULT HrFindFirstID( PIFLD, LPTSTR, ULONG *, LPTSTR *, HANDLE *,
  460.                     WIN32_FIND_DATA *, PEID *);
  461. HRESULT HrFindNextID( PIFLD, ULONG, LPTSTR, HANDLE, WIN32_FIND_DATA *, PEID *);
  462. void CloseIDSearch( HANDLE *, LPTSTR *);
  463. HRESULT HrFullToRelative( LPTSTR, PIMS, LPTSTR *);
  464. HRESULT HrUpdateRow(PIMS pims, LPTABLEDATA lptbl, PEID peid,
  465.     LPSPropTagArray pPTA, FILETIME *pft, ULONG ulObjType);
  466. void    IFLD_Neuter (PIFLD);
  467. void ChangeTable(PIMS pims, PEID peidTable, PEID peidObject,
  468.     ULONG ulObjType, ULONG ulTableEvent, BOOL fSendNotif);
  469. HRESULT HrRemoveRow( LPTABLEDATA lptbl, PEID peid);
  470. /*
  471.  *  MSPMSG.C
  472.  */
  473. #undef  INTERFACE
  474. #define INTERFACE struct _IMSG
  475.     
  476. #undef  MAPIMETHOD_
  477. #define MAPIMETHOD_(type, method)   MAPIMETHOD_DECLARE(type, method, IMSG_)
  478.         MAPI_IUNKNOWN_METHODS(IMPL)
  479.         MAPI_IMAPIPROP_METHODS(IMPL)
  480.         MAPI_IMESSAGE_METHODS(IMPL)
  481. #undef  MAPIMETHOD_
  482. #define MAPIMETHOD_(type, method)   MAPIMETHOD_TYPEDEF(type, method, IMSG_)
  483.         MAPI_IUNKNOWN_METHODS(IMPL)
  484.         MAPI_IMAPIPROP_METHODS(IMPL)
  485.         MAPI_IMESSAGE_METHODS(IMPL)
  486. #undef  MAPIMETHOD_
  487. #define MAPIMETHOD_(type, method)   STDMETHOD_(type, method)
  488. DECLARE_MAPI_INTERFACE(IMSG_)
  489. {
  490.     MAPI_IUNKNOWN_METHODS(IMPL)
  491.     MAPI_IMAPIPROP_METHODS(IMPL)
  492.     MAPI_IMESSAGE_METHODS(IMPL)
  493. };
  494. extern IMSG_Vtbl    vtblIMSG;
  495. struct _IMSG            /* Implementation of IMessage */
  496. {
  497.     IMSG_Vtbl * lpVtbl; /* -> vtblIMSG */
  498.     STANDARD_OBJECT_MEMBERS
  499.     LPMESSAGE       lpmsg;
  500.     PEID            peid;
  501.     ULONG           cval;
  502.     LPSPropValue    pval;
  503. };
  504. #define MSGF_NEWLYCREATED           ((WORD)0x4000)
  505. #define MSGF_MSGINMSG               ((WORD)0x2000)
  506. #define MSGF_FRESH                  ((WORD)0x1000)
  507. #define MSGF_CREATEDSTORAGE         ((WORD)0x0800)
  508. #define SET         1
  509. #define UNSET       2
  510. #define DONT_SAVE   4
  511. /* Exported functions */
  512. HRESULT HrNewIMSG(PEID peid, PIMS pims, BOOL fCreate, BOOL fModify,
  513.     ULONG ulSeqNum, LPSTR *pszFull, PIMSG *ppimsg);
  514. HRESULT HrSetFlags(PIMSG, ULONG, ULONG, ULONG); 
  515. HRESULT NewIMSGInIATCH (LPMESSAGE lpmsg, POBJ pobj, ULONG ulFlags, PIMSG * ppimsg);
  516. HRESULT InitIMSGProps(PIMSG pimsg);
  517. void IMSG_Neuter (PIMSG);
  518. HRESULT HrSetInternalProps(PLMR plmr, ULONG cprop, LPSPropValue *ppval,
  519.     ULONG *pcval, PEID peid, PEID peidParent, ULONG ulSeqNum);
  520. /*
  521.  *  MSPATCH.C
  522.  */
  523. #undef  INTERFACE
  524. #define INTERFACE struct _IATCH
  525.     
  526. #undef  MAPIMETHOD_
  527. #define MAPIMETHOD_(type, method)   MAPIMETHOD_DECLARE(type, method, IATCH_)
  528.         MAPI_IUNKNOWN_METHODS(IMPL)
  529.         MAPI_IMAPIPROP_METHODS(IMPL)
  530.         MAPI_IATTACH_METHODS(IMPL)
  531. #undef  MAPIMETHOD_
  532. #define MAPIMETHOD_(type, method)   MAPIMETHOD_TYPEDEF(type, method, IATCH_)
  533.         MAPI_IUNKNOWN_METHODS(IMPL)
  534.         MAPI_IMAPIPROP_METHODS(IMPL)
  535.         MAPI_IATTACH_METHODS(IMPL)
  536. #undef  MAPIMETHOD_
  537. #define MAPIMETHOD_(type, method)   STDMETHOD_(type, method)
  538. DECLARE_MAPI_INTERFACE(IATCH_)
  539. {
  540.     MAPI_IUNKNOWN_METHODS(IMPL)
  541.     MAPI_IMAPIPROP_METHODS(IMPL)
  542.     MAPI_IATTACH_METHODS(IMPL)
  543. };
  544. extern IATCH_Vtbl   vtblIATCH;
  545. struct _IATCH           /* Implementation of IAttach */
  546. {
  547.     IATCH_Vtbl *    lpVtbl; /* -> vtblIATCH */
  548.     STANDARD_OBJECT_MEMBERS
  549.     LPATTACH lpattach;
  550. };
  551. /* Exported functions */
  552. HRESULT HrNewIATCH(LPATTACH lpattach, PIMSG pimsg, BOOL fModify,
  553.     PIATCH * ppiatch);
  554. void IATCH_Neuter (PIATCH piatch);
  555. /*
  556.  *  MSPGLE.C
  557.  */
  558. HRESULT MapScodeSz (SCODE scArg, PIMS pims, LPTSTR * lppszError);
  559. /*
  560.  *  MSPMISC.C
  561.  */
  562. /* length in chars of file extension including . (no NULL) */
  563. #define CCH_EXT         4
  564. /* length in chars of the base portion of a local name (no NULL) */
  565. #define CCH_BASE        8
  566. /* length in chars of a local name of a message or folder, including NULL */
  567. #define CCH_NAME            (CCH_BASE + CCH_EXT + 1)
  568. #define FOLDER_EXT      TEXT( ".fld" )  /* extension for folder directory names */
  569. #define MESSAGE_EXT     TEXT( ".msg" )  /* File name extension for messages */
  570. #define TEMP_EXT        TEXT( ".tmp" )  /* File name extension for messages */
  571. /* Filename extension for read-receipt messages   */
  572. #define READRECEIPT_EXT TEXT( ".rrt" )
  573. SCODE ScAlloc(ULONG lcb, LPVOID *ppv);
  574. SCODE ScAllocZ(ULONG lcb, LPVOID *ppv);
  575. SCODE ScRealloc(ULONG lcb, LPVOID pvOrig, LPVOID * ppv);
  576. void FreeNull(LPVOID pv);
  577. SCODE LMAllocZ(PLMR plmr, ULONG lcb, LPVOID *ppv);
  578. SCODE ScInitMSInstance(LPMALLOC lpmalloc);
  579. void DeinitMSInstance(void);
  580. #define HrAlloc(a,b)        ResultFromScode(ScAlloc((a), (b)))
  581. #define HrAllocZ(a,b)       ResultFromScode(ScAllocZ((a), (b)))
  582. #define HrRealloc(a,b,c)    ResultFromScode(ScRealloc((a), (b), (c)))
  583. LPTSTR SzBaseName (PEID);
  584. BOOL FCheckEIDType(PEID peid, LPSTR szExt);
  585. BOOL FIsRoot (PEID peid);
  586. BOOL FIsFolder (PEID peid);
  587. BOOL FIsUnsavedMsg (PIMSG pimsg);
  588. #define FIsMessage(_peid)       FCheckEIDType((_peid), MESSAGE_EXT)
  589. #define FIsUnsavedEID(_peid)    FCheckEIDType((_peid), TEMP_EXT)
  590. HRESULT HrDeconstructEID (PEID peid, LPMAPIUID * lppuid,
  591.     LPTSTR * lppszPath, LPTSTR * lppszFile);
  592. HRESULT HrAppendPath (LPTSTR szBase, LPTSTR szAppend, LPTSTR *
  593.     lppszFullPath);
  594. BOOL FAppendPathNoMem (LPTSTR szBase, LPTSTR szAppend,
  595.     ULONG cchFullPath, LPTSTR szFullPath);
  596. void ReplaceExt(LPTSTR szFile, LPTSTR szExt);
  597. HRESULT HrConstructEID(LPMAPIUID lpuidStore, PLMR plmr, LPSTR szNewName,
  598.     PEID *ppeidNew);
  599. HRESULT HrGetParentEID (PLMR, PEID, PEID *);
  600. HRESULT HrOpenParent(PIMS pims, PEID peid, ULONG ulFlags, PIFLD *ppifld);
  601. void FreePropArrays (LPSPropValue *,
  602.     LPSPropTagArray *, LPSPropAttrArray *);
  603. HRESULT HrAllocPropArrays (ULONG, LPSPropValue *,
  604.     LPSPropTagArray *, LPSPropAttrArray *);
  605. HRESULT HrWrap_GetProps(HRESULT hr, PIMS pims, ULONG cvalInt,
  606.     LPSPropValue pvalInt, ULONG * lpcValues, LPSPropValue * ppval,
  607.     BOOL fStore, BOOL fTagsSpecified, POBJ pobj);
  608. BOOL FIsSubmittedMessage(PIMS pims, PEID peid);
  609. HRESULT HrOpenIMsgSession(LPMSGSESS *ppmsgsess);
  610. HRESULT HrOpenIMsg(LPMSGSESS pmsgsess, LPSTR szFile, PLMR plmr, LPMAPISUP psup,
  611.     BOOL fCreate, BOOL fModify, BOOL fExclusive, LPMESSAGE *lppmsg);
  612. HRESULT HrSetOneROProp(LPMESSAGE lpmsg, PLMR plmr, ULONG ulPT, LPVOID pv);
  613. HRESULT HrGetSingleProp(LPMAPIPROP pmprop, PLMR plmr, ULONG ulPT, LPVOID pv);
  614. HRESULT HrSetSingleProp(LPMAPIPROP pmprop, PLMR plmr, ULONG ulPT, LPVOID pv);
  615. BOOL FContainsProp(ULONG ulPropTag, LPSPropTagArray ptaga);
  616. /*
  617.  *  MSPROVIDER object.
  618.  *  Returned by MSProviderInit() routine.
  619.  *  One is created for each Session logged
  620.  *  into this store provider on this process.
  621.  */
  622. #undef  INTERFACE
  623. #define INTERFACE struct _MSP
  624. #undef  MAPIMETHOD_
  625. #define MAPIMETHOD_(type, method)   MAPIMETHOD_DECLARE(type, method, MSP_)
  626.         MAPI_IUNKNOWN_METHODS(IMPL)
  627.         MAPI_IMSPROVIDER_METHODS(IMPL)
  628. #undef  MAPIMETHOD_
  629. #define MAPIMETHOD_(type, method)   MAPIMETHOD_TYPEDEF(type, method, MSP_)
  630.         MAPI_IUNKNOWN_METHODS(IMPL)
  631.         MAPI_IMSPROVIDER_METHODS(IMPL)
  632. #undef  MAPIMETHOD_
  633. #define MAPIMETHOD_(type, method)   STDMETHOD_(type, method)
  634. DECLARE_MAPI_INTERFACE(MSP_)
  635. {
  636.     MAPI_IUNKNOWN_METHODS(IMPL)
  637.     MAPI_IMSPROVIDER_METHODS(IMPL)
  638. };
  639. extern MSP_Vtbl vtblMSP;
  640. struct _MSP
  641. {
  642.     MSP_Vtbl *  lpVtbl;         /* -> vtblMSP */
  643.     STANDARD_OBJECT_MEMBERS
  644.     CRITICAL_SECTION_MEMBERS        /* Critical section (_WIN32 only) */
  645.     HINSTANCE       hInst;          /* Instance handle */
  646.     LMR             lmr;            /* Linked memory routines */
  647.     IFDBG(BOOL      fInvalid;)      /* TRUE if invalid (DEBUG only) */
  648. };
  649. /*
  650.  *  LOGON object.
  651.  *  Returned from MSP_Logon().
  652.  *  Called by MAPI.DLL.  Equivalent to the IMSGSTORE object
  653.  *  returned on the same call but is used by MAPI instead of the client.
  654.  */
  655. #undef  INTERFACE
  656. #define INTERFACE struct _MSL
  657. #undef  MAPIMETHOD_
  658. #define MAPIMETHOD_(type, method)   MAPIMETHOD_DECLARE(type, method, MSL_)
  659.         MAPI_IUNKNOWN_METHODS(IMPL)
  660.         MAPI_IMSLOGON_METHODS(IMPL)
  661. #undef  MAPIMETHOD_
  662. #define MAPIMETHOD_(type, method)   MAPIMETHOD_TYPEDEF(type, method, MSL_)
  663.         MAPI_IUNKNOWN_METHODS(IMPL)
  664.         MAPI_IMSLOGON_METHODS(IMPL)
  665. #undef  MAPIMETHOD_
  666. #define MAPIMETHOD_(type, method)   STDMETHOD_(type, method)
  667. DECLARE_MAPI_INTERFACE(MSL_)
  668. {
  669.     MAPI_IUNKNOWN_METHODS(IMPL)
  670.     MAPI_IMSLOGON_METHODS(IMPL)
  671. };
  672. extern MSL_Vtbl vtblMSL;
  673. extern MAPIUID uidProvider;
  674. struct _MSL
  675. {
  676.     MSL_Vtbl *      lpVtbl;     /* -> vtblMSL */
  677.     STANDARD_OBJECT_MEMBERS
  678.     CRITICAL_SECTION_MEMBERS        /* Critical section (_WIN32) */
  679.     LMR                 lmr;        /* Linked memory routines */
  680.     IFDBG(BOOL          fInvalid;)  /* TRUE if invalid (DEBUG only) */
  681. };
  682. /*
  683.  *  MSPTBL.C
  684.  */
  685.  
  686. HRESULT HrGetTableName(POBJ, LPSTR, LPSTR, LPSTR *);
  687. HRESULT HrSyncOutgoingTable(LPTABLEDATA lptbl, PIMS pims);
  688. HRESULT HrSyncContentsTable(PIFLD pifld, BOOL fWriteTable);
  689. HRESULT HrReadTableFromDisk(LPTABLEDATA, POBJ, LPSTR, ULONG, LPSTR);
  690. HRESULT HrWriteTableOnDisk(LPTABLEDATA, POBJ, LPSTR, LPSTR);
  691. /*
  692.  *  MSPNTFY.C
  693.  */
  694. HRESULT HrUpdateOutgoingQueue(PIMS pims, PIMSG pimsg, PEID peid,
  695.     ULONG ulTableEvent);
  696. HRESULT HrSetupPrivateNotifications(PIMS pims);
  697. HRESULT HrNewOutgoingTableData(PIMS pims);
  698. HRESULT HrCreateOGQueueMutex(HANDLE *phQMutex);
  699. HRESULT HrSendNotif(PIMS pims, PEID peidParent, PEID peidObject,
  700.     ULONG ulTableEvent, ULONG ulObjType);