/* * n e w s s t o r . h * * Purpose: * Derives from IMessageServer to implement news specific store communication * * Copyright (C) Microsoft Corp. 1998. */ #ifndef _NEWSSTOR_H #define _NEWSSTOR_H #include "imnxport.h" #include "range.h" interface IMimeMessage; typedef IMimeMessage *LPMIMEMESSAGE; typedef DWORD MSGID; class CNewsStore; typedef HRESULT (CNewsStore::*PFNOPFUNC)(THIS_ void); #define OPFLAG_DESCRIPTIONS 0x0001 #define OPFLAG_NOGROUPCMD 0x0002 typedef struct tagOPERATION { STOREOPERATIONTYPE tyOperation; const PFNOPFUNC *pfnState; int iState; int cState; IStoreCallback *pCallback; NNTPSTATE nsPending; DWORD dwFlags; ULONG cPrevFolders; FOLDERID *pPrevFolders; FOLDERID idFolder; SYNCFOLDERFLAGS dwSyncFlags; SYSTEMTIME st; DWORD cHeaders; MESSAGEID idMessage; LPSTR pszArticleId; IStream *pStream; FILEADDRESS faStream; MESSAGEFLAGS dwMsgFlags; LPSTR pszGroup; DWORD idServerMessage; BOOL fCancel; STOREERROR error; DWORD dwProgress; DWORD dwTotal; } OPERATION; typedef struct tagSREFRESHOP { DWORD dwFirstNew; DWORD dwLast; DWORD dwFirst; DWORD dwChunk; DWORD dwDlSize; UINT uObtained; UINT cOps; UINT MaxOps; BOOL fEnabled; BOOL fOnlyNewHeaders; } SREFRESHOP; class CNewsStore : public IMessageServer, public INNTPCallback, public IOperationCancel, public INewsStore, public ITransportCallbackService { public: //---------------------------------------------------------------------- // Construction //---------------------------------------------------------------------- CNewsStore(void); ~CNewsStore(void); //---------------------------------------------------------------------- // 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 GetFolderCounts(FOLDERID idFolder, IStoreCallback *pCallback); STDMETHODIMP GetNewGroups(LPSYSTEMTIME pSysTime, IStoreCallback *pCallback); STDMETHODIMP Close(DWORD dwFlags); STDMETHODIMP ConnectionAddRef() { return E_NOTIMPL; }; STDMETHODIMP ConnectionRelease() { return E_NOTIMPL; }; STDMETHODIMP GetWatchedInfo(FOLDERID idFolder, IStoreCallback *pCallback); STDMETHODIMP GetAdBarUrl(IStoreCallback *pCallback) {return E_NOTIMPL;}; STDMETHODIMP GetMinPollingInterval(IStoreCallback *pCallback) {return E_NOTIMPL;}; HRESULT Initialize(FOLDERID idStoreRoot, LPCSTR pszAccountId); HRESULT GetArticle(LPCSTR pszArticleId, IStream *pStream, IStoreCallback *pCallback); //---------------------------------------------------------------------- // IOperationCancel Members //---------------------------------------------------------------------- STDMETHODIMP Cancel(CANCELTYPE tyCancel); //---------------------------------------------------------------------- // INNTPCallback Members //---------------------------------------------------------------------- STDMETHODIMP OnTimeout (DWORD *pdwTimeout, IInternetTransport *pTransport); 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 pResult, IInternetTransport *pTransport); STDMETHODIMP OnCommand (CMDTYPE cmdtype, LPSTR pszLine, HRESULT hrResponse, IInternetTransport *pTransport); STDMETHODIMP OnResponse (LPNNTPRESPONSE pResponse); //---------------------------------------------------------------------- // ITransportCallbackService //---------------------------------------------------------------------- STDMETHODIMP GetParentWindow(DWORD dwReserved, HWND *phwndParent); STDMETHODIMP GetAccount(LPDWORD pdwServerType, IImnAccount **ppAcount); //---------------------------------------------------------------------- // INewsStore //---------------------------------------------------------------------- STDMETHODIMP MarkCrossposts(LPMESSAGEIDLIST pList, BOOL fRead); HRESULT Connect(void); HRESULT Group(void); HRESULT GroupIfNecessary(void); HRESULT ExpireHeaders(void); HRESULT Headers(void); HRESULT Article(void); HRESULT Post(void); HRESULT List(void); HRESULT DeleteDeadGroups(void); HRESULT Descriptions(void); HRESULT NewGroups(void); HRESULT XHdrReferences(void); HRESULT XHdrSubject(void); HRESULT WatchedArticles(void); static LRESULT CALLBACK NewsStoreWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); private: void _FreeOperation(void); HRESULT _DoOperation(void); HRESULT _BeginDeferredOperation(void); HRESULT _List(LPCSTR pszCommand); HRESULT _ComputeHeaderRange(SYNCFOLDERFLAGS dwFlags, DWORD cHeaders, FOLDERINFO *pInfo, RANGE *pRange); void _MarkCrossposts(LPCSTR szXRefs, BOOL fRead); BOOL _CreateWnd(void); HRESULT _CreateDataFilePath(LPCTSTR pszAccount, LPCTSTR pszFileName, LPTSTR pszPath, DWORD cchPathSize); BOOL _FConnected() { return (m_pTransport && m_ixpStatus != IXP_DISCONNECTING && m_ixpStatus != IXP_DISCONNECTED ); } HRESULT _HandleArticleResponse(LPNNTPRESPONSE pResp); HRESULT _HandleListResponse(LPNNTPRESPONSE pResp, BOOL fNew); HRESULT _HandleHeadResponse(LPNNTPRESPONSE pResp); HRESULT _HandleGroupResponse(LPNNTPRESPONSE pResp); HRESULT _HandlePostResponse(LPNNTPRESPONSE pResp); HRESULT _HandleXHdrReferencesResponse(LPNNTPRESPONSE pResp); HRESULT _HandleXHdrSubjectResponse(LPNNTPRESPONSE pResp); HRESULT _HandleWatchedArticleResponse(LPNNTPRESPONSE pResp); void _FillStoreError(LPSTOREERROR pErrorInfo, IXPRESULT *pResult, LPSTR pszGroup = NULL); BOOL _IsWatchedThread(LPSTR pszRef, LPSTR pszSubject); HRESULT _SaveMessageToStore(IMessageFolder *pFolder, DWORD id, LPSTREAM pstm); //---------------------------------------------------------------------- // Class Member Data //---------------------------------------------------------------------- private: LONG m_cRef; // Reference Counting HWND m_hwnd; IMessageStore *m_pStore; IMessageFolder *m_pFolder; FOLDERID m_idFolder; FOLDERID m_idParent; char m_szGroup[256]; char m_szAccountId[CCHMAX_ACCOUNT_NAME]; OPERATION m_op; SREFRESHOP *m_pROP; INNTPTransport *m_pTransport; IXPSTATUS m_ixpStatus; INETSERVER m_rInetServerInfo; DWORD m_dwLastStatusTicks; // GetWatchInfo state DWORD m_dwWatchLow; DWORD m_dwWatchHigh; LPTSTR *m_rgpszWatchInfo; BOOL m_fXhdrSubject; CRangeList m_cRange; DWORD m_cCurrent; DWORD m_cTotal; IMessageTable *m_pTable; // Used for downloading Watched Messages. #ifdef DEBUG DWORD m_dwThreadId; #endif // DEBUG }; //-------------------------------------------------------------------------- // Prototypes //-------------------------------------------------------------------------- HRESULT CreateNewsStore(IUnknown *pUnkOuter, IUnknown **ppUnknown); HRESULT NewsUtil_CreateDataFilePath(LPCTSTR pszAccount, LPCTSTR pszFileName, LPTSTR pszPath); #endif //_NEWSSTOR_H