|
|
// --------------------------------------------------------------------------------
// Ixppop3.h
// Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
// Steven J. Bailey
// --------------------------------------------------------------------------------
#ifndef __IXPPOP3_H
#define __IXPPOP3_H
// ------------------------------------------------------------------------------------
// Depends
// ------------------------------------------------------------------------------------
#include "ixpbase.h"
#include "asynconn.h"
#include "sicily.h"
// ------------------------------------------------------------------------------------
// AUTHSTATE
// ------------------------------------------------------------------------------------
typedef enum { AUTH_NONE, AUTH_ENUMPACKS, AUTH_ENUMPACKS_DATA, AUTH_TRYING_PACKAGE, AUTH_NEGO_RESP, AUTH_RESP_RESP, AUTH_CANCELED, AUTH_SMTP_LOGIN, AUTH_SMTP_LOGIN_USERNAME, AUTH_SMTP_LOGIN_PASSWORD } AUTHSTATE;
// ------------------------------------------------------------------------------------
// UIDLTYPE
// ------------------------------------------------------------------------------------
typedef enum { UIDL_NONE, UIDL_BY_UIDL, UIDL_BY_TOP } UIDLTYPE;
// ------------------------------------------------------------------------------------
// FETCHINFO
// ------------------------------------------------------------------------------------
typedef struct tagFETCHINFO { DWORD cbSoFar; // Number of bytes downloaded so far
BOOL fLastLineCRLF; // Last line ended with a CRLF
BOOL fGotResponse; // First response after issuing the POP3_TOP or POP3_RETR command
BOOL fHeader; // Header has been downloaded
BOOL fBody; // Body has been downloaded
} FETCHINFO, *LPFETCHINFO;
#define MAX_AUTH_TOKENS 32
// ------------------------------------------------------------------------------------
// AUTHINFO
// ------------------------------------------------------------------------------------
typedef struct tagAUTHINFO { AUTHSTATE authstate; // Sicily Authorization State
BOOL fRetryPackage; // Retry sicily package with differenty isc flags
SSPICONTEXT rSicInfo; // Data used for logging onto a sicily server
LPSTR rgpszAuthTokens[MAX_AUTH_TOKENS]; // AUTH security package tokens
UINT cAuthToken; // count of server packages
UINT iAuthToken; // current package being tried
LPSSPIPACKAGE pPackages; // Array of installed security packages
ULONG cPackages; // Number of installed security packages (pPackages)
} AUTHINFO, *LPAUTHINFO;
void FreeAuthInfo(LPAUTHINFO pAuth);
// ------------------------------------------------------------------------------------
// POP3INFO
// ------------------------------------------------------------------------------------
typedef struct tagPOP3INFO { BOOL fStatDone; // Has the stat command been issued on this session
DWORD cList; // Number of messages listed in the full UIDL or LIST command
DWORD cMarked; // Number of messages in the prgMarked array, set after STAT is issued
LPDWORD prgMarked; // Array of marked messages
FETCHINFO rFetch; // Information for the POP3_TOP or POP3_RETR command
AUTHINFO rAuth; // Sicily Authorization Information
POP3CMDTYPE cmdtype; // Current command type
ULONG cPreviewLines; // Number of lines to retrieve on the preview command
DWORD dwPopIdCurrent; // Current PopId
} POP3INFO, *LPPOP3INFO;
// ------------------------------------------------------------------------------------
// CPOP3Transport
// ------------------------------------------------------------------------------------
class CPOP3Transport : public IPOP3Transport, public CIxpBase { private: POP3INFO m_rInfo; // Structure containing pop3 information
POP3COMMAND m_command; // Current state
BYTE m_fHotmail; // Are we connected to hotmail ?
private: // Processes POP3 command responses
HRESULT HrGetResponse(void); void FillRetrieveResponse(LPPOP3RESPONSE pResponse, LPSTR pszLines, ULONG cbRead, BOOL *pfMessageDone);
// Response Dispatcher for general command
void DispatchResponse(HRESULT hrResult, BOOL fDone=TRUE, LPPOP3RESPONSE pResponse=NULL);
// Sends sicily data to the server
HRESULT HrSendSicilyString(LPSTR pszData);
// Build parameterized command
HRESULT HrBuildParams(POP3CMDTYPE cmdtype, DWORD dwp1, DWORD dwp2);
// Frees the current message array
void FreeMessageArray(void);
// Logon retry
void LogonRetry(HRESULT hrLogon);
// Socket data receive handler
void OnSocketReceive(void);
// Initiates the logon process
void StartLogon(void);
// Response Handler
void ResponseAUTH(HRESULT hrResponse); void ResponseSTAT(void); void ResponseGenericList(void); void ResponseGenericRetrieve(void); void ResponseDELE(void);
// Issues a parameterized command
DWORD DwGetCommandMarkedFlag(POP3COMMAND command); ULONG CountMarked(POP3COMMAND command); HRESULT HrCommandGetPopId(POP3COMMAND command, DWORD dwPopId); HRESULT HrSplitPop3Response(LPSTR pszLine, LPSTR *ppszPart1, LPSTR *ppszPart2); HRESULT HrComplexCommand(POP3COMMAND command, POP3CMDTYPE cmdtype, DWORD dwPopId, ULONG cPreviewLines); HRESULT HrCommandGetNext(POP3COMMAND command, BOOL *pfDone); HRESULT HrCommandGetAll(POP3COMMAND command); BOOL FEndRetrRecvHeader(LPSTR pszLines, ULONG cbRead); HRESULT HrCancelAuthInProg(); // Moved to ixputil.cpp
// BOOL FEndRetrRecvBody(LPSTR pszLines, ULONG cbRead, ULONG *pcbSubtract);
public: // ----------------------------------------------------------------------------
// Construction
// ----------------------------------------------------------------------------
CPOP3Transport(void); ~CPOP3Transport(void);
// ----------------------------------------------------------------------------
// IUnknown methods
// ----------------------------------------------------------------------------
STDMETHODIMP QueryInterface(REFIID, LPVOID *); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void);
// ----------------------------------------------------------------------------
// IAsyncConnCB methods
// ----------------------------------------------------------------------------
void OnNotify(ASYNCSTATE asOld, ASYNCSTATE asNew, ASYNCEVENT ae);
// ----------------------------------------------------------------------------
// IInternetTransport methods
// ----------------------------------------------------------------------------
STDMETHODIMP InitNew(LPSTR pszLogFilePath, IPOP3Callback *pCallback); STDMETHODIMP Connect(LPINETSERVER pInetServer, boolean fAuthenticate, boolean fCommandLogging); STDMETHODIMP DropConnection(void); STDMETHODIMP Disconnect(void); STDMETHODIMP IsState(IXPISSTATE isstate); STDMETHODIMP GetServerInfo(LPINETSERVER pInetServer); STDMETHODIMP_(IXPTYPE) GetIXPType(void); STDMETHODIMP InetServerFromAccount(IImnAccount *pAccount, LPINETSERVER pInetServer); STDMETHODIMP HandsOffCallback(void); STDMETHODIMP GetStatus(IXPSTATUS *pCurrentStatus);
// ----------------------------------------------------------------------------
// IPOP3Transport methods
// ----------------------------------------------------------------------------
STDMETHODIMP MarkItem(POP3MARKTYPE marktype, DWORD dwPopId, boolean fMarked); STDMETHODIMP CommandAUTH(LPSTR pszAuthType); STDMETHODIMP CommandUSER(LPSTR pszUserName); STDMETHODIMP CommandPASS(LPSTR pszPassword); STDMETHODIMP CommandLIST(POP3CMDTYPE cmdtype, DWORD dwPopId); STDMETHODIMP CommandTOP (POP3CMDTYPE cmdtype, DWORD dwPopId, DWORD cPreviewLines); STDMETHODIMP CommandUIDL(POP3CMDTYPE cmdtype, DWORD dwPopId); STDMETHODIMP CommandDELE(POP3CMDTYPE cmdtype, DWORD dwPopId); STDMETHODIMP CommandRETR(POP3CMDTYPE cmdtype, DWORD dwPopId); STDMETHODIMP CommandRSET(void); STDMETHODIMP CommandQUIT(void); STDMETHODIMP CommandSTAT(void); STDMETHODIMP CommandNOOP(void);
// ----------------------------------------------------------------------------
// CIxpBase methods
// ----------------------------------------------------------------------------
virtual void ResetBase(void); virtual void DoQuit(void); virtual void OnConnected(void); virtual void OnDisconnected(void); virtual void OnEnterBusy(void); virtual void OnLeaveBusy(void); };
#endif // __IXPPOP3_H
|