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.

335 lines
14 KiB

  1. /*
  2. * h t t p s e r v . h
  3. *
  4. * Author: Greg Friedman
  5. *
  6. * Purpose: Derives from IMessageServer to implement HTTPMail-specific
  7. * store communication.
  8. *
  9. * Copyright (C) Microsoft Corp. 1998.
  10. */
  11. #ifndef _HTTPSERV_H
  12. #define _HTTPSERV_H
  13. #include "tmap.h"
  14. #include "simpstr.h"
  15. class CFolderList;
  16. class CHTTPMailServer;
  17. typedef HRESULT (CHTTPMailServer::*PFNHTTPOPFUNC)(void);
  18. typedef HRESULT (CHTTPMailServer::*PFNHTTPRESPFUNC)(LPHTTPMAILRESPONSE pResponse);
  19. typedef struct tagHTTPSTATEFUNCS
  20. {
  21. PFNHTTPOPFUNC pfnOp; // operation function
  22. PFNHTTPRESPFUNC pfnResp; // response function
  23. } HTTPSTATEFUNCS, *LPHTTPSTATEFUNCS;
  24. typedef struct tagMARKEDMESSAGE
  25. {
  26. MESSAGEID idMessage;
  27. MESSAGEFLAGS dwFlags;
  28. BOOL fMarked;
  29. } MARKEDMESSAGE, *LPMARKEDMESSAGE;
  30. typedef struct tagNEWMESSAGEINFO
  31. {
  32. LPSTR pszUrlComponent;
  33. } NEWMESSAGEINFO, *LPNEWMESSAGEINFO;
  34. #define HTTPCOPYMOVE_OUTOFSPACE 0x00000001
  35. #define HTTPCOPYMOVE_ERROR 0x00000002
  36. typedef struct tagHTTPOPERATION
  37. {
  38. STOREOPERATIONTYPE tyOperation;
  39. const HTTPSTATEFUNCS *pfnState;
  40. BOOL fCancel;
  41. BOOL fStateWillAdvance;
  42. BOOL fNotifiedComplete;
  43. int iState;
  44. int cState;
  45. IStoreCallback *pCallback;
  46. DWORD dwOptions;
  47. long lIndex;
  48. FOLDERID idFolder;
  49. SYNCFOLDERFLAGS dwSyncFlags;
  50. CFolderList *pFolderList;
  51. IMessageFolder *pMessageFolder;
  52. LPSTR pszProblem;
  53. LPSTR pszDestFolderUrl;
  54. LPSTR pszDestUrl;
  55. MESSAGEID idMessage;
  56. FILEADDRESS faStream;
  57. IStream *pMessageStream;
  58. TMap<CSimpleString, MARKEDMESSAGE> *pmapMessageId;
  59. CSortedArray *psaNewMessages;
  60. LPSTR pszFolderName;
  61. LPSTR pszAdUrl;
  62. FLDRFLAGS dwFldrFlags;
  63. MESSAGEFLAGS dwMsgFlags;
  64. // folder synchronization
  65. DWORD cMessages;
  66. DWORD cUnread;
  67. // setmessage flags
  68. BOOL fMarkRead;
  69. DWORD dwSetFlags;
  70. IPropPatchRequest *pPropPatchRequest;
  71. DWORD dwIndex;
  72. LPMESSAGEIDLIST pIDList;
  73. HROWSET hRowSet;
  74. // batch copy move errors
  75. DWORD dwCopyMoveErrorFlags;
  76. // delete message junk for
  77. // dealing with servers that
  78. // don't support message deletion (Hotmail)
  79. DELETEMESSAGEFLAGS dwDelMsgFlags;
  80. BOOL fFallbackToMove;
  81. LPHTTPTARGETLIST pTargets;
  82. MESSAGEID idPutMessage;
  83. STOREERROR error;
  84. DWORD dwMinPollingInterval;
  85. } HTTPOPERATION, *LPHTTPOPERATION;
  86. class CHTTPMailServer : public IMessageServer, IHTTPMailCallback, public IOperationCancel
  87. {
  88. public:
  89. //----------------------------------------------------------------------
  90. // Construction/Destruction
  91. //----------------------------------------------------------------------
  92. CHTTPMailServer(void);
  93. ~CHTTPMailServer(void);
  94. private:
  95. // intentionally umimplemented copy constructor
  96. // and assignment operator
  97. CHTTPMailServer(const CHTTPMailServer& other);
  98. CHTTPMailServer& operator=(const CHTTPMailServer& other);
  99. public:
  100. //----------------------------------------------------------------------
  101. // IUnknown Members
  102. //----------------------------------------------------------------------
  103. STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv);
  104. STDMETHODIMP_(ULONG) AddRef(void);
  105. STDMETHODIMP_(ULONG) Release(void);
  106. //----------------------------------------------------------------------
  107. // IMessageServer Members
  108. //----------------------------------------------------------------------
  109. STDMETHODIMP Initialize(IMessageStore *pStore, FOLDERID idStoreRoot, IMessageFolder *pFolder, FOLDERID idFolder);
  110. STDMETHODIMP ResetFolder(IMessageFolder *pFolder, FOLDERID idFolder);
  111. STDMETHODIMP SetIdleCallback(IStoreCallback *pDefaultCallback);
  112. STDMETHODIMP SynchronizeFolder (SYNCFOLDERFLAGS dwFlags, DWORD cHeaders, IStoreCallback *pCallback);
  113. STDMETHODIMP GetMessage (MESSAGEID idMessage, IStoreCallback *pCallback);
  114. STDMETHODIMP PutMessage (FOLDERID idFolder, MESSAGEFLAGS dwFlags, LPFILETIME pftReceived, IStream *pStream, IStoreCallback *pCallback);
  115. STDMETHODIMP CopyMessages (IMessageFolder *pDest, COPYMESSAGEFLAGS dwOptions, LPMESSAGEIDLIST pList, LPADJUSTFLAGS pFlags, IStoreCallback *pCallback);
  116. STDMETHODIMP DeleteMessages (DELETEMESSAGEFLAGS dwOptions, LPMESSAGEIDLIST pList, IStoreCallback *pCallback);
  117. STDMETHODIMP SetMessageFlags (LPMESSAGEIDLIST pList, LPADJUSTFLAGS pFlags, SETMESSAGEFLAGSFLAGS dwFlags, IStoreCallback *pCallback);
  118. STDMETHODIMP GetServerMessageFlags(MESSAGEFLAGS *pFlags);
  119. STDMETHODIMP SynchronizeStore (FOLDERID idParent, SYNCSTOREFLAGS dwFlags, IStoreCallback *pCallback);
  120. STDMETHODIMP CreateFolder (FOLDERID idParent, SPECIALFOLDER tySpecial, LPCSTR pszName, FLDRFLAGS dwFlags, IStoreCallback *pCallback);
  121. STDMETHODIMP MoveFolder (FOLDERID idFolder, FOLDERID idParentNew, IStoreCallback *pCallback);
  122. STDMETHODIMP RenameFolder (FOLDERID idFolder, LPCSTR pszName, IStoreCallback *pCallback);
  123. STDMETHODIMP DeleteFolder (FOLDERID idFolder, DELETEFOLDERFLAGS dwFlags, IStoreCallback *pCallback);
  124. STDMETHODIMP SubscribeToFolder (FOLDERID idFolder, BOOL fSubscribe, IStoreCallback *pCallback);
  125. STDMETHODIMP Close(DWORD dwFlags);
  126. STDMETHODIMP GetFolderCounts(FOLDERID idFolder, IStoreCallback *pCallback);
  127. STDMETHODIMP GetNewGroups(LPSYSTEMTIME pSysTime, IStoreCallback *pCallback);
  128. STDMETHODIMP ConnectionAddRef() { return E_NOTIMPL; };
  129. STDMETHODIMP ConnectionRelease() { return E_NOTIMPL; };
  130. STDMETHODIMP GetWatchedInfo(FOLDERID idFolder, IStoreCallback *pCallback) { return E_NOTIMPL; }
  131. STDMETHODIMP GetAdBarUrl(IStoreCallback *pCallback);
  132. STDMETHODIMP GetMinPollingInterval(IStoreCallback *pCallback);
  133. // ----------------------------------------------------------------------------
  134. // ITransportCallback methods
  135. // ----------------------------------------------------------------------------
  136. STDMETHODIMP OnLogonPrompt(
  137. LPINETSERVER pInetServer,
  138. IInternetTransport *pTransport);
  139. STDMETHODIMP_(INT) OnPrompt(
  140. HRESULT hrError,
  141. LPCTSTR pszText,
  142. LPCTSTR pszCaption,
  143. UINT uType,
  144. IInternetTransport *pTransport);
  145. STDMETHODIMP OnStatus(
  146. IXPSTATUS ixpstatus,
  147. IInternetTransport *pTransport);
  148. STDMETHODIMP OnError(
  149. IXPSTATUS ixpstatus,
  150. LPIXPRESULT pIxpResult,
  151. IInternetTransport *pTransport);
  152. STDMETHODIMP OnProgress(
  153. DWORD dwIncrement,
  154. DWORD dwCurrent,
  155. DWORD dwMaximum,
  156. IInternetTransport *pTransport);
  157. STDMETHODIMP OnCommand(
  158. CMDTYPE cmdtype,
  159. LPSTR pszLine,
  160. HRESULT hrResponse,
  161. IInternetTransport *pTransport);
  162. STDMETHODIMP OnTimeout(
  163. DWORD *pdwTimeout,
  164. IInternetTransport *pTransport);
  165. // ----------------------------------------------------------------------------
  166. // IHTTPMailCallback methods
  167. // ----------------------------------------------------------------------------
  168. STDMETHODIMP OnResponse(
  169. LPHTTPMAILRESPONSE pResponse);
  170. STDMETHODIMP GetParentWindow(
  171. HWND *phwndParent);
  172. //----------------------------------------------------------------------
  173. // IOperationCancel Members
  174. //----------------------------------------------------------------------
  175. STDMETHODIMP Cancel(CANCELTYPE tyCancel);
  176. // ----------------------------------------------------------------------------
  177. // Private Implementation
  178. // ----------------------------------------------------------------------------
  179. public:
  180. // ----------------------------------------------------------------------------
  181. // Operations
  182. // ----------------------------------------------------------------------------
  183. HRESULT Connect(void);
  184. HRESULT GetMsgFolderRoot(void);
  185. HRESULT BuildFolderUrl(void);
  186. HRESULT ListFolders(void);
  187. HRESULT AutoListFolders(void);
  188. HRESULT PurgeFolders(void);
  189. HRESULT ListHeaders(void);
  190. HRESULT PurgeMessages(void);
  191. HRESULT ResetMessageCounts(void);
  192. HRESULT GetMessage(void);
  193. HRESULT CreateFolder(void);
  194. HRESULT RenameFolder(void);
  195. HRESULT DeleteFolder(void);
  196. HRESULT CreateSetFlagsRequest(void);
  197. HRESULT SetMessageFlags(void);
  198. HRESULT ApplyFlagsToStore(void);
  199. HRESULT DeleteMessages(void);
  200. HRESULT DeleteFallbackToMove(void);
  201. HRESULT PurgeDeletedFromStore(void);
  202. HRESULT PutMessage(void);
  203. HRESULT AddPutMessage(void);
  204. HRESULT CopyMoveMessage(void);
  205. HRESULT BatchCopyMoveMessages(void);
  206. HRESULT FinalizeBatchCopyMove(void);
  207. HRESULT GetAdBarUrlFromServer(void);
  208. HRESULT GetMinPollingInterval(void);
  209. // ----------------------------------------------------------------------------
  210. // Response Handlers
  211. // ----------------------------------------------------------------------------
  212. HRESULT HandleListFolders(LPHTTPMAILRESPONSE pResponse);
  213. HRESULT HandleListHeaders(LPHTTPMAILRESPONSE pResponse);
  214. HRESULT HandleGetMessage(LPHTTPMAILRESPONSE pResponse);
  215. HRESULT HandleGetMsgFolderRoot(LPHTTPMAILRESPONSE pResponse);
  216. HRESULT HandleCreateFolder(LPHTTPMAILRESPONSE pResponse);
  217. HRESULT HandleRenameFolder(LPHTTPMAILRESPONSE pResponse);
  218. HRESULT HandleDeleteFolder(LPHTTPMAILRESPONSE pResponse);
  219. HRESULT HandleMemberErrors(LPHTTPMAILRESPONSE pResponse);
  220. HRESULT HandleDeleteFallbackToMove(LPHTTPMAILRESPONSE pResponse);
  221. HRESULT HandlePutMessage(LPHTTPMAILRESPONSE pResponse);
  222. HRESULT HandleCopyMoveMessage(LPHTTPMAILRESPONSE pResponse);
  223. HRESULT HandleBatchCopyMoveMessages(LPHTTPMAILRESPONSE pResponse);
  224. private:
  225. // ----------------------------------------------------------------------------
  226. // Other stuff(tm)
  227. // ----------------------------------------------------------------------------
  228. BOOL _CreateWnd(void);
  229. static LRESULT _WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
  230. HRESULT _BeginDeferredOperation(void);
  231. HRESULT _DoOperation(void);
  232. void _FreeOperation(BOOL fValidState = TRUE);
  233. HRESULT _DoCopyMoveMessages(STOREOPERATIONTYPE sot, IMessageFolder *pDest, COPYMESSAGEFLAGS dwOptions, LPMESSAGEIDLIST pList, IStoreCallback *pCallback);
  234. HRESULT _LoadAccountInfo(IImnAccount *pAcct);
  235. HRESULT _LoadTransport(void);
  236. void _Disconnect(void);
  237. BOOL _FConnected(void) { return m_fConnected; }
  238. void _SetConnected(BOOL fConnected) { if (m_fConnected) _Disconnect(); m_fConnected = fConnected; }
  239. HRESULT _CreateMessageIDMap(TMap<CSimpleString, MARKEDMESSAGE> **ppMap);
  240. HRESULT _HrBuildMapAndTargets(LPMESSAGEIDLIST pList, HROWSET hRowSet, LPADJUSTFLAGS pFlags, SETMESSAGEFLAGSFLAGS dwFlags, TMap<CSimpleString, MARKEDMESSAGE> **ppMap, LPHTTPTARGETLIST *ppTargets);
  241. SPECIALFOLDER _TranslateHTTPSpecialFolderType(HTTPMAILSPECIALFOLDER tySpecial);
  242. BOOL _LoadSpecialFolderName(SPECIALFOLDER tySpecial, LPSTR pszName, DWORD cbBuffer);
  243. HRESULT _CopyMoveNextMessage(void);
  244. HRESULT _CopyMoveLocalMessage(MESSAGEID idMessage,
  245. IMessageFolder* pDestFolder,
  246. LPSTR pszUrl,
  247. BOOL fMoveSource);
  248. HRESULT _MarkMessageRead(MESSAGEID id, BOOL fRead);
  249. void _FillStoreError(LPSTOREERROR pErrorInfo, IXPRESULT *pResult);
  250. // ----------------------------------------------------------------------------
  251. // URL Manipulations
  252. // ----------------------------------------------------------------------------
  253. HRESULT _BuildUrl(LPCSTR pszFolderComponent, LPCSTR pszNameComponent, LPSTR *ppszUrl);
  254. HRESULT _BuildMessageUrl(LPCSTR pszFolderUrl, LPSTR pszNameComponent, LPSTR *ppszUrl);
  255. private:
  256. LONG m_cRef;
  257. HWND m_hwnd;
  258. IMessageStore *m_pStore;
  259. IMessageFolder *m_pFolder;
  260. IHTTPMailTransport *m_pTransport;
  261. LPSTR m_pszFldrLeafName;
  262. LPSTR m_pszMsgFolderRoot;
  263. FOLDERID m_idServer;
  264. FOLDERID m_idFolder;
  265. SPECIALFOLDER m_tySpecialFolder;
  266. LPSTR m_pszFolderUrl;
  267. BOOL m_fConnected;
  268. HTTPOPERATION m_op;
  269. INETSERVER m_rInetServerInfo;
  270. char m_szAccountName[CCHMAX_ACCOUNT_NAME];
  271. char m_szAccountId[CCHMAX_ACCOUNT_NAME];
  272. IImnAccount *m_pAccount;
  273. IHTTPMailTransport2 *m_pTransport2;
  274. #ifdef DEBUG
  275. DWORD m_dwThreadId;
  276. #endif // DEBUG
  277. };
  278. HRESULT CreateHTTPMailStore(IUnknown *pUnkOuter, IUnknown **ppUnknown);
  279. #endif // _HTTPSERV_H