fotaapplication/fotaserver/FotaServer/src/FotaNetworkRegStatus.cpp
changeset 0 b497e44ab2fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fotaapplication/fotaserver/FotaServer/src/FotaNetworkRegStatus.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,391 @@
+/*
+* 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