summaryrefslogtreecommitdiffstats
path: root/xbmc/platform/linux/DBusUtil.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/platform/linux/DBusUtil.h')
-rw-r--r--xbmc/platform/linux/DBusUtil.h88
1 files changed, 88 insertions, 0 deletions
diff --git a/xbmc/platform/linux/DBusUtil.h b/xbmc/platform/linux/DBusUtil.h
new file mode 100644
index 0000000..57349ac
--- /dev/null
+++ b/xbmc/platform/linux/DBusUtil.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#pragma once
+
+#include "DBusMessage.h"
+#include "utils/Variant.h"
+
+#include <memory>
+#include <string>
+
+#include <dbus/dbus.h>
+
+class CDBusUtil
+{
+public:
+ static CVariant GetAll(const char *destination, const char *object, const char *interface);
+ static CVariant GetVariant(const char *destination, const char *object, const char *interface, const char *property);
+ /**
+ * Try to call a DBus method and return whether the call succeeded
+ */
+ static bool TryMethodCall(DBusBusType bus, const char* destination, const char* object, const char* interface, const char* method);
+ /**
+ * Try to call a DBus method and return whether the call succeeded
+ */
+ static bool TryMethodCall(DBusBusType bus, std::string const& destination, std::string const& object, std::string const& interface, std::string const& method);
+
+private:
+ static CVariant ParseType(DBusMessageIter *itr);
+ static CVariant ParseVariant(DBusMessageIter *itr);
+};
+
+class CDBusConnection
+{
+public:
+ CDBusConnection();
+ bool Connect(DBusBusType bus, bool openPrivate = false);
+ bool Connect(DBusBusType bus, CDBusError& error, bool openPrivate = false);
+ void Destroy();
+ operator DBusConnection*();
+
+private:
+ CDBusConnection(CDBusConnection const& other) = delete;
+ CDBusConnection& operator=(CDBusConnection const& other) = delete;
+
+ struct DBusConnectionDeleter
+ {
+ DBusConnectionDeleter() {}
+ bool closeBeforeUnref = false;
+ void operator()(DBusConnection* connection) const;
+ };
+ std::unique_ptr<DBusConnection, DBusConnectionDeleter> m_connection;
+};
+
+class CDBusError
+{
+public:
+ CDBusError();
+ ~CDBusError();
+ operator DBusError*();
+ bool IsSet() const;
+ /**
+ * Reset this error wrapper
+ *
+ * If there was an error, it was handled and this error wrapper should be used
+ * again in a new call, it must be reset before that call.
+ */
+ void Reset();
+ // Keep because operator DBusError* would be used for if-statements on
+ // non-const CDBusError instead
+ operator bool();
+ operator bool() const;
+ std::string Name() const;
+ std::string Message() const;
+ void Log(std::string const& message = "DBus error") const;
+ void Log(int level, std::string const& message = "DBus error") const;
+
+private:
+ CDBusError(CDBusError const& other) = delete;
+ CDBusError& operator=(CDBusError const& other) = delete;
+
+ DBusError m_error;
+};