#include "setting.h" struct setting setting = { { TWEMCACHE_OPTION(OPTION_INIT) }, { ADMIN_OPTION(OPTION_INIT) }, { SERVER_OPTION(OPTION_INIT) }, { WORKER_OPTION(OPTION_INIT) }, { PROCESS_OPTION(OPTION_INIT) }, { KLOG_OPTION(OPTION_INIT) }, { REQUEST_OPTION(OPTION_INIT) }, { RESPONSE_OPTION(OPTION_INIT) }, { SLAB_OPTION(OPTION_INIT) }, { ARRAY_OPTION(OPTION_INIT) }, { BUF_OPTION(OPTION_INIT) }, { DBUF_OPTION(OPTION_INIT) }, { DEBUG_OPTION(OPTION_INIT) }, { SOCKIO_OPTION(OPTION_INIT) }, { TCP_OPTION(OPTION_INIT) }, }; unsigned int nopt = OPTION_CARDINALITY(struct setting);
/** * @fn tEE_DOWNLOAD_STATUS Direct_Download_Start(tSIRF_UINT8 * pEEFilebuffer, * tSIRF_CHAR * pServerAddress, * tSIRF_UINT16 serverPort, * tSIRF_CHAR *pServerFile, * tSIRF_CHAR *pServerAuth, * tSIRF_UINT8 serverFileFormat ) * @brief Direct_Download_Start * * @description To start the EE Download using sockets. * pass all valid required paramaters. * * @param[in] pServerAddress Server address * @param[in] serverPort server port number * @param[in] pServerFile pointer to server file name * @param[in] pServerAuth server authentication code * @param[in] serverFileFormat file format downloaded from server * @return tEE_DOWNLOAD_STATUS with EE_DOWNLOAD_SUCCESS or error code * defined in tEE_DOWNLOAD_STATUS * */ tEE_DOWNLOAD_STATUS Direct_Download_Start( tSIRF_UINT8 * pEEFilebuffer, tSIRF_CHAR *pServerAddress, tSIRF_UINT16 serverPort, tSIRF_CHAR *pServerFile, tSIRF_CHAR *pServerAuth, tSIRF_UINT8 serverFileFormat ) { tSIRF_UINT32 actualLen = 0; tSIRF_INT32 file_length = 0; tSIRF_INT32 file_start = 0; tEE_DOWNLOAD_STATUS returnVal = EE_DOWNLOAD_SUCCESS; tSIRF_UINT32 fileHeaderSize = 0; tSIRF_UINT8 headerProcessed = 0; tSIRF_UINT32 downloadSize = 0; tSIRF_UINT32 bytesRcvd = 0; tSIRF_UINT32 reqSize = 0; #ifdef USE_URID tSIRF_CHAR urid_string[ CSR_URID_STRING_SIZE ]; tSIRF_UINT32 urid_result; #endif /* USE_URID */ #if SIRF_INSTANT_FIX_GSW tSIRF_RESULT result = SIRF_SUCCESS; tSIRF_MSG_SSB_EE_FILE_PART msg; #endif (void)serverFileFormat; if (STATE_EE_DOWNLOAD_DIRECT_STARTED == stateDirectDwnldEnum) { returnVal = EE_DOWNLOAD_ALREADY_STARTED; } else { runningDownaloadDirect = 1; stateDirectDwnldEnum = STATE_EE_DOWNLOAD_DIRECT_STARTED; #ifdef USE_URID EEDownloadDebug_Log(DEBUG_OPTION(CLM_DLOG_MOD_ID_EEDOWNLOADER,CLM_DLOG_SEVERITY_LEVEL_MAX), "EE_DOWNLOAD: uridInfoValidFlagGlobal %d \n", uridInfoValidFlagGlobal); if(SIRF_TRUE == uridInfoValidFlagGlobal) { urid_result = CSR_URID_Get_URID_String( urid_string, sizeof(urid_string) ); if ( URID_SUCCESS != urid_result ) { EEDownloadDebug_Log(DEBUG_OPTION(CLM_DLOG_MOD_ID_EEDOWNLOADER,CLM_DLOG_SEVERITY_LEVEL_MAX), "EE_DOWNLOAD: Syn_Direct_Download_Start failed,CSR_URID_Get_URID_String failed %d!!!\n", urid_result ); returnVal = EE_DOWNLOAD_GET_URID_FAILED; } else { snprintf( (tSIRF_CHAR *)pEEFilebuffer, MAX_SIZE_OF_RECV_BUFFER, "GET %s HTTP/1.1\nHost: %s:%d\nAuthorization: Basic %s\nURID: %s\n\n", pServerFile, pServerAddress, serverPort, pServerAuth, urid_string ); } } else { EEDownloadDebug_Log(DEBUG_OPTION(CLM_DLOG_MOD_ID_EEDOWNLOADER,CLM_DLOG_SEVERITY_LEVEL_MAX), "EE_DOWNLOAD: Syn_Direct_Download_Start failed, no valid OED ID and SubID!!!\n" ); returnVal = EE_DOWNLOAD_NO_URID_INFO; } #else snprintf( (tSIRF_CHAR *)pEEFilebuffer, MAX_SIZE_OF_RECV_BUFFER, "GET %s HTTP/1.1\nHost: %s:%d\nAuthorization: Basic %s\n\n", pServerFile, pServerAddress, serverPort, pServerAuth ); #endif /* USE_URID */ /* write request to the download socket (??? writeset[0] = tcp_sock;???? */ returnVal = EE_Download_Send( pEEFilebuffer, (tSIRF_UINT32)strlen( (tSIRF_CHAR *)pEEFilebuffer ) ); if (EE_DOWNLOAD_SUCCESS != returnVal) { return returnVal; } memset( pEEFilebuffer, 0, MAX_SIZE_OF_RECV_BUFFER ); downloadSize = fileHeaderSize = MAX_HTTP_HEADER_SIZE; /* Max Valid HTTP header size */ bytesRcvd = 0; /* read response and EE file data */ do { reqSize = (downloadSize < MAX_SIZE_OF_RECV_BUFFER)? downloadSize : MAX_SIZE_OF_RECV_BUFFER; returnVal = EE_Download_Receive( pEEFilebuffer + bytesRcvd,reqSize, &actualLen) ; if (EE_DOWNLOAD_SUCCESS == returnVal) { bytesRcvd += actualLen; downloadSize -= actualLen; } else { /* Reset SGEE Module states by indicating '0' size in receive buffer */ #if SIRF_INSTANT_FIX_GSW msg.buffSize = 0; result = SiRFNav_Input(SIRF_MSG_SSB_EE_FILE_PART, &msg, sizeof(msg)); if( SIRF_SUCCESS == result ) { returnVal = EE_DOWNLOAD_INPUT_ERROR; result = EE_Download_CheckForError(EE_DOWNLOAD_WAIT_FILE_PART); if(SIRF_SUCCESS == result) { returnVal = gSIFReponse;/* response */ } else if(SIRF_PAL_OS_SEMAPHORE_WAIT_TIMEOUT == result) { /* In case of timeout, we need to reset the * SIF Download state machine to make that ready for * next download */ memset(&msg, 0x0, sizeof(msg)); (void)SiRFNav_Input(SIRF_MSG_SSB_EE_FILE_PART, &msg, sizeof(msg)); } } else if( SIRFNAV_UI_ERROR_NOT_STARTED == result ) { returnVal = EE_DOWNLOAD_INPUT_ERROR; } else { returnVal = EE_DOWNLOAD_CORRUPTFILE_ERROR; } #else (void)EE_Download_CallBackFnPtr(EE_DOWNLOAD_DATA_CALLBACK,pEEFilebuffer, 0, 0 ); #endif return returnVal; } /* if we've got header and beginning of file, parse header now: */ if ( bytesRcvd == fileHeaderSize && (!headerProcessed)) { if ( !strstr( (tSIRF_CHAR*)pEEFilebuffer, lenstr) ) { EEDownloadDebug_Log(DEBUG_OPTION(CLM_DLOG_MOD_ID_EEDOWNLOADER,CLM_DLOG_SEVERITY_LEVEL_MAX), "EE_DOWNLOAD: Direct_Download_Start HTTP header parsing error; header dump follows:\n" ); EEDownloadDebug_Log(DEBUG_OPTION(CLM_DLOG_MOD_ID_EEDOWNLOADER,CLM_DLOG_SEVERITY_LEVEL_MAX), "%s\n", pEEFilebuffer ); return EE_DOWNLOAD_CORRUPTFILE_ERROR; } /* coverity[secure_coding] */ if(1 != sscanf( strstr( (tSIRF_CHAR*)pEEFilebuffer, lenstr ) + strlen( lenstr ), "%ld", &file_length )) { return EE_DOWNLOAD_CORRUPTFILE_ERROR; } if ( strstr( (tSIRF_CHAR*)pEEFilebuffer, HTTPNEWLINE HTTPNEWLINE) ) { file_start = (tSIRF_INT32)( strstr( (tSIRF_CHAR*)pEEFilebuffer, HTTPNEWLINE HTTPNEWLINE ) + strlen( HTTPNEWLINE HTTPNEWLINE ) - (tSIRF_CHAR*)pEEFilebuffer ); } else { EEDownloadDebug_Log(DEBUG_OPTION(CLM_DLOG_MOD_ID_EEDOWNLOADER,CLM_DLOG_SEVERITY_LEVEL_MAX), "EE_DOWNLOAD: Direct_Download_Start HTTP header parsing error; header dump follows:\n" ); EEDownloadDebug_Log(DEBUG_OPTION(CLM_DLOG_MOD_ID_EEDOWNLOADER,CLM_DLOG_SEVERITY_LEVEL_MAX), "%s\n", pEEFilebuffer ); return EE_DOWNLOAD_CORRUPTFILE_ERROR; } downloadSize = file_length; downloadSize -= (fileHeaderSize - file_start); /* Already downloaded */ if ( downloadSize <= fileHeaderSize ) { EEDownloadDebug_Log(DEBUG_OPTION(CLM_DLOG_MOD_ID_EEDOWNLOADER,CLM_DLOG_SEVERITY_LEVEL_MAX), "EE_DOWNLOAD: Direct_Download_Start HTTP header parsing error; header dump follows:\n" ); EEDownloadDebug_Log(DEBUG_OPTION(CLM_DLOG_MOD_ID_EEDOWNLOADER,CLM_DLOG_SEVERITY_LEVEL_MAX), "%s\n", pEEFilebuffer ); return EE_DOWNLOAD_CORRUPTFILE_ERROR; } headerProcessed = 1; } if(headerProcessed) { /* Provide the EE file to CLM: bytesRcvd */ #if SIRF_INSTANT_FIX_GSW memcpy( &(msg.buff[0]), (tSIRF_UINT8 *)(pEEFilebuffer+file_start), (bytesRcvd-file_start)); msg.buffSize = bytesRcvd-file_start; result = SiRFNav_Input(SIRF_MSG_SSB_EE_FILE_PART, &msg, sizeof(msg)); if( SIRF_SUCCESS == result) { returnVal = EE_DOWNLOAD_INPUT_ERROR; result = EE_Download_CheckForError(EE_DOWNLOAD_WAIT_FILE_PART); if(SIRF_SUCCESS == result) { returnVal = gSIFReponse;/* response */ } else if(SIRF_PAL_OS_SEMAPHORE_WAIT_TIMEOUT == result) { /* In case of timeout, we need to reset the * SIF Download state machine to make that ready for * next download */ memset(&msg, 0x0, sizeof(msg)); (void)SiRFNav_Input(SIRF_MSG_SSB_EE_FILE_PART, &msg, sizeof(msg)); } } else if( SIRFNAV_UI_ERROR_NOT_STARTED == result ) { returnVal = EE_DOWNLOAD_INPUT_ERROR; } else { returnVal = EE_DOWNLOAD_CORRUPTFILE_ERROR; } #else returnVal = EE_Download_CallBackFnPtr(EE_DOWNLOAD_DATA_CALLBACK, pEEFilebuffer+file_start, bytesRcvd-file_start, 0 ); #endif if(returnVal != EE_DOWNLOAD_SUCCESS) { returnVal = EE_DOWNLOAD_INPUT_ERROR; /* Reset connection and download based on time scheme */ break; } file_start = 0; bytesRcvd = 0; } } while ( downloadSize && runningDownaloadDirect); } return returnVal; }