#include "arc/linux/dbus/helpers.h" #include "arc/linux/dbus/dbus.h" #include #include typedef struct ARC_DBus { DBusConnection *connection; DBusError error; const char *handle; } ARC_DBus; void ARC_DBusHelper_BusRequestName(ARC_DBus *dbus, const char *interface, const char *objectPath){ int32_t response = dbus_bus_request_name(dbus->connection, interface, DBUS_NAME_FLAG_REPLACE_EXISTING, &(dbus->error)); if(response == -1){ printf("Request name failed %s\n", (dbus->error).message); dbus_error_free(&(dbus->error)); return; } } void ARC_DBusHelper_BusAddMatch(ARC_DBus *dbus, const char *interface, const char *objectPath, const char *member){ //add response signal const char *matchRuleCStr = "type='signal',interface='%s',path='%s',member='%s'"; uint32_t matchRuleLen = strlen(matchRuleCStr) + strlen(interface) + strlen(objectPath) + strlen(member); char matchRule[matchRuleLen]; snprintf(matchRule, matchRuleLen, matchRuleCStr, interface, objectPath, member); dbus_bus_add_match(dbus->connection, matchRule, &(dbus->error)); if(dbus_error_is_set(&(dbus->error))){ printf("failed to add match rule: %s\n", matchRuleCStr); dbus_error_free(&(dbus->error)); } } void ARC_DBusHelper_HandleSignal(DBusMessage *message){ DBusError error; dbus_error_init(&error); uint32_t response; DBusMessageIter argumentsIter; dbus_message_iter_init(message, &argumentsIter); dbus_message_iter_get_basic(&argumentsIter, &response); printf("Response signal: %u\n", response); dbus_error_free(&error); } void ARC_DBusHelper_AddStringVarientStringToMessageIterDictionary(DBusMessageIter *dictonaryIter, const char *stringKey, const char *varientStringValue){ //TODO: should add arc error checks here DBusMessageIter keyIter; dbus_message_iter_open_container(dictonaryIter, DBUS_TYPE_DICT_ENTRY, NULL, &keyIter); dbus_message_iter_append_basic(&keyIter, DBUS_TYPE_STRING, &stringKey); DBusMessageIter valueIter; dbus_message_iter_open_container(&keyIter, DBUS_TYPE_VARIANT, DBUS_TYPE_STRING_AS_STRING, &valueIter); dbus_message_iter_append_basic(&valueIter, DBUS_TYPE_STRING, &varientStringValue); dbus_message_iter_close_container(&keyIter, &valueIter); dbus_message_iter_close_container(dictonaryIter, &keyIter); }