Exemplo n.º 1
0
#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;
}