/* * 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.h" #include "eulogium_item_list.h" void on_method_generic_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; } } 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 = eulogium->networks; const char *errname, *errmsg; Eldbus_Message_Iter *array, *net_struct; char *obj_path, *tech, *ipv4, *ipv6, *ssid, *dummy; 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)); 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)); break; } else { networks = realloc(networks, (i + 1) * sizeof(struct network_data)); if (!networks) { EINA_LOG_ERR("Unable to allocate memory."); } else { size_t obj_pathsize = strlen(obj_path) + 1; networks[i].obj_path = malloc(obj_pathsize); if (!networks[i].obj_path) EINA_LOG_ERR("Unable to allocate memory."); else strncpy(networks[i].obj_path, obj_path, obj_pathsize); if (strncmp(tech, _TECH_ETHERNET, sizeof(_TECH_ETHERNET))) networks[i].tech = ETHERNET; if (strncmp(tech, _TECH_WIFI, sizeof(_TECH_WIFI))) networks[i].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); } i++; } } void on_signal_network_info_changed_ret(void *data, const Eldbus_Message *msg) { on_method_get_network_info_ret(data, msg, NULL); } 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; } item->state = state; if (item->_widget) elm_check_state_set(item->_widget, item->state); EINA_LOG_INFO("%s is now %d", eldbus_message_member_get(msg), item->state); } void on_signal_network_power_changed_ret(void *data, const Eldbus_Message *msg) { on_method_is_network_powered_ret(data, msg, NULL); }