Code:
int g_iStatus = 1;
char g_szBuffer[2048];
unsigned long g_ulCount, g_ulCurMsg, g_ulMsgRead, g_ulSize;
HWND g_hwndLV, g_hwndEdit, g_hwndStatus;
SOCKET g_Socket;
case FD_READ:
{
char *szLine, *szLineEnd, szTemp[256];
int nBytesRead;
SendMessage(g_hwndStatus, SB_SETTEXT, 0, (LPARAM)"Receiving");
nBytesRead = recv(g_Socket, g_szBuffer, 2047, 0);
g_szBuffer[nBytesRead] = '\0';
// positive response?
if (g_szBuffer[0] == '+')
{
switch(g_iStatus)
{
case 1:
{
SendMessage(g_hwndEdit, EM_REPLACESEL, 0, (LPARAM)g_szBuffer);
wsprintf(szTemp, "USER \r\n"); // stick a username in here
send(g_Socket, szTemp, strlen(szTemp), 0);
g_iStatus = 2;
break;
}
case 2:
{
SendMessage(g_hwndEdit, EM_REPLACESEL, 0, (LPARAM)g_szBuffer);
wsprintf(szTemp, "PASS \r\n"); // password here
send(g_Socket, szTemp, strlen(szTemp), 0);
g_iStatus = 3;
break;
}
case 3:
{
SendMessage(g_hwndEdit, EM_REPLACESEL, 0, (LPARAM)g_szBuffer);
wsprintf(szTemp, "STAT\r\n");
send(g_Socket, szTemp, strlen(szTemp), 0);
g_iStatus = 4;
break;
}
case 4:
{
SendMessage(g_hwndEdit, EM_REPLACESEL, 0, (LPARAM)g_szBuffer);
sscanf(g_szBuffer, "+OK %lu %lu", &g_ulCount, &g_ulSize);
g_ulCurMsg = g_ulCount;
wsprintf(szTemp, "LIST %lu\r\n", g_ulCurMsg);
send(g_Socket, szTemp, strlen(szTemp), 0);
g_iStatus = 5;
break;
}
case 5:
{
SendMessage(g_hwndEdit, EM_REPLACESEL, 0, (LPARAM)g_szBuffer);
sscanf(g_szBuffer, "+OK %lu %lu", &g_ulCurMsg, &g_ulSize);
wsprintf(szTemp, "RETR %lu\r\n", g_ulCurMsg--);
send(g_Socket, szTemp, strlen(szTemp), 0);
g_iStatus = 6;
break;
}
case 6:
{
szLine = strstr(g_szBuffer, "\r\n"); // Ignore the "+OK" line
if (szLine)
{
szLine += 2;
g_ulMsgRead = 0; // reset counter on initial packet
while (szLine)
{
// Find the end of the current line
szLineEnd = strstr(szLine, "\r\n");
if (szLineEnd)
{
szLineEnd += 2;
// Add line end - line start to the counter
g_ulMsgRead += (szLineEnd - szLine);
}
else // Add the end of the buffer - line start to counter
g_ulMsgRead += ((g_szBuffer + nBytesRead) - szLine);
// If we've read the length of the message, finish
if (g_ulMsgRead >= g_ulSize)
{
if (g_ulCurMsg)
{
wsprintf(szTemp, "LIST %lu\r\n", g_ulCurMsg);
send(g_Socket, szTemp, strlen(szTemp), 0);
g_iStatus = 5;
}
else
{
wsprintf(szTemp, "QUIT\r\n");
send(g_Socket, szTemp, strlen(szTemp), 0);
g_iStatus = 7;
}
break;
}
szLine = szLineEnd;
}
}
break;
}
case 7:
{
wsprintf(szTemp, "You have %lu new messages (%lu octets).", g_ulCount, g_ulSize);
MessageBox(hwndDlg, szTemp, "New Messages", MB_ICONINFORMATION);
break;
}
}
}
else
{
// data?
if (g_iStatus == 6)
{
szLine = g_szBuffer;
while (szLine)
{
// Find the end of the current line
szLineEnd = strstr(szLine, "\r\n");
if (szLineEnd)
{
szLineEnd += 2;
// Add line end - line start to the counter
g_ulMsgRead += (szLineEnd - szLine);
}
else // Add the end of the buffer - line start to counter
g_ulMsgRead += ((g_szBuffer + nBytesRead) - szLine);
// If we've read the length of the message, finish
if (g_ulMsgRead >= g_ulSize)
{
if (g_ulCurMsg)
{
wsprintf(szTemp, "LIST %lu\r\n", g_ulCurMsg);
send(g_Socket, szTemp, strlen(szTemp), 0);
g_iStatus = 5;
}
else
{
wsprintf(szTemp, "QUIT\r\n");
send(g_Socket, szTemp, strlen(szTemp), 0);
g_iStatus = 7;
}
break;
}
szLine = szLineEnd;
}
else // bad stuff, just print and curse repeatedly
SendMessage(g_hwndEdit, EM_REPLACESEL, 0, (LPARAM)g_szBuffer);
}
break;
}
}