Hooked up sleep/wake events in UPower
authortopfs2 <topfs2@svn>
Fri, 7 May 2010 21:07:34 +0000 (21:07 +0000)
committertopfs2 <topfs2@svn>
Fri, 7 May 2010 21:07:34 +0000 (21:07 +0000)
git-svn-id: https://xbmc.svn.sourceforge.net/svnroot/xbmc/trunk@29905 568bbfeb-2a22-0410-94d2-cc84cf5bfa90

xbmc/linux/ConsoleUPowerSyscall.cpp
xbmc/linux/ConsoleUPowerSyscall.h

index 261eecf..90d873a 100644 (file)
 #ifdef HAS_DBUS
 #include "Application.h"
 #include "LocalizeStrings.h"
-#include "DBusUtil.h"
 
 CConsoleUPowerSyscall::CConsoleUPowerSyscall()
 {
+  dbus_error_init (&m_error);
+  m_connection = dbus_bus_get(DBUS_BUS_SYSTEM, &m_error);
+
+  dbus_bus_add_match(m_connection, "type='signal',interface='org.freedesktop.UPower'", &m_error);
+  dbus_connection_flush(m_connection);
+  if (dbus_error_is_set(&m_error))
+  {
+    CLog::Log(LOGERROR, "UPower: Failed to attach to signal %s", m_error.message);
+    dbus_connection_unref(m_connection);
+    m_connection = NULL;
+  }
+
   m_CanPowerdown = ConsoleKitMethodCall("CanStop");
 
   // If "the name org.freedesktop.UPower was not provided by any .service files",
@@ -51,6 +62,17 @@ CConsoleUPowerSyscall::CConsoleUPowerSyscall()
   m_CanReboot    = ConsoleKitMethodCall("CanRestart");
 }
 
+CConsoleUPowerSyscall::~CConsoleUPowerSyscall()
+{
+  if (m_connection)
+  {
+    dbus_connection_unref(m_connection);
+    m_connection = NULL;
+  }
+
+  dbus_error_free (&m_error);
+}
+
 bool CConsoleUPowerSyscall::Powerdown()
 {
   CDBusMessage message("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", "Stop");
@@ -59,16 +81,12 @@ bool CConsoleUPowerSyscall::Powerdown()
 
 bool CConsoleUPowerSyscall::Suspend()
 {
-  CPowerSyscallWithoutEvents::Suspend();
-
   CDBusMessage message("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.UPower", "Suspend");
   return message.SendSystem() != NULL;
 }
 
 bool CConsoleUPowerSyscall::Hibernate()
 {
-  CPowerSyscallWithoutEvents::Hibernate();
-
   CDBusMessage message("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.UPower", "Hibernate");
   return message.SendSystem() != NULL;
 }
@@ -130,6 +148,30 @@ bool CConsoleUPowerSyscall::HasDeviceConsoleKit()
   return hasUPower && hasConsoleKitManager;
 }
 
+bool CConsoleUPowerSyscall::PumpPowerEvents(IPowerEventsCallback *callback)
+{
+  bool result = false;
+  if (m_connection)
+  {
+    dbus_connection_read_write(m_connection, 0);
+    DBusMessage *msg = dbus_connection_pop_message(m_connection);
+
+    if (msg)
+    {
+      result = true;
+      if (dbus_message_is_signal(msg, "org.freedesktop.UPower", "Sleeping"))
+        callback->OnSleep();
+      else if (dbus_message_is_signal(msg, "org.freedesktop.UPower", "Resuming"))
+        callback->OnWake();
+      else
+        CLog::Log(LOGDEBUG, "UPower: Recieved an unkown signal %s", dbus_message_get_member(msg));
+
+      dbus_message_unref(msg);
+    }
+  }
+  return result;
+}
+
 bool CConsoleUPowerSyscall::ConsoleKitMethodCall(const char *method)
 {
   CDBusMessage message("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", method);
index 54601d2..d8cc81e 100644 (file)
 
 #ifdef HAS_DBUS
 #include "IPowerSyscall.h"
+#include "DBusUtil.h"
 
-class CConsoleUPowerSyscall : public CPowerSyscallWithoutEvents
+class CConsoleUPowerSyscall : public IPowerSyscall
 {
 public:
   CConsoleUPowerSyscall();
-  virtual ~CConsoleUPowerSyscall() { }
+  virtual ~CConsoleUPowerSyscall();
 
   virtual bool Powerdown();
   virtual bool Suspend();
@@ -38,6 +39,8 @@ public:
   virtual bool CanHibernate();
   virtual bool CanReboot();
 
+  virtual bool PumpPowerEvents(IPowerEventsCallback *callback);
+
   static bool HasDeviceConsoleKit();
 private:
   static bool ConsoleKitMethodCall(const char *method);
@@ -46,5 +49,8 @@ private:
   bool m_CanSuspend;
   bool m_CanHibernate;
   bool m_CanReboot;
+
+  DBusConnection *m_connection;
+  DBusError m_error;
 };
 #endif