fotaapplication/fotaserver/src/FotaNetworkRegStatus.cpp
changeset 51 2e64dc50f295
child 73 ae69c2e8bc34
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fotaapplication/fotaserver/src/FotaNetworkRegStatus.cpp	Tue Jul 13 09:51:41 2010 +0530
@@ -0,0 +1,392 @@
+/*
+ * 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:   GPRS and Wlan status getter for sending Generic Alerts
+ *
+ */
+
+// INCLUDE FILES
+
+//System Includes
+#include <startupdomainpskeys.h>	//GlobalRFsStates
+#include <rconnmon.h>	//RConnectionMonitor
+#include <featmgr.h>	//Feature Manager
+#include <features.hrh>	//Feature Manager
+#include <cmconnectionmethoddef.h>
+#include <cmmanagerext.h>
+#include <cmpluginwlandef.h>
+#include <cmpluginpacketdatadef.h>
+
+//User Includes
+#include "FotaServer.h"
+#include "FotaNetworkRegStatus.h"
+
+// -----------------------------------------------------------------------------
+// CFotaNetworkRegStatus::NewL
+// Symbian 2-Phase construction, NewL used for creating object of this class
+// This method can leave
+// -----------------------------------------------------------------------------
+
+CFotaNetworkRegStatus* CFotaNetworkRegStatus::NewL(CFotaServer* aObserver)
+    {
+    CFotaNetworkRegStatus* self = CFotaNetworkRegStatus::NewLC(aObserver);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CFotaNetworkRegStatus::NewLC
+// Symbian 2-Phase construction, NewLC used for creating object of this class
+// This method can leave
+// -----------------------------------------------------------------------------
+
+CFotaNetworkRegStatus* CFotaNetworkRegStatus::NewLC(CFotaServer* aObserver)
+    {
+    CFotaNetworkRegStatus* self = new (ELeave) CFotaNetworkRegStatus(
+            aObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CFotaNetworkRegStatus::ConstructL
+// Symbian 2-Phase construction, ConstructL used for constructing the members of this class
+// This method can leave
+// -----------------------------------------------------------------------------
+
+void CFotaNetworkRegStatus::ConstructL()
+    {
+    iTimer.CreateLocal();
+    iMonitor.ConnectL();
+    }
+
+// -----------------------------------------------------------------------------
+// CFotaNetworkRegStatus::CFotaNetworkRegStatus
+// C++ Constructor
+// This method shouldn't leave
+// -----------------------------------------------------------------------------
+
+CFotaNetworkRegStatus::CFotaNetworkRegStatus(CFotaServer* aObserver) :
+    CActive(CActive::EPriorityStandard), iObserver(aObserver), iRetriesLeft(
+            KRetries), iGlobalRFState(EFalse)
+    {
+    CActiveScheduler::Add(this); // Add AO to current active scheduler
+    }
+
+// -----------------------------------------------------------------------------
+// CFotaNetworkRegStatus::~CFotaNetworkRegStatus
+// C++ Desctructor
+// This method shouldn't leave
+// -----------------------------------------------------------------------------
+
+CFotaNetworkRegStatus::~CFotaNetworkRegStatus()
+    {
+    Cancel();
+
+    iTimer.Close();
+    iMonitor.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// CFotaNetworkRegStatus::DoCancel()
+// Cancels currently active notifier, if such exists
+// -----------------------------------------------------------------------------
+//
+void CFotaNetworkRegStatus::DoCancel()
+    {
+    FLOG(_L("CFotaNetworkRegStatus::DoCancel >>"));
+
+    if (IsActive())
+        {
+        iTimer.Cancel();
+        //		Cancel();
+        }
+
+    FLOG(_L("CFotaNetworkRegStatus::DoCancel <<"));
+    }
+
+// -----------------------------------------------------------------------------
+// CFotaNetworkRegStatus::StartMonitoringL
+// Monitors for connection status
+// This method don't leave
+// -----------------------------------------------------------------------------
+
+void CFotaNetworkRegStatus::StartMonitoringL()
+    {
+    FLOG(_L("CFotaNetworkRegStatus::StartMonitoringL >>"));
+
+    //Check offline state
+    FLOG(_L("Check GlobalRF state..."));
+    if (!iGlobalRFState)
+        {
+        iGlobalRFState = CheckGlobalRFState();
+        }
+
+    if (iGlobalRFState)
+        {
+        //Check registration state only if iGlobalRFState is true
+        FLOG(_L("Check registration state..."));
+        if (CheckNetworkRegStateL())
+            {
+            //If both are successful report complete
+            FLOG(
+                    _L("Network Registration is successful, sending Status as success to FotaServer"));
+            iObserver->ReportNetworkStatus(ETrue);
+            return;
+            }
+        }
+    //If one of them is not successful, start timer and retry KRetries times...
+
+    if (--iRetriesLeft >= 0)
+        {
+        FLOG(_L("Retry count... [%d]"), KRetries - iRetriesLeft);
+        iTimer.After(iStatus, KTimeInterval);
+        if (!IsActive())
+            SetActive();
+        }
+    else
+        {
+        FLOG(
+                _L("Maximum retries (%d) reached, sending Status as failure to FotaServer"),
+                KRetries);
+        iObserver->ReportNetworkStatus(IsWlanSupportedL());
+        }
+
+    FLOG(_L("CFotaNetworkRegStatus::StartMonitoringL <<"));
+    }
+
+// -----------------------------------------------------------------------------
+// CFotaNetworkRegStatus::RunL()
+// Called when event accomplished
+// -----------------------------------------------------------------------------
+//
+void CFotaNetworkRegStatus::RunL()
+    {
+    FLOG(_L("CFotaNetworkRegStatus::RunL >>"));
+
+    if (iStatus == KErrNone)
+        {
+        StartMonitoringL();
+        }
+    else
+        {
+        iObserver->ReportNetworkStatus(EFalse);
+        }
+
+    FLOG(_L("CFotaNetworkRegStatus::RunL <<"));
+    }
+
+// -----------------------------------------------------------------------------
+// CFotaNetworkRegStatus::RunError
+// Called when RunL leaves
+// This method can't leave
+// -----------------------------------------------------------------------------
+
+TInt CFotaNetworkRegStatus::RunError(TInt aError)
+    {
+    FLOG(_L("CFotaNetworkRegStatus::RunL >>"));
+    iObserver->ReportNetworkStatus(EFalse);
+    FLOG(_L("CFotaNetworkRegStatus::RunL <<"));
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CFotaNetworkRegStatus::CheckGlobalRFState
+// Checks for GlobalRFState, set by Starter
+// This method can't leave
+// -----------------------------------------------------------------------------
+
+TBool CFotaNetworkRegStatus::CheckGlobalRFState()
+    {
+    FLOG(_L("CFotaNetworkRegStatus::CheckGlobalRFState >>"));
+
+    RProperty prop;
+    TInt val = KErrNone;
+    TInt err = KErrNone;
+    TInt status = EFalse;
+
+    err = prop.Get(KPSUidStartup, KPSGlobalSystemState, val);
+    if (err == KErrNone && val == ESwStateNormalRfOn)
+        {
+        //Phone is not offline. Check for Network Registration status
+        FLOG(_L("Phone is online. Check for Network Registration status"));
+        status = ETrue;
+        }
+    else
+        {
+        //Phone is offline. No Network activities allowed.
+        FLOG(_L("Phone is offline. No Network activities allowed."));
+        status = EFalse;
+        }
+    FLOG(_L("CFotaNetworkRegStatus::CheckGlobalRFState, status = %d <<"),
+            status);
+    return status;
+    }
+
+// -----------------------------------------------------------------------------
+// CFotaNetworkRegStatus::CheckNetworkRegStatusL
+// Checks for Network registration status
+// This method can leave
+// -----------------------------------------------------------------------------
+
+TBool CFotaNetworkRegStatus::CheckNetworkRegStateL()
+    {
+    FLOG(_L("CFotaNetworkRegStatus::CheckNetworkRegStateL >>"));
+
+    TBool status = EFalse;
+
+    TInt registrationStatus(KErrNone);
+    TRequestStatus status1;
+    iMonitor.GetIntAttribute(EBearerIdGSM, // See bearer ids from TConnMonBearerId
+            0, KNetworkRegistration, registrationStatus, status1);
+    User::WaitForRequest(status1);
+
+    if (status1.Int() == KErrNone)
+        {
+        switch (registrationStatus)
+            {
+            case ENetworkRegistrationHomeNetwork:
+            case ENetworkRegistrationRoaming:
+                {
+                status = ETrue;
+                break;
+                }
+            default:
+                {
+                /* Includes - 	ENetworkRegistrationNotAvailable:
+                 ENetworkRegistrationUnknown:
+                 ENetworkRegistrationNoService:
+                 ENetworkRegistrationEmergencyOnly:
+                 ENetworkRegistrationSearching:
+                 ENetworkRegistrationBusy:
+                 ENetworkRegistrationDenied:*/
+                status = EFalse;
+                break;
+                }
+            }
+        }
+
+    FLOG(_L("CFotaNetworkRegStatus::CheckNetworkRegStateL, status = %d <<"),
+            status);
+    return status;
+    }
+
+// -----------------------------------------------------------------------------
+// CFotaNetworkRegStatus::IsWlanSupportedL
+// Checks whether Wlan supported on device and active
+// This method can leave
+// -----------------------------------------------------------------------------
+
+TBool CFotaNetworkRegStatus::IsWlanSupportedL()
+    {
+    FLOG(_L("CFotaNetworkRegStatus::IsWlanSupportedL >>"));
+
+    TBool status = EFalse;
+
+    FeatureManager::InitializeLibL();
+    if (FeatureManager::FeatureSupported(KFeatureIdProtocolWlan)) // check for feature enabled
+        {
+        status = ETrue;
+        }
+
+    FeatureManager::UnInitializeLib();
+
+#if defined(__WINS__)
+    status = ETrue;
+#endif
+
+    FLOG(_L("CFotaNetworkRegStatus::IsWlanSupportedL, status = %d <<"),
+            status);
+    return status;
+    }
+
+// -----------------------------------------------------------------------------
+// CFotaNetworkRegStatus::IsConnectionPossibleL
+// Checks whether the network connection is possible in the given IAP Id
+// This method can leave
+// -----------------------------------------------------------------------------
+/*TBool CFotaNetworkRegStatus::IsConnectionPossibleL(TInt aIapid)
+    {
+    FLOG(_L("CFotaNetworkRegStatus::IsConnectionPossibleL >>"));
+    TBool status(EFalse);
+
+    TUint32 bearer = FindBearerL(aIapid);
+    if (bearer == KUidPacketDataBearerType)
+        {
+        FLOG(_L("Bearer is Packet data"));
+        if (CheckGlobalRFState() && CheckNetworkRegStateL())
+            {
+            FLOG(_L("Network is up and connection is possible "));
+            status = ETrue;
+            }
+        else
+            {
+            FLOG(_L("Network is not up and connection is not possible "));
+            status = EFalse;
+            }
+        }
+    else if (bearer == KUidWlanBearerType)//for wlan or other bearers
+        {
+        FLOG(_L("Bearer is wlan and proceeding for download "));
+        //proceed & this else loop to be removed
+        status = ETrue;
+        }
+    else
+        {
+        FLOG(_L("Bearer is not packet data or WLAN"));
+        }
+
+    FLOG(_L("CFotaNetworkRegStatus::IsConnectionPossibleL, status = %d <<"),
+            status);
+    return status;
+    }*/
+
+// ----------------------------------------------------------------------------------------
+// CFotaDownload::FindBearerId
+// Finds the Bearer Id for a given IAP Id
+// ----------------------------------------------------------------------------------------
+/*TUint32 CFotaNetworkRegStatus::FindBearerL(TInt aIapId)
+    {
+    FLOG(_L("CFotaNetworkRegStatus::FindBearerL: %d"), aIapId);
+    TUint32 bearer = 0;
+    TInt err(KErrNone);
+    // Query CM Id
+    TInt cmId(aIapId);
+    RCmManagerExt CmManagerExt;
+    TRAP( err, CmManagerExt.OpenL() );
+    FLOG(_L("CmManagerExt.OpenL() with error as  %d"), err);
+    if (err == KErrNone)
+        {
+        RCmConnectionMethodExt cm;
+        TRAP( err, cm = CmManagerExt.ConnectionMethodL( cmId ) );
+        FLOG(_L("CmManagerExt.ConnectionMethodL with error as  %d"), err);
+        if (err == KErrNone)
+            {
+            CleanupClosePushL(cm);
+            FLOG(_L("cm pushed to cleanupstack "));
+            bearer = cm.GetIntAttributeL(CMManager::ECmBearerType);
+            FLOG(_L("bearer is %d "), bearer);
+            CleanupStack::PopAndDestroy(); // cm	  
+            FLOG(_L("cm poped & destroyed from cleanupstack "));
+            }
+
+        CmManagerExt.Close();
+        FLOG(_L("CmManagerExt closed "));
+        }
+    FLOG(_L("CFotaNetworkRegStatus::FindBearerL end with bearer: %d"), bearer);
+    return bearer;
+    }*/
+
+// End of File