networkhandling/networkhandlingengine/NetworkHandlingGsmSrc/CNWNetworkViagBaseEngine.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:15:03 +0100
branchRCL_3
changeset 20 987c9837762f
parent 19 7d48bed6ce0c
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2002-2009 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 CNWNetworkViagBaseEngine
*                class member functions.
*
*/


// INCLUDE FILES
#include    <ctsydomainpskeys.h> 
#include    <e32property.h>
#include    <PSVariables.h>
#include    <startupdomainpskeys.h>

#include    "CNWNetworkViagBaseEngine.h"
#include    "CNWNetworkViagCbEngine.h"
#include    "CNWNetworkViagLcEngine.h"
#include    "NWLogger.h"
#include    "CNWNetworkViagRefresh.h"
#include    "CNWNetworkViagSimReader.h"
#include    "CNWNetworkSystemEventMonitor.h"
#include    "CNWGsmMessageHandler.h"
#include    "NWPanic.pan"
#include    "NetworkHandlingDomainPSKeys.h"
#include    "CNWNetworkViagTimer.h"

// CONSTANTS
const TUint KNWzero = 0;
const TInt KArrayCount = 8;
const TInt KNWTimeOut = 2000000;

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

// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::CNWNetworkViagBaseEngine
// C++ default constructor can NOT contain any code, that
// might leave.
// ----------------------------------------------------------------------------
//
CNWNetworkViagBaseEngine::CNWNetworkViagBaseEngine(
        CNWGsmNetworkCellReselectionHandler& aOwner,
        CNWGsmMessageHandler& aMessageHandler,
        RMmCustomAPI& aCustomAPI,
        TNWInfo& aNetworkInfo,
        TNWInterInfo& aInterNetworkInfo
         ):
           iOwner ( aOwner ),
           iMessageHandler( aMessageHandler ),
           iCustomAPI( aCustomAPI ),
           iNWNetworkInfo( aNetworkInfo ),
           iInterNetworkInfo( aInterNetworkInfo ),
           iLcSupported ( EFalse ),
           iCbActivation( EFalse ),
           iSimOk ( EFalse ),
           iActivation( EFalse ),
           iInitReady( ),
           iReadingOnGoing( EFalse )
    {
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::CNWNetworkViagBaseEngine() Called." );
    }

// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::ConstructL
// Symbian 2nd phase constructor can leave.
// ----------------------------------------------------------------------------
//
void CNWNetworkViagBaseEngine::ConstructL()
    {
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::ConstructL() Begin." );

    RProperty::TType type( RProperty::EInt );
    TSecurityPolicy readPolicy( ECapability_None );
    TSecurityPolicy writePolicy( ECapabilityWriteDeviceData );
    TInt err = RProperty::Define( KPSUidNetworkInfo, 
                                KNWHomeZoneStatus, 
                                type, 
                                readPolicy, 
                                writePolicy );
    
    //An error of KErrAlready exists should be ignored, as this only
    //indicates that some other code int system is also interested in the 
    //value and has created the property.
    if ( err != KErrNone && err != KErrAlreadyExists )
        {
        NWLOGSTRING2( KNWERROR, "NW: CNWNetworkViagBaseEngine::ConstructL \
                RProperty::Define error: %d .", err );
        User::Leave( err );
        }    
       
    RProperty::Set( KPSUidNetworkInfo, KNWHomeZoneStatus, ENWNone );
    
    iSimStateMonitor = CNWNetworkSystemEventMonitor::NewL( *this,  
                                                        KPSUidStartup, 
                                                        KPSSimStatus ); 
    
    iCallStateMonitor = CNWNetworkSystemEventMonitor::NewL( 
            *this, KPSUidCtsyCallInformation, KCTsyCallState );    

    iGPRSStateMonitor = CNWNetworkSystemEventMonitor::NewL( 
            *this, KUidSystemCategory,KPSUidGprsStatusValue );

    iViagCbEngine = CNWNetworkViagCbEngine::NewL( *this, 
                                                iNWNetworkInfo, 
                                                iCustomAPI, 
                                                iInterNetworkInfo, 
                                                iOwner );

   // Sim status monitor.
    iViagSimReader = CNWNetworkViagSimReader::NewL( *this,  iCustomAPI );

    iViagLcEngine = CNWNetworkViagLcEngine::NewL( *this, 
                                                iNWNetworkInfo, 
                                                iCustomAPI, 
                                                iInterNetworkInfo );
                                                
    iZoneTags = new ( ELeave ) CZoneTagsArray( 1 );
    iZoneTags->ResizeL( KArrayCount );
    iSPNEFRead = ETrue;
    iNPNEFRead = ETrue;
    iProgEFRead = ETrue;
    iViagEFRead = ETrue;
    iTimer = CNWNetworkViagTimer::NewL();
    
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::ConstructL() End." );
    }

// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::NewL
// Two-phased constructor.
// ----------------------------------------------------------------------------
//
CNWNetworkViagBaseEngine* CNWNetworkViagBaseEngine::NewL(
                CNWGsmNetworkCellReselectionHandler& aOwner,
                CNWGsmMessageHandler& aMessageHandler,
                RMmCustomAPI& aCustomAPI,
                TNWInfo& aNetworkInfo,
                TNWInterInfo& aInterNetworkInfo
                )
    {
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::NewL() Begin." );
    
    CNWNetworkViagBaseEngine* self = new (ELeave) CNWNetworkViagBaseEngine( 
            aOwner, aMessageHandler, aCustomAPI, aNetworkInfo, 
            aInterNetworkInfo );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::NewL() End." );
    return self;
    }

    
// Destructor
CNWNetworkViagBaseEngine::~CNWNetworkViagBaseEngine()
    {
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::~CNWNetworkViagBaseEngine() Begin." );
    delete iCharacterSetConverter;
    iFs.Close();
    delete iViagRefresh;
    delete iZoneTags;
    delete iViagLcEngine;
    delete iViagSimReader;
    delete iViagCbEngine;
    delete iGPRSStateMonitor;
    delete iCallStateMonitor;
    delete iSimStateMonitor;

    StopTimer();
    delete iTimer;
    
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::~CNWNetworkViagBaseEngine() End." );
    }

// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::CellReselection
// Is called by CNWNetworkCurrentNetworkMonitor in case of cell re-selection.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CNWNetworkViagBaseEngine::CellReselection()
    {
    NWLOGSTRING( KNWOBJECT,
        "NW: CNWNetworkViagBaseEngine::CellResection() Begin" );

    // SIM OK
    // VIAG IMSI OK
    // System UP ...

    NWLOGSTRING2( KNWOBJECT, "NW: CNWNetworkViagBaseEngine::CellResection \
                        iSimOk = %d ", iSimOk );
    // Sim is ok and imsi is right
    if ( iSimOk && IsViagImsi() )
        {
        // ... System is ready to proceed with HomeZone algoritmh(s)!!
        if ( iInitReady == EInitReady )
            {
            iViagActiveAlgo = EWNAlgoNone ;
            NWLOGSTRING( KNWOBJECT, 
                "NW: CNWNetworkViagBaseEngine::CellReselection StopCbAlgo()" );
            iViagCbEngine->StopCbAlgo();
            //  general activation is in default ETrue and CB activation EFalse   
            iViagLcEngine->GetActivation( iActivation, iCbActivation );
            
            NWLOGSTRING3( KNWOBJECT, 
                "NW: CNWNetworkViagBaseEngine::CellResection \
                iActivation = %d, iCbActivation = %d ", 
                iActivation, iCbActivation );
            
            NWLOGSTRING2( KNWOBJECT, 
                "NW: CNWNetworkViagBaseEngine::CellResection \
                iNetworkMode = %d", iNWNetworkInfo.iNetworkMode );

            if ( iActivation )
                {
                if ( iNWNetworkInfo.iNetworkMode == ENWModeWcdma )  // Network mode is WCDMA AND
                    {
                    if( iLcSupported )
                        {
                        iViagActiveAlgo = EWNAlgoLc ;    // UICC is "new geration" O2 de UICC    
                        }
                    }
                else  // GSM                                                                                // Network mode is GSM 
                    {
                    // Gsm mode + there is NOT gsm cells subscribed in LAC files
                    // Gsm mode + Cb-activation bit is "ON"
                    // Gsm mode + UICC is NOT "new geration" O2 de UICC 
                    iViagActiveAlgo = EWNAlgoCb ;       
                    if ( iViagLcEngine->IsGsmCellSubscribed()  )  // There is subscribed  gsm cells in LAC files.
                        {
                        if ( !iCbActivation )   // AND Cb-activation bit is off.
                            {
                            iViagActiveAlgo = EWNAlgoLc ;           
                            }                   
                        }
                    }
                }
            NWLOGSTRING2( KNWOBJECT, 
                "NW: CNWNetworkViagBaseEngine::CellReselection(),\
                iAreaKnown = %d",iInterNetworkInfo.iAreaKnown );
            // Reset  the indications
            WriteViagValues( ENWViagIndicatorTypeNone, KNWzero ); 
            if ( iNWNetworkInfo.iStatus == ENWStatusCurrent 
                 && iInterNetworkInfo.iAreaKnown )
                {
                if ( iViagActiveAlgo == EWNAlgoLc )
                    {
                    NWLOGSTRING( KNWOBJECT, 
                        "NW: CNWNetworkViagBaseEngine::ACTIVE ALGO ***LC***" );
                    iViagLcEngine->CellReselection();
                    }
                else if( iViagActiveAlgo == EWNAlgoCb )
                    {
                    NWLOGSTRING( KNWOBJECT, 
                        "NW: CNWNetworkViagBaseEngine::ACTIVE ALGO ***CB***" );
                    iViagCbEngine->CellReselection();
                    }

                else if ( iViagActiveAlgo == EWNAlgoNone )
                    {
                    NWLOGSTRING( KNWOBJECT, 
                        "NW: CNWNetworkViagBaseEngine::ACTIVE ALGO ***NONE***" );
                    }
                }
            }
        // ... System is NOT yet fully initialised
        else if( iInitReady == EInitNotReady && !iCharacterSetConverter ) 
            {
            TRAP_IGNORE( InitializeCharSetConverterL() );
            NWLOGSTRING( KNWOBJECT, "NW: CNWNetworkViagBaseEngine::CellResection \
                    System is NOT yet fully initialised " );
            ViagInitialize(); 
            // Sat server is not up in startup 
            iActiveCall = EFalse;
            }
        }
    
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::CellResection() End" );
    }

    
// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::SatRefreshCompleteNotification
// Gets called when satrefresh is complete.
// ----------------------------------------------------------------------------
//   
void CNWNetworkViagBaseEngine::SatRefreshCompleteNotification()
    {
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::SatRefreshCompleteNo\
        tification() Begin" );
    
    // When the HZ file of caches are refreshed then notify CB-Engine.
    if( iViagCbEngine )
        {
        iViagCbEngine->SatRefreshCompleteNotification(); 
        }
    
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::SatRefreshCompleteNotification end" );
    }

// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::ViagInitialize
// Initialize viag elements files.
// ----------------------------------------------------------------------------
//   
void CNWNetworkViagBaseEngine::ViagInitialize()
    {               
    NWLOGSTRING( KNWOBJECT, 
            "NW: CNWNetworkViagBaseEngine::ViagInitialize() Begin" );
    iInitReady = EInitOngoing;
    // In start up read all elementary files that are needed.
    if ( iViagSimReader )
        {
        iViagSimReader->SetElementFile( EFileSettings );
        iViagSimReader->SetElementFile( EFileSubscribedOne );
        iViagSimReader->SetElementFile( EFileSubscribedTwo );
        iViagSimReader->SetElementFile( EFileSubscribedThree );
        iViagSimReader->SetElementFile( EFileSubscribedFour );
        iViagSimReader->SetElementFile( EFileTags );
        iViagSimReader->ReadSimFile();   
        }
    NWLOGSTRING( KNWOBJECT, 
            "NW: CNWNetworkViagBaseEngine::ViagInitialize() Complete" );
    }

// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::UpdateCache
// Update cache
// ----------------------------------------------------------------------------
//   
TBool CNWNetworkViagBaseEngine::UpdateCache( 
        TNWNetworkElementFile aElementFile, 
        const TDesC8& aResponse )
    {
    NWLOGSTRING2( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::UpdateCache() Begin\
        , aElementFile = 0x%x", aElementFile );  
    
    NWLOGSTRING2( KNWINT,
        "NW: CNWNetworkViagBaseEngine::UpdateCache(),\
        iActivation = %d", iActivation ); 
    
    ASSERT( iViagLcEngine );
    ASSERT( iViagCbEngine );

    if( iViagLcEngine )
        {
        if ( aElementFile == EFileSettings ||
                ( aElementFile != EFileSettings && iActivation ) )
            {
            iViagLcEngine->ParseResult( aElementFile ,  aResponse );
            if ( !iActivation )
                {
                iViagLcEngine->GetActivation( iActivation, iCbActivation );
                }
            if ( aElementFile == EFileTags && iInitReady == EInitOngoing )
                {
                iInitReady = EInitReady;
                if( iViagCbEngine )
                    {
                    iViagCbEngine->InitilizeCaches();
                    iViagCbEngine->UpdateViagHzParams();
                    }
                }
            }
        }
        
    NWLOGSTRING2( KNWOBJECT, "NW: CNWNetworkViagBaseEngine::UpdateCache() \
            End, length of aResponse = %d", aResponse.Length() );
    return iActivation;    
    }

// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::SetLcNotSupported
// Set LC support to False.
// ----------------------------------------------------------------------------
//   
void  CNWNetworkViagBaseEngine::SetLcSupported( TBool aLcSupported )
    {
    NWLOGSTRING2( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::SetLcSupported() \
        Begin, iLcSupported = %d  ", aLcSupported );
    
    ASSERT( iViagLcEngine );
    ASSERT( iViagCbEngine );
    
    iLcSupported = aLcSupported;
    if ( iLcSupported == EFalse )
        {
        iInitReady = EInitReady;
        if ( !iActivation )
            {
            iViagLcEngine->GetActivation( iActivation, iCbActivation );
            }
        if( iViagCbEngine && iActivation )
            {
            iViagCbEngine->InitilizeCaches();
            iViagCbEngine->UpdateViagHzParams();
            // If cell information is allready avaiable call cell reselection.
             if ( iInterNetworkInfo.iCellId != 0 )
                {
                CellReselection();       
                }
            }
        }
    
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::SetLcSupported() end" );
    }
// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::SendMessage
// Reroutes a message to the Client object.
// ----------------------------------------------------------------------------
// 
void CNWNetworkViagBaseEngine::SendMessage(
        MNWMessageObserver::TNWMessages aMessage ) // send message
    {
    NWLOGSTRING2( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::SendMessage(),\
         aMessage = %d", aMessage );
    
    iMessageHandler.SendMessage( aMessage );
    
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::SendMessage() End" );
    }
    
    
   
// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::WriteViagValues
// Writes Viag-values to networkinfo, shared data and system agent.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CNWNetworkViagBaseEngine::WriteViagValues(
    const  TNWViagIndicatorType aIndicatorType,    //Indicates which zone it is
    const TInt& aZoneId )       // Viag text 
    {

    NWLOGSTRING3( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::WriteViagValues() \
        Begin, aIndicatorType = %d, aZoneId = %d", 
        aIndicatorType,aZoneId );

    TInt zoneType = ENWNone;

    // Intilise internal datastructure by defaul values (Not in any zone)
    iNWNetworkInfo.iViagIndicatorType = ENWViagIndicatorTypeNone;
    iNWNetworkInfo.iViagTextTag.Zero();

    // Get zone values
    switch( aIndicatorType )
        {
        // HomeZone
        case ENWViagIndicatorTypeHomeZone:
            if( !iActiveCall )
                {
                NWLOGSTRING2( KNWOBJECT, 
                    "NW: CNWNetworkViagBaseEngine::WriteViagValues() \
                    iZoneTags->Count = %d", iZoneTags->Count() );
                
                if ( aZoneId < iZoneTags->Count() )
                    {
                    TNWZoneTags zoneTags = iZoneTags->At( aZoneId );
                    iNWNetworkInfo.iViagIndicatorType = ENWViagIndicatorTypeHomeZone;
                    iNWNetworkInfo.iViagTextTag.Copy( zoneTags.iZoneTag ); //Array starts from 0.
                    }
                zoneType = ENWHomeZone;
                }
            break;
         //CityZone and the other known zones
         case ENWViagIndicatorTypeCityZone:
            if( !iActiveCall )
                {
                NWLOGSTRING2( KNWOBJECT, 
                    "NW: CNWNetworkViagBaseEngine::WriteViagValues() \
                    iZoneTags->Count = %d", iZoneTags->Count() );
                
                if ( aZoneId < iZoneTags->Count() )
                    {
                    TNWZoneTags zoneTags = iZoneTags->At( aZoneId );
                    iNWNetworkInfo.iViagIndicatorType = ENWViagIndicatorTypeCityZone;
                    iNWNetworkInfo.iViagTextTag.Copy( zoneTags.iZoneTag ); //Array starts from 0.
                    }
                zoneType = ENWCityZone;
                }
             break;
             // NoZone or UnknownZone
         case ENWViagIndicatorTypeNone:
         default:
             break;
         }
               

    // Update the PubSub key value
    TInt err = RProperty::Set( KPSUidNetworkInfo, KNWHomeZoneStatus, zoneType );
    if ( err != KErrNone )
        {
        NWLOGSTRING2( KNWERROR, 
            "NW: CNWNetworkViagEngine::WriteViagValues: RProperty\
            ::Set error: %d", err );
        }

    NWLOGSTRING2( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::WriteViagValues() Zone Text %S",
        &iNWNetworkInfo.iViagTextTag );
    NWLOGSTRING2( KNWINT,
        "NW: CNWNetworkViagEngine::WriteViagValues: RProperty\
        ::Set, zoneType = %d",
        zoneType );

    // Send upodate messages
    SendMessage( MNWMessageObserver::ENWMessageCurrentHomeZoneMessage );
   
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::WriteViagValues() End" );
    }
    

// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::HandleSystemEventL
// Handles system events. 
// ----------------------------------------------------------------------------
//
void CNWNetworkViagBaseEngine::HandleSystemEventL( 
            const TInt aValue,
            const TInt aState )
    {

    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::HandleSystemEventL() -- Begin -- ");
    NWLOGSTRING2( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine ::   State : %d", aState );
    NWLOGSTRING2( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine ::   aValue : %d", aValue );
    
    if ( aValue == KPSSimStatus && aState == ESimUsable )      
        {
        NWLOGSTRING( KNWOBJECT, "NW: CNWNetworkViagBaseEngine ::1");    
              
        if ( !iSimOk  )
            {
            NWLOGSTRING( KNWOBJECT, 
                "NW: CNWNetworkViagBaseEngine::HandleSystemEventL()\
                 -- SIM OK -- ");
            iSimOk = ETrue;
            CellReselection();
            }
        }
    if ( aValue == KCTsyCallState && iInitReady == EInitReady )
        {
        if ( aState == EPSCTsyCallStateDialling ||
            aState == EPSCTsyCallStateRinging ||
            aState == EPSCTsyCallStateAlerting )
            {
            iActiveCall = ETrue; 
            WriteViagValues( ENWViagIndicatorTypeNone, KNWzero );
            }
   
        else if ( aState == EPSCTsyCallStateNone )
            {
            iActiveCall = EFalse;
            StartTimer();
            }              
        }
        
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::HandleSystemEventL() -- End -- ");
    }


// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::IsViagImsi
// Checks if we got Viag SIM card in ME.
// SubscriberId is checked in the CNWNetworkCommand-class. Viag IMSI has fixed
// prefix which we compare here.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
TBool CNWNetworkViagBaseEngine::IsViagImsi( ) const
    {
    NWLOGSTRING( KNWOBJECT, 
            "NW: CNWNetworkViagBaseEngine::IsViagImsi() Begin" );
    
    TBool ret( EFalse );

    TNWSubscriberId subId( iInterNetworkInfo.iSubscriberId );

    NWLOGSTRING2( KNWINT, 
        "NW: CNWNetworkViagBaseEngine::IsViagImsi, subId = %S", &subId );

    if ( subId.Length() >= KNWViagMinImsiLength )
        {
        ret = subId.Left( KNWViagMinImsiLength ).
            Compare( KNWViagImsiIdentity ) == KErrNone;
        //Checks 3g Viag SIM.
        if ( !ret )
            {
            ret = subId.Left( KNWViagMinImsiLength ).
            Compare( KNWViagImsi3gIdentity ) == KErrNone;
            }
        }
    
    NWLOGSTRING2( KNWOBJECT, 
            "NW: CNWNetworkViagBaseEngine::IsViagImsi() End, \
            ret = %d", ret );
    
    return ret;
    }

// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::StartupReady
// Start Sat Server if it is not started in start up.
// ----------------------------------------------------------------------------
// 
void CNWNetworkViagBaseEngine::StartupReadyL()
    {
    NWLOGSTRING( KNWOBJECT, 
            "NW: CNWNetworkViagBaseEngine::StartupReadyL() Begin" );
    
    // Sat server is not up in starup 
    if ( !iViagRefresh )
        {
        NWLOGSTRING( KNWOBJECT, 
            "NW: CNWNetworkViagBaseEngine::StartupReady() \
            Creating ViagRefresh  ");
        
        iViagRefresh = CNWNetworkViagRefresh::NewL( 
                *this, iCustomAPI, *iViagSimReader, iReadingOnGoing );
        
        NWLOGSTRING( KNWOBJECT, 
            "NW: CNWNetworkViagBaseEngine::StartupReady() \
            Creating ViagRefresh  ");
        iOwner.HandleCellReselection();
        }
    
    NWLOGSTRING( KNWOBJECT, 
            "NW: CNWNetworkViagBaseEngine::StartupReadyL() End" );
    }

// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::SetZoneTag
// Sets Zone tags to the zonetags Array.
// ----------------------------------------------------------------------------
//   
void CNWNetworkViagBaseEngine::SetZoneTag( 
        TInt aZoneId, const TDesC& aZoneText )
    {
    NWLOGSTRING( KNWOBJECT, "NW: CNWNetworkViagBaseEngine::SetZoneTag()begin ");
    NWLOGSTRING2( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::SetZoneTag() aZoneId = %d", aZoneId );
    if ( aZoneId < iZoneTags->Count() )
        {
        TNWZoneTags& zoneTag = iZoneTags->At(aZoneId);
        zoneTag.iZoneTag.Copy( aZoneText.Left(KNWZoneTagLength) );
        NWLOGSTRING2( KNWOBJECT,
            "NW: CNWNetworkViagBaseEngine::SetZoneTag() aZoneText = %S",
            &(zoneTag.iZoneTag ));
        }
    NWLOGSTRING( KNWOBJECT, "NW: CNWNetworkViagBaseEngine::SetZoneTag() end ");
    }

// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::CompleteRefresh
// Calls RefreshEFRead Method to complete refresh.
// ----------------------------------------------------------------------------
//   
void CNWNetworkViagBaseEngine::CompleteRefresh()
    {
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::CompleteRefresh() Begin "); 
    NWLOGSTRING2( KNWINT, 
        "NW: CNWNetworkViagBaseEngine::CompleteRefresh(),\
        ReadingOnGoing = %d",iReadingOnGoing ); 
    NWLOGSTRING3( KNWINT, 
        "NW: CNWNetworkViagBaseEngine::CompleteRefresh(), \
        iSPNEFRead = %d, iNPNEFRead = %d", iSPNEFRead, iNPNEFRead );
    NWLOGSTRING3( KNWINT, 
        "NW: CNWNetworkViagBaseEngine::CompleteRefresh(), \
        iProgEFRead = %d, iViagEFRead = %d", iProgEFRead, iViagEFRead );
    
    if ( iSPNEFRead && iNPNEFRead && iProgEFRead && iViagEFRead )
        {
        NWLOGSTRING( KNWOBJECT, 
            "NW: CNWNetworkViagBaseEngine::RefreshEFRead() called "); 
        iViagRefresh->RefreshEFRead();
        if ( iViagActiveAlgo == EWNAlgoLc )
            {
            CellReselection();
            }
        }   
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::CompleteRefresh() End "); 
    }
    
// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::UpdateEFReadingState
// Calls RefreshEFRead Method to complete refresh.
// ----------------------------------------------------------------------------
//     
void CNWNetworkViagBaseEngine::UpdateEFReadingState( 
        const TNWRead& aElementFile, TBool aReadStatus )
    {
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::UpdateEFReadingState() Begin ");
    NWLOGSTRING2( KNWINT, 
        "NW: CNWNetworkViagBaseEngine::UpdateEFReadingState(),\
        aElementFile = %d; SPN = 0, NPN = 1, ProgOPN = 2, ViagHZ = 3",
        ( TInt )aElementFile ); 
    NWLOGSTRING2( KNWINT, 
        "NW: CNWNetworkViagBaseEngine::UpdateEFReadingState(), \
        aReadStatus = %d",aReadStatus ); 
    NWLOGSTRING2( KNWINT,
        "NW: CNWNetworkViagBaseEngine::UpdateEFReadingState(), \
            iReadingOnGoing = %d", iReadingOnGoing ); 
    
    if ( iReadingOnGoing )
        {
        switch ( aElementFile ) 
            {
            case ESPNEFRead:
                {
                iSPNEFRead = aReadStatus;
                break;
                }
            case ENPNEFRead:
                {
                iNPNEFRead = aReadStatus;
                break;
                }
            case EProgEFRead:
                {
                iProgEFRead = aReadStatus;
                break;
                }
            case EViagEFRead:
                {
                iViagEFRead = aReadStatus;
                break;
                }
            case EFullFileChange:
                {
                iSPNEFRead = aReadStatus;
                iNPNEFRead = aReadStatus;
                iProgEFRead = aReadStatus;
                iViagEFRead = aReadStatus;
                break;
                }
            default:
                break;
            }
        if ( aReadStatus )
            {
            CompleteRefresh();
            } 
        }
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::UpdateEFReadingState() End "); 
    }
    
// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::StartTimer
// Starts the timer for waiting Cell change notification.
// ----------------------------------------------------------------------------
//        
void CNWNetworkViagBaseEngine::StartTimer()
    {
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::StartTimer() Begin ");
    
    StopTimer();
    if( iTimer )
        {
        iTimer->After( KNWTimeOut, this ); // 2 sec
        }
    
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::StartTimer() End ");
    }

// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::StopTimer
// Stops the timer
// ----------------------------------------------------------------------------
// 
void CNWNetworkViagBaseEngine::StopTimer()
    {
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::StopTimer() Begin ");
    
    if( iTimer )
        {
        iTimer->Cancel();
        }
    
    NWLOGSTRING( KNWOBJECT, 
        "NW: CNWNetworkViagBaseEngine::StopTimer() End ");
    }

// ----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::HandleTimeOut
// Calls CellReselection if no notification came.
// ----------------------------------------------------------------------------
//
void CNWNetworkViagBaseEngine::HandleTimeOut()
    {
    NWLOGSTRING( KNWOBJECT, 
            "NW: CNWNetworkViagBaseEngine::HandleTimeOut() Begin ");    
    CellReselection();  
    NWLOGSTRING( KNWOBJECT, 
            "NW: CNWNetworkViagBaseEngine::HandleTimeOut() End ");
    }    

// -----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::InitializeCharSetConverterL
// Initializes CharacterSetConverter and connects to file server session
// -----------------------------------------------------------------------------
//
void CNWNetworkViagBaseEngine::InitializeCharSetConverterL()
    {
    NWLOGSTRING( KNWOBJECT, "NW: CNWNetworkViagBaseEngine::InitalizecharSetConverterL() ");
    User::LeaveIfError( iFs.Connect() );
    iCharacterSetConverter = CCnvCharacterSetConverter::NewL();

    CCnvCharacterSetConverter::TAvailability availability = iCharacterSetConverter->PrepareToConvertToOrFromL(
            KCharacterSetIdentifierSms7Bit, iFs );

    if ( availability == CCnvCharacterSetConverter::ENotAvailable )
        {
        delete iCharacterSetConverter;
        iCharacterSetConverter = NULL;
        }
    NWLOGSTRING( KNWOBJECT, "NW: CNWNetworkViagBaseEngine::InitalizecharSetConverterL() end");
    }

// -----------------------------------------------------------------------------
// CNWNetworkViagBaseEngine::DefaultAlphabetDecode
// Decodes 7-bit text representation.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CNWNetworkViagBaseEngine::DefaultAlphabetDecode(
  const TDesC8& aTag, TDes& aZoneText )
    {
    NWLOGSTRING( KNWOBJECT, "NW: CNWNetworkViagBaseEngine::DefaultAlphabetDecode()");
    // Start conversion
    aZoneText.Copy( aTag );
    TBuf16<KNWZoneTagLength> generatedUnicode;
    TInt state( CCnvCharacterSetConverter::KStateDefault ); // has to be ref.
    if ( iCharacterSetConverter )
        {
        TInt returnValue = iCharacterSetConverter->ConvertToUnicode(
                generatedUnicode, aTag, state );

        // returnValue contains the number of characters that were not converted or
        // error value.
        if ( returnValue >= KErrNone )
            {
            aZoneText.Copy( generatedUnicode );
            }
        }
  NWLOGSTRING( KNWOBJECT, "NW: CNWNetworkViagBaseEngine::DefaultAlphabetDecode() end");
  }

//  End of File