--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/fotaapplication/fotaserver/src/FotaNetworkRegStatus.cpp Tue Jul 06 15:14:24 2010 +0300
@@ -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