--- /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