diff -r 000000000000 -r 164170e6151a wim/WimServer/src/WimSatRefreshObserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wim/WimServer/src/WimSatRefreshObserver.cpp Tue Jan 26 15:20:08 2010 +0200 @@ -0,0 +1,192 @@ +/* +* Copyright (c) 2005 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: Observes 'SIM file changed' events from SAT. If changed file +* is WIM related, WimiLib's cache is cleared and WimiLib closed. +* Prevents WIM from operating with out-dated cache. +* +*/ + + +// INCLUDE FILES +#include "WimSatRefreshObserver.h" +#include "WimServer.h" +#include "WimSession.h" +#include "WimTrace.h" +#include +#include +#include +#if defined SAT_REFRESH_TIMER_TRIGGER +#include "SatRefreshTimerTrigger.h" // for simulated sat refresh +#endif + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CWimSatRefreshObserver::CWimSatRefreshObserver +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CWimSatRefreshObserver::CWimSatRefreshObserver() + { + _WIMTRACE(_L("WIM | CWimSatRefreshObserver | C'tor")); + } + +// ----------------------------------------------------------------------------- +// CWimSatRefreshObserver::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CWimSatRefreshObserver::ConstructL() + { + _WIMTRACE(_L("WIM | CWimSatRefreshObserver::ConstructL | Begin")); + + iWimSvr = CWimServer::Server(); + +#if defined SAT_REFRESH_TIMER_TRIGGER + // simulate SAT file changed events + iTimerTrigger = CSatRefreshTimerTrigger::NewL( this ); + iTimerTrigger->Start(); + _WIMTRACE(_L("WIM | CWimSatRefreshObserver::ConstructL | Using timer triggered SAT refresh.")); +#else + // real implementation + iRefreshClient = new( ELeave ) RSatRefresh( *this ); + _WIMTRACE(_L("WIM | CWimSatRefreshObserver::ConstructL | iRefreshClient")); + iSatSession = new( ELeave ) RSatSession; + _WIMTRACE(_L("WIM | CWimSatRefreshObserver::ConstructL | iSatSession")); + iSatSession->ConnectL(); + _WIMTRACE(_L("WIM | CWimSatRefreshObserver::ConstructL | ConnectL")); + iRefreshClient->OpenL( *iSatSession ); + _WIMTRACE(_L("WIM | CWimSatRefreshObserver::ConstructL | OpenL")); + iRefreshClient->NotifyFileChangeL(); // start receiving notifications + _WIMTRACE(_L("WIM | CWimSatRefreshObserver::ConstructL | NotifyFileChangeL")); +#endif // SAT_REFRESH_TIMER_TRIGGER + _WIMTRACE(_L("WIM | CWimSatRefreshObserver::ConstructL | End")); + } + +// ----------------------------------------------------------------------------- +// CWimSatRefreshObserver::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CWimSatRefreshObserver* CWimSatRefreshObserver::NewL() + { + _WIMTRACE(_L("WIM | CWimSatRefreshObserver::NewL | Begin")); + CWimSatRefreshObserver* self = new( ELeave ) CWimSatRefreshObserver(); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + _WIMTRACE(_L("WIM | CWimSatRefreshObserver::NewL | End")); + return self; + } + + +// ----------------------------------------------------------------------------- +// CWimSatRefreshObserver::~CWimSatRefreshObserver +// Destructor. +// ----------------------------------------------------------------------------- +// +CWimSatRefreshObserver::~CWimSatRefreshObserver() + { + _WIMTRACE(_L("WIM | CWimSatRefreshObserver | D'tor")); + if ( iRefreshClient ) + { + iRefreshClient->Close(); + delete iRefreshClient; + } + if ( iSatSession ) + { + iSatSession->Close(); + delete iSatSession; + } +#if defined SAT_REFRESH_TIMER_TRIGGER + if ( iTimerTrigger ) + { + delete iTimerTrigger; + } +#endif + } + + +// ----------------------------------------------------------------------------- +// CWimSatRefreshObserver::AllowRefresh +// Query from SAT: Is it OK to refresh files on SIM. +// ----------------------------------------------------------------------------- +// +TBool CWimSatRefreshObserver::AllowRefresh( TSatRefreshType /*aType*/, + const TSatRefreshFiles& /*aFiles*/ ) + { + _WIMTRACE(_L("WIM | CWimSatRefreshObserver::AllowRefresh | Begin")); + + TBool allowRefresh( ETrue ); // allow by default + + if ( iWimSvr->IsAccessingToken()) // check if we are accessing card + { + allowRefresh = EFalse; // deny if we are accessing card + } + + _WIMTRACE2(_L("WIM | CWimSatRefreshObserver::AllowRefresh | End | allowRefresh=%d"), allowRefresh); + return allowRefresh; + } + +// ----------------------------------------------------------------------------- +// CWimSatRefreshObserver::Refresh +// Notification of completed refresh event from SAT. +// +// ----------------------------------------------------------------------------- +// +void CWimSatRefreshObserver::Refresh( TSatRefreshType /*aType*/, + const TSatRefreshFiles& /*aFiles*/ ) + { + _WIMTRACE(_L("WIM | CWimSatRefreshObserver::Refresh | Begin")); + + iRefreshClient->RefreshEFRead( EFalse ); + // WIM is doing stg with the card -> postpone WIMI closing. + if ( iWimSvr->IsAccessingToken() ) + { + // Tell server to re-initialize at earliest convenience. + iWimSvr->SetRefreshNotificationReceived( ETrue ); + _WIMTRACE(_L("WIM | CWimSatRefreshObserver::Refresh | WIMI closing postponed.")); + } + else if ( CWimServer::iWimInitialized ) + { + // Wim initialized, can close WIMI immediately. + // NOTE: Is it ok to run lengthy operations here? + RArray sessions; + TRAPD( err, iWimSvr->GetSessionsL( sessions ) ); + + if ( !err ) // Got sessions correctly + { + // Loop through all sessions and notify all clients that are + // requesting the notification + for ( TInt i( 0 ); i < sessions.Count(); i++ ) + { + sessions[i]->NotifyComplete(); + } + sessions.Reset(); + // Close WIMI + WIMI_CloseDownReq(); + _WIMTRACE(_L("WIM | CWimSatRefreshObserver::Refresh | WIMI closed.")); + } + } + else + { + _WIMTRACE(_L("WIM | CWimSatRefreshObserver::Refresh | WIMI already closed.")); + } + + _WIMTRACE(_L("WIM | CWimSatRefreshObserver::Refresh | End")); + } + +// End of File