summaryrefslogtreecommitdiffstats
path: root/src/dbus_common.c
blob: dd3bae5b5c8af71f99704c1faa200770b5fa8d08 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*
 * function and data types for signal handlers
 *
 * Copyright (c) 2015 Ultimaker B.V.
 * Author: Olliver Schinagl <o.schinagl@ultimaker.com>
 *
 * SPDX-License-Identifier:	AGPL-3.0+
 */

#include <Elementary.h>

#include "dbus_common.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 = NULL;
	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 + 2) * 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);

				networks[i].tech = UNKNOWN;
				if (strcmp(tech, _TECH_ETHERNET))
					networks[i].tech = TECH_ETHERNET;
				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);
			}
			i++;
		}
	networks[i].obj_path = NULL; /* sentinel */
	eulogium->networks = networks;
}

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);
}