satengine/SatServer/SystemState/src/csatnetworkregstatusmonitor.cpp
changeset 0 ff3b6d0fd310
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/satengine/SatServer/SystemState/src/csatnetworkregstatusmonitor.cpp	Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,226 @@
+/*
+* Copyright (c) 2007-2008 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:  Network registration status monitor.
+*
+*/
+
+
+#include "csatnetworkregstatusmonitor.h"
+#include "SatLog.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// C++ default constructor can NOT contain any code, that might leave.
+// ---------------------------------------------------------------------------
+//
+CSatNetworkRegStatusMonitor::CSatNetworkRegStatusMonitor(
+    MSatMultiModeApi& aPhone ) :
+    CActive( CActive::EPriorityStandard ),
+    iRegistrationStatus( RMobilePhone::ERegistrationUnknown ),
+    iWaitingRegistrationStatus( EFalse ),
+    iPhone( aPhone )
+    {
+    LOG( SIMPLE, "SATSYSTEMSTATE: \
+        CSatNetworkRegStatusMonitor::CSatNetworkRegStatusMonitor calling" )
+
+    // Add to active scheduler.
+    CActiveScheduler::Add( this );
+
+    LOG( SIMPLE, "SATSYSTEMSTATE: \
+        CSatNetworkRegStatusMonitor::CSatNetworkRegStatusMonitor exiting" )
+    }
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CSatNetworkRegStatusMonitor* CSatNetworkRegStatusMonitor::NewL(
+    MSatMultiModeApi& aPhone )
+    {
+    LOG( SIMPLE, "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::NewL calling" )
+
+    CSatNetworkRegStatusMonitor* self =
+        new( ELeave ) CSatNetworkRegStatusMonitor( aPhone );
+
+    LOG( SIMPLE, "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::NewL exiting" )
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CSatNetworkRegStatusMonitor::~CSatNetworkRegStatusMonitor()
+    {
+    LOG( SIMPLE, "SATSYSTEMSTATE: \
+        CSatNetworkRegStatusMonitor::~CSatNetworkRegStatusMonitor calling" )
+
+    Cancel();
+
+    LOG( SIMPLE, "SATSYSTEMSTATE: \
+        CSatNetworkRegStatusMonitor::~CSatNetworkRegStatusMonitor exiting" )
+    }
+
+// ---------------------------------------------------------------------------
+// Activate monitor.
+// ---------------------------------------------------------------------------
+//
+void CSatNetworkRegStatusMonitor::Start()
+    {
+    LOG( SIMPLE,
+        "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::Start calling" )
+
+#ifndef SAT_USE_DUMMY_TSY
+    if ( !IsActive() )
+        {
+        iRegistrationStatus = RMobilePhone::ERegistrationUnknown;
+
+        iPhone.GetNetworkRegistrationStatus( iStatus, iRegistrationStatus );
+        SetActive();
+        iWaitingRegistrationStatus = ETrue;
+        LOG( SIMPLE, "SATSYSTEMSTATE:   Started" )
+        }
+#else
+    iRegistrationStatus = RMobilePhone::ERegisteredOnHomeNetwork;
+    iWaitingRegistrationStatus = EFalse;
+    LOG( SIMPLE, "SATSYSTEMSTATE:   Set for WINS Emulator" )
+#endif
+
+    LOG( SIMPLE,
+        "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::Start exiting" )
+    }
+
+// ---------------------------------------------------------------------------
+// Get current value of network registration status.
+// ---------------------------------------------------------------------------
+//
+RMobilePhone::TMobilePhoneRegistrationStatus
+    CSatNetworkRegStatusMonitor::CurrentValue()
+    {
+    LOG( SIMPLE,
+        "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::CurrentValue calling" )
+
+    // In case network registration notification failed on startup, we need to 
+    // check it again, if not registered on home network and we are observing
+    // changes in registration status ( iWaitingRegistrationStatus == EFalse )
+    if ( !iWaitingRegistrationStatus &&
+         ( RMobilePhone::ERegisteredOnHomeNetwork != iRegistrationStatus &&
+           RMobilePhone::ERegisteredRoaming != iRegistrationStatus ) )
+        {
+        LOG( NORMAL, "Not registered -> Going to check value again" )
+        Cancel(); // Cancel pending request...
+        Start();  // ... and start again
+        }
+
+    // Wait, initial value has not yet been got.
+    if ( iWaitingRegistrationStatus )
+        {
+        LOG( SIMPLE,
+        "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::CurrentValue \
+        iWaitingRegistrationStatus true" )
+        if ( !iWait.IsStarted() )
+            {
+            LOG( SIMPLE,
+            "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::CurrentValue \
+            start iWait" )
+            iWait.Start();
+            }
+        }
+
+    LOG2( SIMPLE,
+        "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::CurrentValue exiting \
+        (%d)", iRegistrationStatus )
+    return iRegistrationStatus;
+    }
+
+// -----------------------------------------------------------------------------
+// CRegistrationMonitor::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CSatNetworkRegStatusMonitor::DoCancel()
+    {
+    LOG( SIMPLE,
+        "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::DoCancel calling" )
+
+    iPhone.CancelAsyncRequest(
+        EMobilePhoneNotifyNetworkRegistrationStatusChange );
+    if ( iWait.IsStarted() )
+        {
+        LOG( SIMPLE,
+        "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::DoCancel stop iWait" )
+        iWait.AsyncStop();
+        }
+
+    LOG( SIMPLE,
+        "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::DoCancel exiting" )
+    }
+
+// ---------------------------------------------------------------------------
+// From class CActive.
+// Marks status value valid and activates change notifier.
+// ---------------------------------------------------------------------------
+//
+void CSatNetworkRegStatusMonitor::RunL()
+    {
+    const TInt status( iStatus.Int() ); // Asynchronous status
+    LOG2( SIMPLE,
+        "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::RunL calling (%d)",
+        status )
+
+    // Restart request
+    if ( KErrServerBusy == status )
+        {
+        iPhone.GetNetworkRegistrationStatus(
+            iStatus,
+            iRegistrationStatus );
+        SetActive();
+        }
+    else if ( KErrCancel != status )
+        {
+        // (Re)start observing
+        iPhone.NotifyNetworkRegistrationStatusChange(
+            iStatus,
+            iRegistrationStatus );
+        SetActive();
+        }
+    else
+        {
+        LOG( SIMPLE, " Request cancelled" )
+        }
+
+    // Still waiting first value after start.
+    if ( iWaitingRegistrationStatus )
+        {
+        LOG( SIMPLE, 
+        "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::RunL \
+        iWaitingRegistrationStatus true" )
+        iWaitingRegistrationStatus = EFalse;
+        if ( iWait.IsStarted() )
+            {
+            LOG( SIMPLE, 
+            "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::RunL \
+            stop iWait" )
+            iWait.AsyncStop();
+            }
+        }
+
+    LOG2( SIMPLE,
+        "SATSYSTEMSTATE:   NetworkRegistrationStatus updated: %d",
+        iRegistrationStatus )
+
+    LOG( SIMPLE, "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::RunL exiting" )
+    }
+
+// End of file