From 9e49954b85d456fa6bd823c743e7e36151a3e535 Mon Sep 17 00:00:00 2001 From: Olliver Schinagl Date: Fri, 19 Jun 2015 13:34:30 +0200 Subject: Handle networking dbus calls Signed-off-by: Olliver Schinagl --- src/dbus_handlers.c | 39 +++++++++++++++++++++++++++++++++++++++ src/dbus_handlers.h | 29 +++++++++++++++++++++++++++++ src/eulogium.c | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 src/dbus_handlers.c create mode 100644 src/dbus_handlers.h diff --git a/src/dbus_handlers.c b/src/dbus_handlers.c new file mode 100644 index 0000000..2c817da --- /dev/null +++ b/src/dbus_handlers.c @@ -0,0 +1,39 @@ +/* + * function and data types for signal handlers + * + * Copyright (c) 2015 Ultimaker B.V. + * Author: Olliver Schinagl + * + * SPDX-License-Identifier: AGPL-3.0+ + */ + +#include + +#include "dbus_handlers.h" +#include "eulogium_item_list.h" + +void on_method_is_network_powered_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +{ + struct list_item *item = data; + const char *errname, *errmsg; + Eina_Bool state; + + if (eldbus_message_error_get(msg, &errname, &errmsg)) { + EINA_LOG_ERR("%s %s", errname, errmsg); + return; + } + if (!eldbus_message_arguments_get(msg, "b", &state)) { + EINA_LOG_ERR("Failed to get networking state."); + return; + } + if (!item->_widget) + return; + + EINA_LOG_INFO("%s is now %d\n", eldbus_message_member_get(msg), state); + elm_check_state_set(item->_widget, state); +} + +void on_signal_network_power_changed_ret(void *data, const Eldbus_Message *msg) +{ + on_method_is_network_powered_ret(data, msg, NULL); +} diff --git a/src/dbus_handlers.h b/src/dbus_handlers.h new file mode 100644 index 0000000..cf69f4c --- /dev/null +++ b/src/dbus_handlers.h @@ -0,0 +1,29 @@ +/* + * function and data types for dbus calls + * + * Copyright (c) 2015 Ultimaker B.V. + * Author: Olliver Schinagl + * + * SPDX-License-Identifier: AGPL-3.0+ + */ + +#ifndef _DBUS_HANDLERS_H +#define _DBUS_HANDLERS_H + +#include +#include +#include + +//#include "widget_data.h" + +struct dbus_handle { + const char *signal; + Eldbus_Signal_Cb sig_cb; + const char *method; + Eldbus_Message_Cb met_cb; +}; + +void on_method_is_network_powered_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED); +void on_signal_network_power_changed_ret(void *data, const Eldbus_Message *msg); + +#endif /* _DBUS_HANDLERS_H */ diff --git a/src/eulogium.c b/src/eulogium.c index 0c405db..803c8d4 100644 --- a/src/eulogium.c +++ b/src/eulogium.c @@ -18,6 +18,7 @@ #include "eulogium_private.h" #include "gettext.h" #include "procedures.h" +#include "dbus_handlers.h" #include "widget_data.h" #define COPYRIGHT "Copyright © 2015 Olliver Schinagl and various contributors (see AUTHORS)." @@ -495,6 +496,13 @@ static struct menu_def menu_settings_network = { .item = { .type = LIST_ITEM_CHECK, .state = EINA_FALSE, + ._widget = NULL, + }, + .dbus = { + .signal = "WifiPowerChanged", + .sig_cb = on_signal_network_power_changed_ret, + .method = "isWifiPowered", + .met_cb = on_method_is_network_powered_ret, }, .end = NULL, .footer = NULL, @@ -505,6 +513,17 @@ static struct menu_def menu_settings_network = { }, { .icon = NULL, .label = "Ethernet", + .item = { + .type = LIST_ITEM_CHECK, + .state = EINA_FALSE, + ._widget = NULL, + }, + .dbus = { + .signal = "EthernetPowerChanged", + .sig_cb = on_signal_network_power_changed_ret, + .method = "isEthernetPowered", + .met_cb = on_method_is_network_powered_ret, + }, .end = NULL, .footer = NULL, .footer_alt = NULL, @@ -514,6 +533,17 @@ static struct menu_def menu_settings_network = { }, { .icon = NULL, .label = "Hotspot", + .item = { + .type = LIST_ITEM_CHECK, + .state = EINA_FALSE, + ._widget = NULL, + }, + .dbus = { + .signal = "HotspotPowerChanged", + .sig_cb = on_signal_network_power_changed_ret, + .method = "isHotspotPowered", + .met_cb = on_method_is_network_powered_ret, + }, .footer = NULL, .footer_alt = NULL, .end = NULL, @@ -3269,6 +3299,19 @@ static void _on_error_ret(void *data, const Eldbus_Message *msg) _on_get_error_ret(data, msg, NULL); } +static uint_fast16_t _dbus_members_map(Eldbus_Proxy *proxy, struct menu_entry_def *entry) +{ + uint_fast16_t i; + + for (i = 0; entry[i].label; i++) + if (entry[i].dbus.signal && entry[i].dbus.sig_cb) + eldbus_proxy_signal_handler_add(proxy, entry[i].dbus.signal, entry[i].dbus.sig_cb, &entry[i].item); + if (entry[i].dbus.method && entry[i].dbus.met_cb) + eldbus_proxy_call(proxy, entry[i].dbus.method, entry[i].dbus.met_cb, &entry[i].item, -1, ""); + + return i; +} + static int eulogium_dbus_init(struct eulogium_data *eulogium) { Eldbus_Object *obj; @@ -3328,10 +3371,9 @@ static int eulogium_dbus_init(struct eulogium_data *eulogium) EINA_LOG_WARN("Could not get dbus network proxy."); return -EFAULT; } - /* First query the status and store it, we don't know the initial status, - * and the statusChanged signal may not have been fired yet - */ + _dbus_members_map(eulogium->dbus.proxy[NETWORK], menu_settings_network.entry); /* TODO: put signal/method name strings in macro/LUT */ + eldbus_proxy_call(eulogium->dbus.proxy[PRINTER], "getError", _on_get_error_ret, eulogium, -1, ""); eldbus_proxy_signal_handler_add(eulogium->dbus.proxy[PRINTER], "onError", _on_error_ret, eulogium); eldbus_proxy_call(eulogium->dbus.proxy[PRINTER], "getAvailableProcedures", _on_get_available_procedures_ret, eulogium, -1, ""); -- cgit v0.12