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
234 lines
10 KiB
/*
|
|
* 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
|