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.
205 lines
8.1 KiB
205 lines
8.1 KiB
/////////////////////////////////////////////////////////////////////////////
|
|
// Copyright (C) 1993-1998 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
// MODULE: newstask.h
|
|
//
|
|
// PURPOSE: Implements a task object to take care of news downloads.
|
|
//
|
|
|
|
#ifndef __NEWSTASK_H__
|
|
#define __NEWSTASK_H__
|
|
|
|
#include "spoolapi.h"
|
|
#include "newsstor.h"
|
|
#include "StorUtil.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Types of events we support
|
|
|
|
#define HUNDRED_NANOSECONDS 10000000
|
|
|
|
typedef enum tagEVENTTYPE
|
|
{
|
|
EVENT_OUTBOX,
|
|
EVENT_NEWMSGS,
|
|
EVENT_IMAPUPLOAD
|
|
} EVENTTYPE;
|
|
|
|
typedef struct tagEVENTINFO
|
|
{
|
|
TCHAR szGroup[256];
|
|
EVENTTYPE type;
|
|
} EVENTINFO;
|
|
|
|
typedef enum tagNEWSTASKSTATE
|
|
{
|
|
NTS_IDLE = 0,
|
|
|
|
NTS_CONNECTING,
|
|
|
|
NTS_POST_INIT,
|
|
NTS_POST_NEXT, // Posting states
|
|
NTS_POST_RESP,
|
|
NTS_POST_DISPOSE,
|
|
NTS_POST_END,
|
|
|
|
NTS_NEWMSG_INIT,
|
|
NTS_NEWMSG_NEXTGROUP, // Check for new messages
|
|
NTS_NEWMSG_RESP,
|
|
NTS_NEWMSG_HTTPSYNCSTORE,
|
|
NTS_NEWMSG_HTTPRESP,
|
|
NTS_NEWMSG_END,
|
|
|
|
NTS_MAX
|
|
} NEWSTASKSTATE;
|
|
|
|
typedef struct tagSPLITMSGINFO
|
|
{
|
|
FOLDERID idFolder;
|
|
LPMIMEMESSAGEPARTS pMsgParts;
|
|
LPMIMEENUMMESSAGEPARTS pEnumParts;
|
|
} SPLITMSGINFO;
|
|
|
|
class CNewsTask;
|
|
typedef HRESULT (CNewsTask::*PFNSTATEFUNC)(THIS_ void);
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// class CNewsTask
|
|
//
|
|
// Overview:
|
|
// This object defines and implements the ISpoolerTask interface to handle
|
|
// uploading and downloading information from a news server.
|
|
//
|
|
class CNewsTask : public ISpoolerTask, public IStoreCallback, public ITimeoutCallback
|
|
{
|
|
public:
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// Constructor, destructor, initialization
|
|
CNewsTask();
|
|
~CNewsTask();
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// IUnknown Interface
|
|
STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj);
|
|
STDMETHOD_(ULONG, AddRef)(THIS);
|
|
STDMETHOD_(ULONG, Release)(THIS);
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// ISpoolerTask Interface
|
|
STDMETHOD(Init)(THIS_ DWORD dwFlags, ISpoolerBindContext *pBindCtx);
|
|
STDMETHOD(BuildEvents)(THIS_ ISpoolerUI *pSpoolerUI, IImnAccount *pAccount, FOLDERID idFolder);
|
|
STDMETHOD(Execute)(THIS_ EVENTID eid, DWORD_PTR dwTwinkie);
|
|
STDMETHOD(CancelEvent)(THIS_ EVENTID eid, DWORD_PTR dwTwinkie);
|
|
STDMETHOD(ShowProperties)(THIS_ HWND hwndParent, EVENTID eid, DWORD_PTR dwTwinkie);
|
|
STDMETHOD(GetExtendedDetails)(THIS_ EVENTID eid, DWORD_PTR dwTwinkie, LPSTR *ppszDetails);
|
|
STDMETHOD(Cancel)(THIS);
|
|
STDMETHOD(IsDialogMessage)(THIS_ LPMSG pMsg);
|
|
STDMETHOD(OnFlagsChanged)(THIS_ DWORD dwFlags);
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// IStoreCallback Interface
|
|
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);
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// ITimeoutCallback Interface
|
|
STDMETHODIMP OnTimeoutResponse(TIMEOUTRESPONSE eResponse);
|
|
|
|
protected:
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// Window callback and message handling
|
|
static LRESULT CALLBACK TaskWndProc(HWND hwnd, UINT uMsg, WPARAM wParam,
|
|
LPARAM lParam);
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// These functions build the event list
|
|
HRESULT InsertOutbox(LPTSTR szAccount, IImnAccount *pAccount);
|
|
HRESULT InsertNewMsgs(LPTSTR pszAccount, IImnAccount *pAccount, BOOL fHttp);
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// State Machine Stuff
|
|
void NextState(void);
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// Utility functions
|
|
HRESULT DisposeOfPosting(MESSAGEID dwMsgID);
|
|
|
|
public:
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// Functions that upload posts
|
|
HRESULT Post_Init(void);
|
|
HRESULT Post_NextPart(void);
|
|
HRESULT Post_NextMsg(void);
|
|
HRESULT Post_Dispose(void);
|
|
HRESULT Post_Done(void);
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// Functions that check for new messages
|
|
HRESULT NewMsg_Init(void);
|
|
HRESULT NewMsg_InitHttp(void);
|
|
HRESULT NewMsg_NextGroup(void);
|
|
HRESULT NewMsg_HttpSyncStore(void);
|
|
HRESULT NewMsg_Done(void);
|
|
|
|
private:
|
|
void FreeSplitInfo(void);
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// Private member data
|
|
ULONG m_cRef; // Object reference count
|
|
|
|
// State
|
|
BOOL m_fInited; // TRUE if we've been initialized
|
|
DWORD m_dwFlags; // Flags passed in from the spooler engine
|
|
NEWSTASKSTATE m_state; // Current state of the task
|
|
EVENTID m_eidCur; // Currently executing event
|
|
EVENTINFO *m_pInfo; // EVENTINFO for the current event
|
|
BOOL m_fConnectFailed;
|
|
TCHAR m_szAccount[256];
|
|
TCHAR m_szAccountId[256];
|
|
FOLDERID m_idAccount;
|
|
DWORD m_cEvents; // Number of events left to execute
|
|
BOOL m_fCancel;
|
|
IImnAccount *m_pAccount;
|
|
|
|
// Spooler Interfaces
|
|
ISpoolerBindContext *m_pBindCtx; // Interface to communicate with the spooler engine
|
|
ISpoolerUI *m_pUI; // Interface to communicate with the UI
|
|
|
|
// News Object Pointers
|
|
IMessageServer *m_pServer; // Pointer to the transport object
|
|
IMessageFolder *m_pOutbox; // Pointer to the outbox
|
|
IMessageFolder *m_pSent; // Pointer to the sent items folder
|
|
|
|
// Windows
|
|
HWND m_hwnd; // Handle that recieves transport messages
|
|
|
|
// Posting
|
|
int m_cMsgsPost; // Number of messages to post
|
|
int m_cCurPost; // Message currently being posted
|
|
int m_cFailed; // Number of messages which failed to post
|
|
int m_cCurParts; // Number of parts the current message includes
|
|
int m_cPartsCompleted; // Number of parts whose post have completed.
|
|
BOOL m_fPartFailed; // Did one of the parts fail?
|
|
LPMESSAGEINFO m_rgMsgInfo; // Array of headers for messages to post
|
|
SPLITMSGINFO *m_pSplitInfo;
|
|
|
|
// New messages check
|
|
int m_cGroups; // Number of groups we're checking
|
|
int m_cCurGroup; // Current group we're checking
|
|
FOLDERID *m_rgidGroups; // Array of group folderids we're checking
|
|
DWORD m_dwNewInboxMsgs; // Number of new msgs detected in Inbox
|
|
|
|
// Callback
|
|
HTIMEOUT m_hTimeout;
|
|
IOperationCancel *m_pCancel;
|
|
STOREOPERATIONTYPE m_tyOperation;
|
|
};
|
|
|
|
#endif // __NEWSTASK_H__
|