HRESULT ProcessAndApplyDeltaFile()

in host/common/hostagenthelpers.cpp [1192:1354]


HRESULT ProcessAndApplyDeltaFile( char const* filename,
                                 HANDLE handleVolume,
                                 SV_FileList *pCurSV_FileList) //Used for transmitting status to the SV box                                 
{
    HRESULT hr = S_OK;
    SVD_PREFIX prefix = { 0 };
    char* buffer = NULL;
    unsigned bufferSize = 0;
    FILE* file = NULL;
    BOOL bFixInvalidFile = FALSE;
    
    
    do
    {
        DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
        DebugPrintf( "ENTERED ProcessAndApplyDeltaFile()...\n" );

        DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
        DebugPrintf( "CALLING fopen()...\n" );
        file = fopen( filename, "rb" );

        if( NULL == file )
        {
            hr = E_INVALIDARG;
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "FAILED ProcessAndApplyDeltaFile(%s)... hr = %08X\n", filename, hr );
            break;
        }

        while( TRUE )
        {
            if( 1 != fread( &prefix, sizeof( prefix ), 1, file ) )
            {
                break;
            }

            switch( prefix.tag )
            {
            default:
                hr = E_FAIL;
                DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
                DebugPrintf( "FAILED Invalid Tag... (0x%08X) %s\n", prefix.tag, filename );
                if( 0x1000 == prefix.tag && !bFixInvalidFile )
                {
                    DebugPrintf( "WARNING Attempting fixup %s\n", filename );
                    fseek( file, 0, SEEK_SET );
                    bFixInvalidFile = TRUE;
                    hr = S_OK;
                }
                //assert( !"Invalid Tag" );
                break;

            case SVD_TAG_HEADER1:
                DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
                DebugPrintf( "Got SVD_TAG_HEADER1...\n" );
                if( ( prefix.count*sizeof( SVD_HEADER1 ) ) > bufferSize )
                {
                    delete [] buffer;
                    INM_SAFE_ARITHMETIC(bufferSize = prefix.count*InmSafeInt<size_t>::Type(sizeof( SVD_HEADER1 )), INMAGE_EX(prefix.count)(sizeof( SVD_HEADER1 )))
                    buffer = new char[ bufferSize];

                    if( NULL == buffer )
                    {
                        break;
                    }
                }
                if( 1 != fread( buffer, 
                    prefix.count*sizeof( SVD_HEADER1 ),
                    1,
                    file ) )
                {
                    break;
                }

                hr = OnHeader( (SVD_HEADER1*) buffer,
                    prefix.count*sizeof( SVD_HEADER1 ) );
                break;

            case SVD_TAG_TIME_STAMP_OF_FIRST_CHANGE:
                //__asm int 3 ;
                DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
                DebugPrintf( "Got SVD_TAG_TIME_STAMP_OF_FIRST_CHANGE...\n" );        
                if ( 0 != fseek(file, prefix.count*sizeof( SVD_TIME_STAMP ), SEEK_CUR) )
                {
                    hr = E_FAIL ;
                    break ;
                }
                break;

            case SVD_TAG_USER:
                DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
                DebugPrintf( "Got SVD_USER_DEFINED_TAG...\n" );
                assert(prefix.count == 1);
                if (  0 != fseek(file, prefix.Flags, SEEK_CUR) )
                {
                    hr = E_FAIL;
                    break;
                }

                break;

            case SVD_TAG_LENGTH_OF_DRTD_CHANGES:
                DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
                DebugPrintf( "Got SVD_TAG_LENGTH_OF_DRTD_CHANGE...\n" );
                if ( 0 != fseek(file, prefix.count*sizeof(ULARGE_INTEGER ), SEEK_CUR) )
                {
                    hr = E_FAIL ;
                    break ;
                }

                break;

            case SVD_TAG_DIRTY_BLOCK_DATA:
                DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
                DebugPrintf( "Got SVD_TAG_DIRTY_BLOCK_DATA...\n" );

                DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
                DebugPrintf( "CALLING OnDirtyBlockData()...\n" );
                if( bFixInvalidFile )
                {
                    prefix.count++;
                    bFixInvalidFile = FALSE;
                }

                hr = OnDirtyBlockData( file,
                    handleVolume,
                    pCurSV_FileList, //Used for transmitting status to the SV box
                    prefix.count);                    
                break;

            case SVD_TAG_TIME_STAMP_OF_LAST_CHANGE :
                DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
                DebugPrintf( "Got SVD_TAG_TIME_STAMP_OF_LAST_CHANGE...\n" );
                if ( 0 != fseek(file, sizeof( SVD_TIME_STAMP ), SEEK_CUR ) )
                {
                    hr = E_FAIL ;
                    // break ;
                }
                break;

            }
            if( FAILED( hr ) )
            {
                break;
            }
        }
        if( FAILED( hr ) )
        {
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "FAILED ProcessAndApplyDeltaFile()... hr = %08X\n", hr );
            break;
        }
    }
    while( FALSE );

    if( NULL != file )
    {
        fclose( file );
    }
    delete [] buffer;

    return( hr );
}