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.

234 lines
10 KiB

  1. /*
  2. * n e w s s t o r . h
  3. *
  4. * Purpose:
  5. * Derives from IMessageServer to implement news specific store communication
  6. *
  7. * Copyright (C) Microsoft Corp. 1998.
  8. */
  9. #ifndef _NEWSSTOR_H
  10. #define _NEWSSTOR_H
  11. #include "imnxport.h"
  12. #include "range.h"
  13. interface IMimeMessage;
  14. typedef IMimeMessage *LPMIMEMESSAGE;
  15. typedef DWORD MSGID;
  16. class CNewsStore;
  17. typedef HRESULT (CNewsStore::*PFNOPFUNC)(THIS_ void);
  18. #define OPFLAG_DESCRIPTIONS 0x0001
  19. #define OPFLAG_NOGROUPCMD 0x0002
  20. typedef struct tagOPERATION
  21. {
  22. STOREOPERATIONTYPE tyOperation;
  23. const PFNOPFUNC *pfnState;
  24. int iState;
  25. int cState;
  26. IStoreCallback *pCallback;
  27. NNTPSTATE nsPending;
  28. DWORD dwFlags;
  29. ULONG cPrevFolders;
  30. FOLDERID *pPrevFolders;
  31. FOLDERID idFolder;
  32. SYNCFOLDERFLAGS dwSyncFlags;
  33. SYSTEMTIME st;
  34. DWORD cHeaders;
  35. MESSAGEID idMessage;
  36. LPSTR pszArticleId;
  37. IStream *pStream;
  38. FILEADDRESS faStream;
  39. MESSAGEFLAGS dwMsgFlags;
  40. LPSTR pszGroup;
  41. DWORD idServerMessage;
  42. BOOL fCancel;
  43. STOREERROR error;
  44. DWORD dwProgress;
  45. DWORD dwTotal;
  46. } OPERATION;
  47. typedef struct tagSREFRESHOP {
  48. DWORD dwFirstNew;
  49. DWORD dwLast;
  50. DWORD dwFirst;
  51. DWORD dwChunk;
  52. DWORD dwDlSize;
  53. UINT uObtained;
  54. UINT cOps;
  55. UINT MaxOps;
  56. BOOL fEnabled;
  57. BOOL fOnlyNewHeaders;
  58. } SREFRESHOP;
  59. class CNewsStore :
  60. public IMessageServer,
  61. public INNTPCallback,
  62. public IOperationCancel,
  63. public INewsStore,
  64. public ITransportCallbackService
  65. {
  66. public:
  67. //----------------------------------------------------------------------
  68. // Construction
  69. //----------------------------------------------------------------------
  70. CNewsStore(void);
  71. ~CNewsStore(void);
  72. //----------------------------------------------------------------------
  73. // IUnknown Members
  74. //----------------------------------------------------------------------
  75. STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv);
  76. STDMETHODIMP_(ULONG) AddRef(void);
  77. STDMETHODIMP_(ULONG) Release(void);
  78. //----------------------------------------------------------------------
  79. // IMessageServer Members
  80. //----------------------------------------------------------------------
  81. STDMETHODIMP Initialize(IMessageStore *pStore, FOLDERID idStoreRoot, IMessageFolder *pFolder, FOLDERID idFolder);
  82. STDMETHODIMP ResetFolder(IMessageFolder *pFolder, FOLDERID idFolder);
  83. STDMETHODIMP SetIdleCallback(IStoreCallback *pDefaultCallback);
  84. STDMETHODIMP SynchronizeFolder (SYNCFOLDERFLAGS dwFlags, DWORD cHeaders, IStoreCallback *pCallback);
  85. STDMETHODIMP GetMessage (MESSAGEID idMessage, IStoreCallback *pCallback);
  86. STDMETHODIMP PutMessage (FOLDERID idFolder, MESSAGEFLAGS dwFlags, LPFILETIME pftReceived, IStream *pStream, IStoreCallback *pCallback);
  87. STDMETHODIMP CopyMessages (IMessageFolder *pDest, COPYMESSAGEFLAGS dwOptions, LPMESSAGEIDLIST pList, LPADJUSTFLAGS pFlags, IStoreCallback *pCallback);
  88. STDMETHODIMP DeleteMessages (DELETEMESSAGEFLAGS dwOptions, LPMESSAGEIDLIST pList, IStoreCallback *pCallback);
  89. STDMETHODIMP SetMessageFlags (LPMESSAGEIDLIST pList, LPADJUSTFLAGS pFlags, SETMESSAGEFLAGSFLAGS dwFlags, IStoreCallback *pCallback);
  90. STDMETHODIMP GetServerMessageFlags(MESSAGEFLAGS *pFlags);
  91. STDMETHODIMP SynchronizeStore (FOLDERID idParent, SYNCSTOREFLAGS dwFlags, IStoreCallback *pCallback);
  92. STDMETHODIMP CreateFolder (FOLDERID idParent, SPECIALFOLDER tySpecial, LPCSTR pszName, FLDRFLAGS dwFlags, IStoreCallback *pCallback);
  93. STDMETHODIMP MoveFolder (FOLDERID idFolder, FOLDERID idParentNew, IStoreCallback *pCallback);
  94. STDMETHODIMP RenameFolder (FOLDERID idFolder, LPCSTR pszName, IStoreCallback *pCallback);
  95. STDMETHODIMP DeleteFolder (FOLDERID idFolder, DELETEFOLDERFLAGS dwFlags, IStoreCallback *pCallback);
  96. STDMETHODIMP SubscribeToFolder (FOLDERID idFolder, BOOL fSubscribe, IStoreCallback *pCallback);
  97. STDMETHODIMP GetFolderCounts(FOLDERID idFolder, IStoreCallback *pCallback);
  98. STDMETHODIMP GetNewGroups(LPSYSTEMTIME pSysTime, IStoreCallback *pCallback);
  99. STDMETHODIMP Close(DWORD dwFlags);
  100. STDMETHODIMP ConnectionAddRef() { return E_NOTIMPL; };
  101. STDMETHODIMP ConnectionRelease() { return E_NOTIMPL; };
  102. STDMETHODIMP GetWatchedInfo(FOLDERID idFolder, IStoreCallback *pCallback);
  103. STDMETHODIMP GetAdBarUrl(IStoreCallback *pCallback) {return E_NOTIMPL;};
  104. STDMETHODIMP GetMinPollingInterval(IStoreCallback *pCallback) {return E_NOTIMPL;};
  105. HRESULT Initialize(FOLDERID idStoreRoot, LPCSTR pszAccountId);
  106. HRESULT GetArticle(LPCSTR pszArticleId, IStream *pStream, IStoreCallback *pCallback);
  107. //----------------------------------------------------------------------
  108. // IOperationCancel Members
  109. //----------------------------------------------------------------------
  110. STDMETHODIMP Cancel(CANCELTYPE tyCancel);
  111. //----------------------------------------------------------------------
  112. // INNTPCallback Members
  113. //----------------------------------------------------------------------
  114. STDMETHODIMP OnTimeout (DWORD *pdwTimeout, IInternetTransport *pTransport);
  115. STDMETHODIMP OnLogonPrompt (LPINETSERVER pInetServer, IInternetTransport *pTransport);
  116. STDMETHODIMP_(INT) OnPrompt (HRESULT hrError, LPCTSTR pszText, LPCTSTR pszCaption, UINT uType, IInternetTransport *pTransport);
  117. STDMETHODIMP OnStatus (IXPSTATUS ixpstatus, IInternetTransport *pTransport);
  118. STDMETHODIMP OnError (IXPSTATUS ixpstatus, LPIXPRESULT pResult, IInternetTransport *pTransport);
  119. STDMETHODIMP OnCommand (CMDTYPE cmdtype, LPSTR pszLine, HRESULT hrResponse, IInternetTransport *pTransport);
  120. STDMETHODIMP OnResponse (LPNNTPRESPONSE pResponse);
  121. //----------------------------------------------------------------------
  122. // ITransportCallbackService
  123. //----------------------------------------------------------------------
  124. STDMETHODIMP GetParentWindow(DWORD dwReserved, HWND *phwndParent);
  125. STDMETHODIMP GetAccount(LPDWORD pdwServerType, IImnAccount **ppAcount);
  126. //----------------------------------------------------------------------
  127. // INewsStore
  128. //----------------------------------------------------------------------
  129. STDMETHODIMP MarkCrossposts(LPMESSAGEIDLIST pList, BOOL fRead);
  130. HRESULT Connect(void);
  131. HRESULT Group(void);
  132. HRESULT GroupIfNecessary(void);
  133. HRESULT ExpireHeaders(void);
  134. HRESULT Headers(void);
  135. HRESULT Article(void);
  136. HRESULT Post(void);
  137. HRESULT List(void);
  138. HRESULT DeleteDeadGroups(void);
  139. HRESULT Descriptions(void);
  140. HRESULT NewGroups(void);
  141. HRESULT XHdrReferences(void);
  142. HRESULT XHdrSubject(void);
  143. HRESULT WatchedArticles(void);
  144. static LRESULT CALLBACK NewsStoreWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
  145. private:
  146. void _FreeOperation(void);
  147. HRESULT _DoOperation(void);
  148. HRESULT _BeginDeferredOperation(void);
  149. HRESULT _List(LPCSTR pszCommand);
  150. HRESULT _ComputeHeaderRange(SYNCFOLDERFLAGS dwFlags, DWORD cHeaders, FOLDERINFO *pInfo, RANGE *pRange);
  151. void _MarkCrossposts(LPCSTR szXRefs, BOOL fRead);
  152. BOOL _CreateWnd(void);
  153. HRESULT _CreateDataFilePath(LPCTSTR pszAccount, LPCTSTR pszFileName, LPTSTR pszPath, DWORD cchPathSize);
  154. BOOL _FConnected() { return (m_pTransport && m_ixpStatus != IXP_DISCONNECTING && m_ixpStatus != IXP_DISCONNECTED ); }
  155. HRESULT _HandleArticleResponse(LPNNTPRESPONSE pResp);
  156. HRESULT _HandleListResponse(LPNNTPRESPONSE pResp, BOOL fNew);
  157. HRESULT _HandleHeadResponse(LPNNTPRESPONSE pResp);
  158. HRESULT _HandleGroupResponse(LPNNTPRESPONSE pResp);
  159. HRESULT _HandlePostResponse(LPNNTPRESPONSE pResp);
  160. HRESULT _HandleXHdrReferencesResponse(LPNNTPRESPONSE pResp);
  161. HRESULT _HandleXHdrSubjectResponse(LPNNTPRESPONSE pResp);
  162. HRESULT _HandleWatchedArticleResponse(LPNNTPRESPONSE pResp);
  163. void _FillStoreError(LPSTOREERROR pErrorInfo, IXPRESULT *pResult, LPSTR pszGroup = NULL);
  164. BOOL _IsWatchedThread(LPSTR pszRef, LPSTR pszSubject);
  165. HRESULT _SaveMessageToStore(IMessageFolder *pFolder, DWORD id, LPSTREAM pstm);
  166. //----------------------------------------------------------------------
  167. // Class Member Data
  168. //----------------------------------------------------------------------
  169. private:
  170. LONG m_cRef; // Reference Counting
  171. HWND m_hwnd;
  172. IMessageStore *m_pStore;
  173. IMessageFolder *m_pFolder;
  174. FOLDERID m_idFolder;
  175. FOLDERID m_idParent;
  176. char m_szGroup[256];
  177. char m_szAccountId[CCHMAX_ACCOUNT_NAME];
  178. OPERATION m_op;
  179. SREFRESHOP *m_pROP;
  180. INNTPTransport *m_pTransport;
  181. IXPSTATUS m_ixpStatus;
  182. INETSERVER m_rInetServerInfo;
  183. DWORD m_dwLastStatusTicks;
  184. // GetWatchInfo state
  185. DWORD m_dwWatchLow;
  186. DWORD m_dwWatchHigh;
  187. LPTSTR *m_rgpszWatchInfo;
  188. BOOL m_fXhdrSubject;
  189. CRangeList m_cRange;
  190. DWORD m_cCurrent;
  191. DWORD m_cTotal;
  192. IMessageTable *m_pTable; // Used for downloading Watched Messages.
  193. #ifdef DEBUG
  194. DWORD m_dwThreadId;
  195. #endif // DEBUG
  196. };
  197. //--------------------------------------------------------------------------
  198. // Prototypes
  199. //--------------------------------------------------------------------------
  200. HRESULT CreateNewsStore(IUnknown *pUnkOuter, IUnknown **ppUnknown);
  201. HRESULT NewsUtil_CreateDataFilePath(LPCTSTR pszAccount, LPCTSTR pszFileName, LPTSTR pszPath);
  202. #endif //_NEWSSTOR_H