diff -r 000000000000 -r 96612d01cf9f videofeeds/scheduleddlplugin/src/iptvbatterywatcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videofeeds/scheduleddlplugin/src/iptvbatterywatcher.cpp Mon Jan 18 20:21:12 2010 +0200 @@ -0,0 +1,262 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Publish & Subscribe watcher client for battery values.* +*/ + + + + +#include +#include "IptvDebug.h" + +#include "iptvbatterywatcher.h" +#include "iptvbatterywatcherobserver.h" + + + +// --------------------------------------------------------------------------- +// CIptvBatteryWatcher::CIptvBatteryWatcher +// --------------------------------------------------------------------------- +// +CIptvBatteryWatcher::CIptvBatteryWatcher() : CActive( EPriorityNormal ) + { + } + + +// --------------------------------------------------------------------------- +// CIptvBatteryWatcher::ConstructL +// --------------------------------------------------------------------------- +// +void CIptvBatteryWatcher::ConstructL() + { + User::LeaveIfError( iProperty.Attach( + KPSUidHWRMPowerState, + KHWRMBatteryStatus, + EOwnerThread ) ); + + CActiveScheduler::Add(this); + // Do initial subscription and process current property value + RunL(); + } + + +// --------------------------------------------------------------------------- +// CIptvBatteryWatcher::NewL +// --------------------------------------------------------------------------- +// +CIptvBatteryWatcher* CIptvBatteryWatcher::NewL() + { + CIptvBatteryWatcher* self = CIptvBatteryWatcher::NewLC(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// CIptvBatteryWatcher::NewLC +// --------------------------------------------------------------------------- +// +CIptvBatteryWatcher* CIptvBatteryWatcher::NewLC() + { + CIptvBatteryWatcher* self = new( ELeave ) CIptvBatteryWatcher; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +// --------------------------------------------------------------------------- +// CIptvBatteryWatcher::~CIptvBatteryWatcher +// --------------------------------------------------------------------------- +// +CIptvBatteryWatcher::~CIptvBatteryWatcher() + { + Cancel(); + iProperty.Close(); + iObservers.Reset(); + } + + +// --------------------------------------------------------------------------- +// CIptvBatteryWatcher::GetBatteryStatus +// --------------------------------------------------------------------------- +// +TInt CIptvBatteryWatcher::GetBatteryStatus( TInt& aBatteryStatus ) + { + IPTVLOGSTRING_HIGH_LEVEL(">>> CIptvBatteryWatcher::GetBatteryStatus"); + + RProperty batteryProperty; + + TInt err = batteryProperty.Attach( + KPSUidHWRMPowerState, + KHWRMBatteryStatus, + EOwnerThread ); + + if (err == KErrNone) + { + err = batteryProperty.Get( aBatteryStatus ); + } + IPTVLOGSTRING2_HIGH_LEVEL("CIptvBatteryWatcher::GetBatteryStatus %d", aBatteryStatus); + IPTVLOGSTRING_HIGH_LEVEL("<<< CIptvBatteryWatcher::GetBatteryStatus"); + + batteryProperty.Close(); + + return err; + } + + +// --------------------------------------------------------------------------- +// CIptvBatteryWatcher::GetChargerStatus +// --------------------------------------------------------------------------- +// +TInt CIptvBatteryWatcher::GetChargerStatus( TInt& aChargerStatus ) + { + IPTVLOGSTRING_HIGH_LEVEL(">>> CIptvBatteryWatcher::GetChargerStatus"); + + RProperty chargingProperty; + + TInt err = chargingProperty.Attach( + KPSUidHWRMPowerState, + KHWRMChargingStatus, + EOwnerThread ); + + if (err == KErrNone) + { + err = chargingProperty.Get( aChargerStatus ); + } + + IPTVLOGSTRING2_HIGH_LEVEL("CIptvBatteryWatcher::GetChargerStatus %d", aChargerStatus); + IPTVLOGSTRING_HIGH_LEVEL("<<< CIptvBatteryWatcher::GetChargerStatus"); + + chargingProperty.Close(); + + return err; + } + + +// --------------------------------------------------------------------------- +// CIptvBatteryWatcher::IsLowPower +// --------------------------------------------------------------------------- +// +TBool CIptvBatteryWatcher::IsLowPower() + { + IPTVLOGSTRING_HIGH_LEVEL(">>> CIptvBatteryWatcher::IsLowPower"); + + TInt batteryStatus = EBatteryStatusUnknown; + TBool lowBattery = EFalse; + + // Try to get the battery status + GetBatteryStatus(batteryStatus); + + // If it is not ok or we didn't get it, do additional stuff + if (batteryStatus != EBatteryStatusOk) + { + // Assume low or empty battery status + // In empty case just inform observers + lowBattery = ETrue; + if (batteryStatus == EBatteryStatusLow) + { + // Low battery, check the charging state also + // EBatteryStatusLow status is send multiple times + TInt chargingStatus = EChargingStatusNotConnected; + + if (GetChargerStatus( chargingStatus ) == KErrNone) + { + switch (chargingStatus) + { + case EChargingStatusCharging: + case EChargingStatusAlmostComplete: + case EChargingStatusChargingComplete: + case EChargingStatusChargingContinued: + { + lowBattery = EFalse; + } + break; + + default: + { + lowBattery = ETrue; + } + break; + } + } + } + } + + IPTVLOGSTRING2_HIGH_LEVEL("CIptvBatteryWatcher::IsLowPower %d", lowBattery); + IPTVLOGSTRING_HIGH_LEVEL("<<< CIptvBatteryWatcher::IsLowPower"); + + return lowBattery; + } + + +// --------------------------------------------------------------------------- +// CIptvBatteryWatcher::AddObserverL +// --------------------------------------------------------------------------- +// +void CIptvBatteryWatcher::AddObserverL( MBatteryWatcherObserver* aObserver ) + { + iObservers.AppendL( aObserver ); + } + +void CIptvBatteryWatcher::RemoveObserver( MBatteryWatcherObserver* aObserver ) + { + TInt index = iObservers.Find( aObserver ); + if (index != KErrNotFound) + { + iObservers.Remove( index ); + } + } + + +// --------------------------------------------------------------------------- +// CIptvBatteryWatcher::RunL +// +// From class CActive. +// --------------------------------------------------------------------------- +// +void CIptvBatteryWatcher::RunL() + { + IPTVLOGSTRING_HIGH_LEVEL(">>> CIptvBatteryWatcher::RunL"); + + // Resubscribe before processing new value to prevent missing updates + iProperty.Subscribe( iStatus ); + SetActive(); + + TBool lowBattery = IsLowPower(); + + if (lowBattery) + { + IPTVLOGSTRING_HIGH_LEVEL("CIptvBatteryWatcher::RunL low battery and no charger"); + + for (TInt i = 0; i < iObservers.Count(); i++) + { + iObservers[i]->BatteryLow(); + } + } + + IPTVLOGSTRING_HIGH_LEVEL("<<< CIptvBatteryWatcher::RunL"); + } + +// --------------------------------------------------------------------------- +// CIptvBatteryWatcher::DoCancel +// +// From class CActive. +// --------------------------------------------------------------------------- +// +void CIptvBatteryWatcher::DoCancel() + { + iProperty.Cancel(); + } +