diff -r b183ec05bd8c -r 19bba8228ff0 fotaapplication/fotaserver/FotaServer/src/FotaNetworkRegStatus.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fotaapplication/fotaserver/FotaServer/src/FotaNetworkRegStatus.cpp Wed Sep 01 12:27:42 2010 +0100 @@ -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 //GlobalRFsStates +#include //RConnectionMonitor +#include //Feature Manager +#include //Feature Manager +#include +#include +#include +#include + +//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