videofeeds/scheduleddlplugin/src/iptvbatterywatcher.cpp
changeset 0 96612d01cf9f
--- /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 <hwrmpowerstatesdkpskeys.h>
+#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();
+    }
+