ohmu
·
2026-10-15
1#pragma once
2
3#ifdef FF_HAVE_DBUS
4 #include <dbus/dbus.h>
5
6 #include "common/FFstrbuf.h"
7 #include "common/library.h"
8
9typedef struct FFDBusLibrary {
10 FF_LIBRARY_SYMBOL(dbus_bus_get)
11 FF_LIBRARY_SYMBOL(dbus_message_new_method_call)
12 FF_LIBRARY_SYMBOL(dbus_message_append_args)
13 FF_LIBRARY_SYMBOL(dbus_message_iter_init)
14 FF_LIBRARY_SYMBOL(dbus_message_iter_get_arg_type)
15 FF_LIBRARY_SYMBOL(dbus_message_iter_get_basic)
16 FF_LIBRARY_SYMBOL(dbus_message_iter_recurse)
17 FF_LIBRARY_SYMBOL(dbus_message_iter_has_next)
18 FF_LIBRARY_SYMBOL(dbus_message_iter_next)
19 FF_LIBRARY_SYMBOL(dbus_message_unref)
20 FF_LIBRARY_SYMBOL(dbus_connection_send_with_reply_and_block)
21 FF_LIBRARY_SYMBOL(dbus_connection_unref)
22} FFDBusLibrary;
23
24typedef struct FFDBusData {
25 const FFDBusLibrary* lib;
26 DBusConnection* connection;
27} FFDBusData;
28
29const char* ffDBusLoadData(DBusBusType busType, FFDBusData* data); // Returns an error message or nullptr on success
30bool ffDBusGetString(FFDBusData* dbus, DBusMessageIter* iter, FFstrbuf* result);
31bool ffDBusGetBool(FFDBusData* dbus, DBusMessageIter* iter, bool* result);
32bool ffDBusGetUint(FFDBusData* dbus, DBusMessageIter* iter, uint64_t* result);
33DBusMessage* ffDBusGetMethodReply(FFDBusData* dbus, const char* busName, const char* objectPath, const char* interface, const char* method, const char* arg1, const char* arg2);
34DBusMessage* ffDBusGetProperty(FFDBusData* dbus, const char* busName, const char* objectPath, const char* interface, const char* property);
35bool ffDBusGetPropertyString(FFDBusData* dbus, const char* busName, const char* objectPath, const char* interface, const char* property, FFstrbuf* result);
36bool ffDBusGetInt(FFDBusData* dbus, DBusMessageIter* iter, int64_t* result);
37bool ffDBusGetPropertyUint(FFDBusData* dbus, const char* busName, const char* objectPath, const char* interface, const char* property, uint64_t* result);
38void ffDBusDestroyData(FFDBusData* data);
39
40static inline DBusMessage* ffDBusGetAllProperties(FFDBusData* dbus, const char* busName, const char* objectPath, const char* interface) {
41 return ffDBusGetMethodReply(dbus, busName, objectPath, "org.freedesktop.DBus.Properties", "GetAll", interface, nullptr);
42}
43
44 #define FF_DBUS_AUTO_DESTROY_DATA [[gnu::cleanup(ffDBusDestroyData)]]
45
46#endif // FF_HAVE_DBUS