void HttpcHandleContent(USHORT sLen, PCHAR pBuf) { UCHAR iVal; USHORT sLeftLen, sLen2; if (_sHttpcRespCode != 200) { goto SkipContent; } if (_iHttpcTask == HTTPC_TASK_GET_PROV || _iHttpcTask == HTTPC_TASK_GET_CFG || _iHttpcTask == HTTPC_TASK_CFG_AUTH) { sLen2 = sLen; if (_bHttpcEncrypt) { TaskRC4Calc(pBuf, pBuf, sLen2); } while (sLen2 --) { iVal = *pBuf ++; if (iVal == 0x0d || iVal == 0x0a) { if (_iHttpcTask == HTTPC_TASK_GET_PROV) { HandleProvParam(); } else { HttpcHandleSettings(); } } else if (iVal != (UCHAR)'"') { HttpcSaveRecv(iVal); } } goto SkipContent; } if (_iHttpcTask == HTTPC_TASK_GET_SW) { if (_iHttpcUpdatePage == SYSTEM_INVALID_PAGE) goto SkipContent; sLeftLen = FILE_FULL_PAGE_SIZE - _sHttpcPostLen; if (sLen < sLeftLen || !sLeftLen) { BufWrite(pBuf, sLen); BufForward(sLen); _sHttpcPostLen += sLen; } else { BufWrite(pBuf, sLeftLen); BufForward(sLeftLen); _sHttpcPostLen = 0; TaskUIHandler(UI_UPDATE_PROGRESS, (USHORT)_iHttpcCurPage); if (FlashWritePage(_iHttpcCurPage)) { _iHttpcUpdatePage = SYSTEM_INVALID_PAGE; goto SkipContent; } _iHttpcCurPage ++; if ((_iHttpcCurPage - _iHttpcUpdatePage) >= SYSTEM_PROGRAM_PAGE_NUM) { TaskSystemHandler(SYS_UPDATE_FLAG, _iHttpcCurPage); _iHttpcTask = HTTPC_TASK_REBOOT; } else { sLen2 = (USHORT)(sLen - sLeftLen); BufSeek(0); BufWrite((PCHAR)(pBuf + sLeftLen), sLen2); BufForward(sLen2); _sHttpcPostLen = sLen2; } } } SkipContent: if (_lHttpcContentLen > (ULONG)sLen) { _lHttpcContentLen -= (ULONG)sLen; } else { _lHttpcContentLen = 0; HttpcNextTask(); } }
/* * doMore - process a file */ static void doMore( char *name, FILE *f ) { int ch; long file_size; int done; long curr_line=0; long tline; int char_cnt; int percent; char buff[_MAX_PATH*2]; if( f != stdin ) { fseek( f, 0, SEEK_END ); file_size = ftell( f ); fseek( f, 0, SEEK_SET ); InitFileBuffer( file_size ); } char_cnt = 0; for( ;; ) { ch = ReadChar( f ); if( ch == EOF ) { break; } char_cnt++; if( curr_line < startLine ) { if( ch == '\n' ) { curr_line++; } } else { if( ch != '\n' ) { if( char_cnt < screenWidth - 1 ) { fputc( ch, stdout ); continue; } if( !foldLines ) { fputc( '\r', stdout ); continue; } fputc( ch, stdout ); } else { fputc( '\n', stdout ); curr_line++; } char_cnt = 0; fflush( stdout ); lineCount--; if( lineCount == 0 ) { lineCount = screenHeight-1; if( f != stdin ) { percent = (100L*BufferPos)/file_size; } else { percent = 0; } fprintf( stdout,"%s(%d%%)", promptString, percent ); fflush( stdout ); done = 0; while( !done ) { done = 1; ch = getChar(); fputs( "\r \r", stdout ); fflush( stdout ); switch( ch ) { case '\r': case '+': lineCount = 1; break; case CTRL( 'F' ): case ' ': if( clearScreen ) { system( "cls" ); } break; case '=': fputs( ltoa( curr_line, buff, 10 ), stdout ); fflush( stdout ); done = 0; break; case 'q': fclose( f ); return; case '0': if( f != stdin ) { BufSeek( 0 ); curr_line = 0; } else { done = 0; } break; case '$': if( f != stdin ) { BufSeek( file_size ); curr_line -= backUpLines( f, screenHeight ); } else { done = 0; } break; case CTRL( 'B' ): case 'b': if( clearScreen ) { system( "cls" ); } if( f != stdin ) { curr_line -= backUpLines( f, 2*screenHeight-1 ); } else { done = 0; } break; case '-': if( f != stdin ) { curr_line -= backUpLines( f, screenHeight+1 ); } else { done = 0; } break; case '?': fprintf( stdout, "\"%s\", %ld of %ld bytes", name, BufferPos, file_size ); fflush( stdout ); done = 0; break; case 'v': tline = curr_line - screenHeight+2; if( tline < 1 ) { tline = 1; } sprintf( buff, "vi %s -k%ldGz\\n", name, tline ); system( buff ); if( clearScreen ) { system( "cls" ); } if( f != stdin ) { curr_line -= backUpLines( f, screenHeight ); } break; default: fputs( "use ENTER,SPACE,?,0,$,+,-,=,q,v,^F,b,^B", stdout ); fflush( stdout ); done = 0; break; } } } } } fclose( f ); } /* doMore */
void HttpcHandleLine(PCHAR pBuf, UCHAR iLen) { PCHAR pCur; pBuf[iLen] = 0; if (_iHttpcState == HCS_INIT) { pCur = pBuf; if (!memcmp_str(pCur, "HTTP/1.1 ")) { pCur += 9; UdpDebugString(pCur); _sHttpcRespCode = atoi(pCur, 10); _iHttpcState = HCS_HEADER_BEGIN; _bHttpcEncrypt = FALSE; } } else if (_iHttpcState == HCS_HEADER_BEGIN) { if (iLen) { HttpcHandleHeader(pBuf); } else { if (_lHttpcContentLen) { _iHttpcState = HCS_HEADER_END; if (_sHttpcRespCode == 200) { if (_iHttpcTask == HTTPC_TASK_GET_PROV) { // use MAC as public key mac2str(Sys_pMacAddress, _pProvPubKey); ChangeSeparator(_pProvPubKey, '-', ':'); HttpcInitKey(); _bHttpcEncrypt = TRUE; } else if (_iHttpcTask == HTTPC_TASK_GET_CFG || _iHttpcTask == HTTPC_TASK_CFG_AUTH) { if (_bHttpcEncrypt) { HttpcInitKey(); } ReadFlashPage(SYSTEM_SETTINGS_PAGE); } else if (_iHttpcTask == HTTPC_TASK_GET_SW) { _iHttpcUpdatePage = (Sys_iSystemPage == SYSTEM_1ST_PAGE) ? SYSTEM_2ND_PAGE : SYSTEM_1ST_PAGE; _sHttpcPostLen = 0; _iHttpcCurPage = _iHttpcUpdatePage; BufSeek(0); } } } else { HttpcNextTask(); } } } }