void MyFrame::OnSend(wxCommandEvent& event)
{
wxIPV4address addr;
addr.Hostname(wxT("mx2.mail.yahoo.com"));
addr.Service(25);
// Create the socket
wxSocketClient* Socket = new wxSocketClient();
// imposta il gestore eventi della socket
Socket->SetEventHandler(*this, SOCKET_ID);
Socket->SetNotify(wxSOCKET_CONNECTION_FLAG | wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG | wxSOCKET_OUTPUT_FLAG);
Socket->Notify(TRUE);
// Wait for the connection event
Socket->Connect(addr, FALSE);
}
void MyFrame::OnSocketEvent(wxSocketEvent& event)
{
// The socket that had the event
wxSocketBase* sock = event.GetSocket();
// Common buffer shared by the events
char buf[100] = "";
switch(event.GetSocketEvent())
{
// se ricevo un evento "connessione al server"
case wxSOCKET_CONNECTION:
{
// scrive lo stato nella statusbar
SetStatusText("Connected to SMTP server...");
// appende lo stato nella textarea con il log dello stato
statusInput->AppendText("\n\nConnected to SMTP server...");
break;
}
// se ricevo un evento "input dal server"
case wxSOCKET_INPUT:
{
char nextMessage[50] = "";
static int count = 0;
// legge l'input inviato dal server
sock->Read(buf, sizeof(buf));
// lo stampa nella textarea con il log dello stato
statusInput->AppendText("\n");
statusInput->AppendText(buf);
const wxChar* temp;
// decido qual e' il prossimo comando da inviare
switch(count)
{
case 0:
{
// imposta e manda l'HELO
strcpy(nextMessage, "HELO SMTP Client v1.0\n");
sock->Write(nextMessage, sizeof(nextMessage));
break;
}
case 1:
{
// imposta e manda MAIL FROM
//leggendo l'indirizzo dal campo di input apposito
temp = mailFromInput->GetValue();
sprintf(nextMessage, "MAIL FROM:<%s>\n", temp);
sock->Write(nextMessage, sizeof(nextMessage));
break;
}
case 2:
{
// imposta e manda RCPT TO
//leggendo l'indirizzo dal campo di input apposito
temp = rcptToInput->GetValue();
sprintf(nextMessage, "RCPT TO:<%s>\n", temp);
sock->Write(nextMessage, sizeof(nextMessage));
break;
}
case 3:
{
// imposta e manda DATA
//leggendo il testo dell'email dalla textarea apposita
temp = dataInput->GetValue();
sprintf(nextMessage, "DATA\n%s\n.\n", temp);
sock->Write(nextMessage, sizeof(nextMessage));
break;
}
case 4:
{
// imposta e manda il comando QUIT
strcpy(nextMessage, "QUIT\n");
sock->Write(nextMessage, sizeof(nextMessage));
break;
}
}
statusInput->AppendText("\n");
statusInput->AppendText(nextMessage);
// incrementa la variabile statica count
// in modo che al prossimo passo il comando da mandare al server
// sara' quello seguente
count++;
break;
}
// se ricevo un evento "disconnessione dal server"
case wxSOCKET_LOST:
{
sock->Destroy();
// aggiorno la textarea con il log dello stato
statusInput->AppendText("\nConnection lost.");
SetStatusText("Connection lost...");
// dialog con messaggio di errore
wxString msg;
msg.Printf(_T("Connection lost!"));
wxMessageBox(msg, _T("Error"), wxOK | wxICON_ERROR);
break;
}
// se ricevo un evento "output per il server"
case wxSOCKET_OUTPUT:
{
break;
}
}
}