Files
Work/smtp/SCRAPS.TXT
2024-08-07 09:16:27 -04:00

1159 lines
40 KiB
Plaintext

if(pCurrNode==mlpRootNode)
{
if(!pCurrNode->leftNode()&&!pCurrNode->rightNode())
{
delete mlpRootNode;
mlpRootNode=0;
leaves(leaves()-1);
}
else if(!pCurrNode->rightNode())
{
if(pParentNode->leftNode()==pCurrNode)pParentNode->leftNode(pCurrNode->leftNode());
else pParentNode->rightNode(pCurrNode->leftNode());
}
else if(!pCurrNode->leftNode())
{
if(pParentNode->leftNode()==pCurrNode)pParentNode->leftNode(pCurrNode->leftNode());
else pParentNode->rightNode(pCurrNode->leftNode());
}
else
{
TreeNode<T> *pCursorNode;
pTmpNode=pCursorNode=pCurrNode->leftNode();
while(pTmpNode->rightNode()){pCursorNode=pTmpNode;pTmpNode=pTmpNode->rightNode();}
if(pCursorNode)pCursorNode->rightNode(0);
if(pParentNode->leftNode()==pCurrNode)pParentNode->leftNode(pTmpNode);
else pParentNode->rightNode(pTmpNode);
}
delete pCurrNode;
leaves(leaves()-1);
// else
// {
// pTmpNode=(pCurrNode->leftNode()?pCurrNode->leftNode():pCurrNode->rightNode());
// delete mlpRootNode;
// mlpRootNode=pTmpNode;
// leaves(leaves()-1);
// }
}
else
{
#if 0
#include <http/main.hpp>
#include <common/string.hpp>
#include <common/console.hpp>
#include <common/openfile.hpp>
#include <common/filemap.hpp>
#include <common/pview.hpp>
#include <common/profile.hpp>
#include <socket/hostent.hpp>
#include <socket/servent.hpp>
#include <socket/intsaddr.hpp>
#include <socket/socket.hpp>
HINSTANCE Main::smhInstance=0;
HINSTANCE Main::smhPrevInstance=0;
int Main::smnCmdShow=0;
WORD open(void);
void writeLines(Block<String> &stringBlock);
void saveLines(Block<String> &stringBlock,const String &saveName);
Console winConsole;
int PASCAL WinMain(HINSTANCE /*hInstance*/,HINSTANCE /*hPrevInstance*/,LPSTR /*lpszCmdLine*/,int /*nCmdShow*/)
{
open();
winConsole.read();
return FALSE;
}
void writeLines(Block<String> &stringBlock)
{
for(short itemIndex=0;itemIndex<stringBlock.size();itemIndex++)
winConsole.writeLine(stringBlock[itemIndex]);
}
void saveLines(Block<String> &stringBlock,const String &saveName)
{
FileHandle saveFile(saveName,FileHandle::Write,FileHandle::ShareNone,FileHandle::Overwrite);
for(short itemIndex=0;itemIndex<stringBlock.size();itemIndex++)
{
saveFile.write(stringBlock[itemIndex]);
saveFile.write(String("\n"));
}
}
WORD open(void)
{
String hostName;
String getRequest;
HostEnt hostEntry;
ServEnt serverEntry;
WSASystem wsaSystem;
Socket smtpControl;
INETSocketAddress internetSocketAddress;
Profile iniProfile("QUOTE.INI","UNSET");
hostName="hannibal";
winConsole.writeLine(String("trying ")+hostName+String("..."));
if(!wsaSystem.isInitialized()){winConsole.writeLine("WINSOCK initialization failure.");return FALSE;}
InternetAddress internetAddress(hostName);
if(!internetAddress.isZero()){if(!hostEntry.hostByAddress(internetAddress)){return FALSE;}}
else if(!hostEntry.hostByName(hostName)){return FALSE;}
if(!internetAddress.isZero()){if(!hostEntry.hostByAddress(internetAddress)){winConsole.writeLine(String("no DNS entry for ")+hostName);return FALSE;}}
else if(!hostEntry.hostByName(hostName)){winConsole.writeLine(String("no DNS entry for ")+hostName);return FALSE;}
winConsole.writeLine(String("connect...")+String("'")+hostEntry.hostName()+String("' (")+(String)(hostEntry.addresses())[0]+String(")"));
internetSocketAddress.internetAddress((hostEntry.addresses())[0]);
if(serverEntry.serviceByName("smtp","tcp"))
{
if(!smtpControl.openSocket()){winConsole.writeLine("unable to create socket.");return FALSE;}
internetSocketAddress.family(PF_INET);
internetSocketAddress.port(serverEntry.port());
}
else
{
if(!smtpControl.openSocket()){winConsole.writeLine("unable to create socket.");return FALSE;}
internetSocketAddress.family(PF_INET);
internetSocketAddress.port(htons(23));
}
if(!smtpControl.connect(internetSocketAddress)){winConsole.writeLine("unable to connect to pop daemon");return FALSE;}
smtpControl.getSocketName(internetSocketAddress);
Block<String> receiveStrings;
smtpControl.receive(receiveStrings);
for(int lineIndex=0;lineIndex<receiveStrings.size();lineIndex++)winConsole.writeLine(receiveStrings[lineIndex]);
smtpControl.send("HELO kesslers2@moodys.com");
smtpControl.receive(receiveStrings);
for(lineIndex=0;lineIndex<receiveStrings.size();lineIndex++)winConsole.writeLine(receiveStrings[lineIndex]);
return smtpControl.isConnected();
}
#endif#include <smtp/smtp.hpp>
#include <socket/hostent.hpp>
#include <socket/servent.hpp>
SMTPClient::SMTPClient(void)
{
mSMTPResponse.isInResponse("251",SMTPResponse::AckConnect);
createCmds();
createResponseStrings();
}
SMTPClient::~SMTPClient()
{
mWinConsole.read();
}
BOOL SMTPClient::open(const String &hostName)
{
HostEnt hostEntry;
ServEnt serverEntry;
Block<String> responseLines;
INETSocketAddress internetSocketAddress;
if(hostName.isNull())return FALSE;
if(mSMTPControl.isConnected())mSMTPControl.closeSocket();
message(String("trying ")+hostName+String("..."));
if(!mWSASystem.isInitialized()){message("WINSOCK initialization failure.");return FALSE;}
InternetAddress internetAddress(hostName);
if(!internetAddress.isZero()){if(!hostEntry.hostByAddress(internetAddress)){return FALSE;}}
else if(!hostEntry.hostByName(hostName)){return FALSE;}
if(!internetAddress.isZero()){if(!hostEntry.hostByAddress(internetAddress)){message(String("no DNS entry for ")+hostName);return FALSE;}}
else if(!hostEntry.hostByName(hostName)){message(String("no DNS entry for ")+hostName);return FALSE;}
message(String("connect...")+String("'")+hostEntry.hostName()+String("' (")+(String)(hostEntry.addresses())[0]+String(")"));
internetSocketAddress.internetAddress((hostEntry.addresses())[0]);
if(serverEntry.serviceByName("smtp","tcp"))
{
if(!mSMTPControl.openSocket()){message("unable to create socket.");return FALSE;}
internetSocketAddress.family(PF_INET);
internetSocketAddress.port(serverEntry.port());
}
else
{
if(!mSMTPControl.openSocket()){message("unable to create socket.");return FALSE;}
internetSocketAddress.family(PF_INET);
internetSocketAddress.port(htons(SMTPPort));
}
if(!mSMTPControl.connect(internetSocketAddress)){message("unable to connect to smtp server");return FALSE;}
mSMTPControl.getSocketName(internetSocketAddress);
if(!mSMTPControl.isConnected())return FALSE;
if(!mSMTPControl.receive(responseLines)||!responseLines.size()||!isInResponse(responseLines.size()>1?responseLines[0].betweenString(0,'-'):responseLines[0].betweenString(0,' '),mAckConnectResponseStrings))
{
mSMTPControl.closeSocket();
return FALSE;
}
return TRUE;
}
BOOL SMTPClient::helo(const String &domainName)
{
String controlData;
Block<String> responseLines;
if(!mSMTPControl.isConnected()||domainName.isNull())return FALSE;
controlData=mSMTPCmds[Helo];
controlData+=" ";
controlData+=domainName;
if(!putControlData(controlData,FALSE))return FALSE;
if(!mSMTPControl.receive(responseLines))return FALSE;
message(responseLines);
if(!responseLines.size()||!isInResponse(responseLines.size()>1?responseLines[0].betweenString(0,'-'):responseLines[0].betweenString(0,' '),mAckHeloResponseStrings))return FALSE;
return TRUE;
}
BOOL SMTPClient::quit(void)
{
String controlData;
Block<String> responseLines;
if(!mSMTPControl.isConnected())return FALSE;
controlData=mSMTPCmds[Quit];
if(!putControlData(controlData,FALSE))return FALSE;
if(!mSMTPControl.receive(responseLines))return FALSE;
message(responseLines);
if(!responseLines.size()||!isInResponse(responseLines.size()>1?responseLines[0].betweenString(0,'-'):responseLines[0].betweenString(0,' '),mAckQuitResponseStrings))return FALSE;
return TRUE;
}
BOOL SMTPClient::mail(const String &reversePath)
{
String controlData;
Block<String> responseLines;
if(!mSMTPControl.isConnected()||reversePath.isNull())return FALSE;
controlData=mSMTPCmds[Mail];
controlData+=" ";
controlData+=mSMTPCmds[From];
controlData+=reversePath;
if(!putControlData(controlData,FALSE))return FALSE;
if(!mSMTPControl.receive(responseLines))return FALSE;
message(responseLines);
if(!responseLines.size()||!isInResponse(responseLines.size()>1?responseLines[0].betweenString(0,'-'):responseLines[0].betweenString(0,' '),mAckMailResponseStrings))return FALSE;
return TRUE;
}
BOOL SMTPClient::rcpt(const String &forwardPath)
{
String controlData;
Block<String> responseLines;
if(!mSMTPControl.isConnected()||forwardPath.isNull())return FALSE;
controlData=mSMTPCmds[Recipient];
controlData+=" ";
controlData+=mSMTPCmds[To];
controlData+=forwardPath;
if(!putControlData(controlData,FALSE))return FALSE;
if(!mSMTPControl.receive(responseLines))return FALSE;
message(responseLines);
if(!responseLines.size()||!isInResponse(responseLines.size()>1?responseLines[0].betweenString(0,'-'):responseLines[0].betweenString(0,' '),mAckRecipientResponseStrings))return FALSE;
return TRUE;
}
BOOL SMTPClient::data(const Block<String> &mailData)
{
String controlData;
Block<String> responseLines;
if(!mSMTPControl.isConnected()||!mailData.size())return FALSE;
controlData=mSMTPCmds[Data];
if(!putControlData(controlData,FALSE))return FALSE;
if(!mSMTPControl.receive(responseLines))return FALSE;
message(responseLines);
if(!responseLines.size()||!isInResponse(responseLines.size()>1?responseLines[0].betweenString(0,'-'):responseLines[0].betweenString(0,' '),mAckDataResponseStrings))return FALSE;
for(int lineIndex=0;lineIndex<mailData.size();lineIndex++)mSMTPControl.send(((Block<String>&)mailData)[lineIndex]);
mSMTPControl.send(".");
if(!mSMTPControl.receive(responseLines))return FALSE;
if(!responseLines.size()||!isInResponse(responseLines.size()>1?responseLines[0].betweenString(0,'-'):responseLines[0].betweenString(0,' '),mAckDataResponseStrings))return FALSE;
return TRUE;
}
BOOL SMTPClient::vrfy(const String &forwardPath)
{
String controlData;
Block<String> responseLines;
if(!mSMTPControl.isConnected()||forwardPath.isNull())return FALSE;
controlData=mSMTPCmds[Verify];
controlData+=" ";
controlData+=forwardPath;
if(!putControlData(controlData,FALSE))return FALSE;
if(!mSMTPControl.receive(responseLines))return FALSE;
message(responseLines);
if(!responseLines.size()||!isInResponse(responseLines.size()>1?responseLines[0].betweenString(0,'-'):responseLines[0].betweenString(0,' '),mAckVerifyResponseStrings))return FALSE;
return TRUE;
}
BOOL SMTPClient::isInResponse(const String &responseString,Block<String> &responseStrings)
{
if(responseString.isNull())return FALSE;
for(int itemIndex=0;itemIndex<responseStrings.size();itemIndex++)
if(responseString==responseStrings[itemIndex])return TRUE;
return FALSE;
}
void SMTPClient::createCmds(void)
{
mSMTPCmds.remove();
mSMTPCmds.insert(&String("HELO"));
mSMTPCmds.insert(&String("QUIT"));
mSMTPCmds.insert(&String("MAIL"));
mSMTPCmds.insert(&String("FROM:"));
mSMTPCmds.insert(&String("RCPT"));
mSMTPCmds.insert(&String("TO:"));
mSMTPCmds.insert(&String("DATA"));
mSMTPCmds.insert(&String("VRFY"));
mSMTPCmds.insert(&String("EXPN"));
mSMTPCmds.insert(&String("SEND"));
mSMTPCmds.insert(&String("SOML"));
mSMTPCmds.insert(&String("SAML"));
mSMTPCmds.insert(&String("TURN"));
mSMTPCmds.insert(&String("RSET"));
mSMTPCmds.insert(&String("HELP"));
mSMTPCmds.insert(&String("NOOP"));
}
void SMTPClient::createResponseStrings(void)
{
mAckConnectResponseStrings.insert(&String("220"));
mNakConnectResponseStrings.insert(&String("421"));
mAckHeloResponseStrings.insert(&String("250"));
mNakHeloResponseStrings.insert(&String("500"));
mNakHeloResponseStrings.insert(&String("501"));
mNakHeloResponseStrings.insert(&String("504"));
mNakHeloResponseStrings.insert(&String("421"));
mAckMailResponseStrings.insert(&String("250"));
mNakMailResponseStrings.insert(&String("552"));
mNakMailResponseStrings.insert(&String("451"));
mNakMailResponseStrings.insert(&String("452"));
mNakMailResponseStrings.insert(&String("500"));
mNakMailResponseStrings.insert(&String("501"));
mNakMailResponseStrings.insert(&String("421"));
mAckRecipientResponseStrings.insert(&String("250"));
mAckRecipientResponseStrings.insert(&String("251"));
mNakRecipientResponseStrings.insert(&String("550"));
mNakRecipientResponseStrings.insert(&String("551"));
mNakRecipientResponseStrings.insert(&String("552"));
mNakRecipientResponseStrings.insert(&String("553"));
mNakRecipientResponseStrings.insert(&String("450"));
mNakRecipientResponseStrings.insert(&String("451"));
mNakRecipientResponseStrings.insert(&String("452"));
mNakRecipientResponseStrings.insert(&String("500"));
mNakRecipientResponseStrings.insert(&String("501"));
mNakRecipientResponseStrings.insert(&String("503"));
mNakRecipientResponseStrings.insert(&String("421"));
mAckDataResponseStrings.insert(&String("354"));
mAckDataResponseStrings.insert(&String("250"));
mNakDataResponseStrings.insert(&String("552"));
mNakDataResponseStrings.insert(&String("554"));
mNakDataResponseStrings.insert(&String("451"));
mNakDataResponseStrings.insert(&String("452"));
mNakDataResponseStrings.insert(&String("451"));
mNakDataResponseStrings.insert(&String("554"));
mNakDataResponseStrings.insert(&String("500"));
mNakDataResponseStrings.insert(&String("501"));
mNakDataResponseStrings.insert(&String("503"));
mNakDataResponseStrings.insert(&String("421"));
mAckResetResponseStrings.insert(&String("250"));
mNakResetResponseStrings.insert(&String("500"));
mNakResetResponseStrings.insert(&String("501"));
mNakResetResponseStrings.insert(&String("504"));
mNakResetResponseStrings.insert(&String("421"));
mAckSendResponseStrings.insert(&String("250"));
mNakSendResponseStrings.insert(&String("552"));
mNakSendResponseStrings.insert(&String("451"));
mNakSendResponseStrings.insert(&String("452"));
mNakSendResponseStrings.insert(&String("500"));
mNakSendResponseStrings.insert(&String("501"));
mNakSendResponseStrings.insert(&String("502"));
mNakSendResponseStrings.insert(&String("421"));
mAckSendOrMailResponseStrings.insert(&String("250"));
mNakSendOrMailResponseStrings.insert(&String("552"));
mNakSendOrMailResponseStrings.insert(&String("451"));
mNakSendOrMailResponseStrings.insert(&String("452"));
mNakSendOrMailResponseStrings.insert(&String("500"));
mNakSendOrMailResponseStrings.insert(&String("501"));
mNakSendOrMailResponseStrings.insert(&String("502"));
mNakSendOrMailResponseStrings.insert(&String("421"));
mAckSendAndMailResponseStrings.insert(&String("250"));
mNakSendAndMailResponseStrings.insert(&String("552"));
mNakSendAndMailResponseStrings.insert(&String("451"));
mNakSendAndMailResponseStrings.insert(&String("452"));
mNakSendAndMailResponseStrings.insert(&String("500"));
mNakSendAndMailResponseStrings.insert(&String("501"));
mNakSendAndMailResponseStrings.insert(&String("502"));
mNakSendAndMailResponseStrings.insert(&String("421"));
mAckVerifyResponseStrings.insert(&String("250"));
mAckVerifyResponseStrings.insert(&String("251"));
mNakVerifyResponseStrings.insert(&String("550"));
mNakVerifyResponseStrings.insert(&String("551"));
mNakVerifyResponseStrings.insert(&String("553"));
mNakVerifyResponseStrings.insert(&String("500"));
mNakVerifyResponseStrings.insert(&String("501"));
mNakVerifyResponseStrings.insert(&String("502"));
mNakVerifyResponseStrings.insert(&String("504"));
mNakVerifyResponseStrings.insert(&String("421"));
mAckExpandResponseStrings.insert(&String("250"));
mNakExpandResponseStrings.insert(&String("550"));
mNakExpandResponseStrings.insert(&String("500"));
mNakExpandResponseStrings.insert(&String("501"));
mNakExpandResponseStrings.insert(&String("502"));
mNakExpandResponseStrings.insert(&String("504"));
mNakExpandResponseStrings.insert(&String("421"));
mAckHelpResponseStrings.insert(&String("211"));
mAckHelpResponseStrings.insert(&String("214"));
mNakHelpResponseStrings.insert(&String("500"));
mNakHelpResponseStrings.insert(&String("501"));
mNakHelpResponseStrings.insert(&String("502"));
mNakHelpResponseStrings.insert(&String("504"));
mNakHelpResponseStrings.insert(&String("421"));
mAckNoopResponseStrings.insert(&String("250"));
mNakNoopResponseStrings.insert(&String("500"));
mNakNoopResponseStrings.insert(&String("421"));
mAckTurnResponseStrings.insert(&String("250"));
mNakTurnResponseStrings.insert(&String("502"));
mNakTurnResponseStrings.insert(&String("500"));
mNakTurnResponseStrings.insert(&String("503"));
mAckQuitResponseStrings.insert(&String("221"));
mNakQuitResponseStrings.insert(&String("500"));
}
WORD SMTPClient::putControlData(const String &stringData,WORD waitForResponse)
{
if(!mSMTPControl.isConnected())return FALSE;
if(!mSMTPControl.send(stringData))
{
mSMTPControl.closeSocket();
String errorString(String("error sending '")+stringData+String("' to SMTP server."));
message(errorString);
errorString+="\n";
::OutputDebugString(errorString);
return FALSE;
}
if(waitForResponse&&!getControlData())
{
mSMTPControl.closeSocket();
String errorString(String("error reading result of '")+stringData+String("' command from NNTP server."));
message(errorString);
errorString+="\n";
::OutputDebugString(errorString);
return FALSE;
}
return TRUE;
}
WORD SMTPClient::getControlData(void)
{
Block<String> responseStrings;
mSMTPControl.receive(responseStrings);
return responseStrings.size();
}
// virtuals
void SMTPClient::message(const String &messageString)
{
mWinConsole.writeLine(messageString);
}
void SMTPClient::message(Block<String> &messageStrings)
{
for(int lineIndex=0;lineIndex<messageStrings.size();lineIndex++)
mWinConsole.writeLine(messageStrings[lineIndex]);
}
Block<String> mAckConnectResponseStrings;
Block<String> mNakConnectResponseStrings;
Block<String> mAckHeloResponseStrings;
Block<String> mNakHeloResponseStrings;
Block<String> mAckMailResponseStrings;
Block<String> mNakMailResponseStrings;
Block<String> mAckRecipientResponseStrings;
Block<String> mNakRecipientResponseStrings;
Block<String> mAckDataResponseStrings;
Block<String> mNakDataResponseStrings;
Block<String> mAckResetResponseStrings;
Block<String> mNakResetResponseStrings;
Block<String> mAckSendResponseStrings;
Block<String> mNakSendResponseStrings;
Block<String> mAckSendOrMailResponseStrings;
Block<String> mNakSendOrMailResponseStrings;
Block<String> mAckSendAndMailResponseStrings;
Block<String> mNakSendAndMailResponseStrings;
Block<String> mAckVerifyResponseStrings;
Block<String> mNakVerifyResponseStrings;
Block<String> mAckExpandResponseStrings;
Block<String> mNakExpandResponseStrings;
Block<String> mAckHelpResponseStrings;
Block<String> mNakHelpResponseStrings;
Block<String> mAckNoopResponseStrings;
Block<String> mNakNoopResponseStrings;
Block<String> mAckTurnResponseStrings;
Block<String> mNakTurnResponseStrings;
Block<String> mAckQuitResponseStrings;
Block<String> mNakQuitResponseStrings;
void SMTPClient::createResponseStrings(void)
{
mAckConnectResponseStrings.insert(&String("220"));
mNakConnectResponseStrings.insert(&String("421"));
mAckHeloResponseStrings.insert(&String("250"));
mNakHeloResponseStrings.insert(&String("500"));
mNakHeloResponseStrings.insert(&String("501"));
mNakHeloResponseStrings.insert(&String("504"));
mNakHeloResponseStrings.insert(&String("421"));
mAckMailResponseStrings.insert(&String("250"));
mNakMailResponseStrings.insert(&String("552"));
mNakMailResponseStrings.insert(&String("451"));
mNakMailResponseStrings.insert(&String("452"));
mNakMailResponseStrings.insert(&String("500"));
mNakMailResponseStrings.insert(&String("501"));
mNakMailResponseStrings.insert(&String("421"));
mAckRecipientResponseStrings.insert(&String("250"));
mAckRecipientResponseStrings.insert(&String("251"));
mNakRecipientResponseStrings.insert(&String("550"));
mNakRecipientResponseStrings.insert(&String("551"));
mNakRecipientResponseStrings.insert(&String("552"));
mNakRecipientResponseStrings.insert(&String("553"));
mNakRecipientResponseStrings.insert(&String("450"));
mNakRecipientResponseStrings.insert(&String("451"));
mNakRecipientResponseStrings.insert(&String("452"));
mNakRecipientResponseStrings.insert(&String("500"));
mNakRecipientResponseStrings.insert(&String("501"));
mNakRecipientResponseStrings.insert(&String("503"));
mNakRecipientResponseStrings.insert(&String("421"));
mAckDataResponseStrings.insert(&String("354"));
mAckDataResponseStrings.insert(&String("250"));
mNakDataResponseStrings.insert(&String("552"));
mNakDataResponseStrings.insert(&String("554"));
mNakDataResponseStrings.insert(&String("451"));
mNakDataResponseStrings.insert(&String("452"));
mNakDataResponseStrings.insert(&String("451"));
mNakDataResponseStrings.insert(&String("554"));
mNakDataResponseStrings.insert(&String("500"));
mNakDataResponseStrings.insert(&String("501"));
mNakDataResponseStrings.insert(&String("503"));
mNakDataResponseStrings.insert(&String("421"));
mAckResetResponseStrings.insert(&String("250"));
mNakResetResponseStrings.insert(&String("500"));
mNakResetResponseStrings.insert(&String("501"));
mNakResetResponseStrings.insert(&String("504"));
mNakResetResponseStrings.insert(&String("421"));
mAckSendResponseStrings.insert(&String("250"));
mNakSendResponseStrings.insert(&String("552"));
mNakSendResponseStrings.insert(&String("451"));
mNakSendResponseStrings.insert(&String("452"));
mNakSendResponseStrings.insert(&String("500"));
mNakSendResponseStrings.insert(&String("501"));
mNakSendResponseStrings.insert(&String("502"));
mNakSendResponseStrings.insert(&String("421"));
mAckSendOrMailResponseStrings.insert(&String("250"));
mNakSendOrMailResponseStrings.insert(&String("552"));
mNakSendOrMailResponseStrings.insert(&String("451"));
mNakSendOrMailResponseStrings.insert(&String("452"));
mNakSendOrMailResponseStrings.insert(&String("500"));
mNakSendOrMailResponseStrings.insert(&String("501"));
mNakSendOrMailResponseStrings.insert(&String("502"));
mNakSendOrMailResponseStrings.insert(&String("421"));
mAckSendAndMailResponseStrings.insert(&String("250"));
mNakSendAndMailResponseStrings.insert(&String("552"));
mNakSendAndMailResponseStrings.insert(&String("451"));
mNakSendAndMailResponseStrings.insert(&String("452"));
mNakSendAndMailResponseStrings.insert(&String("500"));
mNakSendAndMailResponseStrings.insert(&String("501"));
mNakSendAndMailResponseStrings.insert(&String("502"));
mNakSendAndMailResponseStrings.insert(&String("421"));
mAckVerifyResponseStrings.insert(&String("250"));
mAckVerifyResponseStrings.insert(&String("251"));
mNakVerifyResponseStrings.insert(&String("550"));
mNakVerifyResponseStrings.insert(&String("551"));
mNakVerifyResponseStrings.insert(&String("553"));
mNakVerifyResponseStrings.insert(&String("500"));
mNakVerifyResponseStrings.insert(&String("501"));
mNakVerifyResponseStrings.insert(&String("502"));
mNakVerifyResponseStrings.insert(&String("504"));
mNakVerifyResponseStrings.insert(&String("421"));
mAckExpandResponseStrings.insert(&String("250"));
mNakExpandResponseStrings.insert(&String("550"));
mNakExpandResponseStrings.insert(&String("500"));
mNakExpandResponseStrings.insert(&String("501"));
mNakExpandResponseStrings.insert(&String("502"));
mNakExpandResponseStrings.insert(&String("504"));
mNakExpandResponseStrings.insert(&String("421"));
mAckHelpResponseStrings.insert(&String("211"));
mAckHelpResponseStrings.insert(&String("214"));
mNakHelpResponseStrings.insert(&String("500"));
mNakHelpResponseStrings.insert(&String("501"));
mNakHelpResponseStrings.insert(&String("502"));
mNakHelpResponseStrings.insert(&String("504"));
mNakHelpResponseStrings.insert(&String("421"));
mAckNoopResponseStrings.insert(&String("250"));
mNakNoopResponseStrings.insert(&String("500"));
mNakNoopResponseStrings.insert(&String("421"));
mAckTurnResponseStrings.insert(&String("250"));
mNakTurnResponseStrings.insert(&String("502"));
mNakTurnResponseStrings.insert(&String("500"));
mNakTurnResponseStrings.insert(&String("503"));
mAckQuitResponseStrings.insert(&String("221"));
mNakQuitResponseStrings.insert(&String("500"));
}
// BOOL isInResponse(const String &responseString,RspType responseType);
mailData.insert(&String("subject: My SMTP Client"));
mailData.insert(&String("date: 09/29/1997"));
mailData.insert(&String("from: Sean Kessler <europa@li.net>"));
mailData.insert(&String("to: Russ (Big Guy) Le Blang <leblangr@moodys.com>"));
mailData.insert(&String("Hey Russ,"));
// smtpClient.verify("europa@li.net"); // verify command
template <class T>
void BTree<T>::remove(const T &someItem,TreeNode<T> *pCurrNode,TreeNode<T> *pParentNode)
{
TreeNode<T> *pTmpNode;
if(!pCurrNode)return;
if(someItem<pCurrNode->item())remove(someItem,pCurrNode->leftNode(),pCurrNode);
else if(someItem>pCurrNode->item())remove(someItem,pCurrNode->rightNode(),pCurrNode);
else
{
if(pCurrNode==mlpRootNode)
{
if(!pCurrNode->leftNode()&&!pCurrNode->rightNode())
{
delete mlpRootNode;
mlpRootNode=0;
leaves(leaves()-1);
}
else if(!pCurrNode->rightNode())
{
if(pParentNode->leftNode()==pCurrNode)pParentNode->leftNode(pCurrNode->leftNode());
else pParentNode->rightNode(pCurrNode->leftNode());
}
else if(!pCurrNode->leftNode())
{
if(pParentNode->leftNode()==pCurrNode)pParentNode->leftNode(pCurrNode->leftNode());
else pParentNode->rightNode(pCurrNode->leftNode());
}
else
{
TreeNode<T> *pCursorNode;
pTmpNode=pCursorNode=pCurrNode->leftNode();
while(pTmpNode->rightNode()){pCursorNode=pTmpNode;pTmpNode=pTmpNode->rightNode();}
if(pCursorNode)pCursorNode->rightNode(0);
if(pParentNode->leftNode()==pCurrNode)pParentNode->leftNode(pTmpNode);
else pParentNode->rightNode(pTmpNode);
}
delete pCurrNode;
leaves(leaves()-1);
// else
// {
// pTmpNode=(pCurrNode->leftNode()?pCurrNode->leftNode():pCurrNode->rightNode());
// delete mlpRootNode;
// mlpRootNode=pTmpNode;
// leaves(leaves()-1);
// }
}
else
{
if(!pCurrNode->leftNode()&&!pCurrNode->rightNode())
{
if(pParentNode->leftNode()==pCurrNode)pParentNode->leftNode(0);
else pParentNode->rightNode(0);
}
else if(!pCurrNode->rightNode())
{
if(pParentNode->leftNode()==pCurrNode)pParentNode->leftNode(pCurrNode->leftNode());
else pParentNode->rightNode(pCurrNode->leftNode());
}
else if(!pCurrNode->leftNode())
{
if(pParentNode->leftNode()==pCurrNode)pParentNode->leftNode(pCurrNode->rightNode());
else pParentNode->rightNode(pCurrNode->rightNode());
}
else
{
TreeNode<T> *pCursorNode;
pTmpNode=pCursorNode=pCurrNode->leftNode();
while(pTmpNode->rightNode()){pCursorNode=pTmpNode;pTmpNode=pTmpNode->rightNode();}
if(pCursorNode)pCursorNode->rightNode(0);
if(pParentNode->leftNode()==pCurrNode)pParentNode->leftNode(pTmpNode);
else pParentNode->rightNode(pTmpNode);
}
delete pCurrNode;
leaves(leaves()-1);
}
}
}
// pRootNode->rightNode(mlpRootNode->rightNode());
pRootNode->rightNode(pCurrNode->rightNode);
//#include <smtp/smtp.hpp>
//#include <smtp/mail.hpp>
#include <bsptree/btree.hpp>
#include <common/puredwrd.hpp>
#include <common/console.hpp>
#include <common/stdio.hpp>
int PASCAL WinMain(HINSTANCE /*hInstance*/,HINSTANCE /*hPrevInstance*/,LPSTR /*lpszCmdLine*/,int /*nCmdShow*/)
{
// Console winConsole;
BTree<PureDWORD> wordTree;
Block<PureDWORD> wordBlock;
String lineString;
// wordTree.insert(PureDWORD(500)); // root removal with both subtrees
// wordTree.insert(PureDWORD(600));
// wordTree.insert(PureDWORD(400));
// wordTree.remove(PureDWORD(500));
// wordTree.insert(PureDWORD(500)); // root removal with left subtree
// wordTree.insert(PureDWORD(400));
// wordTree.remove(PureDWORD(500));
// wordTree.insert(PureDWORD(500)); // root removal with right subtree
// wordTree.insert(PureDWORD(600));
// wordTree.remove(PureDWORD(500));
// wordTree.insert(PureDWORD(500)); // root removal with no subtrees
// wordTree.remove(PureDWORD(500));
// wordTree.insert(PureDWORD(500)); // subtree removal with both subtrees
// wordTree.insert(PureDWORD(250));
// wordTree.insert(PureDWORD(600));
// wordTree.insert(PureDWORD(275));
// wordTree.insert(PureDWORD(650));
// wordTree.insert(PureDWORD(249));
// wordTree.remove(PureDWORD(250));
// wordTree.insert(PureDWORD(500)); // subtree removal with right subtree
// wordTree.insert(PureDWORD(250));
// wordTree.insert(PureDWORD(600));
// wordTree.insert(PureDWORD(275));
// wordTree.insert(PureDWORD(650));
// wordTree.remove(PureDWORD(250));
// wordTree.insert(PureDWORD(500)); // subtree removal with right subtree
// wordTree.insert(PureDWORD(250));
// wordTree.insert(PureDWORD(600));
// wordTree.insert(PureDWORD(650));
// wordTree.remove(PureDWORD(250));
wordTree.treeItems(wordBlock);
// for(int lineIndex=0;lineIndex<wordBlock.size();lineIndex++)
// {
// ::sprintf(lineString,"%d",(DWORD)wordBlock[lineIndex]);
// winConsole.writeLine(lineString);
// }
// winConsole.read();
#if 0
Block<String> mailData;
mailData.insert(&String("TEST LINE 1"));
mailData.insert(&String("TEST LINE 2"));
mailData.insert(&String("TEST LINE 3"));
SMTPClient smtpClient;
if(!smtpClient.open("europa.com"))return FALSE; // open server
if(!smtpClient.helo("sean@europa.com"))return FALSE; // identify myself
if(!smtpClient.verify("sean@europa.com"))return FALSE; // verify
if(!smtpClient.send("sean@europa.com"))return FALSE; // send(reversePath)
if(!smtpClient.expand("mailhost.li.net"))return FALSE; // expand(mailList)
if(!smtpClient.sendAndMail("europa@li.net"))return FALSE; // sendAndMail(reversePath)
if(!smtpClient.sendOrMail("europa@li.net"))return FALSE; // sendOrMail(reversePath)
if(!smtpClient.reset())return FALSE; // reset server
if(!smtpClient.help("send"))return FALSE; // help(command)
// smtpClient.mail("sean@europa.com"); // send in reverse path for mail (from)
// if(!smtpClient.rcpt("sean@europa.com"))return FALSE; // specify recipient of mail
// if(!smtpClient.data(mailData))return FALSE; // message text lines
smtpClient.quit();
// if(!smtpClient.open("mailhost.li.net"))return FALSE; // europa.com
// if(!smtpClient.helo("europa@li.net"))return FALSE; // identify myself
// if(!smtpClient.noop())return FALSE; // ping smtp server
// smtpClient.mail("europa@li.net"); // send in reverse path for mail (from)
// if(!smtpClient.rcpt("europa@li.net"))return FALSE; // specify recipient of mail
// if(!smtpClient.data(mailData))return FALSE; // message text lines
// smtpClient.quit();
#endif
return FALSE;
}
#include <bsptree/btree.hpp>
#include <common/puredwrd.hpp>
#include <common/console.hpp>
#include <common/stdio.hpp>
int PASCAL WinMain(HINSTANCE /*hInstance*/,HINSTANCE /*hPrevInstance*/,LPSTR /*lpszCmdLine*/,int /*nCmdShow*/)
{
// Console winConsole;
BTree<PureDWORD> wordTree;
Block<PureDWORD> wordBlock;
String lineString;
// wordTree.insert(PureDWORD(500)); // root removal with both subtrees
// wordTree.insert(PureDWORD(600));
// wordTree.insert(PureDWORD(400));
// wordTree.remove(PureDWORD(500));
// wordTree.insert(PureDWORD(500)); // root removal with left subtree
// wordTree.insert(PureDWORD(400));
// wordTree.remove(PureDWORD(500));
// wordTree.insert(PureDWORD(500)); // root removal with right subtree
// wordTree.insert(PureDWORD(600));
// wordTree.remove(PureDWORD(500));
// wordTree.insert(PureDWORD(500)); // root removal with no subtrees
// wordTree.remove(PureDWORD(500));
// wordTree.insert(PureDWORD(500)); // subtree removal with both subtrees
// wordTree.insert(PureDWORD(250));
// wordTree.insert(PureDWORD(600));
// wordTree.insert(PureDWORD(275));
// wordTree.insert(PureDWORD(650));
// wordTree.insert(PureDWORD(249));
// wordTree.remove(PureDWORD(250));
// wordTree.insert(PureDWORD(500)); // subtree removal with right subtree
// wordTree.insert(PureDWORD(250));
// wordTree.insert(PureDWORD(600));
// wordTree.insert(PureDWORD(275));
// wordTree.insert(PureDWORD(650));
// wordTree.remove(PureDWORD(250));
// wordTree.insert(PureDWORD(500)); // subtree removal with right subtree
// wordTree.insert(PureDWORD(250));
// wordTree.insert(PureDWORD(600));
// wordTree.insert(PureDWORD(650));
// wordTree.remove(PureDWORD(250));
wordTree.treeItems(wordBlock);
// for(int lineIndex=0;lineIndex<wordBlock.size();lineIndex++)
// {
// ::sprintf(lineString,"%d",(DWORD)wordBlock[lineIndex]);
// winConsole.writeLine(lineString);
// }
// winConsole.read();
#if 0
Block<String> mailData;
mailData.insert(&String("TEST LINE 1"));
mailData.insert(&String("TEST LINE 2"));
mailData.insert(&String("TEST LINE 3"));
SMTPClient smtpClient;
if(!smtpClient.open("europa.com"))return FALSE; // open server
if(!smtpClient.helo("sean@europa.com"))return FALSE; // identify myself
if(!smtpClient.verify("sean@europa.com"))return FALSE; // verify
if(!smtpClient.send("sean@europa.com"))return FALSE; // send(reversePath)
if(!smtpClient.expand("mailhost.li.net"))return FALSE; // expand(mailList)
if(!smtpClient.sendAndMail("europa@li.net"))return FALSE; // sendAndMail(reversePath)
if(!smtpClient.sendOrMail("europa@li.net"))return FALSE; // sendOrMail(reversePath)
if(!smtpClient.reset())return FALSE; // reset server
if(!smtpClient.help("send"))return FALSE; // help(command)
smtpClient.quit();
#endif
void MailDlg::sendMail(MailInfo &mailInfo)
{
Block<String> mailData;
String headerString;
// SMTPClient smtpClient;
// smtpClient.open(mailInfo.server());
// smtpClient.mail(mailInfo.reversePath());
// smtpClient.rcpt(mailInfo.toField());
open(mailInfo.server());
mail(mailInfo.reversePath());
rcpt(mailInfo.toField());
headerString="subject:";
headerString+=mailInfo.subjectField();
mailData.insert(&headerString);
SystemTime systemTime;
headerString="date:";
headerString+=(String)systemTime;
mailData.insert(&headerString);
for(int lineIndex=0;lineIndex<mailInfo.mailData().size();lineIndex++)
mailData.insert(&mailInfo.mailData()[lineIndex]);
data(mailData);
quit();
// smtpClient.data(mailData);
// smtpClient.quit();
}
// {
// MailInfo mailInfo;
// if(getFields(mailInfo))sendMail(mailInfo);
// if(getFields(mailInfo))open(mailInfo.server());
// }
EDITTEXT MAIL_TO, 46, 206, 179, 12
#if 0
BOOL UUEncode::encode(GUIWindow &parentWindow,String srcPathFileName,Block<String> &lineStrings,BOOL initBlock)const
{
Profile iniProfile;
char readBuff[45];
int readCount;
int byteCount;
int lineCount;
char *ptrBuff;
String outLine;
int ch;
if(initBlock)lineStrings.remove();
if(srcPathFileName.isNull())return FALSE;
FileHandle readFile(srcPathFileName,FileHandle::Read,FileHandle::ShareRead);
if(!readFile.isOkay())return FALSE;
FileMap readMap(readFile);
PureViewOfFile readView(readMap);
iniProfile.makeFileName(srcPathFileName);
::sprintf(outLine,"begin %d %s\n",644,srcPathFileName);
lineStrings.insert(&outLine);
Progress encodeProgress(parentWindow,srcPathFileName);
encodeProgress.canCancel(TRUE);
encodeProgress.show(TRUE);
encodeProgress.setText("encoding... (press ESC to cancel).");
while(sizeof(readBuff)==readView.read(readBuff,sizeof(readBuff))){parentWindow.yieldTask();lineCount++;}
readView.rewind();
encodeProgress.range(lineCount);
while(readCount=readView.read(readBuff,sizeof(readBuff)))
{
String lineString;
lineString+=(char)chEncode(readCount);
for(ptrBuff=readBuff,byteCount=readCount;byteCount>0;byteCount-=3,ptrBuff+=3)
{
ch=*ptrBuff>>2;
lineString+=(char)chEncode(ch);
ch=(*ptrBuff<<4)&0x30|(ptrBuff[1]>>4)&0x0F;
lineString+=(char)chEncode(ch);
ch=(ptrBuff[1]<<2)&0x3C|(ptrBuff[2]>>6)&0x03;
lineString+=(char)chEncode(ch);
ch=ptrBuff[2]&0x3F;
lineString+=(char)chEncode(ch);
parentWindow.yieldTask();
}
lineString+='\n';
lineStrings.insert(&lineString);
encodeProgress++;
if(!encodeProgress.isOkay()){lineStrings.remove();return FALSE;}
if(readCount!=45)break;
}
ch=('\0'?('\0'&0x3F)+' ':'`');
String lastLine;
lastLine+=(char)ch;
lastLine+='\n';
lineStrings.insert(&lastLine);
lineStrings.insert(&String("end"));
return TRUE;
}
#endif
#include <common/openfile.hpp>
FileHandle writeFile("uuencode.txt",FileHandle::Write,FileHandle::ShareRead,FileHandle::Overwrite);
for(int lineIndex=0;lineIndex<mAttachment.size();lineIndex++)
writeFile.write((BYTE*)(LPSTR)mAttachment[lineIndex],mAttachment[lineIndex].length());
// ch=('\0'?('\0'&0x3F)+' ':'`');
// lastLine+=(char)ch;
String lastLine;
lastLine+=(char)('\0'?('\0'&0x3F)+' ':'`');
lastLine+='\n';
#include <common/openfile.hpp>
FileHandle writeFile("uuencode.txt",FileHandle::Write,FileHandle::ShareRead,FileHandle::Overwrite);
for(int lineIndex=0;lineIndex<mAttachment.size();lineIndex++)
{
// writeFile.write((BYTE*)(LPSTR)mAttachment[lineIndex],mAttachment[lineIndex].length());
writeFile.writeLine(mAttachment[lineIndex]);
}
#include <smtp/uuencode.hpp>
#include <common/openfile.hpp>
#include <common/pview.hpp>
#include <common/filemap.hpp>
#include <common/progress.hpp>
#include <common/profile.hpp>
BOOL UUEncode::encode(GUIWindow &parentWindow,String srcPathFileName,Block<String> &lineStrings,BOOL initBlock)const
{
Profile iniProfile;
char readBuff[45];
int readCount;
int byteCount;
int lineCount;
char *ptrBuff;
String outLine;
int ch;
if(initBlock)lineStrings.remove();
if(srcPathFileName.isNull())return FALSE;
FileHandle readFile(srcPathFileName,FileHandle::Read,FileHandle::ShareRead);
if(!readFile.isOkay())return FALSE;
FileMap readMap(readFile);
PureViewOfFile readView(readMap);
iniProfile.makeFileName(srcPathFileName);
srcPathFileName.removeTokens("\\/");
::sprintf(outLine,"begin %d %s",644,(char*)srcPathFileName);
lineStrings.insert(&outLine);
Progress encodeProgress(parentWindow,srcPathFileName);
encodeProgress.canCancel(TRUE);
encodeProgress.show(TRUE);
encodeProgress.setText("encoding... (press ESC to cancel).");
while(sizeof(readBuff)==readView.read(readBuff,sizeof(readBuff))){parentWindow.yieldTask();lineCount++;}
readView.rewind();
encodeProgress.range(lineCount);
while(readCount=readView.read(readBuff,sizeof(readBuff)))
{
String lineString;
char *ptrLine=(LPSTR)lineString;
*(ptrLine++)=chEncode(readCount);
for(ptrBuff=readBuff,byteCount=readCount;byteCount>0;byteCount-=3,ptrBuff+=3)
{
*(ptrLine++)=chEncode(*ptrBuff>>2);
*(ptrLine++)=chEncode((*ptrBuff<<4)&0x30|(ptrBuff[1]>>4)&0x0F);
*(ptrLine++)=chEncode((ptrBuff[1]<<2)&0x3C|(ptrBuff[2]>>6)&0x03);
*(ptrLine++)=chEncode(ptrBuff[2]&0x3F);
parentWindow.yieldTask();
}
// *(ptrLine++)=0x0D;
// *(ptrLine++)=0x0A;
lineStrings.insert(&lineString);
encodeProgress++;
if(!encodeProgress.isOkay()){lineStrings.remove();return FALSE;}
if(readCount!=sizeof(readBuff))break;
}
String lastLine;
lastLine+=(char)('\0'?('\0'&0x3F)+' ':'`');
// lastLine+="\r\n";
lineStrings.insert(&lastLine);
lineStrings.insert(&String("end"));
return TRUE;
}
#if 0
BOOL UUEncode::encode(GUIWindow &parentWindow,String srcPathFileName,Block<String> &lineStrings,BOOL initBlock)const
{
Profile iniProfile;
char readBuff[45];
int readCount;
int byteCount;
int lineCount;
char *ptrBuff;
String outLine;
int ch;
if(initBlock)lineStrings.remove();
if(srcPathFileName.isNull())return FALSE;
FileHandle readFile(srcPathFileName,FileHandle::Read,FileHandle::ShareRead);
if(!readFile.isOkay())return FALSE;
FileMap readMap(readFile);
PureViewOfFile readView(readMap);
iniProfile.makeFileName(srcPathFileName);
srcPathFileName.removeTokens("\\/");
::sprintf(outLine,"begin %d %s\r\n",644,srcPathFileName);
lineStrings.insert(&outLine);
Progress encodeProgress(parentWindow,srcPathFileName);
encodeProgress.canCancel(TRUE);
encodeProgress.show(TRUE);
encodeProgress.setText("encoding... (press ESC to cancel).");
while(sizeof(readBuff)==readView.read(readBuff,sizeof(readBuff))){parentWindow.yieldTask();lineCount++;}
readView.rewind();
encodeProgress.range(lineCount);
while(readCount=readView.read(readBuff,sizeof(readBuff)))
{
String lineString;
char *ptrLine=(LPSTR)lineString;
*(ptrLine++)=chEncode(readCount);
for(ptrBuff=readBuff,byteCount=readCount;byteCount>0;byteCount-=3,ptrBuff+=3)
{
*(ptrLine++)=chEncode(*ptrBuff>>2);
*(ptrLine++)=chEncode((*ptrBuff<<4)&0x30|(ptrBuff[1]>>4)&0x0F);
*(ptrLine++)=chEncode((ptrBuff[1]<<2)&0x3C|(ptrBuff[2]>>6)&0x03);
*(ptrLine++)=chEncode(ptrBuff[2]&0x3F);
parentWindow.yieldTask();
}
*(ptrLine++)=0x0D;
*(ptrLine++)=0x0A;
lineStrings.insert(&lineString);
encodeProgress++;
if(!encodeProgress.isOkay()){lineStrings.remove();return FALSE;}
if(readCount!=sizeof(readBuff))break;
}
String lastLine;
lastLine+=(char)('\0'?('\0'&0x3F)+' ':'`');
lastLine+="\r\n";
lineStrings.insert(&lastLine);
lineStrings.insert(&String("end"));
return TRUE;
}
#endif
// void fatalThreadExit(void);
//inline
//void SMTPThread::fatalThreadExit(void)
//{
// MessageThread::fatalThreadExit();
//}