Add Technology interface support
[framework/uifw/edbus.git] / src / lib / connman / e_connman.c
1 #include "e_connman_private.h"
2 #include <stdlib.h>
3 #include <string.h>
4
5 static E_DBus_Signal_Handler *cb_name_owner_changed = NULL;
6 static DBusPendingCall *pending_get_name_owner = NULL;
7 static unsigned int init_count = 0;
8 static char *unique_name = NULL;
9
10 static const char bus_name[] = "org.moblin.connman";
11 static const char fdo_bus_name[] = "org.freedesktop.DBus";
12 static const char fdo_interface[] = "org.freedesktop.DBus";
13 static const char fdo_path[] = "/org/freedesktop/DBus";
14
15 E_DBus_Connection *e_connman_conn = NULL;
16
17 EAPI int E_CONNMAN_EVENT_MANAGER_IN = 0;
18 EAPI int E_CONNMAN_EVENT_MANAGER_OUT = 0;
19 EAPI int E_CONNMAN_EVENT_ELEMENT_ADD = 0;
20 EAPI int E_CONNMAN_EVENT_ELEMENT_DEL = 0;
21 EAPI int E_CONNMAN_EVENT_ELEMENT_UPDATED = 0;
22
23 const char *e_connman_iface_manager = NULL;
24 const char *e_connman_iface_network = NULL;
25 const char *e_connman_iface_profile = NULL;
26 const char *e_connman_iface_service = NULL;
27 const char *e_connman_iface_device = NULL;
28 const char *e_connman_iface_connection = NULL;
29 const char *e_connman_iface_technology = NULL;
30
31 const char *e_connman_prop_available = NULL;
32 const char *e_connman_prop_connected = NULL;
33 const char *e_connman_prop_connections = NULL;
34 const char *e_connman_prop_default = NULL;
35 const char *e_connman_prop_device = NULL;
36 const char *e_connman_prop_devices = NULL;
37 const char *e_connman_prop_interface = NULL;
38 const char *e_connman_prop_ipv4 = NULL;
39 const char *e_connman_prop_ipv4_configuration = NULL;
40 const char *e_connman_prop_ethernet = NULL;
41 const char *e_connman_prop_method = NULL;
42 const char *e_connman_prop_address = NULL;
43 const char *e_connman_prop_gateway = NULL;
44 const char *e_connman_prop_netmask = NULL;
45 const char *e_connman_prop_mtu = NULL;
46 const char *e_connman_prop_name = NULL;
47 const char *e_connman_prop_network = NULL;
48 const char *e_connman_prop_networks = NULL;
49 const char *e_connman_prop_offline_mode = NULL;
50 const char *e_connman_prop_policy = NULL;
51 const char *e_connman_prop_powered = NULL;
52 const char *e_connman_prop_priority = NULL;
53 const char *e_connman_prop_profiles = NULL;
54 const char *e_connman_prop_profile_active = NULL;
55 const char *e_connman_prop_services = NULL;
56 const char *e_connman_prop_remember = NULL;
57 const char *e_connman_prop_scan_interval = NULL;
58 const char *e_connman_prop_scanning = NULL;
59 const char *e_connman_prop_state = NULL;
60 const char *e_connman_prop_strength = NULL;
61 const char *e_connman_prop_frequency = NULL;
62 const char *e_connman_prop_type = NULL;
63 const char *e_connman_prop_wifi_mode = NULL;
64 const char *e_connman_prop_wifi_passphrase = NULL;
65 const char *e_connman_prop_wifi_security = NULL;
66 const char *e_connman_prop_wifi_ssid = NULL;
67 const char *e_connman_prop_wifi_channel = NULL;
68 const char *e_connman_prop_wifi_eap = NULL;
69 const char *e_connman_prop_error = NULL;
70 const char *e_connman_prop_mode = NULL;
71 const char *e_connman_prop_security = NULL;
72 const char *e_connman_prop_passphrase = NULL;
73 const char *e_connman_prop_passphrase_required = NULL;
74 const char *e_connman_prop_favorite = NULL;
75 const char *e_connman_prop_immutable = NULL;
76 const char *e_connman_prop_auto_connect = NULL;
77 const char *e_connman_prop_setup_required = NULL;
78 const char *e_connman_prop_apn = NULL;
79 const char *e_connman_prop_mcc = NULL;
80 const char *e_connman_prop_mnc = NULL;
81 const char *e_connman_prop_roaming = NULL;
82 const char *e_connman_prop_technology_default = NULL;
83 const char *e_connman_prop_technologies_available = NULL;
84 const char *e_connman_prop_technologies_enabled= NULL;
85 const char *e_connman_prop_technologies_connected = NULL;
86
87
88 int _e_dbus_connman_log_dom = -1;
89
90 const char *
91 e_connman_system_bus_name_get(void)
92 {
93    return unique_name ? unique_name : bus_name;
94 }
95
96
97 /***********************************************************************
98  * Manager
99  ***********************************************************************/
100
101 /**
102  * Synchronize elements with server.
103  *
104  * This will call Manager.GetProperties() on server, retrieve properties
105  * and some element paths and then request their properties.
106  *
107  * This call will add events E_CONNMAN_EVENT_ELEMENT_ADD and
108  * E_CONNMAN_EVENT_ELEMENT_UPDATED to the main loop.
109  *
110  * This will not remove stale elements.
111  *
112  * @return 1 on success, 0 otherwise.
113  */
114 bool
115 e_connman_manager_sync_elements(void)
116 {
117    E_Connman_Element *manager;
118
119    if (!unique_name)
120      return FALSE;
121    manager = e_connman_element_register(manager_path, e_connman_iface_manager);
122    if (manager)
123      e_connman_element_properties_sync(manager);
124    else
125      return FALSE;
126
127    DBG("sync_manager: %s (%s)", unique_name, bus_name);
128
129    return TRUE;
130 }
131
132 static void
133 _e_connman_system_name_owner_exit(void)
134 {
135    e_connman_manager_clear_elements();
136    ecore_event_add(E_CONNMAN_EVENT_MANAGER_OUT, NULL, NULL, NULL);
137
138    free(unique_name);
139    unique_name = NULL;
140 }
141
142 static void
143 _e_connman_system_name_owner_enter(const char *uid)
144 {
145    DBG("enter connman at %s (old was %s)", uid, unique_name);
146    if (unique_name && strcmp(unique_name, uid) == 0)
147      {
148         DBG("same unique_name for connman, ignore.");
149         return;
150      }
151
152    if (unique_name)
153      _e_connman_system_name_owner_exit();
154
155    unique_name = strdup(uid);
156
157    ecore_event_add(E_CONNMAN_EVENT_MANAGER_IN, NULL, NULL, NULL);
158    e_connman_manager_sync_elements();
159 }
160
161 static void
162 _e_connman_system_name_owner_changed(void *data __UNUSED__, DBusMessage *msg)
163 {
164    DBusError err;
165    const char *name, *from, *to;
166
167    dbus_error_init(&err);
168    if (!dbus_message_get_args(msg, &err,
169                               DBUS_TYPE_STRING, &name,
170                               DBUS_TYPE_STRING, &from,
171                               DBUS_TYPE_STRING, &to,
172                               DBUS_TYPE_INVALID))
173      {
174         ERR("could not get NameOwnerChanged arguments: %s: %s",
175             err.name, err.message);
176         dbus_error_free(&err);
177         return;
178      }
179
180    if (strcmp(name, bus_name) != 0)
181      return;
182
183    DBG("NameOwnerChanged from=[%s] to=[%s]", from, to);
184
185    if (from[0] == '\0' && to[0] != '\0')
186      _e_connman_system_name_owner_enter(to);
187    else if (from[0] != '\0' && to[0] == '\0')
188      {
189         DBG("exit connman at %s", from);
190         if (strcmp(unique_name, from) != 0)
191           DBG("%s was not the known name %s, ignored.", from, unique_name);
192         else
193           _e_connman_system_name_owner_exit();
194      }
195    else
196      DBG("unknow change from %s to %s", from, to);
197 }
198
199 static void
200 _e_connman_get_name_owner(void *data __UNUSED__, DBusMessage *msg, DBusError *err)
201 {
202    DBusMessageIter itr;
203    int t;
204    const char *uid;
205
206    pending_get_name_owner = NULL;
207
208    if (!_dbus_callback_check_and_init(msg, &itr, err))
209      return;
210
211    t = dbus_message_iter_get_arg_type(&itr);
212    if (!_dbus_iter_type_check(t, DBUS_TYPE_STRING))
213      return;
214
215    dbus_message_iter_get_basic(&itr, &uid);
216    if (!uid)
217      {
218         ERR("no name owner!");
219         return;
220      }
221
222    _e_connman_system_name_owner_enter(uid);
223    return;
224 }
225
226 /**
227  * Initialize E Connection Manager (E_Connman) system.
228  *
229  * This will connect and watch org.moblin.connman.Manager and Element
230  * events and translate to Ecore main loop events, also provide a
231  * proxy for method invocation on server.
232  *
233  * Interesting events are:
234  *   - E_CONNMAN_EVENT_MANAGER_IN: issued when connman is avaiable.
235  *   - E_CONNMAN_EVENT_MANAGER_OUT: issued when connman connection is lost.
236  *   - E_CONNMAN_EVENT_ELEMENT_ADD: element was added.
237  *   - E_CONNMAN_EVENT_ELEMENT_DEL: element was deleted.
238  *   - E_CONNMAN_EVENT_ELEMENT_UPDATED: element was updated (properties
239  *     or state changed).
240  *
241  * Manager IN/OUT events do not provide any event information, just
242  * tells you that system is usable or not. After manager is out, all
243  * elements will be removed, so after this event do not use the system anymore.
244  *
245  * Element events will give you an element object. After DEL event callback
246  * returns, that element will not be valid anymore.
247  */
248 unsigned int
249 e_connman_system_init(E_DBus_Connection *edbus_conn)
250 {
251    init_count++;
252
253    if (init_count > 1)
254      return init_count;
255
256    _e_dbus_connman_log_dom = eina_log_domain_register
257      ("e_dbus_connman", EINA_LOG_DEFAULT_COLOR);
258
259    if(_e_dbus_connman_log_dom < 0)
260      {
261         EINA_LOG_ERR
262           ("impossible to create a log domain for edbus_connman module");
263         return -1;
264      }
265
266    if (E_CONNMAN_EVENT_MANAGER_IN == 0)
267      E_CONNMAN_EVENT_MANAGER_IN = ecore_event_type_new();
268    if (E_CONNMAN_EVENT_MANAGER_OUT == 0)
269      E_CONNMAN_EVENT_MANAGER_OUT = ecore_event_type_new();
270    if (E_CONNMAN_EVENT_ELEMENT_ADD == 0)
271      E_CONNMAN_EVENT_ELEMENT_ADD = ecore_event_type_new();
272    if (E_CONNMAN_EVENT_ELEMENT_DEL == 0)
273      E_CONNMAN_EVENT_ELEMENT_DEL = ecore_event_type_new();
274    if (E_CONNMAN_EVENT_ELEMENT_UPDATED == 0)
275      E_CONNMAN_EVENT_ELEMENT_UPDATED = ecore_event_type_new();
276
277    if (e_connman_iface_manager == NULL)
278      e_connman_iface_manager = eina_stringshare_add("org.moblin.connman.Manager");
279    if (e_connman_iface_network == NULL)
280      e_connman_iface_network = eina_stringshare_add("org.moblin.connman.Network");
281    if (e_connman_iface_profile == NULL)
282      e_connman_iface_profile = eina_stringshare_add("org.moblin.connman.Profile");
283    if (e_connman_iface_service == NULL)
284      e_connman_iface_service = eina_stringshare_add("org.moblin.connman.Service");
285    if (e_connman_iface_device == NULL)
286      e_connman_iface_device = eina_stringshare_add("org.moblin.connman.Device");
287    if (e_connman_iface_connection == NULL)
288      e_connman_iface_connection = eina_stringshare_add("org.moblin.connman.Connection");
289    if (e_connman_iface_technology == NULL)
290      e_connman_iface_technology = eina_stringshare_add("org.moblin.connman.Technology");
291
292    if (e_connman_prop_available == NULL)
293      e_connman_prop_available = eina_stringshare_add("Available");
294    if (e_connman_prop_connected == NULL)
295      e_connman_prop_connected = eina_stringshare_add("Connected");
296    if (e_connman_prop_connections == NULL)
297      e_connman_prop_connections = eina_stringshare_add("Connections");
298    if (e_connman_prop_default == NULL)
299      e_connman_prop_default = eina_stringshare_add("Default");
300    if (e_connman_prop_device == NULL)
301      e_connman_prop_device = eina_stringshare_add("Device");
302    if (e_connman_prop_devices == NULL)
303      e_connman_prop_devices = eina_stringshare_add("Devices");
304    if (e_connman_prop_interface == NULL)
305      e_connman_prop_interface = eina_stringshare_add("Interface");
306    if (e_connman_prop_ipv4 == NULL)
307      e_connman_prop_ipv4 = eina_stringshare_add("IPv4");
308    if (e_connman_prop_ipv4_configuration == NULL)
309      e_connman_prop_ipv4_configuration = eina_stringshare_add("IPv4.Configuration");
310    if (e_connman_prop_ethernet == NULL)
311      e_connman_prop_ethernet = eina_stringshare_add("Ethernet");
312    if (e_connman_prop_method == NULL)
313      e_connman_prop_method = eina_stringshare_add("Method");
314    if (e_connman_prop_address == NULL)
315      e_connman_prop_address = eina_stringshare_add("Address");
316    if (e_connman_prop_gateway == NULL)
317      e_connman_prop_gateway = eina_stringshare_add("Gateway");
318    if (e_connman_prop_netmask == NULL)
319      e_connman_prop_netmask = eina_stringshare_add("Netmask");
320    if (e_connman_prop_mtu == NULL)
321      e_connman_prop_mtu = eina_stringshare_add("MTU");
322    if (e_connman_prop_name == NULL)
323      e_connman_prop_name = eina_stringshare_add("Name");
324    if (e_connman_prop_network == NULL)
325      e_connman_prop_network = eina_stringshare_add("Network");
326    if (e_connman_prop_networks == NULL)
327      e_connman_prop_networks = eina_stringshare_add("Networks");
328    if (e_connman_prop_offline_mode == NULL)
329      e_connman_prop_offline_mode = eina_stringshare_add("OfflineMode");
330    if (e_connman_prop_policy == NULL)
331      e_connman_prop_policy = eina_stringshare_add("Policy");
332    if (e_connman_prop_powered == NULL)
333      e_connman_prop_powered = eina_stringshare_add("Powered");
334    if (e_connman_prop_priority == NULL)
335      e_connman_prop_priority = eina_stringshare_add("Priority");
336    if (e_connman_prop_profiles == NULL)
337      e_connman_prop_profiles = eina_stringshare_add("Profiles");
338    if (e_connman_prop_profile_active == NULL)
339      e_connman_prop_profile_active = eina_stringshare_add("ActiveProfile");
340    if (e_connman_prop_services == NULL)
341      e_connman_prop_services = eina_stringshare_add("Services");
342    if (e_connman_prop_remember == NULL)
343      e_connman_prop_remember = eina_stringshare_add("Remember");
344    if (e_connman_prop_scan_interval == NULL)
345      e_connman_prop_scan_interval = eina_stringshare_add("ScanInterval");
346    if (e_connman_prop_scanning == NULL)
347      e_connman_prop_scanning = eina_stringshare_add("Scanning");
348    if (e_connman_prop_state == NULL)
349      e_connman_prop_state = eina_stringshare_add("State");
350    if (e_connman_prop_strength == NULL)
351      e_connman_prop_strength = eina_stringshare_add("Strength");
352    if (e_connman_prop_frequency == NULL)
353      e_connman_prop_frequency = eina_stringshare_add("Frequency");
354    if (e_connman_prop_type == NULL)
355      e_connman_prop_type = eina_stringshare_add("Type");
356    if (e_connman_prop_wifi_mode == NULL)
357      e_connman_prop_wifi_mode = eina_stringshare_add("WiFi.Mode");
358    if (e_connman_prop_wifi_passphrase == NULL)
359      e_connman_prop_wifi_passphrase = eina_stringshare_add("WiFi.Passphrase");
360    if (e_connman_prop_wifi_security == NULL)
361      e_connman_prop_wifi_security = eina_stringshare_add("WiFi.Security");
362    if (e_connman_prop_wifi_ssid == NULL)
363      e_connman_prop_wifi_ssid = eina_stringshare_add("WiFi.SSID");
364    if (e_connman_prop_wifi_channel == NULL)
365      e_connman_prop_wifi_channel = eina_stringshare_add("WiFi.Channel");
366    if (e_connman_prop_wifi_eap == NULL)
367      e_connman_prop_wifi_eap = eina_stringshare_add("WiFi.EAP");
368    if (e_connman_prop_error == NULL)
369      e_connman_prop_error = eina_stringshare_add("Error");
370    if (e_connman_prop_mode == NULL)
371      e_connman_prop_mode = eina_stringshare_add("Mode");
372    if (e_connman_prop_security == NULL)
373      e_connman_prop_security = eina_stringshare_add("Security");
374    if (e_connman_prop_passphrase == NULL)
375      e_connman_prop_passphrase = eina_stringshare_add("Passphrase");
376    if (e_connman_prop_passphrase_required == NULL)
377      e_connman_prop_passphrase_required = eina_stringshare_add("PassphraseRequired");
378    if (e_connman_prop_favorite == NULL)
379      e_connman_prop_favorite = eina_stringshare_add("Favorite");
380    if (e_connman_prop_immutable == NULL)
381      e_connman_prop_immutable = eina_stringshare_add("Immutable");
382    if (e_connman_prop_auto_connect == NULL)
383      e_connman_prop_auto_connect = eina_stringshare_add("AutoConnect");
384    if (e_connman_prop_setup_required == NULL)
385      e_connman_prop_setup_required = eina_stringshare_add("SetupRequired");
386    if (e_connman_prop_apn == NULL)
387      e_connman_prop_apn = eina_stringshare_add("APN");
388    if (e_connman_prop_mcc == NULL)
389      e_connman_prop_mcc = eina_stringshare_add("MCC");
390    if (e_connman_prop_mnc == NULL)
391      e_connman_prop_mnc = eina_stringshare_add("MCN");
392    if (e_connman_prop_roaming == NULL)
393      e_connman_prop_roaming = eina_stringshare_add("Roaming");
394    if (e_connman_prop_technology_default == NULL)
395      e_connman_prop_technology_default = eina_stringshare_add("DefaultTechnology");
396    if (e_connman_prop_technologies_available == NULL)
397      e_connman_prop_technologies_available = eina_stringshare_add("AvailableTechnologies");
398    if (e_connman_prop_technologies_enabled == NULL)
399      e_connman_prop_technologies_enabled = eina_stringshare_add("EnabledTechnologies");
400    if (e_connman_prop_technologies_connected == NULL)
401      e_connman_prop_technologies_connected = eina_stringshare_add("ConnectedTechnologies");
402
403    e_connman_conn = edbus_conn;
404    cb_name_owner_changed = e_dbus_signal_handler_add
405      (e_connman_conn, fdo_bus_name, fdo_path, fdo_interface, "NameOwnerChanged",
406       _e_connman_system_name_owner_changed, NULL);
407
408    if (pending_get_name_owner)
409      dbus_pending_call_cancel(pending_get_name_owner);
410
411    pending_get_name_owner = e_dbus_get_name_owner
412      (e_connman_conn, bus_name, _e_connman_get_name_owner, NULL);
413
414    e_connman_elements_init();
415
416    return init_count;
417 }
418
419 static inline void
420 _stringshare_del(const char **str)
421 {
422    if (!*str)
423      return;
424    eina_stringshare_del(*str);
425    *str = NULL;
426 }
427
428 /**
429  * Shutdown connman system.
430  *
431  * When count drops to 0 resources will be released and no calls should be
432  * made anymore.
433  */
434 unsigned int
435 e_connman_system_shutdown(void)
436 {
437    if (init_count == 0)
438      {
439         ERR("connman system already shut down.");
440         return 0;
441      }
442    init_count--;
443    if (init_count > 0)
444      return init_count;
445
446    _stringshare_del(&e_connman_iface_manager);
447    _stringshare_del(&e_connman_iface_network);
448    _stringshare_del(&e_connman_iface_profile);
449    _stringshare_del(&e_connman_iface_service);
450    _stringshare_del(&e_connman_iface_device);
451    _stringshare_del(&e_connman_iface_connection);
452    _stringshare_del(&e_connman_iface_technology);
453
454    _stringshare_del(&e_connman_prop_available);
455    _stringshare_del(&e_connman_prop_connected);
456    _stringshare_del(&e_connman_prop_connections);
457    _stringshare_del(&e_connman_prop_default);
458    _stringshare_del(&e_connman_prop_device);
459    _stringshare_del(&e_connman_prop_devices);
460    _stringshare_del(&e_connman_prop_interface);
461    _stringshare_del(&e_connman_prop_ipv4);
462    _stringshare_del(&e_connman_prop_ipv4_configuration);
463    _stringshare_del(&e_connman_prop_ethernet);
464    _stringshare_del(&e_connman_prop_method);
465    _stringshare_del(&e_connman_prop_address);
466    _stringshare_del(&e_connman_prop_gateway);
467    _stringshare_del(&e_connman_prop_netmask);
468    _stringshare_del(&e_connman_prop_mtu);
469    _stringshare_del(&e_connman_prop_name);
470    _stringshare_del(&e_connman_prop_network);
471    _stringshare_del(&e_connman_prop_networks);
472    _stringshare_del(&e_connman_prop_offline_mode);
473    _stringshare_del(&e_connman_prop_policy);
474    _stringshare_del(&e_connman_prop_powered);
475    _stringshare_del(&e_connman_prop_priority);
476    _stringshare_del(&e_connman_prop_profiles);
477    _stringshare_del(&e_connman_prop_profile_active);
478    _stringshare_del(&e_connman_prop_services);
479    _stringshare_del(&e_connman_prop_remember);
480    _stringshare_del(&e_connman_prop_scan_interval);
481    _stringshare_del(&e_connman_prop_scanning);
482    _stringshare_del(&e_connman_prop_state);
483    _stringshare_del(&e_connman_prop_strength);
484    _stringshare_del(&e_connman_prop_frequency);
485    _stringshare_del(&e_connman_prop_type);
486    _stringshare_del(&e_connman_prop_wifi_mode);
487    _stringshare_del(&e_connman_prop_wifi_passphrase);
488    _stringshare_del(&e_connman_prop_wifi_security);
489    _stringshare_del(&e_connman_prop_wifi_ssid);
490    _stringshare_del(&e_connman_prop_wifi_channel);
491    _stringshare_del(&e_connman_prop_wifi_eap);
492    _stringshare_del(&e_connman_prop_error);
493    _stringshare_del(&e_connman_prop_mode);
494    _stringshare_del(&e_connman_prop_security);
495    _stringshare_del(&e_connman_prop_passphrase);
496    _stringshare_del(&e_connman_prop_passphrase_required);
497    _stringshare_del(&e_connman_prop_favorite);
498    _stringshare_del(&e_connman_prop_immutable);
499    _stringshare_del(&e_connman_prop_auto_connect);
500    _stringshare_del(&e_connman_prop_setup_required);
501    _stringshare_del(&e_connman_prop_apn);
502    _stringshare_del(&e_connman_prop_mcc);
503    _stringshare_del(&e_connman_prop_mnc);
504    _stringshare_del(&e_connman_prop_roaming);
505    _stringshare_del(&e_connman_prop_technology_default);
506    _stringshare_del(&e_connman_prop_technologies_available);
507    _stringshare_del(&e_connman_prop_technologies_enabled);
508    _stringshare_del(&e_connman_prop_technologies_connected);
509
510    if (pending_get_name_owner)
511      {
512         dbus_pending_call_cancel(pending_get_name_owner);
513         pending_get_name_owner = NULL;
514      }
515
516    if (cb_name_owner_changed)
517      {
518         e_dbus_signal_handler_del(e_connman_conn, cb_name_owner_changed);
519         cb_name_owner_changed = NULL;
520      }
521
522    if (unique_name)
523      _e_connman_system_name_owner_exit();
524
525    e_connman_elements_shutdown();
526    eina_log_domain_unregister(_e_dbus_connman_log_dom);
527    e_connman_conn = NULL;
528
529    return init_count;
530 }