diff -r c8e5c3d81b42 -r 39aa16f3fdc2 fotaapplication/fotaserver/src/FotaNetworkRegStatus.cpp --- /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 //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