--- /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 <RSatRefresh.h>
+#include <RSatSession.h>
+#include <etelsat.h>
+#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<CWimSession*> 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