systemswstubs/startupadaptationstub/src/StartupAdaptationStubModel.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 14 Jan 2010 07:14:53 +0200
changeset 0 0ce1b5ce9557
permissions -rw-r--r--
Revision: 201001

/*
* Copyright (c) 2004-2007 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:  CStartupAdaptationStubModel class definition.
*
*/



// INCLUDE FILES
#include "StartupAdaptationStubModel.h"
#include "StartupAdaptationStubDebug.h"
#include <f32file.h>

// CONSTANTS

_LIT( KConfigFile, "C:\\private\\2000D766\\StartupAdaptationStubConf.txt" );
const TInt KDefaultDuration( 1 ); // Default command duration in ms.

const TInt KGlobalStateChangeIndex( 0 );
const TInt KSecurityStateChangeIndex( 1 );
const TInt KGlobalStartupModeIndex( 2 );
const TInt KSelftestIndex( 3 );
const TInt KLanguageListIndex( 4 );
const TInt KRTCTimeIndex( 5 );
const TInt KSimChangedIndex( 6 );
const TInt KSimOwnedIndex( 7 );
const TInt KSetAlarmIndex( 8 );
const TInt KCancelAlarmIndex( 9 );
const TInt KResetIndex( 10 );
const TInt KShutdownIndex( 11 );
const TInt KRFSIndex( 12 );
const TInt KActivateRfIndex( 13 );
const TInt KDeactivateRfIndex( 14 );
const TInt KHiddenResetIndex( 15 );

using namespace StartupAdaptation;

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CStartupAdaptationStubModel* CStartupAdaptationStubModel::NewL()
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::NewL." ) );

    CStartupAdaptationStubModel* self =
        new( ELeave ) CStartupAdaptationStubModel();

    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop();

    RDEBUG( _L( "CStartupAdaptationStubModel::NewL finished." ) );

    return self;
    }


// Destructor
CStartupAdaptationStubModel::~CStartupAdaptationStubModel()
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::~CStartupAdaptationStubModel." ) );

    for ( TInt i = 0; i < KNumResponseLists; i++ )
        {
        delete iResponses[i].iList;
        }

    RDEBUG( _L( "CStartupAdaptationStubModel::~CStartupAdaptationStubModel finished." ) );
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::GetGlobalStateChangeResponse
//
// -----------------------------------------------------------------------------
//
TInt CStartupAdaptationStubModel::GetGlobalStateChangeResponse()
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::GetGlobalStateChangeResponse." ) );

    TInt response = GetSimpleResponse( KGlobalStateChangeIndex );

    RDEBUG_1( _L( "CStartupAdaptationStubModel::GetGlobalStateChangeResponse finished with %d." ), response );
    return response;
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::GetSecurityStateChangeResponse
//
// -----------------------------------------------------------------------------
//
void CStartupAdaptationStubModel::GetSecurityStateChangeResponse(
    StartupAdaptation::TSecurityStateResponse& aResponse )
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::GetSecurityStateChangeResponse." ) );

    const TInt index = KSecurityStateChangeIndex;
    __ASSERT_DEBUG( iResponses[index].iList != NULL, User::Invariant() );

    CStructuredList& list = *( ( iResponses[index] ).iList );
    const TInt currentIndex = CalculateCurrentBaseIndex( index );;

    __ASSERT_DEBUG( list.Count() > 0, User::Invariant() );
    __ASSERT_DEBUG( currentIndex < list.Count() - 2, User::Invariant() );

    aResponse.iErrorCode = list[currentIndex + 1 ];
    aResponse.iValue =
        static_cast<TSecurityStateInfo>( list[currentIndex + 2 ] );

    UpdateCounter( index );

    RDEBUG( _L( "CStartupAdaptationStubModel::GetSecurityStateChangeResponse finished." ) );
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::GetStartupModeResponse
//
// -----------------------------------------------------------------------------
//
void CStartupAdaptationStubModel::GetStartupModeResponse(
    StartupAdaptation::TGlobalStartupModeResponse& aResponse )
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::GetStartupModeResponse." ) );

    const TInt index = KGlobalStartupModeIndex;
    __ASSERT_DEBUG( iResponses[index].iList != NULL, User::Invariant() );

    CStructuredList& list = *( ( iResponses[index] ).iList );
    const TInt currentIndex = CalculateCurrentBaseIndex( index );;

    __ASSERT_DEBUG( list.Count() > 0, User::Invariant() );
    __ASSERT_DEBUG( currentIndex < list.Count() - 2, User::Invariant() );

    aResponse.iErrorCode = list[currentIndex + 1 ];
    aResponse.iValue =
        static_cast<TGlobalStartupMode>( list[currentIndex + 2 ] );

    UpdateCounter( index );

    RDEBUG( _L( "CStartupAdaptationStubModel::GetStartupModeResponse finished." ) );
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::GetSelftestResponse
//
// -----------------------------------------------------------------------------
//
TInt CStartupAdaptationStubModel::GetSelftestResponse()
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::GetSelftestResponse." ) );

    TInt response = GetSimpleResponse( KSelftestIndex );

    RDEBUG_1( _L( "CStartupAdaptationStubModel::GetSelftestResponse finished with %d." ), response );
    return response;
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::GetLanguageListResponse
//
// -----------------------------------------------------------------------------
//
void CStartupAdaptationStubModel::GetLanguageListResponse(
    StartupAdaptation::RLanguageListResponse& aResponse )
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::GetLanguageListResponse." ) );

    const TInt index = KLanguageListIndex;
    __ASSERT_DEBUG( iResponses[index].iList != NULL, User::Invariant() );

    CStructuredList& list = *( ( iResponses[index] ).iList );
    const TInt currentIndex = CalculateCurrentBaseIndex( index );;

    __ASSERT_DEBUG( list.Count() > 0, User::Invariant() );
    __ASSERT_DEBUG( currentIndex < list.Count() - iResponses[ index ].iParts,
                    User::Invariant() );

    aResponse.iErrorCode = list[ currentIndex + 1 ];
    for ( TInt i = 0; i < list[ currentIndex + 2 ]; i++ )
        {
        aResponse.iLanguages.Append(
            static_cast<TPreferredLanguage>( list[ currentIndex + i + 3 ] ) );
        }

    UpdateCounter( index );

    RDEBUG( _L( "CStartupAdaptationStubModel::GetLanguageListResponse finished." ) );
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::GetRTCTimeValidityResponse
//
// -----------------------------------------------------------------------------
//
TInt CStartupAdaptationStubModel::GetRTCTimeValidityResponse()
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::GetRTCTimeValidityResponse." ) );

    TInt response = GetSimpleResponse( KRTCTimeIndex );

    RDEBUG_1( _L( "CStartupAdaptationStubModel::GetRTCTimeValidityResponse finished with %d." ), response );
    return response;
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::GetSimChangedResponse
//
// -----------------------------------------------------------------------------
//
void CStartupAdaptationStubModel::GetSimChangedResponse(
    StartupAdaptation::TBooleanResponse& aResponse )
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::GetSimChangedResponse." ) );

    const TInt index = KSimChangedIndex;
    __ASSERT_DEBUG( iResponses[index].iList != NULL, User::Invariant() );

    CStructuredList& list = *( ( iResponses[index] ).iList );
    const TInt currentIndex = CalculateCurrentBaseIndex( index );;

    __ASSERT_DEBUG( list.Count() > 0, User::Invariant() );
    __ASSERT_DEBUG( currentIndex < list.Count() - 2, User::Invariant() );

    aResponse.iErrorCode = list[currentIndex + 1];
    aResponse.iValue = static_cast<TBool>( list[currentIndex + 2 ] );

    UpdateCounter( index );

    RDEBUG( _L( "CStartupAdaptationStubModel::GetSimChangedResponse finished." ) );
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::GetSimOwnedResponse
//
// -----------------------------------------------------------------------------
//
void CStartupAdaptationStubModel::GetSimOwnedResponse(
    StartupAdaptation::TBooleanResponse& aResponse )
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::GetSimOwnedResponse." ) );

    const TInt index = KSimOwnedIndex;
    __ASSERT_DEBUG( iResponses[index].iList != NULL, User::Invariant() );

    CStructuredList& list = *( ( iResponses[index] ).iList );
    const TInt currentIndex = CalculateCurrentBaseIndex( index );;

    __ASSERT_DEBUG( list.Count() > 0, User::Invariant() );
    __ASSERT_DEBUG( currentIndex < list.Count() - 2, User::Invariant() );

    aResponse.iErrorCode = list[currentIndex + 1 ];
    aResponse.iValue = static_cast<TBool>( list[currentIndex + 2 ] );

    UpdateCounter( index );

    RDEBUG( _L( "CStartupAdaptationStubModel::GetSimOwnedResponse finished." ) );
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::GetSetAlarmResponse
//
// -----------------------------------------------------------------------------
//
TInt CStartupAdaptationStubModel::GetSetAlarmResponse()
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::GetSetAlarmResponse." ) );

    TInt response = GetSimpleResponse( KSetAlarmIndex );

    RDEBUG_1( _L( "CStartupAdaptationStubModel::GetSetAlarmResponse finished with %d." ), response );
    return response;
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::GetCancelAlarmResponse
//
// -----------------------------------------------------------------------------
//
TInt CStartupAdaptationStubModel::GetCancelAlarmResponse()
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::GetCancelAlarmResponse." ) );

    TInt response = GetSimpleResponse( KCancelAlarmIndex );

    RDEBUG_1( _L( "CStartupAdaptationStubModel::GetCancelAlarmResponse finished with %d." ), response );
    return response;
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::GetResetResponse
//
// -----------------------------------------------------------------------------
//
TInt CStartupAdaptationStubModel::GetResetResponse()
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::GetResetResponse." ) );

    TInt response = GetSimpleResponse( KResetIndex );

    RDEBUG_1( _L( "CStartupAdaptationStubModel::GetResetResponse finished with %d." ), response );
    return response;
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::GetShutdownResponse
//
// -----------------------------------------------------------------------------
//
TInt CStartupAdaptationStubModel::GetShutdownResponse()
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::GetShutdownResponse." ) );

    TInt response = GetSimpleResponse( KShutdownIndex );

    RDEBUG_1( _L( "CStartupAdaptationStubModel::GetShutdownResponse finished with %d." ), response );
    return response;
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::GetRFSResponse
//
// -----------------------------------------------------------------------------
//
TInt CStartupAdaptationStubModel::GetRFSResponse()
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::GetRFSResponse." ) );

    TInt response = GetSimpleResponse( KRFSIndex );

    RDEBUG_1( _L( "CStartupAdaptationStubModel::GetRFSResponse finished with %d." ), response );
    return response;
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::GetActivateRfResponse
//
// -----------------------------------------------------------------------------
//
TInt CStartupAdaptationStubModel::GetActivateRfResponse()
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::GetActivateRfResponse." ) );

    TInt response = GetSimpleResponse( KActivateRfIndex );

    RDEBUG_1( _L( "CStartupAdaptationStubModel::GetActivateRfResponse finished with %d." ), response );
    return response;
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::GetDeactivateRfResponse
//
// -----------------------------------------------------------------------------
//
TInt CStartupAdaptationStubModel::GetDeactivateRfResponse()
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::GetDeactivateRfResponse." ) );

    TInt response = GetSimpleResponse( KDeactivateRfIndex );

    RDEBUG_1( _L( "CStartupAdaptationStubModel::GetDeactivateRfResponse finished with %d." ), response );
    return response;
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::GetHiddenResetResponse
//
// -----------------------------------------------------------------------------
//
void CStartupAdaptationStubModel::GetHiddenResetResponse(
    StartupAdaptation::TBooleanResponse& aResponse )
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::GetHiddenResetResponse." ) );

    const TInt index = KHiddenResetIndex;
    __ASSERT_DEBUG( iResponses[index].iList != NULL, User::Invariant() );

    CStructuredList& list = *( ( iResponses[index] ).iList );
    const TInt currentIndex = CalculateCurrentBaseIndex( index );;

    __ASSERT_DEBUG( list.Count() > 0, User::Invariant() );
    __ASSERT_DEBUG( currentIndex < list.Count() - 2, User::Invariant() );

    aResponse.iErrorCode = list[currentIndex + 1 ];
    aResponse.iValue = static_cast<TBool>( list[currentIndex + 2 ] );

    UpdateCounter( index );

    RDEBUG( _L( "CStartupAdaptationStubModel::GetHiddenResetResponse finished." ) );
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::GetDurationForNextCall
//
// -----------------------------------------------------------------------------
//
TInt CStartupAdaptationStubModel::GetDurationForNextCall( const TInt aCommandId )
    {
    RDEBUG_1( _L( "CStartupAdaptationStubModel::GetDurationForNextCall( %d )" ), aCommandId );

    TInt index = aCommandId - EGlobalStateChange;
    if ( aCommandId >= EValidateRTCTime )
        {
        // Skip the missing two commands.
        index -= ( EValidateRTCTime - EGetSIMLanguages );
        }

    __ASSERT_DEBUG( iResponses[index].iList != NULL, User::Invariant() );

    CStructuredList& list = *( ( iResponses[index] ).iList );
    const TInt currentIndex = CalculateCurrentBaseIndex( index );;

    __ASSERT_DEBUG( list.Count() > 0, User::Invariant() );
    __ASSERT_DEBUG( currentIndex < list.Count(), User::Invariant() );

    const TInt duration = list[currentIndex];

    RDEBUG_1( _L( "CStartupAdaptationStubModel::GetDurationForNextCall finished with %d." ), duration );
    return duration;
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::CStartupAdaptationStubModel
// C++ default constructor can NOT contain any code, that might leave.
// -----------------------------------------------------------------------------
//
CStartupAdaptationStubModel::CStartupAdaptationStubModel()
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::CStartupAdaptationStubModel." ) );

    for ( TInt i = 0; i < KNumResponseLists; i++ )
        {
        iResponses[i].iCounter = 0;
        }

    iResponses[ KGlobalStateChangeIndex ].iParts = 1;
    iResponses[ KSecurityStateChangeIndex ].iParts = 2;
    iResponses[ KGlobalStartupModeIndex ].iParts = 2;
    iResponses[ KSelftestIndex ].iParts = 1;
    iResponses[ KLanguageListIndex ].iParts = 16;
    iResponses[ KRTCTimeIndex ].iParts = 1;
    iResponses[ KSimChangedIndex ].iParts = 2;
    iResponses[ KSimOwnedIndex ].iParts = 2;
    iResponses[ KSetAlarmIndex ].iParts = 1;
    iResponses[ KCancelAlarmIndex ].iParts = 1;
    iResponses[ KResetIndex ].iParts = 1;
    iResponses[ KShutdownIndex ].iParts = 1;
    iResponses[ KRFSIndex ].iParts = 1;
    iResponses[ KActivateRfIndex ].iParts = 1;
    iResponses[ KDeactivateRfIndex ].iParts = 1;
    iResponses[ KHiddenResetIndex ].iParts = 2;

    RDEBUG( _L( "CStartupAdaptationStubModel::CStartupAdaptationStubModel finished." ) );
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CStartupAdaptationStubModel::ConstructL()
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::ConstructL." ) );

    for ( TInt i = 0; i < KNumResponseLists; i++ )
        {
        iResponses[i].iList =
            new ( ELeave ) CStructuredList( iResponses[i].iParts + 1 );
        }

    TRAPD( errorCode, ReadConfigFileL() );
    if ( errorCode != KErrNone )
        {
        RDEBUG_1( _L( "Configuration file does not exist or is corrupt (error code %d). Initializing to default configuration." ), errorCode );

        InitToDefaultL();
        }

    RDEBUG( _L( "CStartupAdaptationStubModel::ConstructL finished." ) );
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::ReadConfigFileL
//
// -----------------------------------------------------------------------------
//
void CStartupAdaptationStubModel::ReadConfigFileL()
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::ReadConfigFileL." ) );

    RFs fs;
    User::LeaveIfError( fs.Connect() );
    CleanupClosePushL( fs );

    RFile file;
    User::LeaveIfError( file.Open( fs, KConfigFile, EFileShareReadersOnly ) );
    CleanupClosePushL( file );

    TFileText reader;
    reader.Set( file );

    TBuf<256> buf;
    TLex lex( buf );

    for ( TInt i = 0; i < KNumResponseLists; i++ )
        {
        User::LeaveIfError( reader.Read( buf ) );

        RDEBUG_1( _L( "CStartupAdaptationStubModel: Config line: %S." ), &buf );

        lex.Assign( buf );
        ReadStructuredListL(
            iResponses[ i ].iParts, lex, *( iResponses[ i ].iList ) );
        }

    CleanupStack::PopAndDestroy( 2 ); // file, fs

    RDEBUG( _L( "CStartupAdaptationStubModel::ReadConfigFileL finished." ) );
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::InitToDefaultL
//
// -----------------------------------------------------------------------------
//
void CStartupAdaptationStubModel::InitToDefaultL()
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::InitToDefaultL." ) );

    for ( TInt i = 0; i < KNumResponseLists; i++ )
        {
        iResponses[i].iList->Reset();
        }

    iResponses[KGlobalStateChangeIndex].iList->AppendL( KDefaultDuration );
    iResponses[KGlobalStateChangeIndex].iList->AppendL( KErrNone );

    iResponses[KSecurityStateChangeIndex].iList->AppendL( KDefaultDuration );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( KErrNone );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( EYes );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( KDefaultDuration );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( KErrNone );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( ENoValue );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( KDefaultDuration );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( KErrNone );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( ENo );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( KDefaultDuration );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( KErrNone );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( ENo );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( KDefaultDuration );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( KErrNone );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( ENo );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( KDefaultDuration );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( KErrNone );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( ENoValue );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( KDefaultDuration );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( KErrNone );
    iResponses[KSecurityStateChangeIndex].iList->AppendL( ESimLockOk );

    iResponses[KGlobalStartupModeIndex].iList->AppendL( KDefaultDuration );
    iResponses[KGlobalStartupModeIndex].iList->AppendL( KErrNone );
    iResponses[KGlobalStartupModeIndex].iList->AppendL( ENormal );

    iResponses[KSelftestIndex].iList->AppendL( KDefaultDuration );
    iResponses[KSelftestIndex].iList->AppendL( KErrNone );

    iResponses[KLanguageListIndex].iList->AppendL( KDefaultDuration );
    iResponses[KLanguageListIndex].iList->AppendL( KErrNotFound );
    for ( TInt i = 0; i < 15; i++ )
        {
        iResponses[KLanguageListIndex].iList->AppendL( 0 );
        }
    iResponses[KLanguageListIndex].iList->AppendL( KDefaultDuration );
    iResponses[KLanguageListIndex].iList->AppendL( KErrNotFound );
    for ( TInt i = 0; i < 15; i++ )
        {
        iResponses[KLanguageListIndex].iList->AppendL( 0 );
        }
    iResponses[KLanguageListIndex].iList->AppendL( KDefaultDuration );
    iResponses[KLanguageListIndex].iList->AppendL( KErrNotFound );
    for ( TInt i = 0; i < 15; i++ )
        {
        iResponses[KLanguageListIndex].iList->AppendL( 0 );
        }

    iResponses[KRTCTimeIndex].iList->AppendL( KDefaultDuration );
    iResponses[KRTCTimeIndex].iList->AppendL( 0 );

    iResponses[KSimChangedIndex].iList->AppendL( KDefaultDuration );
    iResponses[KSimChangedIndex].iList->AppendL( KErrNotFound );
    iResponses[KSimChangedIndex].iList->AppendL( EFalse );

    iResponses[KSimOwnedIndex].iList->AppendL( KDefaultDuration );
    iResponses[KSimOwnedIndex].iList->AppendL( KErrNotFound );
    iResponses[KSimOwnedIndex].iList->AppendL( EFalse );

    for ( TInt i = 8; i < KNumResponseLists - 1; i++ )
        {
        iResponses[i].iList->AppendL( KDefaultDuration );
        iResponses[i].iList->AppendL( 0 );
        }

    iResponses[KHiddenResetIndex].iList->AppendL( KDefaultDuration );
    iResponses[KHiddenResetIndex].iList->AppendL( KErrNotSupported );
    iResponses[KHiddenResetIndex].iList->AppendL( EFalse );

    RDEBUG( _L( "CStartupAdaptationStubModel::InitToDefaultL finished." ) );
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::GetSimpleResponse
//
// -----------------------------------------------------------------------------
//
TInt CStartupAdaptationStubModel::GetSimpleResponse( const TInt aIndex )
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::GetSimpleResponse." ) );
    __ASSERT_DEBUG( iResponses[aIndex].iList != NULL, User::Invariant() );

    CStructuredList& list = *( ( iResponses[aIndex] ).iList );
    const TInt currentIndex = CalculateCurrentBaseIndex( aIndex );;

    RDEBUG_1( _L( "CStartupAdaptationStubModel: count = %d" ), list.Count() );

    __ASSERT_DEBUG( list.Count() > 0, User::Invariant() );
    __ASSERT_DEBUG( currentIndex < list.Count() + 1, User::Invariant() );

    TInt response = list[currentIndex + 1];

    UpdateCounter( aIndex );

    RDEBUG_1( _L( "CStartupAdaptationStubModel::GetSimpleResponse finished with %d." ), response );
    return response;
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::CalculateCurrentBaseIndex
//
// -----------------------------------------------------------------------------
//
TInt CStartupAdaptationStubModel::CalculateCurrentBaseIndex( const TInt aIndex )
    {
    RDEBUG_1( _L( "CStartupAdaptationStubModel::CalculateCurrentBaseIndex( %d )" ), aIndex );

    const TInt counter = iResponses[aIndex].iCounter;
    const TInt parts = iResponses[aIndex].iParts;
    const TInt currentBaseIndex = counter * ( parts + 1 );

    RDEBUG_1( _L( "CStartupAdaptationStubModel::CalculateCurrentBaseIndex finished with %d." ), currentBaseIndex );
    return currentBaseIndex;
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::UpdateCounter
//
// -----------------------------------------------------------------------------
//
void CStartupAdaptationStubModel::UpdateCounter( const TInt aIndex )
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::UpdateCounter." ) );
    __ASSERT_DEBUG( iResponses[aIndex].iList != NULL, User::Invariant() );

    CStructuredList& list = *( ( iResponses[aIndex] ).iList );
    TInt counter = iResponses[aIndex].iCounter;
    const TInt parts = iResponses[aIndex].iParts;

    __ASSERT_DEBUG( list.Count() > 0, User::Invariant() );
    __ASSERT_DEBUG( counter * ( parts + 1 ) < list.Count(), User::Invariant() );

    counter++;

    if ( counter == ( list.Count() / ( parts + 1 ) ) )
        {
        iResponses[aIndex].iCounter = 0;
        }
    else
        {
        iResponses[aIndex].iCounter = counter;
        }

    RDEBUG_1( _L( "CStartupAdaptationStubModel::UpdateCounter finished. New counter is %d" ), iResponses[aIndex].iCounter );
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::ReadStructuredListL
//
// -----------------------------------------------------------------------------
//
void CStartupAdaptationStubModel::ReadStructuredListL(
    const TInt aNumParts,
    TLex& aLexer,
    CStructuredList& aList )
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::ReadStructuredListL." ) );

    while ( !aLexer.Eos() )
        {
        aList.AppendL( ReadDurationL( aLexer ) );

        TUint val( 0 );
        User::LeaveIfError( aLexer.Val( val, EHex ) );
        aList.AppendL( val );

        for ( TInt i = 0; i < aNumParts - 1; i++ )
            {
            if ( aLexer.Get() != ',' ) User::Leave( KErrCorrupt );

            User::LeaveIfError( aLexer.Val( val, EHex ) );
            aList.AppendL( val );
            }

        if ( !aLexer.Eos() && aLexer.Get() != ';' ) User::Leave( KErrCorrupt );
        }

    if ( aList.Count() == 0 ) User::Leave( KErrCorrupt );

    RDEBUG_1( _L( "CStartupAdaptationStubModel::ReadStructuredListL finished. List length: %d" ), aList.Count() );
    }


// -----------------------------------------------------------------------------
// CStartupAdaptationStubModel::ReadDurationL
//
// -----------------------------------------------------------------------------
//
TInt CStartupAdaptationStubModel::ReadDurationL( TLex& aLexer )
    {
    RDEBUG( _L( "CStartupAdaptationStubModel::ReadDurationL." ) );

    TInt val = KDefaultDuration;
    if ( aLexer.Peek() == '[' ) // Duration value is written to file
        {
        aLexer.Inc();
        User::LeaveIfError( aLexer.Val( val ) );
        if ( aLexer.Get() != ']' )
            {
            User::Leave( KErrCorrupt );
            }
        }

    RDEBUG_1( _L( "CStartupAdaptationStubModel::ReadDurationL finished with %d." ), val );
    return val;
    }