|
|
// --------------------------------------------------------------------------------
// Main.cpp
// --------------------------------------------------------------------------------
#define INITGUID
#include "pch.h"
#include "windowsx.h"
#include <initguid.h>
#include "imnxport.h"
#include "smtpcall.h"
#include "pop3call.h"
#include "nntpcall.h"
#include "iconsole.h"
#include "rascall.h"
#include "httpcall.h"
// Globals
IImnAccountManager *g_pAcctMan=NULL; ISMTPTransport *g_pSMTP=NULL; IPOP3Transport *g_pPOP3=NULL; IRASTransport *g_pRAS=NULL; INNTPTransport *g_pNNTP=NULL; IHTTPMailTransport *g_pHTTPMail=NULL; UINT g_msgSMTP=0; UINT g_msgPOP3=0; UINT g_msgRAS=0; UINT g_msgNNTP=0; UINT g_msgHTTPMail=0;
// Prototypes
void ImnxportCommandShell(LPSTR pszShell); void SMTPCommandShell(void); void POP3CommandShell(void); void NNTPCommandShell(void); void IMAPCommandShell(void); void RASCommandShell(void); void HTTPMailCommandShell(void);
void ConnectToSMTPTransport(LPINETSERVER pServer); void WaitForCompletion(UINT uiMsg, DWORD wparam);
void __cdecl main(int argc, char *argv[]) { // Locals
HRESULT hr;
// OLE Init
hr = CoInitialize(NULL); if (FAILED(hr)) { printf("CoInitialize - FAILED\n"); exit(1); }
// Register completion message
g_msgSMTP = RegisterWindowMessage("SMTPTransport_Notify"); g_msgPOP3 = RegisterWindowMessage("POP3Transport_Notify"); g_msgRAS = RegisterWindowMessage("RASTransport_Notify"); g_msgNNTP = RegisterWindowMessage("NNTPTransport_Notify"); g_msgHTTPMail = RegisterWindowMessage("HTTPMailTransport_Notify");
// Load the account manager
hr = CoCreateInstance(CLSID_ImnAccountManager, NULL, CLSCTX_INPROC_SERVER, IID_IImnAccountManager, (LPVOID *)&g_pAcctMan); if (FAILED(hr)) { printf("Unable to load the IMN Account Manager.\n"); goto exit; }
// Init the account manager
hr = g_pAcctMan->Init(NULL); if (FAILED(hr)) { printf("Unable to initialize the IMN Account Manager.\n"); goto exit; }
// Create smtp transport
hr = HrCreateSMTPTransport(&g_pSMTP); if (FAILED(hr)) goto exit;
// Create pop3 transport
hr = HrCreatePOP3Transport(&g_pPOP3); if (FAILED(hr)) goto exit;
// Create ras transport
hr = HrCreateRASTransport(&g_pRAS); if (FAILED(hr)) goto exit;
// Create NNTP transport
hr = HrCreateNNTPTransport(&g_pNNTP); if (FAILED(hr)) goto exit;
hr = HrCreateHTTPMailTransport(&g_pHTTPMail); if (FAILED(hr)) goto exit;
// Our console IO manager
if (argc == 2) ImnxportCommandShell(argv[1]); else ImnxportCommandShell(NULL);
exit: // Cleanup
if (g_pSMTP) g_pSMTP->Release(); if (g_pPOP3) g_pPOP3->Release(); if (g_pRAS) g_pRAS->Release(); if (g_pNNTP) g_pNNTP->Release(); if (g_pHTTPMail) g_pHTTPMail->Release(); if (g_pAcctMan) g_pAcctMan->Release();
// CoUninitialize
CoUninitialize();
// Done
exit(1); }
// --------------------------------------------------------------------------------
// HrByteToStream
// --------------------------------------------------------------------------------
HRESULT HrByteToStream(LPSTREAM *lppstm, LPBYTE lpb, ULONG cb) { // Locals
HRESULT hr=S_OK; LARGE_INTEGER liOrigin = {0,0};
// Create H Global Stream
hr = CreateStreamOnHGlobal (NULL, TRUE, lppstm); if (FAILED(hr)) goto exit;
// Write String
hr = (*lppstm)->Write (lpb, cb, NULL); if (FAILED(hr)) goto exit;
// Rewind the steam
hr = (*lppstm)->Seek(liOrigin, STREAM_SEEK_SET, NULL); if (FAILED(hr)) goto exit;
exit: // Done
return hr; }
void ImnxportCommandShellHelp(void) { printf("Valid commands:\nSMTP\nPOP3\nNNTP\nIMAP\nRAS\nHTTPMail\nEXIT\n\n"); }
// Main command handler
void ImnxportCommandShell(LPSTR pszShell) { // Locals
char szCommand[50];
// Title
printf("\nMicrosoft(R) Internet Mail and News Command Shell.\n"); printf("(C) Copyright 1985-1996 Microsoft Corp.\n"); printf("Type ? for help.\n\n");
IMNXPORTPrompt: if (!pszShell) { // Prompt
printf("Internet> "); scanf("%s", szCommand); fflush(stdin); } else lstrcpy(szCommand, pszShell);
printf("\n");
// Handle Prompt
if (lstrcmpi(szCommand, "SMTP") == 0) SMTPCommandShell(); else if (lstrcmpi(szCommand, "POP3") == 0) POP3CommandShell(); else if (lstrcmpi(szCommand, "IMAP") == 0) IMAPCommandShell(); else if (lstrcmpi(szCommand, "NNTP") == 0) NNTPCommandShell(); else if (lstrcmpi(szCommand, "RAS") == 0) RASCommandShell(); else if (lstrcmpi(szCommand, "HTTPMail") == 0 || lstrcmpi(szCommand, "HTTP") == 0) HTTPMailCommandShell(); else if (lstrcmpi(szCommand, "EXIT") == 0) return; else ImnxportCommandShellHelp();
// RePrompt
pszShell = NULL; goto IMNXPORTPrompt; }
// SMTP Command Help
void SMTPCommandShellHelp(void) { printf("Valid commands:\nACCOUNTS\nCONNECT\nQUIT\nRSET\nSENDMESSAGE\nEHLO\nHELO\nMAIL\nRCPT\nDATA\nSTREAM\nCUSTOM\nEXIT\n\n"); }
// SMTP Command Handler
void SMTPCommandShell(void) { // Locals
INETSERVER rServer; IImnAccount *pAccount=NULL; char szCommand[50];
// Title
printf("Microsoft(R) SMTP Command Shell.\n"); printf("Type ? for help.\n\n");
// Show command
SMTPPrompt: printf("SMTP>"); scanf("%s", szCommand); fflush(stdin);
if (lstrcmpi(szCommand, "ACCOUNTS") == 0) g_pAcctMan->AccountListDialog(NULL, NULL);
else if (lstrcmpi(szCommand, "CONNECT") == 0) { char szAccount[CCHMAX_ACCOUNT_NAME]; printf("Enter Account Name>"); scanf("%s", szAccount); fflush(stdin);
if (FAILED(g_pAcctMan->FindAccount(AP_ACCOUNT_NAME, szAccount, &pAccount))) { printf("Invalid Account Name: '%s'\n\n", szAccount); goto SMTPPrompt; }
if (FAILED(g_pSMTP->InetServerFromAccount(pAccount, &rServer))) { pAccount->Release(); printf("IInternetTransport::InetServerFromAccount failed\n"); goto SMTPPrompt; }
if (FAILED(g_pSMTP->Connect(&rServer, TRUE, TRUE))) { pAccount->Release(); printf("IInternetTransport::Connect failed\n"); goto SMTPPrompt; }
// Wait for completion
WaitForCompletion(g_msgSMTP, SMTP_CONNECTED);
// Done
pAccount->Release(); } else if (lstrcmpi(szCommand, "EHLO") == 0) { if (FAILED(g_pSMTP->CommandEHLO())) { printf("ISMTPTransport::CommandEHLO failed.\n"); goto SMTPPrompt; } WaitForCompletion(g_msgSMTP, SMTP_EHLO); } else if (lstrcmpi(szCommand, "DOT") == 0) { if (FAILED(g_pSMTP->CommandDOT())) { printf("ISMTPTransport::CommandDOT failed.\n"); goto SMTPPrompt; } WaitForCompletion(g_msgSMTP, SMTP_DOT); } else if (lstrcmpi(szCommand, "DATA") == 0) { if (FAILED(g_pSMTP->CommandDATA())) { printf("ISMTPTransport::CommandDATA failed.\n"); goto SMTPPrompt; } WaitForCompletion(g_msgSMTP, SMTP_DATA); } else if (lstrcmpi(szCommand, "HELO") == 0) { if (FAILED(g_pSMTP->CommandHELO())) { printf("ISMTPTransport::CommandHELO failed.\n"); goto SMTPPrompt; } WaitForCompletion(g_msgSMTP, SMTP_HELO); } else if (lstrcmpi(szCommand, "QUIT") == 0) { if (FAILED(g_pSMTP->CommandQUIT())) { printf("ISMTPTransport::CommandQUIT failed.\n"); goto SMTPPrompt; } WaitForCompletion(g_msgSMTP, SMTP_QUIT); } else if (lstrcmpi(szCommand, "RSET") == 0) { if (FAILED(g_pSMTP->CommandRSET())) { printf("ISMTPTransport::CommandRSET failed.\n"); goto SMTPPrompt; } WaitForCompletion(g_msgSMTP, SMTP_RSET); } else if (lstrcmpi(szCommand, "MAIL") == 0) { char szEmail[CCHMAX_EMAIL_ADDRESS];
printf("Enter Sender Email Address>"); scanf("%s", szEmail); fflush(stdin); if (FAILED(g_pSMTP->CommandMAIL(szEmail))) { printf("ISMTPTransport::CommandMAIL failed.\n"); goto SMTPPrompt; } WaitForCompletion(g_msgSMTP, SMTP_MAIL); }
else if (lstrcmpi(szCommand, "RCPT") == 0) { char szEmail[CCHMAX_EMAIL_ADDRESS];
while(1) { printf("Enter Recipient Email ('Done')>"); scanf("%s", szEmail); fflush(stdin); if (lstrcmpi(szEmail, "DONE") == 0) break;
if (FAILED(g_pSMTP->CommandRCPT(szEmail))) { printf("ISMTPTransport::CommandRCPT failed.\n"); goto SMTPPrompt; } WaitForCompletion(g_msgSMTP, SMTP_RCPT); } }
else if (lstrcmpi(szCommand, "SENDMESSAGE") == 0) { INETADDR rgAddress[11]; SMTPMESSAGE rMessage; CHAR szText[1024];
ZeroMemory(&rgAddress, sizeof(rgAddress)); ZeroMemory(&rMessage, sizeof(rMessage));
printf("Enter Sender Email Address>"); rgAddress[0].addrtype = ADDR_FROM; scanf("%s", rgAddress[0].szEmail); fflush(stdin);
rMessage.rAddressList.prgAddress = rgAddress; rMessage.rAddressList.cAddress = 1; while(rMessage.rAddressList.cAddress < 11) { INT i = rMessage.rAddressList.cAddress; printf("(%d of 10) Enter Recipient Email ('Done')>", i); rgAddress[i].addrtype = ADDR_TO; scanf("%s", rgAddress[i].szEmail); fflush(stdin); if (lstrcmpi(rgAddress[i].szEmail, "DONE") == 0) break; rMessage.rAddressList.cAddress++; }
printf("Enter Message Text, end with pressing RETURN:\n"); scanf("%s", szText); fflush(stdin);
rMessage.cbSize = lstrlen(szText);
if (FAILED(HrByteToStream(&rMessage.pstmMsg, (LPBYTE)szText, rMessage.cbSize + 1))) { printf("HrByteToStream failed.\n"); goto SMTPPrompt; }
if (FAILED(g_pSMTP->SendMessage(&rMessage))) { rMessage.pstmMsg->Release(); printf("ISMTPTransport::SendMessage failed.\n"); goto SMTPPrompt; } WaitForCompletion(g_msgSMTP, SMTP_SEND_MESSAGE); rMessage.pstmMsg->Release(); }
else if (lstrcmpi(szCommand, "EXIT") == 0) return; else SMTPCommandShellHelp();
// Go back to the prompt
goto SMTPPrompt; }
// POP3 Command Help
void POP3CommandShellHelp(void) { printf("Valid commands:\nACCOUNTS\nCONNECT\nQUIT\nSTAT\nLIST\nUIDL\nTOP\nRETR\nMARK\n\n"); }
POP3CMDTYPE GetCommandType(LPDWORD pdwPopId) { INT i; *pdwPopId = 0; printf("(1) - POP3CMD_GET_POPID\n(2) - POP3CMD_GET_MARKED\n(3) - POP3CMD_GET_ALL\nSelect Command Type>"); scanf("%d", &i); fflush(stdin); if (i == 1) { printf("Enter PopId>"); scanf("%d", pdwPopId); return POP3CMD_GET_POPID; } else if (i == 2) return POP3CMD_GET_MARKED; return POP3CMD_GET_ALL; }
// POP3 Command Shell
void POP3CommandShell(void) { // Locals
DWORD dwPopId; POP3CMDTYPE cmdtype; INETSERVER rServer; IImnAccount *pAccount=NULL; char szCommand[50];
// Title
printf("Microsoft(R) POP3 Command Shell.\n"); printf("Type ? for help.\n\n");
// Show command
POP3Prompt: printf("POP3>"); scanf("%s", szCommand); fflush(stdin);
if (lstrcmpi(szCommand, "ACCOUNTS") == 0) g_pAcctMan->AccountListDialog(NULL, NULL);
else if (lstrcmpi(szCommand, "CONNECT") == 0) { char szAccount[CCHMAX_ACCOUNT_NAME]; printf("Enter Account Name>"); scanf("%s", szAccount); fflush(stdin);
if (FAILED(g_pAcctMan->FindAccount(AP_ACCOUNT_NAME, szAccount, &pAccount))) { printf("Invalid Account Name: '%s'\n\n", szAccount); goto POP3Prompt; }
if (FAILED(g_pPOP3->InetServerFromAccount(pAccount, &rServer))) { pAccount->Release(); printf("IInternetTransport::InetServerFromAccount failed\n"); goto POP3Prompt; }
if (FAILED(g_pPOP3->Connect(&rServer, TRUE, TRUE))) { pAccount->Release(); printf("IInternetTransport::Connect failed\n"); goto POP3Prompt; }
// Wait for completion
WaitForCompletion(g_msgPOP3, POP3_CONNECTED);
// Done
pAccount->Release(); } else if (lstrcmpi(szCommand, "QUIT") == 0) { if (FAILED(g_pPOP3->CommandQUIT())) { printf("IPOP3Transport::CommandQUIT failed.\n"); goto POP3Prompt; } WaitForCompletion(g_msgPOP3, POP3_QUIT); } else if (lstrcmpi(szCommand, "STAT") == 0) { if (FAILED(g_pPOP3->CommandSTAT())) { printf("IPOP3Transport::CommandSTAT failed.\n"); goto POP3Prompt; } WaitForCompletion(g_msgPOP3, POP3_STAT); } else if (lstrcmpi(szCommand, "LIST") == 0) { cmdtype = GetCommandType(&dwPopId); if (FAILED(g_pPOP3->CommandLIST(cmdtype, dwPopId))) { printf("IPOP3Transport::CommandLIST failed.\n"); goto POP3Prompt; } WaitForCompletion(g_msgPOP3, POP3_LIST); } else if (lstrcmpi(szCommand, "UIDL") == 0) { cmdtype = GetCommandType(&dwPopId); if (FAILED(g_pPOP3->CommandUIDL(cmdtype, dwPopId))) { printf("IPOP3Transport::CommandUIDL failed.\n"); goto POP3Prompt; } WaitForCompletion(g_msgPOP3, POP3_UIDL); } else if (lstrcmpi(szCommand, "DELE") == 0) { cmdtype = GetCommandType(&dwPopId); if (FAILED(g_pPOP3->CommandDELE(cmdtype, dwPopId))) { printf("IPOP3Transport::CommandDELE failed.\n"); goto POP3Prompt; } WaitForCompletion(g_msgPOP3, POP3_DELE); } else if (lstrcmpi(szCommand, "TOP") == 0) { INT cLines; cmdtype = GetCommandType(&dwPopId); printf("Number of Lines to Preview>"); scanf("%d", &cLines); fflush(stdin); if (FAILED(g_pPOP3->CommandTOP(cmdtype, dwPopId, cLines))) { printf("IPOP3Transport::CommandTOP failed.\n"); goto POP3Prompt; } WaitForCompletion(g_msgPOP3, POP3_TOP); } else if (lstrcmpi(szCommand, "RETR") == 0) { cmdtype = GetCommandType(&dwPopId); if (FAILED(g_pPOP3->CommandRETR(cmdtype, dwPopId))) { printf("IPOP3Transport::CommandRETR failed.\n"); goto POP3Prompt; } WaitForCompletion(g_msgPOP3, POP3_RETR); } else if (lstrcmpi(szCommand, "MARK") == 0) { INT type, popid, flag; POP3MARKTYPE marktype;
printf("(1) - POP3_MARK_FOR_TOP\n"); printf("(2) - POP3_MARK_FOR_RETR\n"); printf("(3) - POP3_MARK_FOR_DELE\n"); printf("(4) - POP3_MARK_FOR_UIDL\n"); printf("(5) - POP3_MARK_FOR_LIST\n"); printf("Select MarkItem Type>"); scanf("%d", &type); fflush(stdin); printf("Enter PopId>"); scanf("%d", &popid); fflush(stdin); printf("Enable or Disable Marked Item (1 = Enable, 0 = Disable)>"); scanf("%d", &flag); fflush(stdin); if (1 == type) marktype = POP3_MARK_FOR_TOP; else if (2 == type) marktype = POP3_MARK_FOR_RETR; else if (3 == type) marktype = POP3_MARK_FOR_DELE; else if (4 == type) marktype = POP3_MARK_FOR_UIDL; else if (5 == type) marktype = POP3_MARK_FOR_LIST; else { printf("Invalid MarkItemType!\n"); goto POP3Prompt; }
if (FAILED(g_pPOP3->MarkItem(marktype, popid, flag))) { printf("IPOP3Transport::MarkItem failed!\n"); goto POP3Prompt; } } else if (lstrcmpi(szCommand, "EXIT") == 0) return; else POP3CommandShellHelp();
// Go back to the prompt
goto POP3Prompt; }
// NNTP Command Help
void NNTPCommandShellHelp(void) { printf("Valid commands:\nACCOUNTS\nCONNECT\nGROUP\nNEXT\nLAST\n" "STAT\nLIST\nMODE\nDATE\nARTICLE\nHEAD\nBODY\nHEADERS\nXHDR\n" "POST\nQUIT\n\n"); }
void NNTPCommandShell(void) { // Locals
INETSERVER rServer; IImnAccount *pAccount=NULL; char szCommand[50];
// Title
printf("Microsoft(R) NNTP Command Shell.\n"); printf("Type ? for help.\n\n");
// Show command
NNTPPrompt: printf("NNTP> "); scanf("%s", szCommand); fflush(stdin);
if (lstrcmpi(szCommand, "ACCOUNTS") == 0) g_pAcctMan->AccountListDialog(GetDesktopWindow(), NULL);
else if (lstrcmpi(szCommand, "CONNECT") == 0) { char szAccount[CCHMAX_ACCOUNT_NAME]; printf("Enter Account Name> "); scanf("%s", szAccount); fflush(stdin);
if (FAILED(g_pAcctMan->FindAccount(AP_ACCOUNT_NAME, szAccount, &pAccount))) { printf("Invalid Account Name: '%s'\n\n", szAccount); goto NNTPPrompt; }
if (FAILED(g_pNNTP->InetServerFromAccount(pAccount, &rServer))) { pAccount->Release(); printf("IInternetTransport::InetServerFromAccount failed\n"); goto NNTPPrompt; }
if (FAILED(g_pNNTP->Connect(&rServer, TRUE, TRUE))) { pAccount->Release(); printf("IInternetTransport::Connect failed\n"); goto NNTPPrompt; }
// Wait for completion
WaitForCompletion(g_msgNNTP, 0);
// Done
pAccount->Release(); } else if (lstrcmpi(szCommand, "QUIT") == 0) { if (FAILED(g_pNNTP->CommandQUIT())) { printf("INNTPTransport::CommandQUIT failed.\n"); goto NNTPPrompt; } WaitForCompletion(g_msgNNTP, NS_DISCONNECTED); } else if (lstrcmpi(szCommand, "AUTHINFO") == 0) { DWORD dwType; char szUserName[256]; char szPassword[256]; NNTPAUTHINFO authinfo;
printf("(1) AUTHINFO USER/PASS\n"); printf("(2) AUTHINFO SIMPLE\n"); printf("(3) AUTHINFO TRANSACT\n"); printf("Select type > "); scanf("%d", &dwType); fflush(stdin);
authinfo.authtype = (dwType == 1) ? AUTHTYPE_USERPASS : ((dwType == 2) ? AUTHTYPE_SIMPLE : AUTHTYPE_SASL); if (dwType < 3) { printf("User Name > "); scanf("%s", &szUserName); fflush(stdin); printf("Password > "); scanf("%s", &szPassword);
authinfo.pszUser = szUserName; authinfo.pszPass = szPassword; }
if (FAILED(g_pNNTP->CommandAUTHINFO(&authinfo))) { printf("INNTPTransport::CommandAUTHINFO() failed\n"); goto NNTPPrompt; } WaitForCompletion(g_msgNNTP, 0); } else if (lstrcmpi(szCommand, "GROUP") == 0) { char szGroup[256]; printf("Enter Group Name> "); scanf("%s", szGroup); fflush(stdin);
if (FAILED(g_pNNTP->CommandGROUP(szGroup))) { printf("INNTPTransport::CommandGROUP failed.\n"); goto NNTPPrompt; } WaitForCompletion(g_msgNNTP, NS_GROUP); } else if (lstrcmpi(szCommand, "NEXT") == 0) { if (FAILED(g_pNNTP->CommandNEXT())) { printf("INNTPTransport::CommandNEXT failed.\n"); goto NNTPPrompt; } WaitForCompletion(g_msgNNTP, NS_NEXT); } else if (lstrcmpi(szCommand, "LAST") == 0) { if (FAILED(g_pNNTP->CommandLAST())) { printf("INNTPTransport::CommandLAST failed.\n"); goto NNTPPrompt; } WaitForCompletion(g_msgNNTP, NS_LAST); } else if (lstrcmpi(szCommand, "STAT") == 0) { char szStat[256]; ARTICLEID aid;
ZeroMemory(szStat, sizeof(szStat)); ZeroMemory(&aid, sizeof(aid));
printf("Enter article> "); scanf("%s", szStat); fflush(stdin);
if (0 == sscanf(szStat, "%d", &aid.dwArticleNum)) { aid.idType = AID_MSGID; aid.pszMessageId = szStat; } else aid.idType = AID_ARTICLENUM;
if (FAILED(g_pNNTP->CommandSTAT(*szStat ? &aid : NULL))) { printf("INNTPTransport::CommandSTAT failed.\n"); goto NNTPPrompt; } WaitForCompletion(g_msgNNTP, NS_STAT); } else if (lstrcmpi(szCommand, "LIST") == 0) { if (FAILED(g_pNNTP->CommandLIST(NULL))) { printf("INNTPTransport::CommandLIST failed.\n"); goto NNTPPrompt; } WaitForCompletion(g_msgNNTP, 0); } else if (lstrcmpi(szCommand, "LISTGROUP") == 0) { char szGroup[256]; printf("Enter Group Name> "); scanf("%s", szGroup); fflush(stdin);
if (FAILED(g_pNNTP->CommandLISTGROUP(szGroup))) { printf("INNTPTransport::CommandLISTGROUP failed.\n"); goto NNTPPrompt; } WaitForCompletion(g_msgNNTP, 0); } else if (lstrcmpi(szCommand, "LISTARG") == 0) { char szArg[256]; ZeroMemory(szArg, 256);
printf("Enter Arguments> "); scanf("%s", szArg); fflush(stdin);
if (FAILED(g_pNNTP->CommandLIST(szArg))) { printf("INNTPTransport::CommandLIST failed.\n"); goto NNTPPrompt; } WaitForCompletion(g_msgNNTP, 0); } else if (lstrcmpi(szCommand, "DATE") == 0) { if (FAILED(g_pNNTP->CommandDATE())) { printf("INNTPTransport::CommandDATE failed.\n"); goto NNTPPrompt; } WaitForCompletion(g_msgNNTP, NS_DATE); } else if (lstrcmpi(szCommand, "MODE") == 0) { char szArg[256]; ZeroMemory(szArg, 256);
printf("Enter Arguments> "); scanf("%s", szArg); fflush(stdin);
if (FAILED(g_pNNTP->CommandMODE(szArg))) { printf("INNTPTransport::CommandMODE failed.\n"); goto NNTPPrompt; } WaitForCompletion(g_msgNNTP, NS_MODE); } else if (lstrcmpi(szCommand, "NEWGROUPS") == 0) { SYSTEMTIME st = {1996, 11, 0, 1, 0, 0, 0, 0};
if (FAILED(g_pNNTP->CommandNEWGROUPS(&st, "<alt>"))) { printf("INNTPTransport::CommandNEWGROUPS failed.\n"); goto NNTPPrompt; } WaitForCompletion(g_msgNNTP, 0); } else if (lstrcmpi(szCommand, "ARTICLE") == 0) { char szArg[256]; ARTICLEID aid; ZeroMemory(szArg, 256);
printf("Enter article number> "); scanf("%s", szArg); fflush(stdin);
if (0 == sscanf(szArg, "%d", &aid.dwArticleNum)) { aid.idType = AID_MSGID; aid.pszMessageId = szArg; } else aid.idType = AID_ARTICLENUM;
if (FAILED(g_pNNTP->CommandARTICLE(&aid))) { printf("INNTPTransport::CommandARTICLE failed.\n"); goto NNTPPrompt; } WaitForCompletion(g_msgNNTP, 0); } else if (lstrcmpi(szCommand, "HEAD") == 0) { char szArg[256]; ARTICLEID aid; ZeroMemory(szArg, 256);
printf("Enter article number> "); scanf("%s", szArg); fflush(stdin);
if (0 == sscanf(szArg, "%d", &aid.dwArticleNum)) { aid.idType = AID_MSGID; aid.pszMessageId = szArg; } else aid.idType = AID_ARTICLENUM;
if (FAILED(g_pNNTP->CommandHEAD(&aid))) { printf("INNTPTransport::CommandHEAD failed.\n"); goto NNTPPrompt; } WaitForCompletion(g_msgNNTP, 0); } else if (lstrcmpi(szCommand, "BODY") == 0) { char szArg[256]; ARTICLEID aid; ZeroMemory(szArg, 256);
printf("Enter article number> "); scanf("%s", szArg); fflush(stdin);
if (0 == sscanf(szArg, "%d", &aid.dwArticleNum)) { aid.idType = AID_MSGID; aid.pszMessageId = szArg; } else aid.idType = AID_ARTICLENUM;
if (FAILED(g_pNNTP->CommandBODY(&aid))) { printf("INNTPTransport::CommandBODY failed.\n"); goto NNTPPrompt; } WaitForCompletion(g_msgNNTP, 0); } else if (lstrcmpi(szCommand, "HEADERS") == 0) { char szArg1[30], szArg2[30]; RANGE range; printf("Enter starting article number> "); scanf("%s", szArg1); fflush(stdin);
printf("Enter ending article number (0 for a single article)> "); scanf("%s", szArg2); fflush(stdin);
range.idType = (atol(szArg2) == 0 ? RT_SINGLE : RT_RANGE); range.dwFirst = atol(szArg1); range.dwLast = atol(szArg2);
if (FAILED(g_pNNTP->GetHeaders(&range))) { printf("INNTPTransport::GetHeaders() failed.\n"); goto NNTPPrompt; } WaitForCompletion(g_msgNNTP, 0); } else if (lstrcmpi(szCommand, "XHDR") == 0) { char szHdr[256]; char szArg1[30], szArg2[30]; RANGE range; HRESULT hr;
// I tested this scenario as well -- SteveSer
// hr = g_pNNTP->CommandXHDR("Subject", NULL, "<01bb9b7a$7767b020$ff22369d@a-dmay>");
printf("Enter header> "); scanf("%s", szHdr); printf("Enter starting article number (0 for the current article)> "); scanf("%s", szArg1); fflush(stdin);
if (atol(szArg1) != 0) { printf("Enter ending article number (0 for a single article)> "); scanf("%s", szArg2); fflush(stdin); }
if (atol(szArg1) == 0) hr = g_pNNTP->CommandXHDR(szHdr, NULL, NULL); else { range.idType = (atol(szArg2) == 0 ? RT_SINGLE : RT_RANGE); range.dwFirst = atol(szArg1); range.dwLast = atol(szArg2); hr = g_pNNTP->CommandXHDR(szHdr, &range, NULL); }
if (FAILED(hr)) { printf("INNTPTransport::CommandXHDR() failed.\n"); goto NNTPPrompt; } WaitForCompletion(g_msgNNTP, 0); } else if (lstrcmpi(szCommand, "POST") == 0) { char szMessage[] = "From: \"Steve Serdy\" <[email protected]>\r\n" "Newsgroups: alt.test\r\n" "Subject: Test Message\r\n" "\r\nTest\r\n"; NNTPMESSAGE rMessage; LPSTREAM pStream = 0; HRESULT hr; if (SUCCEEDED(CreateStreamOnHGlobal(NULL, TRUE, &pStream))) { pStream->Write((void const*) szMessage, lstrlen(szMessage) + 1, NULL);
rMessage.cbSize = lstrlen(szMessage); rMessage.pstmMsg = pStream; hr = g_pNNTP->CommandPOST(&rMessage); pStream->Release();
if (FAILED(hr)) { printf("INNTPTransport::CommandPOST() failed.\n"); goto NNTPPrompt; } WaitForCompletion(g_msgNNTP, 0); } } else if (lstrcmpi(szCommand, "EXIT") == 0) return; else NNTPCommandShellHelp();
// Go back to the prompt
goto NNTPPrompt; }
void IMAPCommandShell(void) { printf("Not yet implemented.\n\n"); }
void RASCommandShellHelp(void) { printf("Valid commands:\nCONNECT\nDISCONNECT\nEXIT\n\n"); }
void RASCommandShell(void) { char szCommand[50]; IImnAccount *pAccount=NULL; INETSERVER rServer;
// Title
printf("Microsoft(R) RAS Command Shell.\n"); printf("Type ? for help.\n\n");
// Show command
RASPrompt: printf("RAS>"); scanf("%s", szCommand); fflush(stdin);
if (lstrcmpi(szCommand, "CONNECT") == 0) { char szAccount[CCHMAX_ACCOUNT_NAME]; printf("Enter Account Name>"); scanf("%s", szAccount); fflush(stdin);
if (FAILED(g_pAcctMan->FindAccount(AP_ACCOUNT_NAME, szAccount, &pAccount))) { printf("Invalid Account Name: '%s'\n\n", szAccount); goto RASPrompt; }
if (FAILED(g_pPOP3->InetServerFromAccount(pAccount, &rServer))) { pAccount->Release(); printf("IInternetTransport::InetServerFromAccount failed\n"); goto RASPrompt; }
if (RAS_CONNECT_RAS != rServer.rasconntype) { pAccount->Release(); printf("Account is not using RAS.\n"); goto RASPrompt; }
if (FAILED(g_pRAS->Connect(&rServer, TRUE, TRUE))) { pAccount->Release(); printf("IInternetTransport::Connect failed\n"); goto RASPrompt; }
// Wait for completion
WaitForCompletion(g_msgRAS, RAS_CONNECT);
// Done
pAccount->Release(); } else if (lstrcmpi(szCommand, "DISCONNECT") == 0) { g_pRAS->Disconnect(); } else if (lstrcmpi(szCommand, "EXIT") == 0) return; else RASCommandShellHelp();
// Go back to the prompt
goto RASPrompt; }
void HTTPMailCommandShellHelp(void) { printf("Valid commands:\nCONNECT\nDISCONNECT\nGET\nGETROOTPROP\nLISTFOLDERS\nPUT\nPROPFIND\nEXIT\n\n"); }
void HTTPMailCommandShell(void) { INETSERVER rServer; char szCommand[50]; // Title
printf("Microsoft(R) HTTPMail Command Shell.\n"); printf("Type ? for help.\n\n");
HTTPMailPrompt: printf("HTTPMail> "); scanf("%s", szCommand); fflush(stdin);
if (lstrcmpi(szCommand, "CONNECT") == 0) { ZeroMemory(&rServer, sizeof(rServer)); printf("Enter server> "); scanf("%s", rServer.szServerName); fflush(stdin);
printf("Enter login ('*' for anonymous)> "); scanf("%s", rServer.szUserName); fflush(stdin); if ('*' == rServer.szUserName[0]) rServer.szUserName[0] = '\0'; else { printf("Enter password> "); scanf("%s", rServer.szPassword); }
if (FAILED(g_pHTTPMail->Connect(&rServer, FALSE, TRUE))) { printf("IHTTMPMailTransport::Connect failed\n"); goto HTTPMailPrompt; } WaitForCompletion(g_msgHTTPMail, HTTPMAIL_CONNECTED); goto HTTPMailPrompt; } else if (lstrcmpi(szCommand, "GET") == 0) { char szPath[1024]; printf("Enter path ('/' for root)> "); scanf("%s", szPath); fflush(stdin);
g_pHTTPMail->CommandGET(szPath, 0); WaitForCompletion(g_msgHTTPMail, HTTPMAIL_GET); goto HTTPMailPrompt; } else if (lstrcmpi(szCommand, "GETROOTPROP") == 0) { int iSelection; HTTPMAILROOTPROPTYPE proptype;
printf("Select a property to retrieve:\n"); printf("\t(1) Adbar\n\t(2) Contacts\n\t(3) Inbox\n\t(4) Outbox\n\t(5) SentItems"); printf("\n\t(6) DeletedItems\n\t(7) Drafts\n\t(8) MsgFolderRoot\n\t(9) Sig"); printf("\nSelection> "); scanf("%d", &iSelection); fflush(stdin);
if (iSelection < 1 || iSelection > 9) { printf("Invalid Selection\n"); goto HTTPMailPrompt; }
HTTPMAILROOTPROPTYPE rgProps[] = { HTTPMAIL_ROOTPROP_ADBAR, HTTPMAIL_ROOTPROP_CONTACTS, HTTPMAIL_ROOTPROP_INBOX, HTTPMAIL_ROOTPROP_OUTBOX, HTTPMAIL_ROOTPROP_SENTITEMS, HTTPMAIL_ROOTPROP_DELETEDITEMS, HTTPMAIL_ROOTPROP_DRAFTS, HTTPMAIL_ROOTPROP_MSGFOLDERROOT, HTTPMAIL_ROOTPROP_SIG }; LPSTR pszProp = NULL; if (SUCCEEDED(g_pHTTPMail->GetRootProperty(rgProps[iSelection - 1], &pszProp))) { if (pszProp) printf("Result: %s\n", pszProp); } goto HTTPMailPrompt; } else if (lstrcmpi(szCommand, "LISTFOLDERS") == 0) { g_pHTTPMail->ListFolders(0); WaitForCompletion(g_msgHTTPMail, HTTPMAIL_LISTFOLDERS); } else if (lstrcmpi(szCommand, "PUT") == 0) { char szPath[1024]; char *lpszData = "Outlook Express PUT test"; printf("Enter path ('/' for root)> "); scanf("%s", szPath); fflush(stdin);
g_pHTTPMail->CommandPUT(szPath, lpszData, strlen(lpszData), 0); } else if (lstrcmpi(szCommand, "POST") == 0) { char szPath[1024]; char *lpszData = "Outlook Express POST test"; printf("Enter path ('/' for root)> "); scanf("%s", szPath); fflush(stdin);
g_pHTTPMail->CommandPOST(szPath, lpszData, strlen(lpszData), 0);
} else if (lstrcmpi(szCommand, "PROPFIND") == 0) { char szPath[1024];
printf("Enter path ('/' for root)> "); scanf("%s", szPath); fflush(stdin);
g_pHTTPMail->CommandPROPFIND(szPath, NULL, 0, 0); WaitForCompletion(g_msgHTTPMail, HTTPMAIL_PROPFIND); goto HTTPMailPrompt; } else if (lstrcmpi(szCommand, "DISCONNECT") == 0) { g_pHTTPMail->Disconnect(); } else if (lstrcmpi(szCommand, "EXIT") == 0) return; else HTTPMailCommandShellHelp();
// Go back to the prompt
goto HTTPMailPrompt; }
void WaitForCompletion(UINT uiMsg, DWORD wparam) { MSG msg; while(GetMessage(&msg, NULL, 0, 0)) { if (msg.message == uiMsg && msg.wParam == wparam || msg.wParam == IXP_DISCONNECTED) break; TranslateMessage(&msg); DispatchMessage(&msg); } }
|