Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
7.5 KiB

  1. //--------------------------------------------------------------------------
  2. // MsgFldr.h
  3. //--------------------------------------------------------------------------
  4. #ifndef __MSGFLDR_H
  5. #define __MSGFLDR_H
  6. //--------------------------------------------------------------------------
  7. // Depends
  8. //--------------------------------------------------------------------------
  9. #include "dbimpl.h"
  10. //--------------------------------------------------------------------------
  11. // ONLOCKINFO
  12. //--------------------------------------------------------------------------
  13. typedef struct tagONLOCKINFO {
  14. DWORD cLocked;
  15. LONG lMsgs;
  16. LONG lUnread;
  17. LONG lWatchedUnread;
  18. LONG lWatched;
  19. } ONLOCKINFO, *LPONLOCKINFO;
  20. //--------------------------------------------------------------------------
  21. // FOLDERSTATE
  22. //--------------------------------------------------------------------------
  23. typedef DWORD FOLDERSTATE;
  24. #define FOLDER_STATE_RELEASEDB 0x00000001
  25. #define FOLDER_STATE_CANCEL 0x00000002
  26. //--------------------------------------------------------------------------
  27. // CMessageFolder
  28. //--------------------------------------------------------------------------
  29. class CMessageFolder : public IMessageFolder,
  30. public IDatabaseExtension,
  31. public IOperationCancel,
  32. public IServiceProvider
  33. {
  34. public:
  35. //----------------------------------------------------------------------
  36. // Construction
  37. //----------------------------------------------------------------------
  38. CMessageFolder(void);
  39. ~CMessageFolder(void);
  40. //----------------------------------------------------------------------
  41. // IUnknown Members
  42. //----------------------------------------------------------------------
  43. STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv);
  44. STDMETHODIMP_(ULONG) AddRef(void);
  45. STDMETHODIMP_(ULONG) Release(void);
  46. //----------------------------------------------------------------------
  47. // IMessageFolder Members
  48. //----------------------------------------------------------------------
  49. STDMETHODIMP Initialize(IMessageStore *pStore, IMessageServer *pServer, OPENFOLDERFLAGS dwFlags, FOLDERID idFolder);
  50. STDMETHODIMP SetOwner(IStoreCallback *pDefaultCallback) { return E_NOTIMPL; }
  51. STDMETHODIMP GetFolderId(LPFOLDERID pidFolder);
  52. STDMETHODIMP GetMessageFolderId(MESSAGEID idMessage, LPFOLDERID pidFolder);
  53. STDMETHODIMP Close(void) { return(S_OK); }
  54. STDMETHODIMP Synchronize(SYNCFOLDERFLAGS dwFlags, DWORD cHeaders, IStoreCallback *pCallback) { return(S_OK); }
  55. STDMETHODIMP OpenMessage(MESSAGEID idMessage, OPENMESSAGEFLAGS dwFlags, IMimeMessage **ppMessage, IStoreCallback *pCallback);
  56. STDMETHODIMP SaveMessage(LPMESSAGEID pidMessage, SAVEMESSAGEFLAGS dwOptions, MESSAGEFLAGS dwFlags, IStream *pStream, IMimeMessage *pMessage, IStoreCallback *pCallback);
  57. STDMETHODIMP SetMessageStream(MESSAGEID idMessage, IStream *pStream);
  58. STDMETHODIMP SetMessageFlags(LPMESSAGEIDLIST pList, LPADJUSTFLAGS pFlags, LPRESULTLIST pResults, IStoreCallback *pCallback);
  59. STDMETHODIMP CopyMessages(IMessageFolder *pDest, COPYMESSAGEFLAGS dwFlags, LPMESSAGEIDLIST pList, LPADJUSTFLAGS pFlags, LPRESULTLIST pResults, IStoreCallback *pCallback);
  60. STDMETHODIMP DeleteMessages(DELETEMESSAGEFLAGS dwFlags, LPMESSAGEIDLIST pList, LPRESULTLIST pResults, IStoreCallback *pCallback);
  61. STDMETHODIMP ConnectionAddRef(void) { return(S_OK); }
  62. STDMETHODIMP ConnectionRelease(void) { return(S_OK); }
  63. STDMETHODIMP ResetFolderCounts(DWORD cMessages, DWORD cUnread, DWORD cWatchedUnread, DWORD cWatched);
  64. STDMETHODIMP IsWatched(LPCSTR pszReferences, LPCSTR pszSubject);
  65. STDMETHODIMP GetAdBarUrl(IStoreCallback *pCallback) { return E_NOTIMPL; };
  66. //----------------------------------------------------------------------
  67. // IMessageFolder::GetDatabase Members
  68. //----------------------------------------------------------------------
  69. STDMETHODIMP GetDatabase(IDatabase **ppDB) {
  70. *ppDB = m_pDB;
  71. (*ppDB)->AddRef();
  72. return(S_OK);
  73. }
  74. //----------------------------------------------------------------------
  75. // IDatabaseExtension Members
  76. //----------------------------------------------------------------------
  77. STDMETHODIMP Initialize(IDatabase *pDB);
  78. STDMETHODIMP OnLock(void);
  79. STDMETHODIMP OnUnlock(void);
  80. STDMETHODIMP OnRecordInsert(OPERATIONSTATE tyState, LPORDINALLIST pOrdinals, LPVOID pRecord);
  81. STDMETHODIMP OnRecordUpdate(OPERATIONSTATE tyState, LPORDINALLIST pOrdinals, LPVOID pRecordOld, LPVOID pRecordNew);
  82. STDMETHODIMP OnRecordDelete(OPERATIONSTATE tyState, LPORDINALLIST pOrdinals, LPVOID pRecord);
  83. STDMETHODIMP OnExecuteMethod(METHODID idMethod, LPVOID pBinding, LPDWORD pdwResult);
  84. //----------------------------------------------------------------------
  85. // IServiceProvider
  86. //----------------------------------------------------------------------
  87. STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, LPVOID *ppvObject);
  88. //----------------------------------------------------------------------
  89. // IOperationCancel Members
  90. //----------------------------------------------------------------------
  91. STDMETHODIMP Cancel(CANCELTYPE tyCancel) { FLAGSET(m_dwState, FOLDER_STATE_CANCEL); return(S_OK); }
  92. //----------------------------------------------------------------------
  93. // IDatabase Members
  94. //----------------------------------------------------------------------
  95. IMPLEMENT_IDATABASE(TRUE, m_pDB);
  96. private:
  97. //----------------------------------------------------------------------
  98. // Private Methods
  99. //----------------------------------------------------------------------
  100. HRESULT _FixupMessageCharset(IMimeMessage *pMessage, CODEPAGEID cpCurrent);
  101. HRESULT _GetMsgInfoFromMessage(IMimeMessage *pMessage, LPMESSAGEINFO pInfo);
  102. HRESULT _GetMsgInfoFromPropertySet(IMimePropertySet *pPropertySet, LPMESSAGEINFO pInfo);
  103. HRESULT _FreeMsgInfoData(LPMESSAGEINFO pInfo);
  104. HRESULT _SetMessageStream(LPMESSAGEINFO pInfo, BOOL fUpdateRecord, IStream *pStream);
  105. HRESULT _InitializeWatchIgnoreIndex(void);
  106. HRESULT _GetWatchIgnoreParentFlags(LPCSTR pszReferences, LPCSTR pszSubject, MESSAGEFLAGS *pdwFlags);
  107. private:
  108. //----------------------------------------------------------------------
  109. // Private Data
  110. //----------------------------------------------------------------------
  111. LONG m_cRef; // Ref Count
  112. ONLOCKINFO m_OnLock; // OnLock information
  113. FOLDERTYPE m_tyFolder; // Folder Type
  114. SPECIALFOLDER m_tySpecial; // Am I a Special Folder ?
  115. FOLDERID m_idFolder; // Folder Id
  116. FOLDERSTATE m_dwState; // Folder State
  117. IDatabase *m_pDB; // Database Table
  118. IMessageStore *m_pStore; // Store Object
  119. };
  120. //--------------------------------------------------------------------------
  121. // CreateMsgDbExtension
  122. //--------------------------------------------------------------------------
  123. HRESULT CreateMsgDbExtension(IUnknown *pUnkOuter, IUnknown **ppUnknown);
  124. HRESULT WalkThreadAdjustFlags(IDatabase *pDB, LPMESSAGEINFO pMessage,
  125. BOOL fSubThreads, DWORD cIndent, DWORD_PTR dwCookie, BOOL *pfDoSubThreads);
  126. #endif // __MSGFLDR_H