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.

204 lines
7.3 KiB

  1. /*
  2. * s e r v e r q . h
  3. *
  4. * Purpose:
  5. * Implements IMessageServer wrapper for queuing operations to
  6. * IMessageServer object
  7. *
  8. * Owner:
  9. * brettm.
  10. *
  11. * History:
  12. * June 1998: Created
  13. *
  14. * Copyright (C) Microsoft Corp. 1993, 1994.
  15. */
  16. #ifndef _SERVERQ_H
  17. #define _SERVERQ_H
  18. typedef struct ARGUMENT_DATA_tag
  19. {
  20. STOREOPERATIONTYPE sot;
  21. IStoreCallback *pCallback;
  22. struct ARGUMENT_DATA_tag *pNext;
  23. LPMESSAGEIDLIST pList;
  24. LPADJUSTFLAGS pFlags;
  25. FOLDERID idParent;
  26. FOLDERID idFolder;
  27. LPCSTR pszName;
  28. union
  29. {
  30. // SynchronizeFolder
  31. struct
  32. {
  33. SYNCFOLDERFLAGS dwSyncFlags;
  34. DWORD cHeaders;
  35. };
  36. // GetMessage
  37. struct
  38. {
  39. MESSAGEID idMessage;
  40. IStoreCallback **rgpOtherCallback;
  41. ULONG cOtherCallbacks;
  42. };
  43. // PutMessage
  44. struct
  45. {
  46. MESSAGEFLAGS dwMsgFlags;
  47. LPFILETIME pftReceived; // Either points to ftReceived member, or is NULL
  48. FILETIME ftReceived;
  49. IStream *pPutStream;
  50. };
  51. // CopyMessages
  52. struct
  53. {
  54. IMessageFolder *pDestFldr;
  55. COPYMESSAGEFLAGS dwCopyOptions;
  56. };
  57. // DeleteMessages
  58. struct
  59. {
  60. DELETEMESSAGEFLAGS dwDeleteOptions;
  61. };
  62. // SetMessageFlags
  63. struct
  64. {
  65. SETMESSAGEFLAGSFLAGS dwSetFlags;
  66. };
  67. // SynchronizeStore
  68. struct
  69. {
  70. DWORD dwFlags;
  71. };
  72. // CreateFolder
  73. struct
  74. {
  75. SPECIALFOLDER tySpecial;
  76. FLDRFLAGS dwFldrFlags;
  77. };
  78. // MoveFolder
  79. struct
  80. {
  81. FOLDERID idParentNew;
  82. };
  83. // DeleteFolder
  84. struct
  85. {
  86. DELETEFOLDERFLAGS dwDelFldrFlags;
  87. };
  88. // SubscribeToFolder
  89. struct
  90. {
  91. BOOL fSubscribe;
  92. };
  93. // GetNewGroups
  94. struct
  95. {
  96. SYSTEMTIME sysTime;
  97. };
  98. };
  99. } ARGUMENT_DATA, *PARGUMENT_DATA;
  100. HRESULT CreateServerQueue(IMessageServer *pServerInner, IMessageServer **ppServer);
  101. class CServerQ :
  102. public IMessageServer,
  103. public IStoreCallback,
  104. public IServiceProvider
  105. {
  106. public:
  107. // Constructor, Destructor
  108. CServerQ();
  109. ~CServerQ();
  110. // IUnknown Members
  111. STDMETHODIMP QueryInterface(REFIID iid, LPVOID *ppvObject);
  112. STDMETHODIMP_(ULONG) AddRef();
  113. STDMETHODIMP_(ULONG) Release();
  114. HRESULT Init(IMessageServer *pServerInner);
  115. // IMessageServer Methods
  116. STDMETHODIMP Initialize(IMessageStore *pStore, FOLDERID idStoreRoot, IMessageFolder *pFolder, FOLDERID idFolder);
  117. STDMETHODIMP ResetFolder(IMessageFolder *pFolder, FOLDERID idFolder);
  118. STDMETHODIMP SetIdleCallback(IStoreCallback *pDefaultCallback);
  119. STDMETHODIMP SynchronizeFolder(SYNCFOLDERFLAGS dwFlags, DWORD cHeaders, IStoreCallback *pCallback);
  120. STDMETHODIMP GetMessage(MESSAGEID idMessage, IStoreCallback *pCallback);
  121. STDMETHODIMP PutMessage(FOLDERID idFolder, MESSAGEFLAGS dwFlags, LPFILETIME pftReceived, IStream *pStream, IStoreCallback *pCallback);
  122. STDMETHODIMP CopyMessages(IMessageFolder *pDestFldr, COPYMESSAGEFLAGS dwOptions, LPMESSAGEIDLIST pList, LPADJUSTFLAGS pFlags, IStoreCallback *pCallback);
  123. STDMETHODIMP DeleteMessages(DELETEMESSAGEFLAGS dwOptions, LPMESSAGEIDLIST pList, IStoreCallback *pCallback);
  124. STDMETHODIMP SetMessageFlags(LPMESSAGEIDLIST pList, LPADJUSTFLAGS pFlags, SETMESSAGEFLAGSFLAGS dwFlags, IStoreCallback *pCallback);
  125. STDMETHODIMP SynchronizeStore(FOLDERID idParent, DWORD dwFlags,IStoreCallback *pCallback);
  126. STDMETHODIMP CreateFolder(FOLDERID idParent, SPECIALFOLDER tySpecial, LPCSTR pszName, FLDRFLAGS dwFlags, IStoreCallback *pCallback);
  127. STDMETHODIMP MoveFolder(FOLDERID idFolder, FOLDERID idParentNew,IStoreCallback *pCallback);
  128. STDMETHODIMP RenameFolder(FOLDERID idFolder, LPCSTR pszName, IStoreCallback *pCallback);
  129. STDMETHODIMP DeleteFolder(FOLDERID idFolder, DELETEFOLDERFLAGS dwFlags, IStoreCallback *pCallback);
  130. STDMETHODIMP SubscribeToFolder(FOLDERID idFolder, BOOL fSubscribe, IStoreCallback *pCallback);
  131. STDMETHODIMP GetFolderCounts(FOLDERID idFolder, IStoreCallback *pCallback);
  132. STDMETHODIMP GetNewGroups(LPSYSTEMTIME pSysTime, IStoreCallback *pCallback);
  133. STDMETHODIMP GetServerMessageFlags(MESSAGEFLAGS *pFlags);
  134. STDMETHODIMP Close(DWORD dwFlags);
  135. STDMETHODIMP ConnectionAddRef();
  136. STDMETHODIMP ConnectionRelease();
  137. STDMETHODIMP GetWatchedInfo(FOLDERID idFolder, IStoreCallback *pCallback);
  138. STDMETHODIMP GetAdBarUrl(IStoreCallback *pCallback);
  139. STDMETHODIMP GetMinPollingInterval(IStoreCallback *pCallback);
  140. // IStoreCallback Methods
  141. STDMETHODIMP OnBegin(STOREOPERATIONTYPE tyOperation, STOREOPERATIONINFO *pOpInfo, IOperationCancel *pCancel);
  142. STDMETHODIMP OnProgress(STOREOPERATIONTYPE tyOperation, DWORD dwCurrent, DWORD dwMax, LPCSTR pszStatus);
  143. STDMETHODIMP OnTimeout(LPINETSERVER pServer, LPDWORD pdwTimeout, IXPTYPE ixpServerType);
  144. STDMETHODIMP CanConnect(LPCSTR pszAccountId, DWORD dwFlags);
  145. STDMETHODIMP OnLogonPrompt(LPINETSERVER pServer, IXPTYPE ixpServerType);
  146. STDMETHODIMP OnComplete(STOREOPERATIONTYPE tyOperation, HRESULT hrComplete, LPSTOREOPERATIONINFO pOpInfo, LPSTOREERROR pErrorInfo);
  147. STDMETHODIMP OnPrompt(HRESULT hrError, LPCTSTR pszText, LPCTSTR pszCaption, UINT uType, INT *piUserResponse);
  148. STDMETHODIMP GetParentWindow(DWORD dwReserved, HWND *phwndParent);
  149. //----------------------------------------------------------------------
  150. // IServiceProvider
  151. //----------------------------------------------------------------------
  152. STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, LPVOID *ppvObject);
  153. static LRESULT CALLBACK ExtWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  154. private:
  155. ULONG m_cRef,
  156. m_cRefConnection;
  157. IMessageServer *m_pServer;
  158. IStoreCallback *m_pCurrentCallback; // non-addref'ed pointer to pCallback of current task
  159. ARGUMENT_DATA *m_pTaskQueue; // head pointer for task queue
  160. ARGUMENT_DATA *m_pLastQueueTask; // last pointer for appending tasks
  161. ARGUMENT_DATA *m_pCurrentTask;
  162. HWND m_hwnd;
  163. HRESULT _OnNextTask();
  164. HRESULT _AddToQueue(STOREOPERATIONTYPE sot, IStoreCallback *pCallback, LPMESSAGEIDLIST pList, LPADJUSTFLAGS pFlags, LPCSTR pszName, ARGUMENT_DATA **ppNewArgData);
  165. HRESULT _Flush(BOOL fSendCurrCompletion);
  166. HRESULT _FreeArgumentData(ARGUMENT_DATA *pArgData);
  167. HRESULT _StartNextTask();
  168. HRESULT _AppendToExistingTask(ARGUMENT_DATA *pTask, MESSAGEID idMessage);
  169. #ifdef DEBUG
  170. ARGUMENT_DATA *m_DBG_pArgDataLast;
  171. HRESULT _DBG_DumpQueue();
  172. #endif
  173. };
  174. #endif //_SERVERQ_H