Alguém poderia me ajudar a entender o código seguinte:
static HTTP_IO_RESULT HTTPPostMD5(void)
{
WORD lenA, lenB;
static HASH_SUM md5; // Assume only one simultaneous MD5
#define SM_MD5_READ_SEPARATOR (0u) // Processed as the "default" state
#define SM_MD5_SKIP_TO_DATA (1u)
#define SM_MD5_READ_DATA (2u)
// We don't care about curHTTP.data at this point,
// so we'll use that for our buffer
// curHTTP.data[0] is always at least overwritten with the leading '/'
// from the filename, so we'll use that as a state machine variable.
// If it's value isn't 0x01 or 0x02, then we haven't passed the separator.
switch(curHTTP.data[0])
{
case SM_MD5_SKIP_TO_DATA:
// Look for the CRLFCRLF
lenA = TCPFindROMArray(sktHTTP, (ROM BYTE*)"\r\n\r\n", 4, 0, FALSE);
if(lenA != 0xffff)
{// Found it, so remove all data up to and including
lenA = TCPGetArray(sktHTTP, NULL, lenA+4);
curHTTP.byteCount -= lenA;
curHTTP.data[0] = SM_MD5_READ_DATA;
}
else
{// Otherwise, remove as much as possible
lenA = TCPGetArray(sktHTTP, NULL, TCPIsGetReady(sktHTTP) - 4);
curHTTP.byteCount -= lenA;
// Return the need more data flag
return HTTP_IO_NEED_DATA;
}
// No break if we found the header terminator
case SM_MD5_READ_DATA:
// Find out how many bytes are available to be read
lenA = TCPIsGetReady(sktHTTP);
if(lenA > curHTTP.byteCount)
lenA = curHTTP.byteCount;
while(lenA > 0)
{// Add up to 64 bytes at a time to the sum
lenB = TCPGetArray(sktHTTP, &(curHTTP.data[1]), (lenA < 64)?lenA:64);
curHTTP.byteCount -= lenB;
lenA -= lenB;
MD5AddData(&md5, &curHTTP.data[1], lenB);
}
// If we've read all the data
if(curHTTP.byteCount == 0)
{// Calculate and copy result to curHTTP.data for printout
curHTTP.data[0] = 0x05;
MD5Calculate(&md5, &(curHTTP.data[1]));
return HTTP_IO_DONE;
}
// Ask for more data
return HTTP_IO_NEED_DATA;
// Just started, so try to find the separator string
case SM_MD5_READ_SEPARATOR:
default:
// Reset the MD5 calculation
MD5Initialize(&md5);
// See if a CRLF is in the buffer
lenA = TCPFindROMArray(sktHTTP, (ROM BYTE*)"\r\n", 2, 0, FALSE);
if(lenA == 0xffff)
{//if not, ask for more data
return HTTP_IO_NEED_DATA;
}
// If so, figure out where the last byte of data is
// Data ends if CRLFseparator--CRLF, so 6+len bytes
curHTTP.byteCount -= lenA + 6;
// Read past the CRLF
curHTTP.byteCount -= TCPGetArray(sktHTTP, NULL, lenA+2);
// Save the next state (skip to CRLFCRLF)
curHTTP.data[0] = SM_MD5_SKIP_TO_DATA;
// Ask for more data
return HTTP_IO_NEED_DATA;
}
}
#endif // #if defined(STACK_USE_MD5)