diff -r 000000000000 -r e686773b3f54 phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CPhone.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CPhone.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,868 @@ +/* +* Copyright (c) 2002-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: Opens ETel RTelServer and RMobilePhone +* +*/ + + + +// INCLUDE FILES +#include "CPhone.h" + +// From Virtual Phonebook +#include "CServiceTableCmd.h" +#include "CUsimAdnStore.h" +#include "CAdnStore.h" +#include "CFdnStore.h" +#include "CSdnStore.h" +#include "COwnNumberStore.h" +#include "CSatRefreshNotifier.h" +#include "CBtSapNotification.h" +#include "TStoreParams.h" +#include "VPbkSimStoreImplError.h" +#include "CSimStatusNotification.h" +#include +#include +#include +#include +#include +#include + +// System includes +#include + +// DEBUG +#include + +namespace VPbkSimStoreImpl { + +// ----------------------------------------------------------------------------- +// CSimPdUtilities::ConvertStatus +// Converts ETel status to SIMPD status +// ----------------------------------------------------------------------------- +// +MVPbkSimPhone::TFDNStatus ConvertStatus(TInt aETelFDNStatus) + { + FUNC_ENTRY(); + MVPbkSimPhone::TFDNStatus status = MVPbkSimPhone::EFdnStatusUnknown; + + switch ( aETelFDNStatus ) + { + case RMobilePhone::EFdnNotActive: + { + status = MVPbkSimPhone::EFdnIsNotActive; + break; + } + case RMobilePhone::EFdnActive: + { + status = MVPbkSimPhone::EFdnIsActive; + break; + } + case RMobilePhone::EFdnPermanentlyActive: + { + status = MVPbkSimPhone::EFdnIsPermanentlyActive; + break; + } + case RMobilePhone::EFdnNotSupported: + { + status = MVPbkSimPhone::EFdnIsNotSupported; + break; + } + case RMobilePhone::EFdnUnknown: // FALLTHROUGH + default: + { + // Do nothing + break; + } + } + + FUNC_EXIT(); + return status; + } + +// ----------------------------------------------------------------------------- +// CPhone::CPhone +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPhone::CPhone( CSatRefreshNotifier& aSatNotifier, + CVPbkSimStateInformation& aSimStateInfo, + CBtSapNotification& aBtSapNotifier ) + : CActive( EPriorityStandard ), + iSatNotifier( aSatNotifier ), + iSimStateInfo( aSimStateInfo ), + iBtSapNotifier( aBtSapNotifier ) + { + FUNC_ENTRY(); + CActiveScheduler::Add(this); + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::~CPhone +// ----------------------------------------------------------------------------- +// +CPhone::~CPhone() + { + FUNC_ENTRY(); + Cancel(); + delete iSimStatus; + iSatNotifier.DeActivate( *this ); + iBtSapNotifier.RemoveObserver( *this ); + delete iAsyncOp; + delete iSTCommand; + iObservers.Close(); + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: RMobilePhone Close handle %d"), + iPhone.SubSessionHandle()); + iPhone.Close(); + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: RTelServer Close handle %d"),iTelServer.Handle()); + iTelServer.Close(); + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::ETelPhone +// ----------------------------------------------------------------------------- +// +RMobilePhone& CPhone::ETelPhone() + { + FUNC_ENTRY(); + return iPhone; + } + +// ----------------------------------------------------------------------------- +// CPhone::CreateStoreLC +// ----------------------------------------------------------------------------- +// +MVPbkSimCntStore* CPhone::CreateStoreLC( TStoreParams& aParams ) + { + FUNC_ENTRY(); + OpenETelPhoneL(); + + VPbkSimStoreImpl::CStoreBase* store = NULL; + + switch ( aParams.iId ) + { + case EVPbkSimAdnGlobalStore: + { + if ( USimAccessSupported() ) + { + store = VPbkSimStoreImpl::CUsimAdnStore::NewL( aParams ); + } + else + { + store = VPbkSimStoreImpl::CAdnStore::NewL( aParams ); + } + break; + } + case EVPbkSimFdnGlobalStore: + { + store = + VPbkSimStoreImpl::CFdnStore::NewL( aParams ); + break; + } + case EVPbkSimSdnGlobalStore: + { + store = + VPbkSimStoreImpl::CSdnStore::NewL( aParams ); + break; + } + case EVPbkSimONStore: + { + store = VPbkSimStoreImpl::COwnNumberStore::NewL( aParams ); + break; + } + default: + { + __ASSERT_DEBUG( EFalse, VPbkSimStoreImpl::Panic( + VPbkSimStoreImpl::ESimStoreNotSupportedYet ) ); + break; + } + } + + if ( store ) + { + CleanupStack::PushL( store ); + } + FUNC_EXIT(); + return store; + } + +// ----------------------------------------------------------------------------- +// CPhone::AddObserverL +// ----------------------------------------------------------------------------- +// +void CPhone::AddObserverL( MVPbkSimPhoneObserver& aObserver ) + { + FUNC_ENTRY(); + if ( iObservers.Find( &aObserver ) == KErrNotFound ) + { + iObservers.AppendL( &aObserver ); + } + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::RemoveObserver +// ----------------------------------------------------------------------------- +// +void CPhone::RemoveObserver( MVPbkSimPhoneObserver& aObserver ) + { + FUNC_ENTRY(); + TInt pos = iObservers.Find( &aObserver ); + if ( pos != KErrNotFound ) + { + iObservers.Remove( pos ); + } + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::RunL +// ----------------------------------------------------------------------------- +// +void CPhone::RunL() + { + FUNC_ENTRY(); + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl:CPhone::RunL: res: % d, ETel FDN status: %d"), + iStatus.Int(), iFdnStatus ); + + if ( iStatus == KErrNone ) + { + TInt conversion = ConvertStatus( iFdnStatus ); + + SendObserverMessageR( iObservers, + &MVPbkSimPhoneObserver::FixedDiallingStatusChanged, + conversion ); + } + + ActivateFDNNotification(); + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::BtSapDeactivated +// ----------------------------------------------------------------------------- +// +void CPhone::BtSapActivated() + { + FUNC_ENTRY(); + SendObserverMessageRVV( iObservers, + &MVPbkSimPhoneObserver::PhoneError, *this, + MVPbkSimPhoneObserver::EBtSapActive, KErrGeneral ); + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::BtSapDeactivated +// ----------------------------------------------------------------------------- +// +void CPhone::BtSapDeactivated() + { + FUNC_ENTRY(); + TRAPD( res, HandleBtSapDeactivationL() ); + if ( res != KErrNone ) + { + SendObserverMessageRVV( iObservers, + &MVPbkSimPhoneObserver::PhoneError, *this, + MVPbkSimPhoneObserver::ESystem, res ); + } + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::BtSapNotificationError +// ----------------------------------------------------------------------------- +// +void CPhone::BtSapNotificationError( TInt aError ) + { + FUNC_ENTRY(); + SendObserverMessageRVV( iObservers, + &MVPbkSimPhoneObserver::PhoneError, *this, + MVPbkSimPhoneObserver::ESystem, aError ); + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::DoCancel +// ----------------------------------------------------------------------------- +// +void CPhone::DoCancel() + { + FUNC_ENTRY(); + iPhone.CancelAsyncRequest( EMobilePhoneNotifyFdnStatusChange ); + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::OpenL +// ----------------------------------------------------------------------------- +// +void CPhone::OpenL( MVPbkSimPhoneObserver& aObserver ) + { + FUNC_ENTRY(); + MVPbkSimPhoneObserver::TErrorIdentifier errorId; + if ( SimUsableL( errorId ) ) + { + OpenETelPhoneL(); + + if ( !StartInitL() && iIsOpen ) + { + // store is open + CVPbkAsyncObjectCallback* callback = + VPbkEngUtils::CreateAsyncObjectCallbackLC( + *this, + &CPhone::DoOpenL, + &CPhone::DoOpenError, + aObserver ); + AsyncOpL()->CallbackL( callback ); + CleanupStack::Pop( callback ); + } + } + else + { + CVPbkAsyncObjectCallback* callback = + VPbkEngUtils::CreateAsyncObjectCallbackLC( + *this, + &CPhone::DoOpenWithErrorL, + errorId, + &CPhone::DoOpenError, + aObserver ); + AsyncOpL()->CallbackL( callback ); + CleanupStack::Pop( callback ); + } + + if ( iObservers.Find( &aObserver ) == KErrNotFound ) + { + iObservers.AppendL( &aObserver ); + } + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::Close +// ----------------------------------------------------------------------------- +// +void CPhone::Close( MVPbkSimPhoneObserver& aObserver ) + { + FUNC_ENTRY(); + if ( iAsyncOp ) + { + iAsyncOp->CancelCallback( &aObserver ); + } + + TInt index = iObservers.Find( &aObserver ); + if ( index != KErrNotFound ) + { + iObservers.Remove( index ); + } + + if ( iObservers.Count() == 0 ) + { + if ( iAsyncOp ) + { + iAsyncOp->Purge(); + } + } + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::USimAccessSupported +// ----------------------------------------------------------------------------- +// +TBool CPhone::USimAccessSupported() const + { + FUNC_ENTRY(); + TBool supported = EFalse; + TUint32 iccCaps; + + TInt result = iPhone.GetIccAccessCaps( iccCaps ); + if ( result == KErrNone && + iccCaps & RMobilePhone::KCapsUSimAccessSupported ) + { + supported = ETrue; + } + FUNC_EXIT(); + return supported; + } + +// ----------------------------------------------------------------------------- +// CPhone::ServiceTable +// ----------------------------------------------------------------------------- +// +TUint32 CPhone::ServiceTable() const + { + FUNC_ENTRY(); + return iServiceTable; + } + +// ----------------------------------------------------------------------------- +// CPhone::FixedDialingStatus +// ----------------------------------------------------------------------------- +// +MVPbkSimPhone::TFDNStatus CPhone::FixedDialingStatus() const + { + FUNC_ENTRY(); + RMobilePhone::TMobilePhoneFdnStatus etelStatus = RMobilePhone::EFdnUnknown; + TFDNStatus ownStatus = EFdnStatusUnknown; + + TInt result = iPhone.GetFdnStatus( etelStatus ); + if ( result == KErrNone ) + { + ownStatus = ConvertStatus( etelStatus ); + } + FUNC_EXIT(); + return ownStatus; + } + +// ----------------------------------------------------------------------------- +// CPhone::CommandDone +// ----------------------------------------------------------------------------- +// +void CPhone::CommandDone( MVPbkSimCommand& aCommand ) + { + FUNC_ENTRY(); + if ( iSTCommand == &aCommand ) + { + // Delete the service table command + delete iSTCommand; + iSTCommand = NULL; + + // Activate observing BT SAP and SAT refresh. + TRAPD( res, ActivateBtSapAndSatRefreshL() ); + if ( res != KErrNone ) + { + CommandError( aCommand, res ); + } + else if ( !iIsOpen ) + { + // The phone is open after service table have been read + iIsOpen = ETrue; + SendObserverMessageR( iObservers, + &MVPbkSimPhoneObserver::PhoneOpened, *this ); + } + else + { + // It was already open so inform observers about updated table + SendObserverMessageR( iObservers, + &MVPbkSimPhoneObserver::ServiceTableUpdated, iServiceTable ); + } + + // Service table is reloaded when SIM is refreshed and we + // have to tell SAT server that we have updated ourselves. + CompleteSatRefresh(); + } + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::CommandError +// ----------------------------------------------------------------------------- +// +void CPhone::CommandError( MVPbkSimCommand& aCommand, TInt aError ) + { + FUNC_ENTRY(); + if ( iSTCommand == &aCommand ) + { + delete iSTCommand; + iSTCommand = NULL; + SendObserverMessageRVV( iObservers, + &MVPbkSimPhoneObserver::PhoneError, *this, + MVPbkSimPhoneObserver::ESystem, aError ); + // Service table is reloaded when SIM is refreshed. If this fails + // SAT server is still waiting client notifying. + CompleteSatRefresh(); + } + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::SimRefreshed +// ----------------------------------------------------------------------------- +// +void CPhone::SimRefreshed( TUint32 aSimRefreshFlags, + MSimRefreshCompletion& aSimRefreshCompletion ) + { + FUNC_ENTRY(); + // SAT notifier tells that SIM has been refreshed + VPBK_DEBUG_PRINT( + VPBK_DEBUG_STRING("CPbkSimStoreImpl:CPhone::SimRefreshed [%x]"), aSimRefreshFlags ); + // Check if there are elementary files that this class is interested in. + // In practise service table file. + TBool completeNow = ETrue; + if ( aSimRefreshFlags & ElementaryFiles() ) + { + // Service table has been updated -> load service table asynchronously. + TRAPD( res, LoadServiceTableL() ); + VPBK_DEBUG_PRINT( + VPBK_DEBUG_STRING("CPbkSimStoreImpl:CPhone LoadServiceTableL [%i]"), res ); + if ( res != KErrNone ) + { + SendObserverMessageRVV( iObservers, + &MVPbkSimPhoneObserver::PhoneError, *this, + MVPbkSimPhoneObserver::ESystem, res ); + } + else + { + // Save completion to complete refresh later + iSimRefreshCompletion = &aSimRefreshCompletion; + completeNow = EFalse; + } + } + + // If we didn't start asyncrhonous update then complete refresh because + // SAT server is waiting that. + if ( completeNow ) + { + aSimRefreshCompletion.SatRefreshCompleted( *this, EFalse ); + } + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::AllowRefresh +// ----------------------------------------------------------------------------- +// +TBool CPhone::AllowRefresh( TUint32 /*aSimRefreshFlags*/ ) + { + FUNC_ENTRY(); + if ( iSTCommand ) + { + // If service table request is active then don't allow refresh yet + return EFalse; + } + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CPhone::ElementaryFiles +// ----------------------------------------------------------------------------- +// +TUint32 CPhone::ElementaryFiles() + { + FUNC_ENTRY(); + return KSTRefresh | KSimReset | KSimInit | + KSimInitFullFileChangeNotification | KUsimApplicationReset | + K3GSessionReset; + } + +// ----------------------------------------------------------------------------- +// CPhone::AsyncOpL +// ----------------------------------------------------------------------------- +// +CVPbkAsyncObjectOperation* CPhone::AsyncOpL() + { + FUNC_ENTRY(); + if ( !iAsyncOp ) + { + iAsyncOp = CVPbkAsyncObjectOperation::NewL(); + } + FUNC_EXIT(); + return iAsyncOp; + } + +// ----------------------------------------------------------------------------- +// CPhone::StartInitL +// ----------------------------------------------------------------------------- +// +TBool CPhone::StartInitL() + { + FUNC_ENTRY(); + if ( !iIsOpen && !iSTCommand ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: CPhone::StartInitL")); + + // phone is not open and service table is not currently loading + LoadServiceTableL(); + FUNC_EXIT(); + return ETrue; + } + FUNC_EXIT(); + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CPhone::OpenETelPhoneL +// ----------------------------------------------------------------------------- +// +void CPhone::OpenETelPhoneL() + { + FUNC_ENTRY(); + if ( !iTelServer.Handle() ) + { + User::LeaveIfError( iTelServer.Connect() ); + User::LeaveIfError( iTelServer.LoadPhoneModule( KMmTsyModuleName ) ); + // This enables extended errors from low level which are needed + // to get detailed information when saving contacts + TInt res = iTelServer.SetExtendedErrorGranularity( + RTelServer::EErrorExtended ); + // If no memory then leave otherwise continue -> application works + // with core errors too. Only some error notes are not shown. + if ( res == KErrNoMemory ) + { + User::Leave( res ); + } + } + + if ( !iPhone.SubSessionHandle() ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: RTelServer Connected handle %d"), + iTelServer.Handle()); + RTelServer::TPhoneInfo info; + const TInt firstPhoneIndex = 0; + User::LeaveIfError( iTelServer.GetPhoneInfo( + firstPhoneIndex , info ) ); + User::LeaveIfError( iPhone.Open( iTelServer, info.iName ) ); + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: RMobilePhone Open h%d"), + iPhone.SubSessionHandle()); + + ActivateFDNNotification(); + } + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::HandleBtSapDeactivationL +// ----------------------------------------------------------------------------- +// +void CPhone::HandleBtSapDeactivationL() + { + FUNC_ENTRY(); + OpenETelPhoneL(); + /// If already open -> send only open message + if ( !StartInitL() && iIsOpen ) + { + SendObserverMessageR( iObservers, + &MVPbkSimPhoneObserver::PhoneOpened, *this ); + } + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::ActivateBtSapAndSatRefreshL +// ----------------------------------------------------------------------------- +// +void CPhone::ActivateBtSapAndSatRefreshL() + { + FUNC_ENTRY(); + iSatNotifier.ActivateL( *this ); + iBtSapNotifier.AddObserverL( *this ); + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::DeActivateBtSapAndSatRefresh +// ----------------------------------------------------------------------------- +// +void CPhone::DeActivateBtSapAndSatRefresh() + { + FUNC_ENTRY(); + iSatNotifier.DeActivate( *this ); + iBtSapNotifier.RemoveObserver( *this ); + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::LoadServiceTable +// ----------------------------------------------------------------------------- +// +void CPhone::LoadServiceTableL() + { + FUNC_ENTRY(); + if ( !iSTCommand ) + { + iSTCommand = CServiceTableCmd::NewLC( *this, iServiceTable ); + CleanupStack::Pop(); // iSTCommand + iSTCommand->AddObserverL( *this ); + iSTCommand->Execute(); + } + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::SimUsableL +// ----------------------------------------------------------------------------- +// +TBool CPhone::SimUsableL( MVPbkSimPhoneObserver::TErrorIdentifier& aErrorId ) + { + FUNC_ENTRY(); + if ( !iSimStatus ) + { + iSimStatus = CSimStatusNotification::NewL(); + iSimStatus->AddObserverL( *this ); + } + TBool result = EFalse; + if ( iSimStateInfo.BTSapEnabledL() ) + { + aErrorId = MVPbkSimPhoneObserver::EBtSapActive; + } + else if ( iSimStatus->CurrentStatus() != VPbkSimStoreImpl::SimOkStatus ) + { + aErrorId = MVPbkSimPhoneObserver::ESimCardNotInserted; + } + else + { + result = ETrue; + } + FUNC_EXIT(); + return result; + } + +// ----------------------------------------------------------------------------- +// CPhone::ActivateFDNNotification +// ----------------------------------------------------------------------------- +// +void CPhone::ActivateFDNNotification() + { + FUNC_ENTRY(); + // Activate FDN activity notification + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: CPhone::ActivateFDNNotification")); + iPhone.NotifyFdnStatusChange(iStatus, iFdnStatus); + SetActive(); + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::CompleteSatRefresh +// ----------------------------------------------------------------------------- +// +void CPhone::CompleteSatRefresh() + { + FUNC_ENTRY(); + // If iSimRefreshCompletion exists it means that service table has + // been updated due to SAT refresh. We have to tell SAT server + // that we have done the update. + if ( iSimRefreshCompletion ) + { + iSimRefreshCompletion->SatRefreshCompleted( *this, EFalse ); + iSimRefreshCompletion = NULL; + } + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::SimStatusOk +// ----------------------------------------------------------------------------- +// +void CPhone::SimStatusOk() + { + FUNC_ENTRY(); + OpenETelPhoneL(); + /// If already open -> send only open message + if ( !StartInitL() && iIsOpen ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: CPhone::SimStatusOk Send phone opened")); + SendObserverMessageR( iObservers, + &MVPbkSimPhoneObserver::PhoneOpened, *this ); + } + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::SimStatusNotOk +// ----------------------------------------------------------------------------- +// +void CPhone::SimStatusNotOk() + { + FUNC_ENTRY(); + SendObserverMessageRVV( iObservers, + &MVPbkSimPhoneObserver::PhoneError, *this, + MVPbkSimPhoneObserver::ESimCardNotInserted, KErrGeneral ); + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::SimStatusUninitialized +// ----------------------------------------------------------------------------- +// +void CPhone::SimStatusUninitialized() + { + FUNC_ENTRY(); + SendObserverMessageRVV( iObservers, + &MVPbkSimPhoneObserver::PhoneError, *this, + MVPbkSimPhoneObserver::ESimCardNotInserted, KErrGeneral ); + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::SimStatusNotificationError +// ----------------------------------------------------------------------------- +// +void CPhone::SimStatusNotificationError( TInt /*aError*/ ) + { + FUNC_ENTRY(); + SendObserverMessageRVV( iObservers, + &MVPbkSimPhoneObserver::PhoneError, *this, + MVPbkSimPhoneObserver::ESimCardNotInserted, KErrGeneral ); + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::DoOpenL +// ----------------------------------------------------------------------------- +// +void CPhone::DoOpenL( MVPbkSimPhoneObserver& aObserver ) + { + FUNC_ENTRY(); + if ( iObservers.Find( &aObserver ) != KErrNotFound ) + { + aObserver.PhoneOpened( *this ); + } + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::DoOpenError +// ----------------------------------------------------------------------------- +// +void CPhone::DoOpenError( MVPbkSimPhoneObserver& aObserver, TInt aError ) + { + FUNC_ENTRY(); + if ( iObservers.Find( &aObserver ) != KErrNotFound ) + { + aObserver.PhoneError( *this, MVPbkSimPhoneObserver::ESystem, aError ); + } + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CPhone::DoOpenWithErrorL +// ----------------------------------------------------------------------------- +// +void CPhone::DoOpenWithErrorL + ( MVPbkSimPhoneObserver& aObserver, + MVPbkSimPhoneObserver::TErrorIdentifier aErrorId ) + { + FUNC_ENTRY(); + if ( iObservers.Find( &aObserver ) != KErrNotFound ) + { + aObserver.PhoneError( *this, aErrorId, KErrGeneral ); + } + FUNC_EXIT(); + } + +} // namespace VPbkSimStoreImpl + + +// End of File