2 #include "e_mod_main.h"
7 * displays current status, allows connecting and
8 * disconnecting. needs connman 0.48 or even better from git.
13 * 1. improve gadget ui
16 * 1. imporve mouse over popup ui
17 * 2. nice popup using edje objects as rows, not simple lists (fancy)
18 * 3. "Controls" for detailed information, similar to Mixer app
19 * it would contain switches to toggle offline and choose
20 * technologies that are enabled.
23 * 1. create static connections
24 * 2. handle cellular: ask APN, Username and Password, use SetupRequired
25 * 3. handle vpn, bluetooth, wimax
29 static E_Module *connman_mod = NULL;
30 static char tmpbuf[PATH_MAX]; /* general purpose buffer, just use immediately */
32 const char _e_connman_name[] = "connman";
33 const char _e_connman_Name[] = "Connection Manager";
34 int _e_connman_log_dom = -1;
36 static const char *e_str_idle = NULL;
37 static const char *e_str_association = NULL;
38 static const char *e_str_configuration = NULL;
39 static const char *e_str_ready = NULL;
40 static const char *e_str_login = NULL;
41 static const char *e_str_online = NULL;
42 static const char *e_str_disconnect = NULL;
43 static const char *e_str_failure = NULL;
45 const char *e_str_enabled = NULL;
46 const char *e_str_available = NULL;
47 const char *e_str_connected = NULL;
48 const char *e_str_offline = NULL;
50 static void _connman_service_ask_pass_and_connect(E_Connman_Service *service);
51 static void _connman_default_service_changed_delayed(E_Connman_Module_Context *ctxt);
52 static void _connman_gadget_update(E_Connman_Instance *inst);
53 static void _connman_tip_update(E_Connman_Instance *inst);
56 e_connman_theme_path(void)
58 #define TF "/e-module-connman.edj"
61 dirlen = strlen(connman_mod->dir);
62 if (dirlen >= sizeof(tmpbuf) - sizeof(TF))
65 memcpy(tmpbuf, connman_mod->dir, dirlen);
66 memcpy(tmpbuf + dirlen, TF, sizeof(TF));
73 _connman_toggle_offline_mode_cb(void *data,
74 DBusMessage *msg __UNUSED__,
77 E_Connman_Module_Context *ctxt = data;
79 if ((!error) || (!dbus_error_is_set(error)))
81 ctxt->offline_mode_pending = EINA_FALSE;
85 _connman_dbus_error_show(_("Cannot toggle system's offline mode."), error);
86 dbus_error_free(error);
90 _connman_toggle_offline_mode(E_Connman_Module_Context *ctxt)
94 if ((!ctxt) || (!ctxt->has_manager))
96 _connman_operation_error_show(_("ConnMan Daemon is not running."));
100 if (!e_connman_manager_offline_mode_get(&offline))
102 _connman_operation_error_show
103 (_("Query system's offline mode."));
108 if (!e_connman_manager_offline_mode_set
109 (offline, _connman_toggle_offline_mode_cb, ctxt))
111 _connman_operation_error_show
112 (_("Cannot toggle system's offline mode."));
118 _connman_cb_toggle_offline_mode(E_Object *obj __UNUSED__,
119 const char *params __UNUSED__)
121 E_Connman_Module_Context *ctxt;
126 ctxt = connman_mod->data;
127 _connman_toggle_offline_mode(ctxt);
130 struct connman_passphrase_data
132 void (*cb)(void *data,
133 const char *password,
134 const char *service_path);
136 const char *service_path;
138 E_Connman_Module_Context *ctxt;
145 #if 0 // NOT WORKING, e_widget_entry_password_set() changes stops editing!!!
147 _connman_passphrase_ask_cleartext_changed(void *data,
149 void *event __UNUSED__)
151 struct connman_passphrase_data *d = data;
152 e_widget_entry_password_set(d->entry, !e_widget_check_checked_get(obj));
153 e_widget_entry_readonly_set(d->entry, 0);
154 e_widget_focus_set(d->entry, 1);
160 _connman_passphrase_ask_ok(void *data,
163 struct connman_passphrase_data *d = data;
164 d->canceled = EINA_FALSE;
165 e_object_del(E_OBJECT(dia));
169 _connman_passphrase_ask_cancel(void *data,
172 struct connman_passphrase_data *d = data;
173 d->canceled = EINA_TRUE;
174 e_object_del(E_OBJECT(dia));
178 _connman_passphrase_ask_del(void *data)
180 E_Dialog *dia = data;
181 struct connman_passphrase_data *d = e_object_data_get(E_OBJECT(dia));
186 d->passphrase = NULL;
189 d->cb(d->data, d->passphrase, d->service_path);
191 eina_stringshare_del(d->service_path);
197 _connman_passphrase_ask_key_down(void *data,
199 Evas_Object *o __UNUSED__,
202 Evas_Event_Key_Down *ev = event;
203 struct connman_passphrase_data *d = data;
205 if (strcmp(ev->keyname, "Return") == 0)
206 _connman_passphrase_ask_ok(d, d->dia);
207 else if (strcmp(ev->keyname, "Escape") == 0)
208 _connman_passphrase_ask_cancel(d, d->dia);
212 _connman_passphrase_ask(E_Connman_Service *service,
213 void (*cb)(void *data,
214 const char *password,
215 const char *service_path),
218 struct connman_passphrase_data *d;
219 Evas_Object *list, *o;
222 const char *passphrase;
229 cb((void *)data, NULL, NULL);
233 d = E_NEW(struct connman_passphrase_data, 1);
236 cb((void *)data, NULL, NULL);
240 d->data = (void *)data;
241 d->service_path = eina_stringshare_add(service->path);
242 d->ctxt = service->ctxt;
243 d->canceled = EINA_TRUE; /* closing the dialog defaults to cancel */
244 d->dia = e_dialog_new(NULL, "E", "connman_ask_passphrase");
246 e_dialog_title_set(d->dia, _("ConnMan needs your passphrase"));
247 e_dialog_icon_set(d->dia, "dialog-ask", 64);
248 e_dialog_border_icon_set(d->dia, "dialog-ask");
250 evas = d->dia->win->evas;
252 list = e_widget_list_add(evas, 0, 0);
254 o = edje_object_add(evas);
255 e_theme_edje_object_set(o, "base/theme/dialog",
256 "e/widgets/dialog/text");
257 snprintf(buf, sizeof(buf),
258 _("Connection Manager needs your passphrase for <br>"
259 "the service <hilight>%s</hilight>"),
261 edje_object_part_text_set(o, "e.textblock.message", buf);
262 edje_object_size_min_calc(o, &mw, &mh);
263 evas_object_size_hint_min_set(o, mw, mh);
264 evas_object_resize(o, mw, mh);
266 e_widget_list_object_append(list, o, 1, 1, 0.5);
268 if (!e_connman_service_passphrase_get(service->element, &passphrase))
270 if (passphrase && passphrase[0])
271 d->passphrase = strdup(passphrase);
273 d->passphrase = NULL;
275 d->entry = o = e_widget_entry_add(evas, &d->passphrase, NULL, NULL, NULL);
276 e_widget_entry_password_set(o, 0);
278 e_widget_list_object_append(list, o, 1, 0, 0.0);
280 #if 0 // NOT WORKING, e_widget_entry_password_set() changes stops editing!!!
282 o = e_widget_check_add(evas, _("Show passphrase as clear text"),
284 evas_object_smart_callback_add
285 (o, "changed", _connman_passphrase_ask_cleartext_changed, d);
287 e_widget_list_object_append(list, o, 1, 0, 0.0);
290 e_widget_size_min_get(list, &mw, &mh);
295 e_dialog_content_set(d->dia, list, mw, mh);
298 (d->dia, _("Ok"), NULL, _connman_passphrase_ask_ok, d);
300 (d->dia, _("Cancel"), NULL, _connman_passphrase_ask_cancel, d);
302 evas_object_event_callback_add
303 (d->dia->bg_object, EVAS_CALLBACK_KEY_DOWN,
304 _connman_passphrase_ask_key_down, d);
306 e_object_del_attach_func_set
307 (E_OBJECT(d->dia), _connman_passphrase_ask_del);
308 e_object_data_set(E_OBJECT(d->dia), d);
310 e_dialog_button_focus_num(d->dia, 0);
311 e_widget_focus_set(d->entry, 1);
313 e_win_centered_set(d->dia->win, 1);
314 e_dialog_show(d->dia);
318 _connman_service_free(E_Connman_Service *service)
320 eina_stringshare_del(service->path);
321 eina_stringshare_del(service->name);
322 eina_stringshare_del(service->type);
323 eina_stringshare_del(service->mode);
324 eina_stringshare_del(service->state);
325 eina_stringshare_del(service->error);
326 eina_stringshare_del(service->security);
327 eina_stringshare_del(service->ipv4_method);
328 eina_stringshare_del(service->ipv4_address);
329 eina_stringshare_del(service->ipv4_netmask);
335 _connman_service_security_find(const E_Connman_Element *element)
337 const char **security;
340 if (!e_connman_service_security_get(element, &count, &security))
342 if ((!security) || (count < 1))
348 _connman_service_changed(void *data,
349 const E_Connman_Element *element)
351 E_Connman_Service *service = data;
356 #define GSTR(name_, getter) \
358 if (!getter(element, &str)) \
360 eina_stringshare_replace(&service->name_, str)
362 GSTR(name, e_connman_service_name_get);
363 GSTR(type, e_connman_service_type_get);
364 GSTR(state, e_connman_service_state_get);
365 GSTR(error, e_connman_service_error_get);
366 GSTR(ipv4_method, e_connman_service_ipv4_configuration_method_get);
368 str = _connman_service_security_find(element);
369 eina_stringshare_replace(&service->security, str);
371 if (service->ipv4_method && strcmp(service->ipv4_method, "dhcp") == 0)
373 GSTR(ipv4_address, e_connman_service_ipv4_address_get);
374 GSTR(ipv4_netmask, e_connman_service_ipv4_netmask_get);
379 e_connman_service_ipv4_configuration_address_get);
381 e_connman_service_ipv4_configuration_netmask_get);
385 if ((service->state != e_str_failure) && (service->error))
386 eina_stringshare_replace(&service->error, NULL);
388 if (!e_connman_service_strength_get(element, &u8))
390 service->strength = u8;
392 #define GBOOL(name_, getter) \
394 if (!getter(element, &b)) \
398 GBOOL(favorite, e_connman_service_favorite_get);
399 GBOOL(auto_connect, e_connman_service_auto_connect_get);
400 GBOOL(pass_required, e_connman_service_passphrase_required_get);
403 if ((service->ctxt->default_service == service) ||
404 (!service->ctxt->default_service))
405 _connman_default_service_changed_delayed(service->ctxt);
407 DBG("Do not request for delayed changed as this is not the default.");
411 _connman_service_freed(void *data)
413 E_Connman_Service *service = data;
414 E_Connman_Module_Context *ctxt = service->ctxt;
416 ctxt->services = eina_inlist_remove
417 (ctxt->services, EINA_INLIST_GET(service));
419 _connman_service_free(service);
421 if (ctxt->default_service == service)
423 ctxt->default_service = NULL;
424 _connman_default_service_changed_delayed(ctxt);
428 static E_Connman_Service *
429 _connman_service_new(E_Connman_Module_Context *ctxt,
430 E_Connman_Element *element)
432 E_Connman_Service *service;
440 service = E_NEW(E_Connman_Service, 1);
444 service->ctxt = ctxt;
445 service->element = element;
446 service->path = eina_stringshare_add(element->path);
448 #define GSTR(name_, getter) \
450 if (!getter(element, &str)) \
452 service->name_ = eina_stringshare_add(str)
454 GSTR(name, e_connman_service_name_get);
455 GSTR(type, e_connman_service_type_get);
456 GSTR(state, e_connman_service_state_get);
457 GSTR(error, e_connman_service_error_get);
458 GSTR(ipv4_method, e_connman_service_ipv4_method_get);
459 GSTR(ipv4_address, e_connman_service_ipv4_address_get);
460 GSTR(ipv4_netmask, e_connman_service_ipv4_netmask_get);
463 str = _connman_service_security_find(element);
464 eina_stringshare_replace(&service->security, str);
466 if ((service->state != e_str_failure) && (service->error))
467 eina_stringshare_replace(&service->error, NULL);
469 if (!e_connman_service_strength_get(element, &u8))
471 service->strength = u8;
473 #define GBOOL(name_, getter) \
475 if (!getter(element, &b)) \
479 GBOOL(favorite, e_connman_service_favorite_get);
480 GBOOL(auto_connect, e_connman_service_auto_connect_get);
481 GBOOL(pass_required, e_connman_service_passphrase_required_get);
484 e_connman_element_listener_add
485 (element, _connman_service_changed, service,
486 _connman_service_freed);
491 #define GSTR(name_, getter) \
493 if (!getter(element, &str)) \
495 eina_stringshare_replace(&t->name_, str)
498 _connman_technology_free(E_Connman_Technology *t)
500 eina_stringshare_del(t->path);
501 eina_stringshare_del(t->name);
502 eina_stringshare_del(t->type);
503 eina_stringshare_del(t->state);
509 _connman_technology_changed(void *data,
510 const E_Connman_Element *element)
512 E_Connman_Technology *t = data;
515 GSTR(name, e_connman_technology_name_get);
516 GSTR(type, e_connman_technology_type_get);
517 GSTR(state, e_connman_technology_state_get);
521 _connman_technology_freed(void *data)
523 E_Connman_Technology *t = data;
524 E_Connman_Module_Context *ctxt = t->ctxt;
526 ctxt->technologies = eina_inlist_remove
527 (ctxt->technologies, EINA_INLIST_GET(t));
529 _connman_technology_free(t);
532 static E_Connman_Technology *
533 _connman_technology_new(E_Connman_Module_Context *ctxt,
534 E_Connman_Element *element)
536 E_Connman_Technology *t;
542 t = E_NEW(E_Connman_Technology, 1);
547 t->element = element;
548 t->path = eina_stringshare_add(element->path);
550 GSTR(name, e_connman_technology_name_get);
551 GSTR(type, e_connman_technology_type_get);
552 GSTR(state, e_connman_technology_state_get);
554 e_connman_element_listener_add
555 (element, _connman_technology_changed, t,
556 _connman_technology_freed);
564 _connman_service_disconnect_cb(void *data,
565 DBusMessage *msg __UNUSED__,
568 E_Connman_Module_Context *ctxt = data;
570 if (error && dbus_error_is_set(error))
572 if ((strcmp(error->name,
573 "org.moblin.connman.Error.NotConnected") != 0) ||
575 "net.connman.Error.NotConnected") != 0))
576 _connman_dbus_error_show(_("Disconnect from network service."),
578 dbus_error_free(error);
581 _connman_default_service_changed_delayed(ctxt);
585 _connman_service_disconnect(E_Connman_Service *service)
587 if (!e_connman_service_disconnect
588 (service->element, _connman_service_disconnect_cb, service->ctxt))
589 _connman_operation_error_show(_("Disconnect from network service."));
592 struct connman_service_connect_data
594 const char *service_path;
595 E_Connman_Module_Context *ctxt;
599 _connman_service_connect_cb(void *data,
600 DBusMessage *msg __UNUSED__,
603 struct connman_service_connect_data *d = data;
605 if (error && dbus_error_is_set(error))
607 char *password_needed[] = {
608 "org.moblin.connman.Error.PassphraseRequired",
609 "org.moblin.connman.Error.Failed",
610 "net.connman.Error.PassphraseRequired",
611 "net.connman.Error.Failed",
614 char *dont_display_error[] = {
615 "org.moblin.connman.Error.AlreadyConnected",
616 "net.connman.Error.AlreadyConnected",
617 "net.connman.Error.OperationAborted",
622 for (i = 0; password_needed[i]; ++i)
623 if (strcmp(error->name, password_needed[i]) == 0)
625 /* TODO: cellular might ask for SetupRequired to enter APN,
626 * username and password
628 E_Connman_Service *service;
630 service = _connman_ctxt_find_service_stringshare
631 (d->ctxt, d->service_path);
633 _connman_operation_error_show
634 (_("Service does not exist anymore"));
635 else if (strcmp(service->type, "wifi") == 0)
637 _connman_service_disconnect(service);
638 _connman_service_ask_pass_and_connect(service);
641 /* TODO: cellular might ask for user and pass */
642 _connman_dbus_error_show(_("Connect to network service."),
647 if (password_needed[i] == NULL)
649 for (i = 0; dont_display_error[i]; ++i)
650 if (strcmp(error->name, dont_display_error[i]) == 0)
653 if (dont_display_error[i] == NULL)
654 _connman_dbus_error_show(_("Connect to network service."), error);
657 dbus_error_free(error);
660 _connman_default_service_changed_delayed(d->ctxt);
661 eina_stringshare_del(d->service_path);
666 _connman_service_connect(E_Connman_Service *service)
668 struct connman_service_connect_data *d;
670 d = E_NEW(struct connman_service_connect_data, 1);
674 d->service_path = eina_stringshare_ref(service->path);
675 d->ctxt = service->ctxt;
677 if (!e_connman_service_connect
678 (service->element, _connman_service_connect_cb, d))
680 eina_stringshare_del(d->service_path);
682 _connman_operation_error_show(_("Connect to network service."));
686 struct connman_service_ask_pass_data
688 const char *service_path;
689 E_Connman_Module_Context *ctxt;
693 _connman_service_ask_pass_and_connect__set_cb(void *data,
694 DBusMessage *msg __UNUSED__,
697 struct connman_service_ask_pass_data *d = data;
698 E_Connman_Service *service;
700 service = _connman_ctxt_find_service_stringshare(d->ctxt, d->service_path);
703 _connman_operation_error_show(_("Service does not exist anymore"));
707 if ((!error) || (!dbus_error_is_set(error)))
708 _connman_service_connect(service);
711 if ((error) && (dbus_error_is_set(error)))
712 dbus_error_free(error);
713 eina_stringshare_del(d->service_path);
718 _connman_service_ask_pass_and_connect__ask_cb(void *data,
719 const char *passphrase,
720 const char *service_path)
722 E_Connman_Module_Context *ctxt = data;
723 E_Connman_Service *service;
724 struct connman_service_ask_pass_data *d;
726 service = _connman_ctxt_find_service_stringshare(ctxt, service_path);
729 _connman_operation_error_show(_("Service does not exist anymore"));
735 _connman_service_disconnect(service);
739 d = E_NEW(struct connman_service_ask_pass_data, 1);
742 d->service_path = eina_stringshare_ref(service_path);
745 if (!e_connman_service_passphrase_set
746 (service->element, passphrase,
747 _connman_service_ask_pass_and_connect__set_cb, d))
749 eina_stringshare_del(d->service_path);
751 _connman_operation_error_show(_("Could not set service's passphrase"));
757 _connman_service_ask_pass_and_connect(E_Connman_Service *service)
759 _connman_passphrase_ask
760 (service, _connman_service_ask_pass_and_connect__ask_cb, service->ctxt);
764 _connman_services_free(E_Connman_Module_Context *ctxt)
766 while (ctxt->services)
768 E_Connman_Service *service = (E_Connman_Service *)ctxt->services;
769 e_connman_element_listener_del
770 (service->element, _connman_service_changed, service);
771 /* no need for free or unlink, since listener_del() calls
772 * _connman_service_freed()
774 //ctxt->services = eina_inlist_remove(ctxt->services, ctxt->services);
775 //_connman_service_free(service);
779 static inline Eina_Bool
780 _connman_services_element_exists(const E_Connman_Module_Context *ctxt,
781 const E_Connman_Element *element)
783 const E_Connman_Service *service;
785 EINA_INLIST_FOREACH(ctxt->services, service)
786 if (service->path == element->path)
792 static inline Eina_Bool
793 _connman_technologies_element_exists(const E_Connman_Module_Context *ctxt,
794 const E_Connman_Element *element)
796 const E_Connman_Technology *t;
798 EINA_INLIST_FOREACH(ctxt->technologies, t)
800 if (t->path == element->path)
808 _connman_request_scan_cb(void *data __UNUSED__,
809 DBusMessage *msg __UNUSED__,
812 if (error && dbus_error_is_set(error))
814 ERR("%s method failed with message \'%s\'", error->name, error->message);
815 dbus_error_free(error);
822 _connman_technologies_load(E_Connman_Module_Context *ctxt)
824 unsigned int count, i;
825 E_Connman_Element **elements;
827 if (!e_connman_manager_technologies_get(&count, &elements))
830 DBG("Technologies = %d.", count);
831 for (i = 0; i < count; i++)
833 E_Connman_Element *e = elements[i];
834 E_Connman_Technology *t;
836 if ((!e) || _connman_technologies_element_exists(ctxt, e))
839 t = _connman_technology_new(ctxt, e);
843 DBG("Added technology: %s.", t->name);
844 ctxt->technologies = eina_inlist_append
845 (ctxt->technologies, EINA_INLIST_GET(t));
848 if (!e_connman_manager_request_scan("", _connman_request_scan_cb, NULL))
849 ERR("Request scan on all technologies failed.");
855 _connman_services_load(E_Connman_Module_Context *ctxt)
857 unsigned int i, count;
858 E_Connman_Element **elements;
860 if (!e_connman_manager_services_get(&count, &elements))
863 for (i = 0; i < count; i++)
865 E_Connman_Element *e = elements[i];
866 E_Connman_Service *service;
868 if ((!e) || (_connman_services_element_exists(ctxt, e)))
871 service = _connman_service_new(ctxt, e);
875 DBG("Added service: %s\n", service->name);
876 ctxt->services = eina_inlist_append
877 (ctxt->services, EINA_INLIST_GET(service));
880 /* no need to remove elements, as they remove themselves */
885 _connman_default_service_changed(E_Connman_Module_Context *ctxt)
887 E_Connman_Service *itr, *def = NULL;
888 E_Connman_Instance *inst;
892 EINA_INLIST_FOREACH(ctxt->services, itr)
894 if ((itr->state == e_str_ready) ||
895 (itr->state == e_str_login) ||
896 (itr->state == e_str_online))
901 else if ((itr->state == e_str_association) &&
902 ((!def) || (def && def->state != e_str_configuration)))
904 else if (itr->state == e_str_configuration)
908 DBG("Default service changed to %p (%s)", def, def ? def->name : "");
910 if (!e_connman_manager_technology_default_get(&tech))
912 if (eina_stringshare_replace(&ctxt->technology, tech))
913 DBG("Manager technology is '%s'", tech);
915 if (!e_connman_manager_offline_mode_get(&ctxt->offline_mode))
916 ctxt->offline_mode = EINA_FALSE;
918 if ((e_config->mode.offline != ctxt->offline_mode) &&
919 (!ctxt->offline_mode_pending))
921 e_config->mode.offline = ctxt->offline_mode;
922 e_config_mode_changed();
923 e_config_save_queue();
926 ctxt->default_service = def;
927 EINA_LIST_FOREACH(ctxt->instances, l, inst)
928 _connman_gadget_update(inst);
932 _connman_services_reload(E_Connman_Module_Context *ctxt)
934 _connman_services_load(ctxt);
935 _connman_default_service_changed(ctxt);
939 _connman_default_service_changed_delayed_do(void *data)
941 E_Connman_Module_Context *ctxt = data;
942 DBG("Do delayed change.");
944 ctxt->poller.default_service_changed = NULL;
945 _connman_default_service_changed(ctxt);
946 return ECORE_CALLBACK_CANCEL;
950 _connman_default_service_changed_delayed(E_Connman_Module_Context *ctxt)
952 if (!ctxt->has_manager)
954 DBG("Request delayed change.");
955 if (ctxt->poller.default_service_changed)
956 ecore_poller_del(ctxt->poller.default_service_changed);
957 ctxt->poller.default_service_changed = ecore_poller_add
958 (ECORE_POLLER_CORE, 1, _connman_default_service_changed_delayed_do, ctxt);
961 static void _connman_popup_del(E_Connman_Instance *inst);
964 _connman_popup_input_window_mouse_up_cb(void *data,
968 Ecore_Event_Mouse_Button *ev = event;
969 E_Connman_Instance *inst = data;
971 if (ev->window != inst->ui.input.win)
972 return ECORE_CALLBACK_PASS_ON;
974 _connman_popup_del(inst);
976 return ECORE_CALLBACK_PASS_ON;
980 _connman_popup_input_window_key_down_cb(void *data,
984 Ecore_Event_Key *ev = event;
985 E_Connman_Instance *inst = data;
988 if (ev->window != inst->ui.input.win)
989 return ECORE_CALLBACK_PASS_ON;
992 if (strcmp(keysym, "Escape") == 0)
993 _connman_popup_del(inst);
995 return ECORE_CALLBACK_PASS_ON;
999 _connman_popup_input_window_destroy(E_Connman_Instance *inst)
1001 ecore_x_window_free(inst->ui.input.win);
1002 inst->ui.input.win = 0;
1004 ecore_event_handler_del(inst->ui.input.mouse_up);
1005 inst->ui.input.mouse_up = NULL;
1007 ecore_event_handler_del(inst->ui.input.key_down);
1008 inst->ui.input.key_down = NULL;
1012 _connman_popup_input_window_create(E_Connman_Instance *inst)
1014 Ecore_X_Window_Configure_Mask mask;
1015 Ecore_X_Window w, popup_w;
1018 man = e_manager_current_get();
1020 w = ecore_x_window_input_new(man->root, 0, 0, man->w, man->h);
1021 mask = (ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE |
1022 ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING);
1023 popup_w = inst->popup->win->evas_win;
1024 ecore_x_window_configure(w, mask, 0, 0, 0, 0, 0, popup_w,
1025 ECORE_X_WINDOW_STACK_BELOW);
1026 ecore_x_window_show(w);
1028 inst->ui.input.mouse_up =
1029 ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP,
1030 _connman_popup_input_window_mouse_up_cb, inst);
1032 inst->ui.input.key_down =
1033 ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
1034 _connman_popup_input_window_key_down_cb, inst);
1036 inst->ui.input.win = w;
1040 _connman_popup_cb_offline_mode_changed(void *data,
1043 E_Connman_Instance *inst = data;
1044 E_Connman_Module_Context *ctxt = inst->ctxt;
1045 Eina_Bool offline = e_widget_check_checked_get(obj);
1047 if ((!ctxt) || (!ctxt->has_manager))
1049 _connman_operation_error_show(_("ConnMan Daemon is not running."));
1053 if (!e_connman_manager_offline_mode_set
1054 (offline, _connman_toggle_offline_mode_cb, ctxt))
1056 _connman_operation_error_show
1057 (_("Cannot toggle system's offline mode."));
1060 ctxt->offline_mode_pending = EINA_TRUE;
1064 _connman_popup_cb_controls(void *data,
1065 void *data2 __UNUSED__)
1067 E_Connman_Instance *inst = data;
1072 _connman_popup_del(inst);
1073 if (inst->ctxt->conf_dialog)
1076 inst->ctxt->conf_dialog = e_connman_config_dialog_new(NULL, inst->ctxt);
1080 _connman_popup_service_selected(void *data)
1082 E_Connman_Instance *inst = data;
1083 E_Connman_Module_Context *ctxt = inst->ctxt;
1084 E_Connman_Service *service;
1086 if (inst->first_selection)
1088 inst->first_selection = EINA_FALSE;
1092 if (!inst->service_path)
1095 service = _connman_ctxt_find_service_stringshare(ctxt, inst->service_path);
1099 _connman_popup_del(inst);
1101 if ((service->state != e_str_idle) &&
1102 (service->state != e_str_disconnect) &&
1103 (service->state != e_str_failure))
1104 _connman_service_disconnect(service);
1105 else if (service->pass_required)
1106 _connman_service_ask_pass_and_connect(service);
1108 _connman_service_connect(service);
1112 _connman_service_new_list_item(Evas *evas,
1113 E_Connman_Service *service)
1116 Edje_Message_Int msg;
1119 snprintf(buf, sizeof(buf), "e/modules/connman/icon/%s", service->type);
1120 icon = edje_object_add(evas);
1121 e_theme_edje_object_set(icon, "base/theme/modules/connman", buf);
1123 snprintf(buf, sizeof(buf), "e,state,%s", service->state);
1124 edje_object_signal_emit(icon, buf, "e");
1128 snprintf(buf, sizeof(buf), "e,mode,%s", service->mode);
1129 edje_object_signal_emit(icon, buf, "e");
1132 if (service->security)
1134 snprintf(buf, sizeof(buf), "e,security,%s", service->security);
1135 edje_object_signal_emit(icon, buf, "e");
1138 if (service->favorite)
1139 edje_object_signal_emit(icon, "e,favorite,yes", "e");
1141 edje_object_signal_emit(icon, "e,favorite,no", "e");
1143 if (service->auto_connect)
1144 edje_object_signal_emit(icon, "e,auto_connect,yes", "e");
1146 edje_object_signal_emit(icon, "e,auto_connect,no", "e");
1148 if (service->pass_required)
1149 edje_object_signal_emit(icon, "e,pass_required,yes", "e");
1151 edje_object_signal_emit(icon, "e,pass_required,no", "e");
1153 msg.val = service->strength;
1154 edje_object_message_send(icon, EDJE_MESSAGE_INT, 1, &msg);
1160 _connman_popup_update(E_Connman_Instance *inst)
1162 Evas_Object *list = inst->ui.list;
1163 E_Connman_Service *service;
1164 const char *default_path;
1165 Evas *evas = evas_object_evas_get(list);
1168 default_path = inst->ctxt->default_service ?
1169 inst->ctxt->default_service->path : NULL;
1171 /* TODO: replace this with a scroller + list of edje
1172 * objects that are more full of features
1174 e_widget_ilist_freeze(list);
1175 e_widget_ilist_clear(list);
1178 EINA_INLIST_FOREACH(inst->ctxt->services, service)
1182 if (service->path == default_path)
1186 icon = _connman_service_new_list_item(evas, service);
1188 e_widget_ilist_append
1189 (list, icon, service->name, _connman_popup_service_selected,
1190 inst, service->path);
1195 inst->first_selection = EINA_TRUE;
1196 e_widget_ilist_selected_set(list, selected);
1199 inst->first_selection = EINA_FALSE;
1201 e_widget_ilist_thaw(list);
1202 e_widget_ilist_go(list);
1204 e_widget_check_checked_set(inst->ui.offline_mode, inst->ctxt->offline_mode);
1208 _connman_popup_del(E_Connman_Instance *inst)
1210 eina_stringshare_replace(&inst->service_path, NULL);
1211 _connman_popup_input_window_destroy(inst);
1212 e_object_del(E_OBJECT(inst->popup));
1217 _connman_popup_new(E_Connman_Instance *inst)
1219 E_Connman_Module_Context *ctxt = inst->ctxt;
1225 e_gadcon_popup_show(inst->popup);
1229 inst->popup = e_gadcon_popup_new(inst->gcc);
1230 evas = inst->popup->win->evas;
1232 inst->ui.table = e_widget_table_add(evas, 0);
1234 if (ctxt->default_service)
1235 eina_stringshare_replace(&inst->service_path, ctxt->default_service->path);
1237 // TODO: get this size from edj
1238 inst->ui.list = e_widget_ilist_add(evas, 32, 32, &inst->service_path);
1239 e_widget_size_min_set(inst->ui.list, 180, 100);
1240 e_widget_table_object_append(inst->ui.table, inst->ui.list,
1241 0, 0, 1, 5, 1, 1, 1, 1);
1243 inst->offline_mode = ctxt->offline_mode;
1244 inst->ui.offline_mode = e_widget_check_add
1245 (evas, _("Offline mode"), &inst->offline_mode);
1247 evas_object_show(inst->ui.offline_mode);
1248 e_widget_table_object_append(inst->ui.table, inst->ui.offline_mode,
1249 0, 5, 1, 1, 1, 1, 1, 0);
1250 e_widget_on_change_hook_set
1251 (inst->ui.offline_mode, _connman_popup_cb_offline_mode_changed, inst);
1253 inst->ui.button = e_widget_button_add
1254 (evas, _("Controls"), NULL,
1255 _connman_popup_cb_controls, inst, NULL);
1256 e_widget_table_object_append(inst->ui.table, inst->ui.button,
1257 0, 6, 1, 1, 1, 1, 1, 0);
1259 _connman_popup_update(inst);
1261 e_widget_size_min_get(inst->ui.table, &mw, &mh);
1262 if (mh < 200) mh = 200;
1263 if (mw < 200) mw = 200;
1264 e_widget_size_min_set(inst->ui.table, mw, mh);
1266 e_gadcon_popup_content_set(inst->popup, inst->ui.table);
1267 e_gadcon_popup_show(inst->popup);
1268 _connman_popup_input_window_create(inst);
1272 _connman_menu_cb_post(void *data,
1273 E_Menu *menu __UNUSED__)
1275 E_Connman_Instance *inst = data;
1276 if ((!inst) || (!inst->menu))
1280 e_object_del(E_OBJECT(inst->menu));
1286 _connman_menu_cb_cfg(void *data,
1287 E_Menu *menu __UNUSED__,
1288 E_Menu_Item *mi __UNUSED__)
1290 E_Connman_Instance *inst = data;
1295 _connman_popup_del(inst);
1296 if (inst->ctxt->conf_dialog)
1299 inst->ctxt->conf_dialog = e_connman_config_dialog_new(NULL, inst->ctxt);
1303 _connman_menu_new(E_Connman_Instance *inst,
1304 Evas_Event_Mouse_Down *ev)
1311 zone = e_util_zone_current_get(e_manager_current_get());
1314 mi = e_menu_item_new(m);
1315 e_menu_item_label_set(mi, _("Settings"));
1316 e_util_menu_item_theme_icon_set(mi, "configure");
1317 e_menu_item_callback_set(mi, _connman_menu_cb_cfg, inst);
1319 m = e_gadcon_client_util_menu_items_append(inst->gcc, m, 0);
1320 e_menu_post_deactivate_callback_set(m, _connman_menu_cb_post, inst);
1322 e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &x, &y, NULL, NULL);
1323 e_menu_activate_mouse(m, zone, x + ev->output.x, y + ev->output.y,
1324 1, 1, E_MENU_POP_DIRECTION_AUTO, ev->timestamp);
1325 evas_event_feed_mouse_up(inst->gcc->gadcon->evas, ev->button,
1326 EVAS_BUTTON_NONE, ev->timestamp, NULL);
1330 _connman_tip_new(E_Connman_Instance *inst)
1334 inst->tip = e_gadcon_popup_new(inst->gcc);
1335 if (!inst->tip) return;
1337 e = inst->tip->win->evas;
1339 inst->o_tip = edje_object_add(e);
1340 e_theme_edje_object_set(inst->o_tip, "base/theme/modules/connman/tip",
1341 "e/modules/connman/tip");
1343 _connman_tip_update(inst);
1345 e_gadcon_popup_content_set(inst->tip, inst->o_tip);
1346 e_gadcon_popup_show(inst->tip);
1350 _connman_tip_del(E_Connman_Instance *inst)
1352 evas_object_del(inst->o_tip);
1353 e_object_del(E_OBJECT(inst->tip));
1359 _connman_cb_mouse_down(void *data,
1360 Evas *evas __UNUSED__,
1361 Evas_Object *obj __UNUSED__,
1364 E_Connman_Instance *inst;
1365 Evas_Event_Mouse_Down *ev;
1372 if (ev->button == 1)
1375 _connman_popup_new(inst);
1377 _connman_popup_del(inst);
1379 else if (ev->button == 2)
1380 _connman_toggle_offline_mode(inst->ctxt);
1381 else if ((ev->button == 3) && (!inst->menu))
1382 _connman_menu_new(inst, ev);
1386 _connman_cb_mouse_in(void *data,
1387 Evas *evas __UNUSED__,
1388 Evas_Object *obj __UNUSED__,
1389 void *event __UNUSED__)
1391 E_Connman_Instance *inst = data;
1396 _connman_tip_new(inst);
1400 _connman_cb_mouse_out(void *data,
1401 Evas *evas __UNUSED__,
1402 Evas_Object *obj __UNUSED__,
1403 void *event __UNUSED__)
1405 E_Connman_Instance *inst = data;
1410 _connman_tip_del(inst);
1414 _connman_edje_view_update(E_Connman_Instance *inst,
1417 E_Connman_Module_Context *ctxt = inst->ctxt;
1418 const E_Connman_Service *service;
1419 Edje_Message_Int msg;
1422 if (!ctxt->has_manager)
1424 edje_object_signal_emit(o, "e,unavailable", "e");
1425 edje_object_part_text_set(o, "e.text.name", _("No ConnMan"));
1426 edje_object_part_text_set(o, "e.text.error",
1427 _("No ConnMan server found."));
1428 edje_object_signal_emit(o, "e,changed,connected,no", "e");
1429 edje_object_part_text_set(o, "e.text.offline_mode", "");
1430 edje_object_signal_emit(o, "e,changed,offline_mode,no", "e");
1434 edje_object_signal_emit(o, "e,available", "e");
1436 if (ctxt->offline_mode)
1438 edje_object_signal_emit(o, "e,changed,offline_mode,yes", "e");
1439 edje_object_part_text_set(o, "e.text.offline_mode",
1440 _("Offline mode: all radios are turned off"));
1444 edje_object_signal_emit(o, "e,changed,offline_mode,no", "e");
1445 edje_object_part_text_set(o, "e.text.offline_mode", "");
1448 if (ctxt->technology && ctxt->technology[0])
1450 edje_object_part_text_set(o, "e.text.technology",
1452 snprintf(buf, sizeof(buf), "e,changed,technology,%s",
1454 edje_object_signal_emit(o, buf, "e");
1456 else if (!ctxt->default_service)
1458 edje_object_part_text_set(o, "e.text.technology", "");
1459 edje_object_signal_emit(o, "e,changed,technology,none", "e");
1462 service = ctxt->default_service;
1465 edje_object_part_text_set(o, "e.text.name", _("No Connection"));
1466 edje_object_signal_emit(o, "e,changed,service,none", "e");
1467 edje_object_signal_emit(o, "e,changed,connected,no", "e");
1469 edje_object_part_text_set(o, "e.text.error", _("Not connected"));
1470 edje_object_signal_emit(o, "e,changed,error,no", "e");
1472 edje_object_part_text_set(o, "e.text.state", _("disconnect"));
1473 edje_object_signal_emit(o, "e,changed,state,disconnect", "e");
1475 edje_object_signal_emit(o, "e,changed,mode,no", "e");
1477 edje_object_signal_emit(o, "e,changed,mode,none", "e");
1478 edje_object_signal_emit(o, "e,changed,security,none", "e");
1480 edje_object_part_text_set(o, "e.text.ipv4_address", "");
1481 edje_object_signal_emit(o, "e,changed,ipv4_address,no", "e");
1483 edje_object_signal_emit(o, "e,changed,favorite,no", "e");
1484 edje_object_signal_emit(o, "e,changed,auto_connect,no", "e");
1485 edje_object_signal_emit(o, "e,changed,pass_required,no", "e");
1490 edje_object_signal_emit(o, "e,changed,connected,yes", "e");
1493 edje_object_part_text_set(o, "e.text.name", service->name);
1495 edje_object_part_text_set(o, "e.text.name", _("Unknown Name"));
1499 edje_object_part_text_set(o, "e.text.error", service->error);
1500 edje_object_signal_emit(o, "e,changed,error,yes", "e");
1504 edje_object_part_text_set(o, "e.text.error", _("No error"));
1505 edje_object_signal_emit(o, "e,changed,error,no", "e");
1508 snprintf(buf, sizeof(buf), "e,changed,service,%s", service->type);
1509 edje_object_signal_emit(o, buf, "e");
1511 if (!ctxt->technology)
1513 edje_object_part_text_set(o, "e.text.technology", service->type);
1514 snprintf(buf, sizeof(buf), "e,changed,technology,%s", service->type);
1515 edje_object_signal_emit(o, buf, "e");
1518 snprintf(buf, sizeof(buf), "e,changed,state,%s", service->state);
1519 edje_object_signal_emit(o, buf, "e");
1520 edje_object_part_text_set(o, "e.text.state", _(service->state));
1524 snprintf(buf, sizeof(buf), "e,changed,mode,%s", service->mode);
1525 edje_object_signal_emit(o, buf, "e");
1528 edje_object_signal_emit(o, "e,changed,mode,none", "e");
1530 if (service->security)
1532 snprintf(buf, sizeof(buf), "e,changed,security,%s", service->security);
1533 edje_object_signal_emit(o, buf, "e");
1536 edje_object_signal_emit(o, "e,changed,security,none", "e");
1538 if (service->ipv4_address)
1540 edje_object_part_text_set(o, "e.text.ipv4_address", service->ipv4_address);
1541 edje_object_signal_emit(o, "e,changed,ipv4_address,yes", "e");
1545 edje_object_part_text_set(o, "e.text.ipv4_address", "");
1546 edje_object_signal_emit(o, "e,changed,ipv4_address,no", "e");
1549 if (service->favorite)
1550 edje_object_signal_emit(o, "e,changed,favorite,yes", "e");
1552 edje_object_signal_emit(o, "e,changed,favorite,no", "e");
1554 if (service->auto_connect)
1555 edje_object_signal_emit(o, "e,changed,auto_connect,yes", "e");
1557 edje_object_signal_emit(o, "e,changed,auto_connect,no", "e");
1559 if (service->pass_required)
1560 edje_object_signal_emit(o, "e,changed,pass_required,yes", "e");
1562 edje_object_signal_emit(o, "e,changed,pass_required,no", "e");
1564 msg.val = service->strength;
1565 edje_object_message_send(o, EDJE_MESSAGE_INT, 1, &msg);
1569 _connman_tip_update(E_Connman_Instance *inst)
1571 _connman_edje_view_update(inst, inst->o_tip);
1575 _connman_gadget_update(E_Connman_Instance *inst)
1577 E_Connman_Module_Context *ctxt = inst->ctxt;
1579 if (!ctxt->has_manager && inst->popup)
1580 _connman_popup_del(inst);
1583 _connman_popup_update(inst);
1585 _connman_tip_update(inst);
1587 _connman_edje_view_update(inst, inst->ui.gadget);
1590 /* Gadcon Api Functions */
1592 static E_Gadcon_Client *
1593 _gc_init(E_Gadcon *gc,
1598 E_Connman_Instance *inst;
1599 E_Connman_Module_Context *ctxt;
1604 ctxt = connman_mod->data;
1606 inst = E_NEW(E_Connman_Instance, 1);
1608 inst->ui.gadget = edje_object_add(gc->evas);
1609 e_theme_edje_object_set(inst->ui.gadget, "base/theme/modules/connman",
1610 "e/modules/connman/main");
1612 inst->gcc = e_gadcon_client_new(gc, name, id, style, inst->ui.gadget);
1613 inst->gcc->data = inst;
1615 evas_object_event_callback_add
1616 (inst->ui.gadget, EVAS_CALLBACK_MOUSE_DOWN, _connman_cb_mouse_down, inst);
1617 evas_object_event_callback_add
1618 (inst->ui.gadget, EVAS_CALLBACK_MOUSE_IN, _connman_cb_mouse_in, inst);
1619 evas_object_event_callback_add
1620 (inst->ui.gadget, EVAS_CALLBACK_MOUSE_OUT, _connman_cb_mouse_out, inst);
1622 _connman_gadget_update(inst);
1624 ctxt->instances = eina_list_append(ctxt->instances, inst);
1630 _gc_shutdown(E_Gadcon_Client *gcc)
1632 E_Connman_Module_Context *ctxt;
1633 E_Connman_Instance *inst;
1638 ctxt = connman_mod->data;
1648 e_menu_post_deactivate_callback_set(inst->menu, NULL, NULL);
1649 e_object_del(E_OBJECT(inst->menu));
1651 evas_object_del(inst->ui.gadget);
1653 ctxt->instances = eina_list_remove(ctxt->instances, inst);
1659 _gc_orient(E_Gadcon_Client *gcc,
1660 E_Gadcon_Orient orient __UNUSED__)
1662 e_gadcon_client_aspect_set(gcc, 16, 16);
1663 e_gadcon_client_min_size_set(gcc, 16, 16);
1667 _gc_label(E_Gadcon_Client_Class *client_class __UNUSED__)
1669 return _(_e_connman_Name);
1672 static Evas_Object *
1673 _gc_icon(E_Gadcon_Client_Class *client_class __UNUSED__,
1678 o = edje_object_add(evas);
1679 edje_object_file_set(o, e_connman_theme_path(), "icon");
1684 _gc_id_new(E_Gadcon_Client_Class *client_class __UNUSED__)
1686 E_Connman_Module_Context *ctxt;
1687 Eina_List *instances;
1692 ctxt = connman_mod->data;
1696 instances = ctxt->instances;
1697 snprintf(tmpbuf, sizeof(tmpbuf), "connman.%d", eina_list_count(instances));
1701 static const E_Gadcon_Client_Class _gc_class =
1703 GADCON_CLIENT_CLASS_VERSION, _e_connman_name,
1705 _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL,
1706 e_gadcon_site_is_not_toolbar
1708 E_GADCON_CLIENT_STYLE_PLAIN
1711 EAPI E_Module_Api e_modapi = {E_MODULE_API_VERSION, _e_connman_Name};
1713 static const char _act_toggle_offline_mode[] = "toggle_offline_mode";
1714 static const char _lbl_toggle_offline_mode[] = "Toggle Offline Mode";
1717 _connman_actions_register(E_Connman_Module_Context *ctxt)
1719 ctxt->actions.toggle_offline_mode = e_action_add(_act_toggle_offline_mode);
1720 if (ctxt->actions.toggle_offline_mode)
1722 ctxt->actions.toggle_offline_mode->func.go =
1723 _connman_cb_toggle_offline_mode;
1724 e_action_predef_name_set
1725 (_(_e_connman_Name), _(_lbl_toggle_offline_mode), _act_toggle_offline_mode,
1731 _connman_actions_unregister(E_Connman_Module_Context *ctxt)
1733 if (ctxt->actions.toggle_offline_mode)
1735 e_action_predef_name_del(_(_e_connman_Name), _(_lbl_toggle_offline_mode));
1736 e_action_del(_act_toggle_offline_mode);
1741 _connman_manager_changed_do(void *data)
1743 E_Connman_Module_Context *ctxt = data;
1745 _connman_technologies_load(ctxt);
1746 _connman_services_reload(ctxt);
1748 ctxt->poller.manager_changed = NULL;
1749 return ECORE_CALLBACK_CANCEL;
1753 _connman_manager_changed(void *data,
1754 const E_Connman_Element *element __UNUSED__)
1756 E_Connman_Module_Context *ctxt = data;
1757 if (ctxt->poller.manager_changed)
1758 ecore_poller_del(ctxt->poller.manager_changed);
1759 ctxt->poller.manager_changed = ecore_poller_add
1760 (ECORE_POLLER_CORE, 1, _connman_manager_changed_do, ctxt);
1764 _connman_event_manager_in(void *data,
1765 int type __UNUSED__,
1766 void *event __UNUSED__)
1768 E_Connman_Module_Context *ctxt = data;
1769 E_Connman_Element *element;
1771 ctxt->has_manager = EINA_TRUE;
1773 element = e_connman_manager_get();
1774 e_connman_element_listener_add
1775 (element, _connman_manager_changed, ctxt, NULL);
1777 _connman_services_reload(ctxt);
1779 return ECORE_CALLBACK_PASS_ON;
1783 _connman_event_manager_out(void *data,
1784 int type __UNUSED__,
1785 void *event __UNUSED__)
1787 E_Connman_Module_Context *ctxt = data;
1789 ctxt->has_manager = EINA_FALSE;
1790 eina_stringshare_replace(&ctxt->technology, NULL);
1792 _connman_services_free(ctxt);
1793 _connman_default_service_changed(ctxt);
1795 return ECORE_CALLBACK_PASS_ON;
1799 _connman_event_mode_changed(void *data,
1800 int type __UNUSED__,
1801 void *event __UNUSED__)
1803 E_Connman_Module_Context *ctxt = data;
1804 if ((ctxt->offline_mode == e_config->mode.offline) ||
1805 (!ctxt->has_manager))
1806 return ECORE_CALLBACK_PASS_ON;
1807 if (!ctxt->offline_mode_pending)
1809 if (!e_connman_manager_offline_mode_set(e_config->mode.offline,
1810 _connman_toggle_offline_mode_cb, ctxt))
1811 _connman_operation_error_show(_("Cannot toggle system's offline mode."));
1814 ctxt->offline_mode_pending = EINA_FALSE;
1816 return ECORE_CALLBACK_PASS_ON;
1819 static E_Config_Dialog *
1820 _connman_config(E_Container *con,
1821 const char *params __UNUSED__)
1823 E_Connman_Module_Context *ctxt;
1828 ctxt = connman_mod->data;
1832 if (!ctxt->conf_dialog)
1833 ctxt->conf_dialog = e_connman_config_dialog_new(con, ctxt);
1835 return ctxt->conf_dialog;
1838 static const char _reg_cat[] = "extensions";
1839 static const char _reg_item[] = "extensions/connman";
1842 _connman_configure_registry_register(void)
1844 e_configure_registry_category_add(_reg_cat, 90, _("Extensions"), NULL,
1845 "preferences-extensions");
1846 e_configure_registry_item_add(_reg_item, 110, _(_e_connman_Name), NULL,
1847 e_connman_theme_path(),
1852 _connman_configure_registry_unregister(void)
1854 e_configure_registry_item_del(_reg_item);
1855 e_configure_registry_category_del(_reg_cat);
1859 _connman_events_register(E_Connman_Module_Context *ctxt)
1861 ctxt->event.manager_in = ecore_event_handler_add
1862 (E_CONNMAN_EVENT_MANAGER_IN, _connman_event_manager_in, ctxt);
1863 ctxt->event.manager_out = ecore_event_handler_add
1864 (E_CONNMAN_EVENT_MANAGER_OUT, _connman_event_manager_out, ctxt);
1865 ctxt->event.mode_changed = ecore_event_handler_add
1866 (E_EVENT_CONFIG_MODE_CHANGED, _connman_event_mode_changed, ctxt);
1870 _connman_events_unregister(E_Connman_Module_Context *ctxt)
1872 if (ctxt->event.manager_in)
1873 ecore_event_handler_del(ctxt->event.manager_in);
1874 if (ctxt->event.manager_out)
1875 ecore_event_handler_del(ctxt->event.manager_out);
1876 if (ctxt->event.mode_changed)
1877 ecore_event_handler_del(ctxt->event.mode_changed);
1881 _connman_status_stringshare_init(void)
1883 e_str_idle = eina_stringshare_add(N_("idle"));
1884 e_str_association = eina_stringshare_add(N_("association"));
1885 e_str_configuration = eina_stringshare_add(N_("configuration"));
1886 e_str_ready = eina_stringshare_add(N_("ready"));
1887 e_str_login = eina_stringshare_add(N_("login"));
1888 e_str_online = eina_stringshare_add(N_("online"));
1889 e_str_disconnect = eina_stringshare_add(N_("disconnect"));
1890 e_str_failure = eina_stringshare_add(N_("failure"));
1891 e_str_enabled = eina_stringshare_add(N_("enabled"));
1892 e_str_available = eina_stringshare_add(N_("available"));
1893 e_str_connected = eina_stringshare_add(N_("connected"));
1894 e_str_offline = eina_stringshare_add(N_("offline"));
1898 _connman_status_stringshare_del(void)
1900 eina_stringshare_replace(&e_str_idle, NULL);
1901 eina_stringshare_replace(&e_str_association, NULL);
1902 eina_stringshare_replace(&e_str_configuration, NULL);
1903 eina_stringshare_replace(&e_str_ready, NULL);
1904 eina_stringshare_replace(&e_str_login, NULL);
1905 eina_stringshare_replace(&e_str_online, NULL);
1906 eina_stringshare_replace(&e_str_disconnect, NULL);
1907 eina_stringshare_replace(&e_str_failure, NULL);
1908 eina_stringshare_replace(&e_str_enabled, NULL);
1909 eina_stringshare_replace(&e_str_available, NULL);
1910 eina_stringshare_replace(&e_str_connected, NULL);
1911 eina_stringshare_replace(&e_str_offline, NULL);
1915 e_modapi_init(E_Module *m)
1917 E_Connman_Module_Context *ctxt;
1918 E_DBus_Connection *c;
1920 _connman_status_stringshare_init();
1922 c = e_dbus_bus_get(DBUS_BUS_SYSTEM);
1924 goto error_dbus_bus_get;
1925 if (!e_connman_system_init(c))
1926 goto error_connman_system_init;
1928 ctxt = E_NEW(E_Connman_Module_Context, 1);
1930 goto error_connman_context;
1932 ctxt->services = NULL;
1933 ctxt->technologies = NULL;
1934 ctxt->conf_dialog = NULL;
1937 if (_e_connman_log_dom < 0)
1939 _e_connman_log_dom = eina_log_domain_register("econnman", EINA_COLOR_ORANGE);
1940 if (_e_connman_log_dom < 0)
1942 EINA_LOG_CRIT("could not register logging domain econnman");
1943 goto error_log_domain;
1947 _connman_configure_registry_register();
1948 _connman_actions_register(ctxt);
1949 e_gadcon_provider_register(&_gc_class);
1951 _connman_events_register(ctxt);
1956 _e_connman_log_dom = -1;
1959 error_connman_context:
1960 e_connman_system_shutdown();
1961 error_connman_system_init:
1963 _connman_status_stringshare_del();
1968 _connman_instances_free(E_Connman_Module_Context *ctxt)
1970 while (ctxt->instances)
1972 E_Connman_Instance *inst;
1974 inst = ctxt->instances->data;
1977 _connman_popup_del(inst);
1979 _connman_tip_del(inst);
1981 e_object_del(E_OBJECT(inst->gcc));
1986 e_modapi_shutdown(E_Module *m)
1988 E_Connman_Module_Context *ctxt;
1989 E_Connman_Element *element;
1995 element = e_connman_manager_get();
1996 e_connman_element_listener_del
1997 (element, _connman_manager_changed, ctxt);
1999 _connman_events_unregister(ctxt);
2001 _connman_instances_free(ctxt);
2002 _connman_services_free(ctxt);
2004 _connman_configure_registry_unregister();
2005 _connman_actions_unregister(ctxt);
2006 e_gadcon_provider_unregister(&_gc_class);
2008 if (ctxt->poller.default_service_changed)
2009 ecore_poller_del(ctxt->poller.default_service_changed);
2010 if (ctxt->poller.manager_changed)
2011 ecore_poller_del(ctxt->poller.manager_changed);
2016 e_connman_system_shutdown();
2018 _connman_status_stringshare_del();
2023 e_modapi_save(E_Module *m)
2025 E_Connman_Module_Context *ctxt;