/*
* Copyright (c) 2009 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: Implementation of fotaserver component
* This is part of fotaapplication.
*
*/
#include <systemwarninglevels.hrh>
#include <e32property.h>
#include <startupdomainpskeys.h>
#include <hwrmpowerstatesdkpskeys.h>
#include <sysutil.h>
#include <fotaengine.h>
#include "fotaserverPrivateCRKeys.h"
#include "fmsserver.h"
#include "fmsinterruptaob.h"
#include "fmsclientserver.h"
#include "FotaIPCTypes.h"
// ----------------------------------------------------------------------------------------
// static method StaticCheckNwRequestL() called to check n/w availability
// ----------------------------------------------------------------------------------------
static TInt StaticCheckNwRequestL(TAny* aPtr)
{
CFMSInterruptAob* ptr = (CFMSInterruptAob*) aPtr;
FLOG(_L("StaticCheckNwRequestL:-Begin"));
TRAPD(err, ptr->NetworkRegistryCheckL() );
FLOG(_L("StaticCheckNwRequestL:-end"));
return err;
}
// -----------------------------------------------------------------------------
// CFMSInterruptAob::CFMSInterruptAob()
// -----------------------------------------------------------------------------
CFMSInterruptAob::CFMSInterruptAob()
:CActive(EPriorityStandard)
{
//CActiveScheduler::Add(this);
iConnStatus = KErrNone;
iWlanAvailable = EFalse;
iGPRSAvail = EFalse;
iWcdma = EFalse;
iUpdInterruptType = ENoUpdInterrupt;
iChargeToMonitor = 0;
}
// -----------------------------------------------------------------------------
// CFMSInterruptAob::ConstructL()
// -----------------------------------------------------------------------------
void CFMSInterruptAob::ConstructL()
{
CActiveScheduler::Add(this);
User::LeaveIfError(iConnMon.ConnectL());
}
// -----------------------------------------------------------------------------
// CFMSInterruptAob::Start()
// -----------------------------------------------------------------------------
void CFMSInterruptAob::StartL(TOmaDLInterruptReason aType)
{
FLOG(_L("CFMSInterruptAob::Start- begin"));
iInterruptType = aType;
if(iInterruptType == EUserInterrupt && iServer->ChargerTobeMonitered())
{
FLOG(_L("CFMSInterruptAob::Start--EUserInterrupt"));
if(!IsActive())
{
//RProperty pw;
iProperty.Attach(KPSUidHWRMPowerState,KHWRMChargingStatus);
iStatus=KRequestPending;
iProperty.Subscribe(iStatus);
SetActive();
}
}
else if(iInterruptType == ENetworkInterrupt && iServer->NetworkTobeMonitered())
{
FLOG(_L("CFMSInterruptAob::Start--ENetworkInterrupt"));
if(!IsActive())
{
iStatus=KRequestPending;
TBool phonenotoffline = CheckGlobalRFStateL();
if ( ( iBearer == EBearerIdGPRS || iBearer == EBearerIdWCDMA )
&& phonenotoffline )
{
FLOG(_L("CFMSInterruptAob::Start--ENetworkInterrupt iBearer is %d"),iBearer);
NotifyL();
return;
}
else if ( iBearer == EBearerIdWLAN )
{
//feature supported check
iWlanAvailable = EFalse;
iConnMon.GetBoolAttribute( EBearerIdWLAN,
0,
KBearerAvailability,
iWlanAvailable,
iStatus );
SetActive();
}
else
{
FLOG(_L("CFMSInterruptAob::Start--ENetworkInterrupt--other then GPRS/ WLan bearer "));
//Stop the server
//Dont delete the file if interrupt is network + offline( to differentiate from hard reboot
iServer->DeleteFile(EFalse);
StopServer();
}
}
}
else if(iInterruptType == EMemoryInterrupt && iServer->MemoryTobeMonitered())
{
FLOG(_L("CFMSInterruptAob::Start--EMemoryInterrupt on drive %d"),(TInt)iDrive );
if(!IsActive())
{
User::LeaveIfError(iFs.Connect());
TBool critical = EFalse;
TInt err = KErrNone;
err=IsPkgSizeMoreThanWL(critical);
if(critical)
{
FLOG(_L("CFMSInterruptAob::Start--EMemoryInterrupt--critical pkg dont fit on drive %d"),(TInt)iDrive );
iStatus=KRequestPending;
iFs.NotifyDiskSpace( iSize, iDrive, iStatus );
FLOG(_L("CFMSInterruptAob::Start--EMemoryInterrupt-setting as active") );
SetActive();
}
else
{
if(err == KErrNone)
{
FLOG(_L("CFMSInterruptAob::Start--EMemoryInterrupt--critical pkg fits on drive %d"),(TInt)iDrive );
LaunchFotaEngineL();
}
else
{
FLOG(_L("CFMSInterruptAob::Start--EMemoryInterrupt--System error %d on memory drive %d"), err,(TInt)iDrive );
}
//Stop the server
StopServer();
}
}
}
else //case where variation fails or by chance if a bad interrupt reason
{
StopServer();
}
}
// -----------------------------------------------------------------------------
// CFMSInterruptAob::RunL()
// -----------------------------------------------------------------------------
void CFMSInterruptAob::RunL()
{
FLOG(_L("CFMSInterruptAob::RunL()- begin"));
TInt value = 0;
if( EMonitorPhoneCallEnd == iUpdInterruptType)
{
FLOG(_L("RunL EPhoneCallActiveAsync--call status %d"),iCallStatus);
if(iStatus == KErrNone && RCall::EStatusIdle == iCallStatus )
{
//call fota scheduler & Stop the server
LaunchFotaUpdate(iServer->PkgId(),iServer->ProfileId());
StopServer();
}
else //call in progress, subscribe again
{
FLOG(_L("call in progress, subscribing again"));
iLine.NotifyStatusChange(iStatus, iCallStatus);
SetActive();
}
}
else if( iUpdInterruptType == EMonitorbattery)
{
FLOG(_L("CFMSInterruptAob::RunL()- handling battery monitor"));
iProperty.Attach(KPSUidHWRMPowerState,KHWRMBatteryLevel);
TInt err=iProperty.Get(KPSUidHWRMPowerState,KHWRMBatteryLevel,value);
if(err != KErrNone)
{
FLOG(_L("CFMSInterruptAob::RunL()- error in getiing the battery level"));
StopServer();
}
if(value >= iChargeToMonitor)
{ iProperty.Cancel();
iProperty.Close();
TRAPD(err, LaunchFotaScheduleUpdate());
if(err)
{
FLOG(_L("CFMSInterruptAob::RunL()- error in launch fota schedule"));
}
iUpdInterruptType = ENoUpdInterrupt;
StopServer();
}
else
{
FLOG(_L("CFMSInterruptAob::RunL()--status charger not connected"));
if(!IsActive())
{
iStatus=KRequestPending;
iProperty.Subscribe(iStatus);
FLOG(_L("CFMSInterruptAob::RunL()--waiting for charger Connectivity"));
SetActive();
}
}
}
else if( iInterruptType == EUserInterrupt)
{
TInt value;
//RProperty pw;
iProperty.Attach(KPSUidHWRMPowerState,KHWRMChargingStatus);
iProperty.Get(KPSUidHWRMPowerState,KHWRMChargingStatus,value);
// charger connected or already charging going on
if( value == EChargingStatusCharging /*|| value == EChargingStatusChargingComplete ||
value == EChargingStatusAlmostComplete || value == EChargingStatusChargingContinued */)
{
FLOG(_L("CFMSInterruptAob::RunL()--status charging"));
HandleChargingInterruptL();
}
else
{
FLOG(_L("CFMSInterruptAob::RunL()--status charger not connected"));
if(!IsActive())
{
iStatus=KRequestPending;
iProperty.Subscribe(iStatus);
FLOG(_L("CFMSInterruptAob::RunL()--waiting for charger Connectivity"));
SetActive();
}
}
}
else if( iInterruptType == ENetworkInterrupt )
{
FLOG(_L("CFMSInterruptAob::RunL()--ENetworkInterrupt" ));
/*if( iBearer == EBearerIdGPRS || iBearer == EBearerIdWCDMA )
{
FLOG(_L("CFMSInterruptAob::RunL()--ENetworkInterrupt:GPRS/WCDMA" ));
}*/
if ( iBearer == EBearerIdWLAN )
{
TBuf<10> num;
FLOG(_L("CFMSInterruptAob::RunL()--ENetworkInterrupt due to bearer id WLAN, iStatus %d"),iStatus.Int());
/*if(iWlanAvailable)
FLOG(_L("iWlanAvailable :TRUE"));
else
FLOG(_L("iWlanAvailable :FALSE")); */
if( iWlanAvailable && iStatus == KErrNone )
{
FLOG(_L("CFMSInterruptAob::RunL()--status WLAN networks found"));
LaunchFotaEngineL();
StopServer();
}
else if( iStatus == KErrNotSupported )//feture not supported
{
FLOG(_L("CFMSInterruptAob::RunL()--status WLAN feature not supported"));
StopServer();
}
else
{
FLOG(_L("CFMSInterruptAob::RunL()--status WLAN networks not found"));
if(!IsActive())
{
iWlanAvailable = EFalse;
iStatus=KRequestPending;
iConnMon.GetBoolAttribute( EBearerIdWLAN,
0,
KBearerAvailability,
iWlanAvailable,
iStatus );
FLOG(_L("CFMSInterruptAob::RunL()--search for wlan availability"));
SetActive();
}
}
}
}
else if( iInterruptType == EMemoryInterrupt )
{
FLOG(_L("CFMSInterruptAob::RunL()--EMemoryInterrupt,iStatus %d"),iStatus.Int());
if( iStatus == KErrNone || iStatus == KErrCancel )
{
TBool critical = EFalse;
IsPkgSizeMoreThanWL(critical);
//if download size doesn't lead to memory less than critical level
if( !critical )
{
FLOG(_L("CFMSInterruptAob::RunL()--Ok download not greater than critical level"));
//Check network status at this moment
HandleAboveCriticallevelL();
}
else
{
FLOG(_L("CFMSInterruptAob::RunL()--Ok download greater than critical level"));
// space monitor for this
if(!IsActive())
{
iStatus=KRequestPending;
iFs.NotifyDiskSpace( iSize, iDrive, iStatus );
SetActive();
}
}
}
else // for size request more than disk space
{
FLOG(_L("CFMSInterruptAob::RunL()--bad request size greater than the disk limit"));
StopServer();
}
}
else //general
{
//Already ahandled in session class
}
FLOG(_L("CFMSInterruptAob::RunL()- End"));
}
// ----------------------------------------------------------------------------------------
// CFMSInterruptAob::DoCancel()
// ----------------------------------------------------------------------------------------
void CFMSInterruptAob::DoCancel()
{
FLOG(_L("CFMSInterruptAob::::DoCancel()"));
if( iStatus == KRequestPending )
{
FLOG(_L("CFMSInterruptAob::::DoCancel()--request pending"));
TRequestStatus* status = &iStatus;
User::RequestComplete( status, KErrCancel );
}
}
// ----------------------------------------------------------------------------------------
// CFMSInterruptAob::MemoryToMonitorL()
// ----------------------------------------------------------------------------------------
void CFMSInterruptAob::MemoryToMonitorL(TInt aSize, TDriveNumber aDrive)
{
FLOG(_L("CFMSInterruptAob::::MemoryToMonitorL()--Begin"));
if( aSize < 0 || (aDrive < EDriveA && aDrive > EDriveZ) )
{
FLOG(_L("CFMSInterruptAob::::MemoryToMonitorL()--Leving with KErrArgumnet"));
User::Leave(KErrArgument);
}
iDrive = aDrive;
iSize = aSize;
CheckMemSizeL();
}
// ----------------------------------------------------------------------------------------
// CFMSInterruptAob::NetworkTypeL()
// ----------------------------------------------------------------------------------------
void CFMSInterruptAob::NetworkTypeL(TInt aBearer)
{
if( aBearer == EBearerIdGPRS || aBearer == EBearerIdWLAN
|| aBearer == EBearerIdWCDMA )
{
iBearer = aBearer;
}
else
{
FLOG(_L("CFMSInterruptAob::::NetworkTypeL()--leaving with KErrArgument"));
User::Leave(KErrArgument);
}
}
// ----------------------------------------------------------------------------------------
// CFMSInterruptAob::IsPkgSizeMoreThanWL()
// ----------------------------------------------------------------------------------------
TInt CFMSInterruptAob::IsPkgSizeMoreThanWL(TBool& aCritical)
{
FLOG(_L("CFMSInterruptAob::::IsPkgSizeMoreThanWL()--Begin"));
TInt err = KErrNone;
//Already checked the drive is proper or not
//here the check happened for warning level
TRAP(err,aCritical = SysUtil::DiskSpaceBelowCriticalLevelL ( &iFs, iSize, iDrive ));
FLOG(_L("CFMSInterruptAob::::IsPkgSizeMoreThanWL() end %d"),err);
return err;
}
// ----------------------------------------------------------------------------------------
// CFMSInterruptAob::CheckNetworkL()
// ----------------------------------------------------------------------------------------
TBool CFMSInterruptAob::CheckNetworkL()
{
FLOG(_L("CFMSInterruptAob::CheckNetworkL--begin"));
TRequestStatus status=KRequestPending;
iConnStatus = KErrNone;
TBool phonenotoffline = CheckGlobalRFStateL();
if ( phonenotoffline && iBearer == EBearerIdGPRS )
{
TRequestStatus gsmstatus = KRequestPending;
iConnStatus = KErrNotFound;
FLOG(_L("CFMSInterruptAob::CheckNetworkL--check GSM registry"));
iConnMon.GetIntAttribute( EBearerIdGSM, 0,KNetworkRegistration, iConnStatus, gsmstatus );
User::WaitForRequest(gsmstatus);
FLOG(_L("iConnStatus is %d gsmstatus is %d"),iConnStatus,gsmstatus.Int());
if( iConnStatus == ENetworkRegistrationHomeNetwork ||
iConnStatus == ENetworkRegistrationRoaming )
{
FLOG(_L("CFMSInterruptAob::CheckNetworkL--GSM available"));
FLOG(_L("CFMSInterruptAob::CheckNetworkL--checking GPRS"));
iConnMon.GetBoolAttribute( EBearerIdGPRS, 0,KPacketDataAvailability,
iGPRSAvail, status );
User::WaitForRequest(status);
if( iGPRSAvail && status.Int()==KErrNone )
{
FLOG(_L("CFMSInterruptAob::CheckNetworkL--GPRS available"));
return ETrue;
}
}
}
else if ( phonenotoffline && iBearer == EBearerIdWCDMA )
{
TRequestStatus gsmstatus = KRequestPending;
iConnStatus = KErrNotFound;
FLOG(_L("CFMSInterruptAob::CheckNetworkL--check WCDMA sim registry"));
iConnMon.GetIntAttribute( EBearerIdWCDMA, 0,KNetworkRegistration, iConnStatus, gsmstatus );
User::WaitForRequest(gsmstatus);
FLOG(_L("iConnStatus is %d WCDMA gsmstatus is %d"),iConnStatus,gsmstatus.Int());
if( iConnStatus == ENetworkRegistrationHomeNetwork ||
iConnStatus == ENetworkRegistrationRoaming )
{
FLOG(_L("CFMSInterruptAob::CheckNetworkL--WCDMA GSM available"));
FLOG(_L("CFMSInterruptAob::CheckNetworkL--checking WCDMA GPRS"));
iConnMon.GetBoolAttribute( EBearerIdWCDMA, 0,KPacketDataAvailability,
iGPRSAvail, status );
User::WaitForRequest(status);
if( iGPRSAvail && status.Int()==KErrNone )
{
FLOG(_L("CFMSInterruptAob::CheckNetworkL--WCDMA GPRS available"));
return ETrue;
}
}
}
else if ( iBearer == EBearerIdWLAN )
{
FLOG(_L("CFMSInterruptAob::CheckNetworkL--checking WLAN"));
iWlanAvailable = EFalse;
iConnMon.GetBoolAttribute( EBearerIdWLAN,
0,
KBearerAvailability,
iWlanAvailable,
status );
User::WaitForRequest(status);//Synchronous call
if( iWlanAvailable && status == KErrNone )
{
FLOG(_L("CFMSInterruptAob::CheckNetworkL--wlan available"));
return ETrue;
}
}
else //phone is offline
{
FLOG(_L("CFMSInterruptAob::CheckNetworkL--phone is offline or invalid bearer"));
}
FLOG(_L("CFMSInterruptAob::CheckNetworkL--end"));
return EFalse;
}
// ----------------------------------------------------------------------------------------
// CFMSInterruptAob::CheckGlobalRFStateL()
// ----------------------------------------------------------------------------------------
TBool CFMSInterruptAob::CheckGlobalRFStateL()
{
TInt val = KErrNone;
TInt err = KErrNone;
TInt status = EFalse;
err = RProperty::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;
}
// ----------------------------------------------------------------------------------------
// CFMSInterruptAob::StopServer()
// ----------------------------------------------------------------------------------------
void CFMSInterruptAob::StopServer()
{
FLOG(_L("CFMSInterruptAob::StopServer begin"));
iServer->iSessionCount = 0;
CActiveScheduler::Stop();//---for stopping the server
FLOG(_L("CFMSInterruptAob::StopServer:server stopped"));
}
// ----------------------------------------------------------------------------------------
// CFMSInterruptAob::LaunchFotaEngineL()
// ----------------------------------------------------------------------------------------
void CFMSInterruptAob::LaunchFotaEngineL()
{
FLOG(_L("CFMSInterruptAob::LaunchFotaEngineL call to iFotaEngine.OpenL() "));
TInt err = KErrNone;
TRAP(err,iFotaEngine.OpenL());
FLOG(_L("iFotaEngine.OpenL() launched withe error as %d"),err);
if(err == KErrNone)
{
err = iFotaEngine.TryResumeDownload();
FLOG(_L("iFotaEngine.TryResumeDownload() returns %d"),err);
iFotaEngine.Close();
FLOG(_L("CFMSInterruptAob::LaunchFotaEngineL END - fotaengine closed "));
}
}
// ----------------------------------------------------------------------------------------
// CFMSInterruptAob::CheckMemSizeL()
// ----------------------------------------------------------------------------------------
void CFMSInterruptAob::CheckMemSizeL(/*TInt& aMemoryNeeded*/)
{
FLOG(_L("CFMSInterruptAob::CheckMemSizeL-begin"));
iSize = iSize + KDRIVECWARNINGTHRESHOLD; //irrespective of Drive
FLOG(_L(" neededspace = sizeNeededFromFS + KDRIVECWARNINGTHRESHOLD: %d"), iSize);
FLOG(_L("CFMSInterruptAob::CheckMemSizeL-end"));
}
// ----------------------------------------------------------------------------------------
// CFMSInterruptAob::~CFMSInterruptAob()
// ----------------------------------------------------------------------------------------
CFMSInterruptAob::~CFMSInterruptAob()
{
FLOG(_L("CFMSInterruptAob::~CFMSInterruptAob()"));
if(iPeriodicNwCheck)
{
FLOG(_L("CFMSInterruptAob::~CFMSInterruptAob()--deleting iPeriodicNwCheck"));
delete iPeriodicNwCheck;
iPeriodicNwCheck = NULL;
}
StopNotify();
Cancel();
iConnMon.Close();
if(iProperty.Handle())
{
iProperty.Close();
FLOG(_L("CFMSInterruptAob::~CFMSInterruptAob()--iProperty closed"));
}
if(iInterruptType == EMemoryInterrupt)
{
iFs.NotifyDiskSpaceCancel();
}
iFs.Close();
if(iLine.SubSessionHandle())
{
iLine.Close();
}
if(iPhone.SubSessionHandle())
{
iPhone.Close();
}
if(iTelServer.Handle())
{
iTelServer.Close();
}
FLOG(_L("CFMSInterruptAob::~CFMSInterruptAob()--End"));
}
// ---------------------------------------------------------------------------
// CFMSInterruptAob::RunError
// ---------------------------------------------------------------------------
//
TInt CFMSInterruptAob::RunError( TInt aError )
{
FLOG( _L("CAOConnectionImpl::RunError: aError: %d"), aError );
return aError;
}
//
// -----------------------------------------------------------------------------
// CFMSInterruptAob::NotifyL()
// Registers with connection monitor for notification
// -----------------------------------------------------------------------------
//
void CFMSInterruptAob::NotifyL()
{
FLOG(_L("CFMSInterruptAob::NotifyL Begin "));
iConnMon.NotifyEventL( *this );
FLOG(_L("CFMSInterruptAob::NotifyL, after registering "));
// Threholds
TInt err = iConnMon.SetUintAttribute( iBearer,
0,
KBearerAvailabilityThreshold,
1 );
FLOG(_L("CFMSInterruptAob::NotifyL : END "));
}
// -----------------------------------------------------------------------------
// CFMSInterruptAob::StopNotify()
// Cancels notification with connection monitor
// -----------------------------------------------------------------------------
//
void CFMSInterruptAob::StopNotify()
{
FLOG(_L("CFMSInterruptAob::StopNotify Begin "));
iConnMon.CancelNotifications();
FLOG(_L("CFMSInterruptAob::StopNotify end "));
}
// -----------------------------------------------------------------------------
// CNsmlNetworkStatusEngine::EventL()
// Method involed by connection monitor with current event.
// This method handles the events
// -----------------------------------------------------------------------------
//
void CFMSInterruptAob::EventL( const CConnMonEventBase& aConnMonEvent )
{
FLOG(_L("CFMSInterruptAob::EventL, BEGIN"));
FLOG(_L("CFMSInterruptAob::EventL event is == %d"), aConnMonEvent.EventType() );
switch ( aConnMonEvent.EventType() )
{
case EConnMonNetworkStatusChange:
{
CConnMonBearerAvailabilityChange* eventBearerAvailabilityChange;
eventBearerAvailabilityChange = ( CConnMonBearerAvailabilityChange* ) &aConnMonEvent;
if ( eventBearerAvailabilityChange->ConnectionId() == iBearer )
{
if ( eventBearerAvailabilityChange->Availability() )
{
// Available
if(CheckNetworkL())
{
FLOG(_L("CFMSInterruptAob::EventL()--status GPRS up"));
LaunchFotaEngineL();
StopServer();
}
else
{
FLOG(_L("CFMSInterruptAob::EventL()--status GPRS not up-- but connmon triggererd"));
NotifyL();
}
}
else
{
//check the phone status
// Not available
FLOG(_L("CFMSInterruptAob::EventL()--search for GPRS connection not up"));
NotifyL();
}
}
break;
}
case EConnMonPacketDataAvailable:
{
CConnMonPacketDataAvailable* eventAvailable;
eventAvailable = ( CConnMonPacketDataAvailable* ) &aConnMonEvent;
if ( eventAvailable->ConnectionId() == iBearer )
{
// Available
if(CheckNetworkL())
{
FLOG(_L("CFMSInterruptAob::EventL()--status GPRS up"));
LaunchFotaEngineL();
StopServer();
}
else
{
FLOG(_L("CFMSInterruptAob::EventL()--status GPRS not up-- but connmon triggererd"));
NotifyL();
}
}
else
{
//check the phone status
// Not available
FLOG(_L("CFMSInterruptAob::EventL()--search for GPRS connection not up"));
NotifyL();
}
break;
}
default:
break;
}
}
//------------------------------------------------------------
// CFMSInterruptAob::SetWcdma
//------------------------------------------------------------
void CFMSInterruptAob::SetWcdma()
{
iWcdma = ETrue;
}
//------------------------------------------------------------
// CFMSInterruptAob::CheckNetworkRegistryL
//------------------------------------------------------------
void CFMSInterruptAob::StartNetworkRegistryCheckL()
{
FLOG(_L("CFMSInterruptAob::CheckNetworkRegistryL- begin"));
iPeriodicNwCheck = CPeriodic::NewL (EPriorityNormal) ;
FLOG(_L("CFMSInterruptAob::CheckNetworkRegistryL:-iPeriodicNwCheck created)"));
iPeriodicNwCheck->Start(
TTimeIntervalMicroSeconds32(KRequestTriggerWaitTime*20)
, TTimeIntervalMicroSeconds32(KRequestTriggerWaitTime*25)
, TCallBack(StaticCheckNwRequestL,this) ) ;
FLOG(_L("CFMSInterruptAob::CheckNetworkRegistryL- End"));
}
//------------------------------------------------------------
// CFMSInterruptAob::StopNetworkRegistryCheckL
//------------------------------------------------------------
void CFMSInterruptAob::NetworkRegistryCheckL()
{
FLOG(_L("CFMSInterruptAob::StopNetworkRegistryCheckL- begin"));
if(CheckNetworkL())
{
FLOG(_L("CFMSInterruptAob::StopNetworkRegistryCheckL-n/w found"));
if(iPeriodicNwCheck)
{
delete iPeriodicNwCheck;
iPeriodicNwCheck = NULL;
FLOG(_L("CFMSInterruptAob::iPeriodicNwCheck-deleted"));
}
LaunchFotaEngineL();
StopServer();
}
FLOG(_L("CFMSInterruptAob::StopNetworkRegistryCheckL- End"));
}
//----------------------------------------------------------------------------
// CFMSInterruptAob::StartBatteryMonitoringL
// Starts the monitoring of Battery
//----------------------------------------------------------------------------
void CFMSInterruptAob::StartBatteryMonitoringL(TOmaUpdInterruptReason aType, TUint aLevel)
{
FLOG(_L("CFMSInterruptAob::StartBatteryMonitoringL- begin"));
__ASSERT_ALWAYS(aLevel > EBatteryLevelLevel0 && aLevel <=EBatteryLevelLevel7, User::Leave(KErrArgument));
iUpdInterruptType = aType;
if(iUpdInterruptType == EMonitorbattery)
{
FLOG(_L("CFMSInterruptAob::Start- EMonitorbattery"));
TInt value =0;
iChargeToMonitor = aLevel;
iProperty.Attach(KPSUidHWRMPowerState,KHWRMBatteryLevel);
TInt err=iProperty.Get(KPSUidHWRMPowerState,KHWRMBatteryLevel,value);
if(err != KErrNone)
{
FLOG(_L("CFMSInterruptAob::StartBatteryMonitoringL- error in getiing the battery level"));
StopServer();
}
if(value >= iChargeToMonitor)
{
iProperty.Cancel();
iProperty.Close();
TRAPD(err1, LaunchFotaScheduleUpdate());
if (err1)
{
FLOG(_L("CFMSInterruptAob::error in LaunchFotaScheduleUpdateL()"));
}
StopServer();
}
else
{
if(!IsActive())
{
//RProperty pw;
FLOG(_L("CFMSInterruptAob::Start- attaching for battery"));
iProperty.Attach(KPSUidHWRMPowerState,KHWRMBatteryLevel);
iStatus=KRequestPending;
iProperty.Subscribe(iStatus);
SetActive();
}
}
}
FLOG(_L("CFMSInterruptAob::StartBatteryMonitoringL- end"));
}
//----------------------------------------------------------------------------
// CFMSInterruptAob::LaunchFotaScheduleUpdate
// Launches the FOTA schedule dialog
//----------------------------------------------------------------------------
void CFMSInterruptAob::LaunchFotaScheduleUpdate()
{
RFotaEngineSession fotaengine;
TRAPD(error,fotaengine.OpenL());
if(error == KErrNone)
{
FLOG(_L("CFMSInterruptAob::LaunchFotaScheduleUpdate()- going for update again"));
TFotaScheduledUpdate sched(-1,-1); //trigger the Fota remainder dialog here..
TPckg<TFotaScheduledUpdate> p(sched);
TRAPD(err, fotaengine.ScheduledUpdateL(sched));
if(err)
{
FLOG( _L( "[LaunchFotaScheduleUpdate()] FirmwareUpdate scheduling failed " ) );
}
FLOG(_L("CFMSInterruptAob::LaunchFotaScheduleUpdate()- closing fota engine"));
iUpdInterruptType = ENoUpdInterrupt;
fotaengine.Close();
}
else
{
FLOG(_L("CFMSInterruptAob::LaunchFotaScheduleUpdate()- error in opening the fota engine"));
}
}
//----------------------------------------------------------------------------
// CFMSInterruptAob::CheckNetworkStatusL
// Checks the network status
//----------------------------------------------------------------------------
void CFMSInterruptAob::CheckNetworkStatusL()
{
if(CheckNetworkL())
{
FLOG(_L("CFMSInterruptAob::RunL()--charging & network found"));
LaunchFotaEngineL();
StopServer();
}
else
{
FLOG(_L("CFMSInterruptAob::RunL()--charging but no network found & started monitoring"));
//StartNetWorkMonitoring
iServer->WriteToFile(ENetworkInterrupt, iBearer, EDriveC, 0, iWcdma);
StartL(ENetworkInterrupt);
}
}
//----------------------------------------------------------------------------
// CFMSInterruptAob::HandleChargingInterruptL
// Handle the cherging interrupt
//----------------------------------------------------------------------------
void CFMSInterruptAob::HandleChargingInterruptL()
{
iProperty.Cancel();
iProperty.Close();
//check variation
if(iServer->NetworkTobeMonitered())
{
//Check network status at this moment
CheckNetworkStatusL();
}
else
{
FLOG(_L("CFMSInterruptAob::RunL()--charging & network found"));
LaunchFotaEngineL();
StopServer();
}
}
//----------------------------------------------------------------------------
// CFMSInterruptAob::HandleAboveCriticallevelL
// Handle the meory above critical level
//----------------------------------------------------------------------------
void CFMSInterruptAob::HandleAboveCriticallevelL()
{
if(iServer->NetworkTobeMonitered())
{
if(CheckNetworkL())
{
FLOG(_L("CFMSInterruptAob::RunL()--memory avail & network found"));
//Notify fota server
LaunchFotaEngineL();
StopServer();
}
else
{
FLOG(_L("CFMSInterruptAob::RunL()--memory avail but no network found"));
//StartNetWorkMonitoring
iServer->WriteToFile(ENetworkInterrupt, iBearer, iDrive, 0, iWcdma);
StartL(ENetworkInterrupt);
}
}
else
{
FLOG(_L("CFMSInterruptAob::RunL()--memory avail & no network monitor "));
//Notify fota server
LaunchFotaEngineL();
StopServer();
}
}
//----------------------------------------------------------------------------
// CFMSInterruptAob::LaunchFotaUpdate
// Launches the FOTA update dialog
//----------------------------------------------------------------------------
void CFMSInterruptAob::LaunchFotaUpdate(TInt& aPkgId, TInt& aProfileId)
{
RFotaEngineSession fotaengine;
TRAPD(error,fotaengine.OpenL());
if(error == KErrNone)
{
FLOG(_L("CFMSInterruptAob::LaunchFotaUpdate()- going for update pkgid:%d,profile:%d "),aPkgId,aProfileId);
TInt err=fotaengine.Update( aPkgId, aProfileId, KNullDesC8, KNullDesC8 );
if(err)
{
FLOG( _L( "LaunchFotaUpdate() failed " ) );
}
FLOG(_L("CFMSInterruptAob::LaunchFotaUpdate()- closing fota engine"));
iUpdInterruptType = ENoUpdInterrupt;
fotaengine.Close();
}
else
{
FLOG(_L("CFMSInterruptAob::LaunchFotaUpdate()- error in opening the fota engine"));
}
}
//----------------------------------------------------------------------------
// CFMSInterruptAob::StartCallEndMonitoringL
// starts monitoring for call end
//----------------------------------------------------------------------------
void CFMSInterruptAob::StartCallEndMonitoringL(TOmaUpdInterruptReason aType)
{
if(!IsActive())
{
FLOG(_L("Starting Call End Monitoring:Begin"));
iUpdInterruptType = aType;
User::LeaveIfError(iTelServer.Connect());
_LIT(KTsyName, "phonetsy.tsy");//TSY module names wouldn't change
RTelServer::TPhoneInfo info;
RPhone::TLineInfo lineInfo;
User::LeaveIfError(iTelServer.LoadPhoneModule(KTsyName));
// Get the details for the first (and only) phone.
User::LeaveIfError(iTelServer.GetPhoneInfo(0, info));
// Open the phone.
User::LeaveIfError(iPhone.Open(iTelServer, info.iName));
iPhone.Initialise();
TInt numberLines = 0;
User::LeaveIfError(iPhone.EnumerateLines(numberLines));
TBool foundLine = EFalse;
for (TInt a = 0; a < numberLines; a++)
{
User::LeaveIfError(iPhone.GetLineInfo(a, lineInfo));
if (lineInfo.iLineCapsFlags & RLine::KCapsVoice)
{
foundLine = ETrue;
break;
}
}
if (!foundLine)
{
User::Leave(KErrNotFound);
}
User::LeaveIfError(iLine.Open(iPhone, lineInfo.iName));
iCallStatus = RCall::EStatusIdle;
iLine.NotifyStatusChange(iStatus, iCallStatus);
SetActive();
}
FLOG(_L("Starting Call End Monitoring: end"));
}
//End of File