/* * h t t p s e r v . h * * Author: Greg Friedman * * Purpose: Derives from IMessageServer to implement HTTPMail-specific * store communication. * * Copyright (C) Microsoft Corp. 1998. */ #ifndef _HTTPSERV_H #define _HTTPSERV_H #include "tmap.h" #include "simpstr.h" class CFolderList; class CHTTPMailServer; typedef HRESULT (CHTTPMailServer::*PFNHTTPOPFUNC)(void); typedef HRESULT (CHTTPMailServer::*PFNHTTPRESPFUNC)(LPHTTPMAILRESPONSE pResponse); typedef struct tagHTTPSTATEFUNCS { PFNHTTPOPFUNC pfnOp; // operation function PFNHTTPRESPFUNC pfnResp; // response function } HTTPSTATEFUNCS, *LPHTTPSTATEFUNCS; typedef struct tagMARKEDMESSAGE { MESSAGEID idMessage; MESSAGEFLAGS dwFlags; BOOL fMarked; } MARKEDMESSAGE, *LPMARKEDMESSAGE; typedef struct tagNEWMESSAGEINFO { LPSTR pszUrlComponent; } NEWMESSAGEINFO, *LPNEWMESSAGEINFO; #define HTTPCOPYMOVE_OUTOFSPACE 0x00000001 #define HTTPCOPYMOVE_ERROR 0x00000002 typedef struct tagHTTPOPERATION { STOREOPERATIONTYPE tyOperation; const HTTPSTATEFUNCS *pfnState; BOOL fCancel; BOOL fStateWillAdvance; BOOL fNotifiedComplete; int iState; int cState; IStoreCallback *pCallback; DWORD dwOptions; long lIndex; FOLDERID idFolder; SYNCFOLDERFLAGS dwSyncFlags; CFolderList *pFolderList; IMessageFolder *pMessageFolder; LPSTR pszProblem; LPSTR pszDestFolderUrl; LPSTR pszDestUrl; MESSAGEID idMessage; FILEADDRESS faStream; IStream *pMessageStream; TMap *pmapMessageId; CSortedArray *psaNewMessages; LPSTR pszFolderName; LPSTR pszAdUrl; FLDRFLAGS dwFldrFlags; MESSAGEFLAGS dwMsgFlags; // folder synchronization DWORD cMessages; DWORD cUnread; // setmessage flags BOOL fMarkRead; DWORD dwSetFlags; IPropPatchRequest *pPropPatchRequest; DWORD dwIndex; LPMESSAGEIDLIST pIDList; HROWSET hRowSet; // batch copy move errors DWORD dwCopyMoveErrorFlags; // delete message junk for // dealing with servers that // don't support message deletion (Hotmail) DELETEMESSAGEFLAGS dwDelMsgFlags; BOOL fFallbackToMove; LPHTTPTARGETLIST pTargets; MESSAGEID idPutMessage; STOREERROR error; DWORD dwMinPollingInterval; } HTTPOPERATION, *LPHTTPOPERATION; class CHTTPMailServer : public IMessageServer, IHTTPMailCallback, public IOperationCancel { public: //---------------------------------------------------------------------- // Construction/Destruction //---------------------------------------------------------------------- CHTTPMailServer(void); ~CHTTPMailServer(void); private: // intentionally umimplemented copy constructor // and assignment operator CHTTPMailServer(const CHTTPMailServer& other); CHTTPMailServer& operator=(const CHTTPMailServer& other); public: //---------------------------------------------------------------------- // IUnknown Members //---------------------------------------------------------------------- STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); //---------------------------------------------------------------------- // IMessageServer Members //---------------------------------------------------------------------- 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 *pDest, 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 GetServerMessageFlags(MESSAGEFLAGS *pFlags); STDMETHODIMP SynchronizeStore (FOLDERID idParent, SYNCSTOREFLAGS 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 Close(DWORD dwFlags); STDMETHODIMP GetFolderCounts(FOLDERID idFolder, IStoreCallback *pCallback); STDMETHODIMP GetNewGroups(LPSYSTEMTIME pSysTime, IStoreCallback *pCallback); STDMETHODIMP ConnectionAddRef() { return E_NOTIMPL; }; STDMETHODIMP ConnectionRelease() { return E_NOTIMPL; }; STDMETHODIMP GetWatchedInfo(FOLDERID idFolder, IStoreCallback *pCallback) { return E_NOTIMPL; } STDMETHODIMP GetAdBarUrl(IStoreCallback *pCallback); STDMETHODIMP GetMinPollingInterval(IStoreCallback *pCallback); // ---------------------------------------------------------------------------- // ITransportCallback methods // ---------------------------------------------------------------------------- STDMETHODIMP OnLogonPrompt( LPINETSERVER pInetServer, IInternetTransport *pTransport); STDMETHODIMP_(INT) OnPrompt( HRESULT hrError, LPCTSTR pszText, LPCTSTR pszCaption, UINT uType, IInternetTransport *pTransport); STDMETHODIMP OnStatus( IXPSTATUS ixpstatus, IInternetTransport *pTransport); STDMETHODIMP OnError( IXPSTATUS ixpstatus, LPIXPRESULT pIxpResult, IInternetTransport *pTransport); STDMETHODIMP OnProgress( DWORD dwIncrement, DWORD dwCurrent, DWORD dwMaximum, IInternetTransport *pTransport); STDMETHODIMP OnCommand( CMDTYPE cmdtype, LPSTR pszLine, HRESULT hrResponse, IInternetTransport *pTransport); STDMETHODIMP OnTimeout( DWORD *pdwTimeout, IInternetTransport *pTransport); // ---------------------------------------------------------------------------- // IHTTPMailCallback methods // ---------------------------------------------------------------------------- STDMETHODIMP OnResponse( LPHTTPMAILRESPONSE pResponse); STDMETHODIMP GetParentWindow( HWND *phwndParent); //---------------------------------------------------------------------- // IOperationCancel Members //---------------------------------------------------------------------- STDMETHODIMP Cancel(CANCELTYPE tyCancel); // ---------------------------------------------------------------------------- // Private Implementation // ---------------------------------------------------------------------------- public: // ---------------------------------------------------------------------------- // Operations // ---------------------------------------------------------------------------- HRESULT Connect(void); HRESULT GetMsgFolderRoot(void); HRESULT BuildFolderUrl(void); HRESULT ListFolders(void); HRESULT AutoListFolders(void); HRESULT PurgeFolders(void); HRESULT ListHeaders(void); HRESULT PurgeMessages(void); HRESULT ResetMessageCounts(void); HRESULT GetMessage(void); HRESULT CreateFolder(void); HRESULT RenameFolder(void); HRESULT DeleteFolder(void); HRESULT CreateSetFlagsRequest(void); HRESULT SetMessageFlags(void); HRESULT ApplyFlagsToStore(void); HRESULT DeleteMessages(void); HRESULT DeleteFallbackToMove(void); HRESULT PurgeDeletedFromStore(void); HRESULT PutMessage(void); HRESULT AddPutMessage(void); HRESULT CopyMoveMessage(void); HRESULT BatchCopyMoveMessages(void); HRESULT FinalizeBatchCopyMove(void); HRESULT GetAdBarUrlFromServer(void); HRESULT GetMinPollingInterval(void); // ---------------------------------------------------------------------------- // Response Handlers // ---------------------------------------------------------------------------- HRESULT HandleListFolders(LPHTTPMAILRESPONSE pResponse); HRESULT HandleListHeaders(LPHTTPMAILRESPONSE pResponse); HRESULT HandleGetMessage(LPHTTPMAILRESPONSE pResponse); HRESULT HandleGetMsgFolderRoot(LPHTTPMAILRESPONSE pResponse); HRESULT HandleCreateFolder(LPHTTPMAILRESPONSE pResponse); HRESULT HandleRenameFolder(LPHTTPMAILRESPONSE pResponse); HRESULT HandleDeleteFolder(LPHTTPMAILRESPONSE pResponse); HRESULT HandleMemberErrors(LPHTTPMAILRESPONSE pResponse); HRESULT HandleDeleteFallbackToMove(LPHTTPMAILRESPONSE pResponse); HRESULT HandlePutMessage(LPHTTPMAILRESPONSE pResponse); HRESULT HandleCopyMoveMessage(LPHTTPMAILRESPONSE pResponse); HRESULT HandleBatchCopyMoveMessages(LPHTTPMAILRESPONSE pResponse); private: // ---------------------------------------------------------------------------- // Other stuff(tm) // ---------------------------------------------------------------------------- BOOL _CreateWnd(void); static LRESULT _WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); HRESULT _BeginDeferredOperation(void); HRESULT _DoOperation(void); void _FreeOperation(BOOL fValidState = TRUE); HRESULT _DoCopyMoveMessages(STOREOPERATIONTYPE sot, IMessageFolder *pDest, COPYMESSAGEFLAGS dwOptions, LPMESSAGEIDLIST pList, IStoreCallback *pCallback); HRESULT _LoadAccountInfo(IImnAccount *pAcct); HRESULT _LoadTransport(void); void _Disconnect(void); BOOL _FConnected(void) { return m_fConnected; } void _SetConnected(BOOL fConnected) { if (m_fConnected) _Disconnect(); m_fConnected = fConnected; } HRESULT _CreateMessageIDMap(TMap **ppMap); HRESULT _HrBuildMapAndTargets(LPMESSAGEIDLIST pList, HROWSET hRowSet, LPADJUSTFLAGS pFlags, SETMESSAGEFLAGSFLAGS dwFlags, TMap **ppMap, LPHTTPTARGETLIST *ppTargets); SPECIALFOLDER _TranslateHTTPSpecialFolderType(HTTPMAILSPECIALFOLDER tySpecial); BOOL _LoadSpecialFolderName(SPECIALFOLDER tySpecial, LPSTR pszName, DWORD cbBuffer); HRESULT _CopyMoveNextMessage(void); HRESULT _CopyMoveLocalMessage(MESSAGEID idMessage, IMessageFolder* pDestFolder, LPSTR pszUrl, BOOL fMoveSource); HRESULT _MarkMessageRead(MESSAGEID id, BOOL fRead); void _FillStoreError(LPSTOREERROR pErrorInfo, IXPRESULT *pResult); // ---------------------------------------------------------------------------- // URL Manipulations // ---------------------------------------------------------------------------- HRESULT _BuildUrl(LPCSTR pszFolderComponent, LPCSTR pszNameComponent, LPSTR *ppszUrl); HRESULT _BuildMessageUrl(LPCSTR pszFolderUrl, LPSTR pszNameComponent, LPSTR *ppszUrl); private: LONG m_cRef; HWND m_hwnd; IMessageStore *m_pStore; IMessageFolder *m_pFolder; IHTTPMailTransport *m_pTransport; LPSTR m_pszFldrLeafName; LPSTR m_pszMsgFolderRoot; FOLDERID m_idServer; FOLDERID m_idFolder; SPECIALFOLDER m_tySpecialFolder; LPSTR m_pszFolderUrl; BOOL m_fConnected; HTTPOPERATION m_op; INETSERVER m_rInetServerInfo; char m_szAccountName[CCHMAX_ACCOUNT_NAME]; char m_szAccountId[CCHMAX_ACCOUNT_NAME]; IImnAccount *m_pAccount; IHTTPMailTransport2 *m_pTransport2; #ifdef DEBUG DWORD m_dwThreadId; #endif // DEBUG }; HRESULT CreateHTTPMailStore(IUnknown *pUnkOuter, IUnknown **ppUnknown); #endif // _HTTPSERV_H