/* * s e r v e r q . h * * Purpose: * Implements IMessageServer wrapper for queuing operations to * IMessageServer object * * Owner: * brettm. * * History: * June 1998: Created * * Copyright (C) Microsoft Corp. 1993, 1994. */ #ifndef _SERVERQ_H #define _SERVERQ_H typedef struct ARGUMENT_DATA_tag { STOREOPERATIONTYPE sot; IStoreCallback *pCallback; struct ARGUMENT_DATA_tag *pNext; LPMESSAGEIDLIST pList; LPADJUSTFLAGS pFlags; FOLDERID idParent; FOLDERID idFolder; LPCSTR pszName; union { // SynchronizeFolder struct { SYNCFOLDERFLAGS dwSyncFlags; DWORD cHeaders; }; // GetMessage struct { MESSAGEID idMessage; IStoreCallback **rgpOtherCallback; ULONG cOtherCallbacks; }; // PutMessage struct { MESSAGEFLAGS dwMsgFlags; LPFILETIME pftReceived; // Either points to ftReceived member, or is NULL FILETIME ftReceived; IStream *pPutStream; }; // CopyMessages struct { IMessageFolder *pDestFldr; COPYMESSAGEFLAGS dwCopyOptions; }; // DeleteMessages struct { DELETEMESSAGEFLAGS dwDeleteOptions; }; // SetMessageFlags struct { SETMESSAGEFLAGSFLAGS dwSetFlags; }; // SynchronizeStore struct { DWORD dwFlags; }; // CreateFolder struct { SPECIALFOLDER tySpecial; FLDRFLAGS dwFldrFlags; }; // MoveFolder struct { FOLDERID idParentNew; }; // DeleteFolder struct { DELETEFOLDERFLAGS dwDelFldrFlags; }; // SubscribeToFolder struct { BOOL fSubscribe; }; // GetNewGroups struct { SYSTEMTIME sysTime; }; }; } ARGUMENT_DATA, *PARGUMENT_DATA; HRESULT CreateServerQueue(IMessageServer *pServerInner, IMessageServer **ppServer); class CServerQ : public IMessageServer, public IStoreCallback, public IServiceProvider { public: // Constructor, Destructor CServerQ(); ~CServerQ(); // IUnknown Members STDMETHODIMP QueryInterface(REFIID iid, LPVOID *ppvObject); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); HRESULT Init(IMessageServer *pServerInner); // IMessageServer Methods STDMETHODIMP Initialize(IMessageStore *pStore, FOLDERID idStoreRoot, IMessageFolder *pFolder, FOLDERID idFolder); STDMETHODIMP ResetFolder(IMessageFolder *pFolder, FOLDERID idFolder); STDMETHODIMP SetIdleCallback(IStoreCallback *pDefaultCallback); STDMETHODIMP SynchronizeFolder(SYNCFOLDERFLAGS dwFlags, DWORD cHeaders, IStoreCallback *pCallback); STDMETHODIMP GetMessage(MESSAGEID idMessage, IStoreCallback *pCallback); STDMETHODIMP PutMessage(FOLDERID idFolder, MESSAGEFLAGS dwFlags, LPFILETIME pftReceived, IStream *pStream, IStoreCallback *pCallback); STDMETHODIMP CopyMessages(IMessageFolder *pDestFldr, COPYMESSAGEFLAGS dwOptions, LPMESSAGEIDLIST pList, LPADJUSTFLAGS pFlags, IStoreCallback *pCallback); STDMETHODIMP DeleteMessages(DELETEMESSAGEFLAGS dwOptions, LPMESSAGEIDLIST pList, IStoreCallback *pCallback); STDMETHODIMP SetMessageFlags(LPMESSAGEIDLIST pList, LPADJUSTFLAGS pFlags, SETMESSAGEFLAGSFLAGS dwFlags, IStoreCallback *pCallback); STDMETHODIMP SynchronizeStore(FOLDERID idParent, DWORD dwFlags,IStoreCallback *pCallback); STDMETHODIMP CreateFolder(FOLDERID idParent, SPECIALFOLDER tySpecial, LPCSTR pszName, FLDRFLAGS dwFlags, IStoreCallback *pCallback); STDMETHODIMP MoveFolder(FOLDERID idFolder, FOLDERID idParentNew,IStoreCallback *pCallback); STDMETHODIMP RenameFolder(FOLDERID idFolder, LPCSTR pszName, IStoreCallback *pCallback); STDMETHODIMP DeleteFolder(FOLDERID idFolder, DELETEFOLDERFLAGS dwFlags, IStoreCallback *pCallback); STDMETHODIMP SubscribeToFolder(FOLDERID idFolder, BOOL fSubscribe, IStoreCallback *pCallback); STDMETHODIMP GetFolderCounts(FOLDERID idFolder, IStoreCallback *pCallback); STDMETHODIMP GetNewGroups(LPSYSTEMTIME pSysTime, IStoreCallback *pCallback); STDMETHODIMP GetServerMessageFlags(MESSAGEFLAGS *pFlags); STDMETHODIMP Close(DWORD dwFlags); STDMETHODIMP ConnectionAddRef(); STDMETHODIMP ConnectionRelease(); STDMETHODIMP GetWatchedInfo(FOLDERID idFolder, IStoreCallback *pCallback); STDMETHODIMP GetAdBarUrl(IStoreCallback *pCallback); STDMETHODIMP GetMinPollingInterval(IStoreCallback *pCallback); // IStoreCallback Methods STDMETHODIMP OnBegin(STOREOPERATIONTYPE tyOperation, STOREOPERATIONINFO *pOpInfo, IOperationCancel *pCancel); STDMETHODIMP OnProgress(STOREOPERATIONTYPE tyOperation, DWORD dwCurrent, DWORD dwMax, LPCSTR pszStatus); STDMETHODIMP OnTimeout(LPINETSERVER pServer, LPDWORD pdwTimeout, IXPTYPE ixpServerType); STDMETHODIMP CanConnect(LPCSTR pszAccountId, DWORD dwFlags); STDMETHODIMP OnLogonPrompt(LPINETSERVER pServer, IXPTYPE ixpServerType); STDMETHODIMP OnComplete(STOREOPERATIONTYPE tyOperation, HRESULT hrComplete, LPSTOREOPERATIONINFO pOpInfo, LPSTOREERROR pErrorInfo); STDMETHODIMP OnPrompt(HRESULT hrError, LPCTSTR pszText, LPCTSTR pszCaption, UINT uType, INT *piUserResponse); STDMETHODIMP GetParentWindow(DWORD dwReserved, HWND *phwndParent); //---------------------------------------------------------------------- // IServiceProvider //---------------------------------------------------------------------- STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, LPVOID *ppvObject); static LRESULT CALLBACK ExtWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); private: ULONG m_cRef, m_cRefConnection; IMessageServer *m_pServer; IStoreCallback *m_pCurrentCallback; // non-addref'ed pointer to pCallback of current task ARGUMENT_DATA *m_pTaskQueue; // head pointer for task queue ARGUMENT_DATA *m_pLastQueueTask; // last pointer for appending tasks ARGUMENT_DATA *m_pCurrentTask; HWND m_hwnd; HRESULT _OnNextTask(); HRESULT _AddToQueue(STOREOPERATIONTYPE sot, IStoreCallback *pCallback, LPMESSAGEIDLIST pList, LPADJUSTFLAGS pFlags, LPCSTR pszName, ARGUMENT_DATA **ppNewArgData); HRESULT _Flush(BOOL fSendCurrCompletion); HRESULT _FreeArgumentData(ARGUMENT_DATA *pArgData); HRESULT _StartNextTask(); HRESULT _AppendToExistingTask(ARGUMENT_DATA *pTask, MESSAGEID idMessage); #ifdef DEBUG ARGUMENT_DATA *m_DBG_pArgDataLast; HRESULT _DBG_DumpQueue(); #endif }; #endif //_SERVERQ_H