summaryrefslogtreecommitdiffstats
path: root/src/dbus_common.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dbus_common.c')
-rw-r--r--src/dbus_common.c84
1 files changed, 69 insertions, 15 deletions
diff --git a/src/dbus_common.c b/src/dbus_common.c
index dd3bae5..6e05524 100644
--- a/src/dbus_common.c
+++ b/src/dbus_common.c
@@ -12,40 +12,60 @@
#include "dbus_common.h"
#include "eulogium.h"
#include "eulogium_item_list.h"
+#include "procedures.h"
-void on_method_generic_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
+void on_method_generic_ret(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
{
+ const char *errname, *errmsg;
- struct list_item *item = data;
+ if (eldbus_message_error_get(msg, &errname, &errmsg)) {
+ EINA_LOG_ERR("%s %s", errname, errmsg);
+ return;
+ }
+}
+
+void on_method_generic_bool_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
+{
const char *errname, *errmsg;
- Eina_Bool state;
+ Eina_Bool ret;
if (eldbus_message_error_get(msg, &errname, &errmsg)) {
EINA_LOG_ERR("%s %s", errname, errmsg);
return;
}
+ if (!eldbus_message_arguments_get(msg, "b", &ret)) {
+ EINA_LOG_ERR("Signature mismatch, \"b\".");
+ return;
+ }
+ if (ret)
+ EINA_LOG_INFO("Ran %s successfully.", (char *)data);
+ else
+ EINA_LOG_WARN("%s failed to run.", (char *)data);
}
+#define _TECH_ETHERNET "ethernet"
+#define _TECH_WIFI "wifi"
void on_method_get_network_info_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
{
struct eulogium_data *eulogium = data; /* TODO replace this by making networks direct via ** */
struct network_data *networks = NULL;
const char *errname, *errmsg;
- Eldbus_Message_Iter *array, *net_struct;
- char *obj_path, *tech, *ipv4, *ipv6, *ssid, *dummy;
+ Eldbus_Message_Iter *array, *array_security, *net_struct;
+ char *obj_path, *state, *error, *ssid, *tech, *ipv4, *ipv6, *security;
+ uint8_t strength, favorite, immutable, autoconnect;
uint_fast16_t i = 0;
if (eldbus_message_error_get(msg, &errname, &errmsg)) {
EINA_LOG_ERR("%s %s", errname, errmsg);
return;
}
- if (!eldbus_message_arguments_get(msg, "a(osssss)", &array)) {
- EINA_LOG_ERR("Message content does not match expected \"a(osssss)\" signature. (%s)", eldbus_message_signature_get(msg));
+ if (!eldbus_message_arguments_get(msg, "a(ossssybbbssas)", &array)) {
+ EINA_LOG_ERR("Message content does not match expected \"a(ossssybbbssas)\" signature. (%s)", eldbus_message_signature_get(msg));
return;
}
- while (eldbus_message_iter_get_and_next(array, 'r', &net_struct))
- if (!eldbus_message_iter_arguments_get(net_struct, "osssss", &obj_path, &tech, &ipv4, &ipv6, &ssid, &dummy)) {
- EINA_LOG_ERR("Message content does not match expected \"osssss\" signature. (%s)", eldbus_message_signature_get(msg));
+ while (eldbus_message_iter_get_and_next(array, 'r', &net_struct)) {
+ if (!eldbus_message_iter_arguments_get(net_struct, "ossssybbbssas", &obj_path, &state, &error, &ssid, &tech, &strength, &favorite, &immutable, &autoconnect, &ipv4, &ipv6, &array_security)) {
+ EINA_LOG_ERR("Message content does not match expected \"ossssybbbssas\" signature. (%s)", eldbus_message_signature_get(msg));
break;
} else {
networks = realloc(networks, (i + 2) * sizeof(struct network_data));
@@ -60,25 +80,59 @@ void on_method_get_network_info_ret(void *data, const Eldbus_Message *msg, Eldbu
else
strncpy(networks[i].obj_path, obj_path, obj_pathsize);
- networks[i].tech = UNKNOWN;
- if (strcmp(tech, _TECH_ETHERNET))
+ networks[i].tech = TECH_UNKNOWN;
+ if (!strcmp(tech, _TECH_ETHERNET))
networks[i].tech = TECH_ETHERNET;
- if (strcmp(tech, _TECH_WIFI))
+ if (!strcmp(tech, _TECH_WIFI))
networks[i].tech = TECH_WIFI;
strncpy(networks[i].ipv4, ipv4, IPV4_MAX_LEN);
strncpy(networks[i].ipv6, ipv6, IPV6_MAX_LEN);
strncpy(networks[i].ssid, ssid, SSID_MAX_LEN);
+ while (eldbus_message_iter_get_and_next(array_security, 's', &security))
+ /* noop */;
}
i++;
}
+ }
+ if (i < 1)
+ return;
+
networks[i].obj_path = NULL; /* sentinel */
eulogium->networks = networks;
}
-void on_signal_network_info_changed_ret(void *data, const Eldbus_Message *msg)
+void on_signal_network_info_changed_ret(void *data, const Eldbus_Message *msg EINA_UNUSED)
+{
+ struct eulogium_data *eulogium = data;
+
+ /* XXX TODO: Right now we ignore the received message and just assume data
+ * has changed and we request a new array. The received object path is thus also ignored.
+ */
+ eldbus_proxy_call(eulogium->dbus.proxy[NETWORK], "getNetworkServicesInfo", on_method_get_network_info_ret, eulogium, -1, "b", 1);
+}
+
+void on_method_get_procedure_metadata_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
+{
+ const struct procedure_data *proc = data;
+ const char *errname, *errmsg;
+ Eldbus_Message_Iter *array;
+
+ if (eldbus_message_error_get(msg, &errname, &errmsg)) {
+ EINA_LOG_ERR("%s %s", errname, errmsg); /* XXX do these need to be free'ed? FIXME! YES! They do */
+ return;
+ }
+ if (!eldbus_message_arguments_get(msg, "a{sv}", &array)) {
+ EINA_LOG_ERR("Message content does not match expected \"a{sv}\" signature. (%s)", eldbus_message_signature_get(msg)); /* XXX this return value may need to be freed actually!! Yep they do.*/
+ return;
+ }
+ eldbus_message_iter_dict_iterate(array, "sv", proc->parser, proc);
+}
+
+/* XXX we are likely not getting a signal, but will deal with this on procedure start and procedure finished. */
+void on_signal_procedure_metadata_changed_ret(void *data, const Eldbus_Message *msg)
{
- on_method_get_network_info_ret(data, msg, NULL);
+ on_method_get_procedure_metadata_ret(data, msg, NULL);
}
void on_method_is_network_powered_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)