iaupdate/IAD/ui/src/iaupdatetools.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:21:33 +0300
branchRCL_3
changeset 25 7333d7932ef7
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:   This module contains the implementation of IAUpdateTools functions
*
*/






#include <s32mem.h>
#include <iaupdateparameters.h>

#include "iaupdatetools.h"
#include "iaupdatedebug.h"

// -----------------------------------------------------------------------------
// IAUpdateTools::ExternalizeParametersL
// 
// -----------------------------------------------------------------------------
// 
void IAUpdateTools::ExternalizeParametersL( HBufC8*& aTarget,
                                            const CIAUpdateParameters& aSource )
    {
    IAUPDATE_TRACE("[IAUPDATE] IAUpdateTools::ExternalizeParametersL begin");
    // Notice!
    // If you make changes here. Also, remember to make corresponding
    // changes to the InternalizeParametersL

    // The size of the buffer will contain:
    // - 1 TInt for UIDs,
    // - 1 TBool for ShowProgress boolean
    // - 1 TUint for importance
    // - 1 TUint for type
    // - 1 TBool for Refresh boolean
    
    // - 3 TInt for descriptor lengths
    // --> bytes for 5 + 3 = 8 TInt values are needed 
    //     (sizeof( TInt ) * KNumberOfTInts)
    // - 3 descriptor TDesC texts
    const TInt KNumberOfTInts( 8 );

    // Notice, that because descriptor texts that are included
    // here are TDesC, their Size-information has to be used
    // instead of Length.
    HBufC8* tmp = 
        HBufC8::NewLC( sizeof( TInt ) * KNumberOfTInts
                       + aSource.SearchCriteria().Size()
                       + aSource.CommandLineExecutable().Size()
                       + aSource.CommandLineArguments().Size() );

    // Create stream that uses the buffer created above.
    // By using the stream, the values are easier to insert into the buffer.
    TPtr8 ptr( tmp->Des() );    
    RDesWriteStream stream( ptr );
    CleanupClosePushL( stream );

    // These are integers for uids
    IAUPDATE_TRACE_1("[IAUPDATE] uid: %x", aSource.Uid().iUid );
    stream.WriteInt32L( aSource.Uid().iUid );

    // These are length and data pairs for descriptors
    IAUPDATE_TRACE_1("[IAUPDATE] search criteria: %S", &aSource.SearchCriteria() );
    ExternalizeDesL( aSource.SearchCriteria(), stream );
    IAUPDATE_TRACE_1("[IAUPDATE] command line executable: %S", &aSource.CommandLineExecutable() );
    ExternalizeDesL( aSource.CommandLineExecutable(), stream );
#ifdef _DEBUG
    HBufC* temp = HBufC::NewL( aSource.CommandLineArguments().Length() );
    temp->Des().Copy( aSource.CommandLineArguments()) ;
    IAUPDATE_TRACE_1("[IAUPDATE] command line arguments: %S", temp );
    delete temp;
#endif //_DEBUG
    ExternalizeDes8L( aSource.CommandLineArguments(), stream );
    
    // Boolean for ShowProgress
    stream.WriteInt32L( aSource.ShowProgress() );
    
    // TUint for importance
    stream.WriteInt32L( aSource.Importance() );
    
    // TUint for type
    stream.WriteInt32L( aSource.Type() );
    
    // Boolean for Refresh
    stream.WriteInt32L( aSource.Refresh() );

    // Stream is not needed anymore
    CleanupStack::PopAndDestroy( &stream );

    // Remove tmp from the stack but do not delete it because it will be
    // assigned to the aTarget below.
    CleanupStack::Pop( tmp );
    
    // Replace aTarget with new value
    delete aTarget;
    aTarget = tmp;
    IAUPDATE_TRACE("[IAUPDATE] IAUpdateTools::ExternalizeParametersL end");
    }

// -----------------------------------------------------------------------------
// IAUpdateTools::InternalizeParametersL
// 
// -----------------------------------------------------------------------------
// 
void IAUpdateTools::InternalizeParametersL( CIAUpdateParameters& aTarget, 
                                            const TDesC8& aSource )
    {
    IAUPDATE_TRACE("[IAUPDATE] IAUpdateTools::InternalizeParametersL begin");
    // Notice!
    // If you make changes here. Also, remember to make corresponding
    // changes to the ExternalizeParametersL

    // InternalizeDesL function will set values into this tmp descriptor.
    HBufC* tmp( NULL );
    
    // Create stream that uses the given buffer.
    RDesReadStream stream( aSource );
    CleanupClosePushL( stream );

    aTarget.SetUid( TUid::Uid( stream.ReadInt32L() ) );
    IAUPDATE_TRACE_1("[IAUPDATE] uid: %x", aTarget.Uid().iUid );
    
    InternalizeDesL( tmp, stream );
    CleanupStack::PushL( tmp );
    aTarget.SetSearchCriteriaL( *tmp );
    IAUPDATE_TRACE_1("[IAUPDATE] search criteria: %S", tmp );
    CleanupStack::PopAndDestroy( tmp );
    tmp = NULL;
        
    InternalizeDesL( tmp, stream );
    CleanupStack::PushL( tmp );
    aTarget.SetCommandLineExecutableL( *tmp );
    IAUPDATE_TRACE_1("[IAUPDATE] command line executable: %S", tmp );
    CleanupStack::PopAndDestroy( tmp );
    tmp = NULL;

    HBufC8* tmp8( NULL );        
    InternalizeDes8L( tmp8, stream );
    CleanupStack::PushL( tmp8 );
    aTarget.SetCommandLineArgumentsL( *tmp8 );
#ifdef _DEBUG
    tmp = HBufC::NewL( tmp8->Length() );
    tmp->Des().Copy( *tmp8 ) ;
    IAUPDATE_TRACE_1("[IAUPDATE] command line arguments: %S", tmp );
    delete tmp;
    tmp = NULL;
#endif //_DEBUG
    CleanupStack::PopAndDestroy( tmp8 );
    tmp8 = NULL;
    
    aTarget.SetShowProgress( stream.ReadInt32L() );

    // new parameters (in phase 2 IAD) do not always exist. Parameters may have written by old IAD in selfupdate case.
    TRAPD( err, aTarget.SetImportance( stream.ReadInt32L() ) );
    if ( err != KErrEof )
        {
        User::LeaveIfError( err );
        aTarget.SetType( stream.ReadInt32L() );
        aTarget.SetRefresh( stream.ReadInt32L() );
        }
     
    IAUPDATE_TRACE_1("[IAUPDATE] show progress: %d", aTarget.ShowProgress() );
    CleanupStack::PopAndDestroy( &stream );   
    IAUPDATE_TRACE("[IAUPDATE] IAUpdateTools::InternalizeParametersL end");
    }


// -----------------------------------------------------------------------------
// IAUpdateTools::ExternalizeDesL
// 
// -----------------------------------------------------------------------------
// 
void IAUpdateTools::ExternalizeDesL( const TDesC& aDes, 
                                     RWriteStream& aStream )
    {
    aStream.WriteInt32L( aDes.Length() );
    aStream.WriteL( aDes );
    }

// -----------------------------------------------------------------------------
// IAUpdateTools::InternalizeDesL
// 
// -----------------------------------------------------------------------------
// 
TInt IAUpdateTools::InternalizeDesL( HBufC*& aDes, 
                                     RReadStream& aStream )
    {
    TInt length = aStream.ReadInt32L();
    if ( length > 0 ) 
        {
        HBufC* target = HBufC::NewLC( length );
        TPtr ptr( target->Des() );        
        aStream.ReadL( ptr, length );
        delete aDes;
        aDes = target;
        CleanupStack::Pop( target );
        }
    else
        {
        delete aDes;
        aDes = KNullDesC().AllocL();
        }
    return length;
    }

// -----------------------------------------------------------------------------
// IAUpdateTools::ExternalizeDes8L
// 
// -----------------------------------------------------------------------------
// 
void IAUpdateTools::ExternalizeDes8L( const TDesC8& aDes, RWriteStream& aStream )
    {
    aStream.WriteInt32L( aDes.Length() );
    aStream.WriteL( aDes );
    }

// -----------------------------------------------------------------------------
// IAUpdateTools::InternalizeDes8L
// 
// -----------------------------------------------------------------------------
// 
TInt IAUpdateTools::InternalizeDes8L( HBufC8*& aDes, RReadStream& aStream )
    {
    TInt length = aStream.ReadInt32L();
    if ( length > 0 ) 
        {
        HBufC8* target = HBufC8::NewLC( length );
        TPtr8 ptr( target->Des() );        
        aStream.ReadL( ptr, length );
        delete aDes;
        aDes = target;
        CleanupStack::Pop( target );
        }
    else
        {
        delete aDes;
        aDes = KNullDesC8().AllocL();
        }
    return length;
    }