|
|
// --------------------------------------------------------------------------------
// Pop3call.cpp
// --------------------------------------------------------------------------------
#include "pch.h"
#include "iconsole.h"
#include "pop3call.h"
// --------------------------------------------------------------------------------
// HrCreatePOP3Transport
// --------------------------------------------------------------------------------
HRESULT HrCreatePOP3Transport(IPOP3Transport **ppPOP3) { // Locals
HRESULT hr; CPOP3Callback *pCallback=NULL;
// Create callback object
pCallback = new CPOP3Callback(); if (NULL == pCallback) { printf("Memory allocation failure\n"); return E_OUTOFMEMORY; }
// Load SMTP Transport
hr = CoCreateInstance(CLSID_IPOP3Transport, NULL, CLSCTX_INPROC_SERVER, IID_IPOP3Transport, (LPVOID *)ppPOP3); if (FAILED(hr)) { pCallback->Release(); printf("Unable to load CLSID_IMNXPORT - IID_IPOP3Transport\n"); return E_FAIL; }
// InitNew
hr = (*ppPOP3)->InitNew(NULL, pCallback); if (FAILED(hr)) { pCallback->Release(); printf("Unable to load CLSID_IMNXPORT - IID_IPOP3Transport\n"); return E_FAIL; }
// Done
pCallback->Release(); return S_OK; }
// --------------------------------------------------------------------------------
// CPOP3Callback::CPOP3Callback
// --------------------------------------------------------------------------------
CPOP3Callback::CPOP3Callback(void) { m_cRef = 1; }
// --------------------------------------------------------------------------------
// CPOP3Callback::~CPOP3Callback
// --------------------------------------------------------------------------------
CPOP3Callback::~CPOP3Callback(void) { }
// --------------------------------------------------------------------------------
// CPOP3Callback::QueryInterface
// --------------------------------------------------------------------------------
STDMETHODIMP CPOP3Callback::QueryInterface(REFIID riid, LPVOID *ppv) { // Locals
HRESULT hr=S_OK;
// Bad param
if (ppv == NULL) { hr = E_INVALIDARG; goto exit; }
// Init
*ppv=NULL;
// IID_IUnknown
if (IID_IUnknown == riid) *ppv = (IUnknown *)this;
// IID_IPOP3Callback
else if (IID_IPOP3Callback == riid) *ppv = (IPOP3Callback *)this;
// If not null, addref it and return
if (NULL != *ppv) { ((LPUNKNOWN)*ppv)->AddRef(); goto exit; }
// No Interface
hr = E_NOINTERFACE;
exit: // Done
return hr; }
// --------------------------------------------------------------------------------
// CPOP3Callback::AddRef
// --------------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CPOP3Callback::AddRef(void) { return ++m_cRef; }
// --------------------------------------------------------------------------------
// CPOP3Callback::Release
// --------------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CPOP3Callback::Release(void) { if (0 != --m_cRef) return m_cRef; delete this; return 0; }
// --------------------------------------------------------------------------------
// CPOP3Callback::OnLogonPrompt
// --------------------------------------------------------------------------------
STDMETHODIMP CPOP3Callback::OnLogonPrompt( LPINETSERVER pInetServer, IInternetTransport *pTransport) { printf("Enter User Name ('quit' to abort logon)>"); scanf("%s", pInetServer->szUserName); fflush(stdin); if (lstrcmpi(pInetServer->szUserName, "quit") == 0) return S_FALSE;
printf("Enter Password ('quit' to abort logon)>"); scanf("%s", pInetServer->szPassword); fflush(stdin); if (lstrcmpi(pInetServer->szPassword, "quit") == 0) return S_FALSE;
return S_OK; }
// --------------------------------------------------------------------------------
// CPOP3Callback::OnPrompt
// --------------------------------------------------------------------------------
STDMETHODIMP_(INT) CPOP3Callback::OnPrompt( HRESULT hrError, LPCTSTR pszText, LPCTSTR pszCaption, UINT uType, IInternetTransport *pTransport) { return S_OK; }
// --------------------------------------------------------------------------------
// CPOP3Callback::OnError
// --------------------------------------------------------------------------------
STDMETHODIMP CPOP3Callback::OnError( IXPSTATUS ixpstatus, LPIXPRESULT pIxpResult, IInternetTransport *pTransport) { printf("CPOP3Callback::OnError - Status: %d, hrResult: %08x\n", ixpstatus, pIxpResult->hrResult); return S_OK; }
// --------------------------------------------------------------------------------
// CPOP3Callback::OnStatus
// --------------------------------------------------------------------------------
STDMETHODIMP CPOP3Callback::OnStatus( IXPSTATUS ixpstatus, IInternetTransport *pTransport) { INETSERVER rServer;
pTransport->GetServerInfo(&rServer);
switch(ixpstatus) { case IXP_FINDINGHOST: printf("Finding '%s'...\n", rServer.szServerName); break; case IXP_CONNECTING: printf("Connecting '%s'...\n", rServer.szServerName); break; case IXP_SECURING: printf("Establishing secure connection to '%s'...\n", rServer.szServerName); break; case IXP_CONNECTED: printf("Connected '%s'\n", rServer.szServerName); break; case IXP_AUTHORIZING: printf("Authorizing '%s'...\n", rServer.szServerName); break; case IXP_AUTHRETRY: printf("Retrying Logon '%s'...\n", rServer.szServerName); break; case IXP_DISCONNECTING: printf("Disconnecting '%s'...\n", rServer.szServerName); break; case IXP_DISCONNECTED: printf("Disconnected '%s'\n", rServer.szServerName); PostThreadMessage(GetCurrentThreadId(), g_msgPOP3, IXP_DISCONNECTED, 0); PostThreadMessage(GetCurrentThreadId(), g_msgPOP3, POP3_QUIT, 0); break; } return S_OK; }
// --------------------------------------------------------------------------------
// CPOP3Callback::OnProgress
// --------------------------------------------------------------------------------
STDMETHODIMP CPOP3Callback::OnProgress( DWORD dwIncrement, DWORD dwCurrent, DWORD dwMaximum, IInternetTransport *pTransport) { return S_OK; }
// --------------------------------------------------------------------------------
// CPOP3Callback::OnCommand
// --------------------------------------------------------------------------------
STDMETHODIMP CPOP3Callback::OnCommand( CMDTYPE cmdtype, LPSTR pszLine, HRESULT hrResponse, IInternetTransport *pTransport) { INETSERVER rServer; pTransport->GetServerInfo(&rServer); if (CMD_SEND == cmdtype) { if (strstr(pszLine, "pass") || strstr(pszLine, "PASS")) printf("%s[TX]: <Secret Password>\n", rServer.szServerName); else printf("%s[TX]: %s", rServer.szServerName, pszLine); } else if (CMD_RESP == cmdtype) printf("%s[RX]: %s - %08x\n", rServer.szServerName, pszLine, hrResponse); return S_OK; }
// --------------------------------------------------------------------------------
// CPOP3Callback::OnTimeout
// --------------------------------------------------------------------------------
STDMETHODIMP CPOP3Callback::OnTimeout( DWORD *pdwTimeout, IInternetTransport *pTransport) { INETSERVER rServer; pTransport->GetServerInfo(&rServer); printf("Timeout '%s' !!!\n", rServer.szServerName); return S_OK; }
// --------------------------------------------------------------------------------
// CPOP3Callback::OnResponse
// --------------------------------------------------------------------------------
STDMETHODIMP CPOP3Callback::OnResponse( LPPOP3RESPONSE pResponse) { switch(pResponse->command) { case POP3_NONE: break;
case POP3_BANNER: break;
case POP3_CONNECTED: if (pResponse->fDone) PostThreadMessage(GetCurrentThreadId(), g_msgPOP3, POP3_CONNECTED, 0); break;
case POP3_RSET: if (pResponse->fDone) PostThreadMessage(GetCurrentThreadId(), g_msgPOP3, POP3_RSET, 0); break;
case POP3_QUIT: if (pResponse->fDone) PostThreadMessage(GetCurrentThreadId(), g_msgPOP3, POP3_QUIT, 0); break;
case POP3_LIST: // 0 is invalid for dwPopId
if (pResponse->rListInfo.dwPopId) { printf("OnResponse::POP3_LIST - dwPopId = %d\n", pResponse->rListInfo.dwPopId); printf("OnResponse::POP3_LIST - cbSize = %d\n", pResponse->rListInfo.cbSize); } if (pResponse->fDone) PostThreadMessage(GetCurrentThreadId(), g_msgPOP3, POP3_LIST, 0); break;
case POP3_UIDL: // 0 is invalid for dwPopId
if (pResponse->fValidInfo) { printf("OnResponse::POP3_UIDL - dwPopId = %d\n", pResponse->rUidlInfo.dwPopId); printf("OnResponse::POP3_UIDL - pszUidl = %s\n", pResponse->rUidlInfo.pszUidl); } if (pResponse->fDone) PostThreadMessage(GetCurrentThreadId(), g_msgPOP3, POP3_UIDL, 0); break;
case POP3_DELE: // 0 is invalid for dwPopId
if (pResponse->fValidInfo) printf("OnResponse::POP3_DELE - dwPopId = %d\n", pResponse->dwPopId); if (pResponse->fDone) PostThreadMessage(GetCurrentThreadId(), g_msgPOP3, POP3_DELE, 0); break;
case POP3_STAT: if (pResponse->fDone) { printf("OnResponse::POP3_STAT - cMessages = %d\n", pResponse->rStatInfo.cMessages); printf("OnResponse::POP3_STAT - cbMessages = %d\n", pResponse->rStatInfo.cbMessages); PostThreadMessage(GetCurrentThreadId(), g_msgPOP3, POP3_STAT, 0); } break;
case POP3_TOP: if (pResponse->fValidInfo) { if (pResponse->rTopInfo.pszLines) printf("%s", pResponse->rTopInfo.pszLines); if (pResponse->rTopInfo.cPreviewLines && pResponse->rTopInfo.fHeader && pResponse->rTopInfo.fBody) printf("%d Total\n", pResponse->rTopInfo.cbSoFar); else if (pResponse->rTopInfo.cPreviewLines == 0 && pResponse->rTopInfo.fHeader) printf("%d Total\n", pResponse->rTopInfo.cbSoFar); } if (pResponse->fDone) PostThreadMessage(GetCurrentThreadId(), g_msgPOP3, POP3_TOP, 0); break;
case POP3_RETR: if (pResponse->fValidInfo) { if (pResponse->rRetrInfo.pszLines) printf("%s", pResponse->rRetrInfo.pszLines); if (pResponse->rRetrInfo.fHeader && pResponse->rRetrInfo.fBody) printf("%d Total\n", pResponse->rRetrInfo.cbSoFar); } if (pResponse->fDone) PostThreadMessage(GetCurrentThreadId(), g_msgPOP3, POP3_RETR, 0); break; } return S_OK; }
|