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.
226 lines
12 KiB
226 lines
12 KiB
// --------------------------------------------------------------------------------
|
|
// Spengine.h
|
|
// Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
|
|
// Steven J. Bailey
|
|
// --------------------------------------------------------------------------------
|
|
#ifndef __SPENGINE_H
|
|
#define __SPENGINE_H
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Depends
|
|
// --------------------------------------------------------------------------------
|
|
#include "spoolapi.h"
|
|
#include "imnact.h"
|
|
#include "conman.h"
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Forward Decls
|
|
// --------------------------------------------------------------------------------
|
|
interface ILogFile;
|
|
interface IImnAccountManager;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Spooler State
|
|
// --------------------------------------------------------------------------------
|
|
#define SPSTATE_INIT FLAG01 // The spooler has been initialized
|
|
#define SPSTATE_BUSY FLAG02 // The spooler is currently working
|
|
#define SPSTATE_CANCEL FLAG03 // The user hit stop
|
|
#define SPSTATE_SHUTDOWN FLAG04 // The spooler is shutting down
|
|
#define SPSTATE_UISHUTDOWN FLAG05 // ::UIShutdown
|
|
|
|
// ------------------------------------------------------------------------------------
|
|
// NOTIFYTABLE
|
|
// ------------------------------------------------------------------------------------
|
|
typedef struct tagNOTIFYTABLE {
|
|
ULONG cAlloc; // Number of array items allocated
|
|
ULONG cNotify; // Number of registered views
|
|
HWND *prghwndNotify; // Array of view who want notifications
|
|
} NOTIFYTABLE, *LPNOTIFYTABLE;
|
|
|
|
// ------------------------------------------------------------------------------------
|
|
// SPOOLERACCOUNT
|
|
// ------------------------------------------------------------------------------------
|
|
typedef struct tagSPOOLERACCOUNT {
|
|
CHAR szConnectoid[CCHMAX_CONNECTOID]; // RAS Connectoid Name
|
|
DWORD dwSort; // Inverted Sort Index
|
|
DWORD dwConnType; // CONNECTION_TYPE_XXXX (imnact.h)
|
|
DWORD dwServers; // Support Server Types on this account
|
|
IImnAccount *pAccount; // The Account Object
|
|
} SPOOLERACCOUNT, *LPSPOOLERACCOUNT;
|
|
|
|
// ------------------------------------------------------------------------------------
|
|
// ACCOUNTTABLE
|
|
// ------------------------------------------------------------------------------------
|
|
typedef struct tagACCOUNTTABLE {
|
|
ULONG cAccounts; // cRasAccts + cLanAccts
|
|
ULONG cLanAlloc; // Number of elements allocated;
|
|
ULONG cLanAccts; // Number of valid lan/manual accounts
|
|
ULONG cRasAlloc; // Number of elements allocated;
|
|
ULONG cRasAccts; // Number of valid lan/manual accounts
|
|
LPSPOOLERACCOUNT prgLanAcct; // Array of elements
|
|
LPSPOOLERACCOUNT prgRasAcct; // Array of elements
|
|
} ACCOUNTTABLE, *LPACCOUNTTABLE;
|
|
|
|
// ------------------------------------------------------------------------------------
|
|
// SPOOLERTASKTYPE
|
|
// ------------------------------------------------------------------------------------
|
|
typedef enum tagSPOOLERTASKTYPE {
|
|
TASK_POP3, // POP3 Task
|
|
TASK_SMTP, // SMTP Task
|
|
TASK_NNTP, // NNTP Task
|
|
TASK_IMAP // IMAP Task
|
|
} SPOOLERTASKTYPE;
|
|
|
|
// ------------------------------------------------------------------------------------
|
|
// SPOOLEREVENT
|
|
// ------------------------------------------------------------------------------------
|
|
typedef struct tagSPOOLEREVENT {
|
|
CHAR szConnectoid[CCHMAX_CONNECTOID]; // RAS Connectoid Name
|
|
DWORD dwConnType; // Connection Type
|
|
IImnAccount *pAccount; // Account object for this task
|
|
EVENTID eid; // Event ID
|
|
ISpoolerTask *pSpoolerTask; // Pointer to Task Object
|
|
DWORD_PTR dwTwinkie; // Event extra data
|
|
} SPOOLEREVENT, *LPSPOOLEREVENT;
|
|
|
|
// ------------------------------------------------------------------------------------
|
|
// SPOOLEREVENTTABLE
|
|
// ------------------------------------------------------------------------------------
|
|
typedef struct tagSPOOLEREVENTTABLE {
|
|
DWORD cEvents;
|
|
DWORD cSucceeded;
|
|
DWORD cEventsAlloc;
|
|
LPSPOOLEREVENT prgEvents;
|
|
} SPOOLEREVENTTABLE, *LPSPOOLEREVENTTABLE;
|
|
|
|
// ------------------------------------------------------------------------------------
|
|
// VIEWREGISTER
|
|
// ------------------------------------------------------------------------------------
|
|
typedef struct tagVIEWREGISTER {
|
|
ULONG cViewAlloc; // Number of array items allocated
|
|
HWND *rghwndView; // Array of view who want notifications
|
|
ULONG cView; // Number of registered views
|
|
} VIEWREGISTER, *LPVIEWREGISTER;
|
|
|
|
#define ALL_ACCT_SERVERS 0xffffffff
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// CSpoolerEngine
|
|
// --------------------------------------------------------------------------------
|
|
#ifndef WIN16 // No RAS support in Win16
|
|
class CSpoolerEngine : public ISpoolerEngine, ISpoolerBindContext, IConnectionNotify
|
|
#else
|
|
class CSpoolerEngine : public ISpoolerEngine, ISpoolerBindContext
|
|
#endif
|
|
{
|
|
friend HRESULT CreateThreadedSpooler(PFNCREATESPOOLERUI pfnCreateUI, ISpoolerEngine **ppSpooler, BOOL fPoll);
|
|
|
|
public:
|
|
// ----------------------------------------------------------------------------
|
|
// CSpoolerEngine
|
|
// ----------------------------------------------------------------------------
|
|
CSpoolerEngine(void);
|
|
~CSpoolerEngine(void);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// IUnknown members
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// ISpoolerEngine members
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP Init(ISpoolerUI *pUI, BOOL fPoll);
|
|
STDMETHODIMP StartDelivery(HWND hwnd, LPCSTR pszAcctID, FOLDERID idFolder, DWORD dwFlags);
|
|
STDMETHODIMP Close(void);
|
|
STDMETHODIMP Advise(HWND hwndView, BOOL fRegister);
|
|
STDMETHODIMP UpdateTrayIcon(TRAYICONTYPE type);
|
|
STDMETHODIMP GetThreadInfo(LPDWORD pdwThreadId, HTHREAD* phThread);
|
|
STDMETHODIMP OnStartupFinished(void);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// ISpoolerBindContext members
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP RegisterEvent(LPCSTR pszDescription, ISpoolerTask *pTask, DWORD_PTR dwTwinkie,
|
|
IImnAccount *pAccount, LPEVENTID peid);
|
|
STDMETHODIMP EventDone(EVENTID eid, EVENTCOMPLETEDSTATUS status);
|
|
STDMETHODIMP BindToObject(REFIID riid, void **ppvObject);
|
|
STDMETHODIMP TaskFromEventId(EVENTID eid, ISpoolerTask *ppTask);
|
|
STDMETHODIMP OnWindowMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
STDMETHODIMP Cancel(void);
|
|
STDMETHODIMP Notify(DELIVERYNOTIFYTYPE notify, LPARAM lParam);
|
|
STDMETHODIMP IsDialogMessage(LPMSG pMsg);
|
|
STDMETHODIMP PumpMessages(void);
|
|
STDMETHODIMP UIShutdown(void);
|
|
STDMETHODIMP OnUIChange(BOOL fVisible);
|
|
STDMETHODIMP_(LRESULT) QueryEndSession(WPARAM wParam, LPARAM lParam);
|
|
|
|
#ifndef WIN16 // No RAS support in Win16
|
|
// ---------------------------------------------------------------------------
|
|
// IConnectionNotify
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP OnConnectionNotify(CONNNOTIFY nCode, LPVOID pvData, CConnectionManager *pConMan);
|
|
#endif //!WIN16
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// CSpoolerEngine members
|
|
// ---------------------------------------------------------------------------
|
|
HRESULT Shutdown(void);
|
|
|
|
private:
|
|
// ---------------------------------------------------------------------------
|
|
// Private Members
|
|
// ---------------------------------------------------------------------------
|
|
HRESULT _HrStartDeliveryActual(DWORD dwFlags);
|
|
HRESULT _HrAppendAccountTable(LPACCOUNTTABLE pTable, LPCSTR pszAcctID, DWORD dwServers);
|
|
HRESULT _HrAppendAccountTable(LPACCOUNTTABLE pTable, IImnAccount *pAccount, DWORD dwServers);
|
|
#ifndef WIN16 // No RAS support in Win16
|
|
void _InsertRasAccounts(LPACCOUNTTABLE pTable, LPCSTR pszConnectoid, DWORD dwSrvTypes);
|
|
void _SortAccountTableByConnName(LONG left, LONG right, LPSPOOLERACCOUNT prgRasAcct);
|
|
#endif
|
|
HRESULT _HrCreateTaskObject(LPSPOOLERACCOUNT pSpoolerAcct);
|
|
HRESULT _HrStartNextEvent(void);
|
|
HRESULT _HrGoIdle(void);
|
|
void _ShutdownTasks(void);
|
|
void _DoBackgroundPoll(void);
|
|
void _StartPolling(void);
|
|
void _StopPolling(void);
|
|
HRESULT _HrDoRasConnect(const LPSPOOLEREVENT pEvent);
|
|
HRESULT _OpenMailLogFile(DWORD dwOptionId, LPCSTR pszPrefix, LPCSTR pszFileName, ILogFile **ppLogFile);
|
|
|
|
private:
|
|
// ---------------------------------------------------------------------------
|
|
// Private Data
|
|
// ---------------------------------------------------------------------------
|
|
ULONG m_cRef; // Reference count
|
|
DWORD m_dwThreadId; // Thread Id of this spooler
|
|
HTHREAD m_hThread; // Handle to my own thread
|
|
ISpoolerUI *m_pUI; // Spooler UI
|
|
DWORD m_dwState; // Spooler Engine State
|
|
IImnAccountManager *m_pAcctMan; // The Account Manager
|
|
IDatabase *m_pUidlCache; // POP3 uidl Cache
|
|
DWORD m_dwFlags; // Current DELIVERYFLAGS
|
|
HWND m_hwndUI; // Spooler Window
|
|
LPSTR m_pszAcctID; // Work on a specific account
|
|
FOLDERID m_idFolder; // Work on a specific folder or group
|
|
CRITICAL_SECTION m_cs; // Thread Safety
|
|
SPOOLEREVENTTABLE m_rEventTable; // Table of events
|
|
BOOL m_fBackgroundPollPending;
|
|
VIEWREGISTER m_rViewRegister; // Registered Views
|
|
DWORD m_dwPollInterval; // Duration between background polling
|
|
HWND m_hwndTray; // The tray icon window
|
|
DWORD m_cCurEvent; // Index of the currently executing event
|
|
DWORD m_dwQueued; // Queued Polling Flags
|
|
BOOL m_fRasSpooled; // Use this for the Hangup when done options
|
|
BOOL m_fOfflineWhenDone; // Toggle the Work Offline state after spool
|
|
ILogFile *m_pPop3LogFile;
|
|
ILogFile *m_pSmtpLogFile;
|
|
BOOL m_fIDialed;
|
|
DWORD m_cSyncEvent;
|
|
BOOL m_fNoSyncEvent;
|
|
};
|
|
|
|
#endif // __SPENGINE_H
|