#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",
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");
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;
}
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);
#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();
virtual bool CanHibernate();
virtual bool CanReboot();
+ virtual bool PumpPowerEvents(IPowerEventsCallback *callback);
+
static bool HasDeviceConsoleKit();
private:
static bool ConsoleKitMethodCall(const char *method);
bool m_CanSuspend;
bool m_CanHibernate;
bool m_CanReboot;
+
+ DBusConnection *m_connection;
+ DBusError m_error;
};
#endif