diff -r 000000000000 -r e686773b3f54 phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CSatRefreshNotifier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CSatRefreshNotifier.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,484 @@ +/* +* 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: A notifier that gets refresh events from the SAT server +* +*/ + + + +// INCLUDE FILES +#include "CSatRefreshNotifier.h" + +#include +#include +#include +#include "MSimRefreshObject.h" + +namespace VPbkSimStoreImpl { + + +// ============================= LOCAL FUNCTIONS =============================== + +namespace { +// ----------------------------------------------------------------------------- +// ConvertFromSatFormat() Converts from SAT server format to own format +// ----------------------------------------------------------------------------- +// +TUint32 ConvertFromSatFormat( + const TSatRefreshFiles& aFiles ) // List of files which has been refreshed + { + FUNC_ENTRY(); + TUint32 result = 0; + + // KAdnEf -> KADNRefresh + TChar ef( KAdnEf ); + if ( aFiles.Locate( ef ) != KErrNotFound ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: ConvertFromSatFormat 1")); + result |= KADNRefresh; + } + + // KExt1Ef -> KADNExtRefresh + ef = KExt1Ef; + if ( aFiles.Locate( ef ) != KErrNotFound ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: ConvertFromSatFormat 2")); + result |= KADNExtRefresh; + } + + // KFdnEf -> KFDNRefresh + ef = KFdnEf; + if ( aFiles.Locate( ef ) != KErrNotFound ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: ConvertFromSatFormat 3")); + result |= KFDNRefresh; + } + + // KExt2Ef -> KFDNExtRefresh + ef = KExt2Ef; + if ( aFiles.Locate( ef ) != KErrNotFound ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: ConvertFromSatFormat 4")); + result |= KFDNExtRefresh; + } + + // KSdnEf -> KSDNRefresh + ef = KSdnEf; + if ( aFiles.Locate( ef ) != KErrNotFound ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: ConvertFromSatFormat 5")); + result |= KSDNRefresh; + } + + // KExt3Ef -> KSDNExtRefresh + ef = KExt3Ef; + if ( aFiles.Locate( ef ) != KErrNotFound ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: ConvertFromSatFormat 6")); + result |= KSDNExtRefresh; + } + + // KSstEf -> KSTRefresh + ef = KSstEf; + if ( aFiles.Locate( ef ) != KErrNotFound ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: ConvertFromSatFormat 7")); + result |= KSTRefresh; + } + + // KMsisdnEf -> KONRefresh + ef = KMsisdnEf; + if ( aFiles.Locate( ef ) != KErrNotFound ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: ConvertFromSatFormat 8")); + result |= KONRefresh; + } + + // KExt5Ef -> KONExtRefresh + ef = KExt5Ef; + if ( aFiles.Locate( ef ) != KErrNotFound ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: ConvertFromSatFormat 9")); + result |= KONExtRefresh; + } + + // Check all 0x4FXX files + const TInt count( aFiles.Length() ); + for( TInt i(0); i < count; ++i ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: ConvertFromSatFormat 10")); + if ( !(0x4F ^ aFiles[i] >> 8 ) ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: ConvertFromSatFormat 11")); + // USIM ADN file updated + result |= KADNRefresh; + result |= KADNExtRefresh; + } + } + FUNC_EXIT(); + return result; + } + +TUint32 ConvertFromSatFormat( + const TSatRefreshType& aType ) // List of files which has been refreshed + { + FUNC_ENTRY(); + TUint result(0); + + if( aType == ESimReset ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: ConvertFromSatFormat ESimReset")); + result |= KSimReset; + } + + if( aType == ESimInitFullFileChangeNotification ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: ConvertFromSatFormat ESimInitFullFileChangeNotification")); + result |= KSimInitFullFileChangeNotification; + } + + if( aType == EUsimApplicationReset ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: ConvertFromSatFormat EUsimApplicationReset")); + result |= KUsimApplicationReset; + } + + if( aType == E3GSessionReset ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: ConvertFromSatFormat E3GSessionReset")); + result |= K3GSessionReset; + } + + if( aType == ESimInit ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl: ConvertFromSatFormat ESimInit")); + result |= KSimInit; + } + + FUNC_EXIT(); + return result; + } + + +} // unnamed namespace + +// ============================ MEMBER FUNCTIONS =============================== + +NONSHARABLE_CLASS(CSatRefreshNotifier::CSatSession) : public CBase + { + public: // Constructors and destructor + CSatSession( MSatRefreshObserver& aSatObserver ); + ~CSatSession(); + + public: // New functions + /** + * Opens SAT session + */ + void OpenL(); + + /** + * Returns ETrue if session has been opened + */ + TBool IsOpen(); + + /** + * @return the refresh subsession + */ + RSatRefresh& Refresh(); + + private: // Data + /// The main session to SAT server + RSatSession iSatSession; + /// The subsession that implements SAT refresh notifying + RSatRefresh iSatRefresh; + TBool iIsOpen; + }; + +// ----------------------------------------------------------------------------- +// CSatRefreshNotifier::CSatSession::CSatSession +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CSatRefreshNotifier::CSatSession::CSatSession( MSatRefreshObserver& aSatObserver ) +: iSatRefresh( aSatObserver ) + { + } + +// Destructor +CSatRefreshNotifier::CSatSession::~CSatSession() + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl:CSatRefreshNotifier::CSatSession::~CSatSession,\ + Cancel refresh h%d"), + iSatRefresh.SubSessionHandle() ); + iSatRefresh.Cancel(); + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl:CSatRefreshNotifier::CSatSession::~CSatSession,\ + Close refresh h%d"), + iSatRefresh.SubSessionHandle() ); + iSatRefresh.Close(); + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl:CSatRefreshNotifier::CSatSession::~CSatSession,\ + Close session h%d"), + iSatSession.Handle() ); + iSatSession.Close(); + } + +// ----------------------------------------------------------------------------- +// CSatRefreshNotifier::CSatSession::OpenL +// ----------------------------------------------------------------------------- +// +void CSatRefreshNotifier::CSatSession::OpenL() + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl:CSatRefreshNotifier::CSatSession::OpenL")); + iSatSession.ConnectL(); + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl:CSatRefreshNotifier::CSatSession::OpenL, Session Connected h%d"), + iSatSession.Handle() ); + iSatRefresh.OpenL( iSatSession ); + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl:CSatRefreshNotifier::CSatSession::OpenL, Refresh Opened h%d"), + iSatRefresh.SubSessionHandle() ); + iIsOpen = ETrue; + } + +// ----------------------------------------------------------------------------- +// CSatRefreshNotifier::CSatSession::IsOpen +// ----------------------------------------------------------------------------- +// +TBool CSatRefreshNotifier::CSatSession::IsOpen() + { + return iIsOpen; + } + +// ----------------------------------------------------------------------------- +// CSatRefreshNotifier::CSatSession::Refresh +// ----------------------------------------------------------------------------- +// +RSatRefresh& CSatRefreshNotifier::CSatSession::Refresh() + { + return iSatRefresh; + } + +// ----------------------------------------------------------------------------- +// CSatRefreshNotifier::CSatRefreshNotifier +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CSatRefreshNotifier::CSatRefreshNotifier() + { + } + +// ----------------------------------------------------------------------------- +// CSatRefreshNotifier::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CSatRefreshNotifier::ConstructL() + { + iSatSession = new( ELeave ) CSatSession( *this ); + } + +// ----------------------------------------------------------------------------- +// CSatRefreshNotifier::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CSatRefreshNotifier* CSatRefreshNotifier::NewL() + { + CSatRefreshNotifier* self = new( ELeave ) CSatRefreshNotifier; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// ----------------------------------------------------------------------------- +// CSatRefreshNotifier::~CSatRefreshNotifier +// ----------------------------------------------------------------------------- +// +CSatRefreshNotifier::~CSatRefreshNotifier() + { + delete iSatSession; + iObjects.Close(); + } + +// ----------------------------------------------------------------------------- +// CSatRefreshNotifier::IsActive +// ----------------------------------------------------------------------------- +// +TBool CSatRefreshNotifier::IsActive() + { + return iSatSession->IsOpen(); + } + +// ----------------------------------------------------------------------------- +// CSatRefreshNotifier::ActivateL +// ----------------------------------------------------------------------------- +// +void CSatRefreshNotifier::ActivateL( MSimRefreshObject& aSimRefreshObject ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl:CSatRefreshNotifier::ActivateL")); + + // Open the session to SAT server if not opened + if ( !iSatSession->IsOpen() ) + { + iSatSession->OpenL(); + } + + // Listen to all changes + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl:CSatRefreshNotifier::ActivateL: NotifyFileChangeL ALL")); + iSatSession->Refresh().NotifyFileChangeL(); + + if ( iObjects.Find( &aSimRefreshObject ) == KErrNotFound ) + { + iObjects.AppendL( &aSimRefreshObject ); + } + } + +// ----------------------------------------------------------------------------- +// CSatRefreshNotifier::DeActivate +// ----------------------------------------------------------------------------- +// +void CSatRefreshNotifier::DeActivate( MSimRefreshObject& aSimRefreshObject ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl:CSatRefreshNotifier::DeActivate")); + + TInt index = iObjects.Find( &aSimRefreshObject ); + if ( index != KErrNotFound ) + { + iObjects.Remove( index ); + } + + // Cancel the request if session is open and this was the last object + if ( iSatSession->IsOpen() && iObjects.Count() == 0 ) + { + iSatSession->Refresh().Cancel(); + } + } + +// ----------------------------------------------------------------------------- +// CSatRefreshNotifier::AllowRefresh +// ----------------------------------------------------------------------------- +// +TBool CSatRefreshNotifier::AllowRefresh( TSatRefreshType aType, + const TSatRefreshFiles& aFiles ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl:CSatRefreshNotifier::AllowRefresh:type=%d, aFiles=%S"), + aType,&aFiles); + // First check files... + TUint32 flags = ConvertFromSatFormat( aFiles ); + // ...and then refresh types + flags |= ConvertFromSatFormat( aType ); + + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl:CSatRefreshNotifier::AllowRefresh:Converted flags=%x"), + flags); + + TBool result = ETrue; + const TInt count = iObjects.Count(); + for( TInt i = count - 1; i >= 0 && result; --i ) + { + if ( !iObjects[i]->AllowRefresh( flags ) ) + { + result = EFalse; + } + } + + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl:CSatRefreshNotifier::AllowRefresh:return %d"), + result); + // The refresh doesn't necessary start + // because other clients or TSY can deny the refresh. + return result; + } + +// ----------------------------------------------------------------------------- +// CSatRefreshNotifier::Refresh +// ----------------------------------------------------------------------------- +// +void CSatRefreshNotifier::Refresh( TSatRefreshType aType, + const TSatRefreshFiles& aFiles ) + { + FUNC_ENTRY(); + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl:CSatRefreshNotifier::Refresh:type=%d, aFiles=%S"), + aType,&aFiles); + + // Refresh has happened. Clients must update their content + iRefreshedObjects = 0; + iAdditionalEFsRead = EFalse; + // First check files... + TUint32 flags = ConvertFromSatFormat( aFiles ); + // ...and then refresh types + flags |= ConvertFromSatFormat( aType ); + + const TInt count = iObjects.Count(); + for( TInt i = count - 1; i >= 0; --i ) + { + iObjects[i]->SimRefreshed( flags, *this ); + } + FUNC_EXIT(); + } + +// ----------------------------------------------------------------------------- +// CSatRefreshNotifier::SatRefreshCompleted +// ----------------------------------------------------------------------------- +// +void CSatRefreshNotifier::SatRefreshCompleted( + MSimRefreshObject& /*aSimRefreshObject*/, + TBool aReadAdditionalFiles ) + { + VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING( + "VPbkSimStoreImpl:CSatRefreshNotifier::SatRefreshCompleted:total=%d,cur=%d"), + iObjects.Count(), iRefreshedObjects + 1); + + ++iRefreshedObjects; + if ( aReadAdditionalFiles ) + { + iAdditionalEFsRead = ETrue; + } + + // Complete refresh to SAT server when all the objects have completed + if ( iRefreshedObjects == iObjects.Count() ) + { + iSatSession->Refresh().RefreshEFRead( iAdditionalEFsRead ); + } + } +} // namespace VPbkSimStoreImpl +// End of File