summaryrefslogtreecommitdiffstats
path: root/src/dbus_common.c
blob: b05e9ea420d6984be3fcd8f08c8bd9cea8b4d2f5 (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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/*
 * 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"
#include "procedures.h"

void on_method_generic_ret(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
{
	const char *errname, *errmsg;

	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 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;
	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 = 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_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->meta);
}

/* 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_procedure_metadata_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);
}