Leaked source code of windows server 2003
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

// --------------------------------------------------------------------------------
// 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