devicediagnosticsfw/diagframework/src/diagnetworkregstatuswatcher.cpp
branchRCL_3
changeset 26 19bba8228ff0
parent 0 b497e44ab2fc
--- /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
+