--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/devicediagnosticsfw/diagframework/src/diagnetworkregstatuswatcher.cpp Wed Sep 01 12:27:42 2010 +0100
@@ -0,0 +1,266 @@
+/*
+* Copyright (c) 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: This is the implementation for the Diagnostics Network
+* registration status watcher.
+*
+*/
+
+
+// CLASS DECLARATION
+#include <DiagNetworkRegStatusWatcher.h>
+
+// SYSTM INCLUDE FILES
+#include <e32base.h>
+#include <DiagFrameworkDebug.h> // Debugging macros
+#include <DiagNetworkRegStatusObserver.h> // MDiagNetworkRegStatusObserver
+
+
+// ============================ MEMBER FUNCTIONS =============================
+
+// ---------------------------------------------------------------------------
+// Static two-phase constructor.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CDiagNetworkRegStatusWatcher* CDiagNetworkRegStatusWatcher::NewL(
+ MDiagNetworkRegStatusObserver& aCallBack )
+ {
+ CDiagNetworkRegStatusWatcher* self = new ( ELeave )
+ CDiagNetworkRegStatusWatcher( aCallBack );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CDiagNetworkRegStatusWatcher::~CDiagNetworkRegStatusWatcher()
+ {
+ // cancel any pending request
+ Cancel();
+
+ delete iTelephony;
+ iTelephony = NULL;
+
+ LOGSTRING( "CDiagNetworkRegStatusWatcher::ConstructL() Destroying Network registration status watcher" )
+ }
+
+// ---------------------------------------------------------------------------
+// The default constructor.
+// ---------------------------------------------------------------------------
+//
+CDiagNetworkRegStatusWatcher::CDiagNetworkRegStatusWatcher
+ ( MDiagNetworkRegStatusObserver& aCallBack )
+ : CActive( EPriorityStandard ),
+ iState( EStateInit ),
+ iRegV1(),
+ iRegV1Pckg( iRegV1 ),
+ iCallBack( aCallBack )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+
+// ---------------------------------------------------------------------------
+// The second phase constructor.
+// ---------------------------------------------------------------------------
+//
+
+void CDiagNetworkRegStatusWatcher::ConstructL()
+ {
+ LOGSTRING( "CDiagNetworkRegStatusWatcher::ConstructL() Creating Network registration status watcher" )
+ iTelephony = CTelephony::NewL();
+ iPreviouslyRegistered = EFalse;
+ }
+
+
+// ---------------------------------------------------------------------------
+// This function starts the network registration status monitor process. This
+// involves first checking for the current status and then registering for any
+// changes that may occur.
+// ---------------------------------------------------------------------------
+//
+
+EXPORT_C void CDiagNetworkRegStatusWatcher::StartObserver()
+ {
+ // get the current status of network registration
+ iState = EStateWaitForInitialStatus;
+ iTelephony->GetNetworkRegistrationStatus( iStatus, iRegV1Pckg );
+ SetActive();
+ }
+
+
+// ---------------------------------------------------------------------------
+// This function stops the network registration monitor process
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CDiagNetworkRegStatusWatcher::StopObserver()
+ {
+ Cancel();
+ }
+
+// ---------------------------------------------------------------------------
+// Handles the completion of active requests.
+// ---------------------------------------------------------------------------
+//
+void CDiagNetworkRegStatusWatcher::RunL()
+ {
+ switch ( iState )
+ {
+ case EStateWaitForInitialStatus:
+ {
+ HandleInitialStatusL();
+ }
+ break;
+
+ case EStateWaitForStatusChange:
+ {
+ HandleNetworkStatusChangeL();
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+
+
+// ---------------------------------------------------------------------------
+// Handles the request for initial network registration status
+// ---------------------------------------------------------------------------
+//
+void CDiagNetworkRegStatusWatcher::HandleInitialStatusL()
+ {
+ if ( iStatus == KErrNone )
+ {
+ // get the current registration status
+ TBool currentRegStatus = IsDeviceRegisteredOnNetwork();
+
+ LOGSTRING2( "CDiagNetworkRegStatusWatcher::HandleInitialStatus : current status = %d", currentRegStatus )
+
+ // we have to continue monitoring changes in network registration status
+ // so set the next asynchronous request
+ iState = EStateWaitForStatusChange;
+ iTelephony->NotifyChange( iStatus,
+ CTelephony::ENetworkRegistrationStatusChange, iRegV1Pckg );
+ SetActive();
+
+ // inform the client about the initial registration status
+ iPreviouslyRegistered = currentRegStatus;
+ iCallBack.InitialNetworkRegistrationStatusL( currentRegStatus );
+ }
+ else
+ {
+ // inform the client that device is not registered
+ iCallBack.InitialNetworkRegistrationStatusL( EFalse );
+ iPreviouslyRegistered = EFalse;
+ }
+ }
+
+
+
+// ---------------------------------------------------------------------------
+// Handles the events related to Network registration status change
+// ---------------------------------------------------------------------------
+//
+void CDiagNetworkRegStatusWatcher::HandleNetworkStatusChangeL()
+ {
+ if ( iStatus == KErrNone )
+ {
+ // get the current registration status
+ TBool currentRegStatus = IsDeviceRegisteredOnNetwork();
+
+ LOGSTRING2( "CDiagNetworkRegStatusWatcher::HandleNetworkStatusChange : current status = %d", currentRegStatus )
+
+ // we have to continue monitoring changes in network registration status
+ // so set the next asynchronous request
+ iState = EStateWaitForStatusChange;
+ iTelephony->NotifyChange( iStatus,
+ CTelephony::ENetworkRegistrationStatusChange, iRegV1Pckg );
+ SetActive();
+
+ // if the current registration state is different from previous state,
+ // inform the client
+ if ( currentRegStatus != iPreviouslyRegistered )
+ {
+ // inform the client about the network status change
+ iCallBack.NetworkRegistrationStatusChangeL( currentRegStatus );
+ }
+ iPreviouslyRegistered = currentRegStatus;
+ }
+ else
+ {
+ iCallBack.NetworkRegistrationStatusChangeL( EFalse );
+ iPreviouslyRegistered = EFalse;
+ }
+ }
+
+
+
+// ---------------------------------------------------------------------------
+// This function wraps the logic if the device is currently registered or not
+// ---------------------------------------------------------------------------
+//
+TBool CDiagNetworkRegStatusWatcher::IsDeviceRegisteredOnNetwork()
+ {
+ TBool regStatus = EFalse;
+ switch ( iRegV1.iRegStatus )
+ {
+ case CTelephony::ERegisteredOnHomeNetwork:
+ case CTelephony::ERegisteredRoaming:
+ {
+ regStatus = ETrue;
+ }
+ break;
+ default:
+ {
+ // the device lost the network coverage
+ regStatus = EFalse;
+ }
+ break;
+ }
+ return regStatus;
+ }
+
+// ---------------------------------------------------------------------------
+// Handles the cancellation of active requests.
+// ---------------------------------------------------------------------------
+//
+void CDiagNetworkRegStatusWatcher::DoCancel()
+ {
+ switch ( iState )
+ {
+ case EStateWaitForInitialStatus:
+ {
+ iTelephony->CancelAsync( CTelephony::EGetNetworkRegistrationStatusCancel );
+ }
+ break;
+
+ case EStateWaitForStatusChange:
+ {
+ iTelephony->CancelAsync( CTelephony::ENetworkRegistrationStatusChangeCancel );
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+// End of file
+