| OLD | NEW |
| 1 /* | 1 /* |
| 2 * | 2 * |
| 3 * Connection Manager | 3 * Connection Manager |
| 4 * | 4 * |
| 5 * Copyright (C) 2007-2009 Intel Corporation. All rights reserved. | 5 * Copyright (C) 2007-2009 Intel Corporation. All rights reserved. |
| 6 * | 6 * |
| 7 * This program is free software; you can redistribute it and/or modify | 7 * This program is free software; you can redistribute it and/or modify |
| 8 * it under the terms of the GNU General Public License version 2 as | 8 * it under the terms of the GNU General Public License version 2 as |
| 9 * published by the Free Software Foundation. | 9 * published by the Free Software Foundation. |
| 10 * | 10 * |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 | 52 |
| 53 static DBusConnection *connection = NULL; | 53 static DBusConnection *connection = NULL; |
| 54 | 54 |
| 55 static GSequence *service_list = NULL; | 55 static GSequence *service_list = NULL; |
| 56 static GHashTable *service_hash = NULL; | 56 static GHashTable *service_hash = NULL; |
| 57 | 57 |
| 58 struct connman_service { | 58 struct connman_service { |
| 59 gint refcount; | 59 gint refcount; |
| 60 char *identifier; | 60 char *identifier; |
| 61 char *path; | 61 char *path; |
| 62 struct connman_profile *profile; |
| 62 enum connman_service_type type; | 63 enum connman_service_type type; |
| 63 enum connman_service_mode mode; | 64 enum connman_service_mode mode; |
| 64 enum connman_service_security security; | 65 enum connman_service_security security; |
| 65 enum connman_service_state state; | 66 enum connman_service_state state; |
| 66 enum connman_service_error error; | 67 enum connman_service_error error; |
| 67 enum connman_service_connectivity_state connectivity_state; | 68 enum connman_service_connectivity_state connectivity_state; |
| 68 connman_uint8_t pri; | 69 connman_uint8_t pri; |
| 69 connman_uint8_t strength; | 70 connman_uint8_t strength; |
| 70 connman_bool_t favorite; | 71 connman_bool_t favorite; |
| 71 connman_bool_t hidden; | 72 connman_bool_t hidden; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 89 char *private_key_passwd; | 90 char *private_key_passwd; |
| 90 char *key_id; | 91 char *key_id; |
| 91 char *ca_cert; /* formerly authpath */ | 92 char *ca_cert; /* formerly authpath */ |
| 92 char *ca_cert_id; | 93 char *ca_cert_id; |
| 93 connman_bool_t use_system_cas; | 94 connman_bool_t use_system_cas; |
| 94 char *pin; | 95 char *pin; |
| 95 char *password; | 96 char *password; |
| 96 char *key_mgmt; | 97 char *key_mgmt; |
| 97 } eap; | 98 } eap; |
| 98 | 99 |
| 99 const struct connman_storage_ident *profile; | |
| 100 char *proxy_config; | 100 char *proxy_config; |
| 101 | 101 |
| 102 /* TODO(sleffler) overlay storage */ | 102 /* TODO(sleffler) overlay storage */ |
| 103 struct { | 103 struct { |
| 104 char *operator_name; | 104 char *operator_name; |
| 105 char *operator_code; | 105 char *operator_code; |
| 106 char *olp_url; | 106 char *olp_url; |
| 107 char *usage_url; | 107 char *usage_url; |
| 108 enum connman_network_activation_state activation_state; | 108 enum connman_network_activation_state activation_state; |
| 109 enum connman_network_cellular_technology network_technology; | 109 enum connman_network_cellular_technology network_technology; |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 389 { | 389 { |
| 390 struct find_data data = { .path = path, .service = NULL }; | 390 struct find_data data = { .path = path, .service = NULL }; |
| 391 | 391 |
| 392 _DBG_SERVICE("path %s", path); | 392 _DBG_SERVICE("path %s", path); |
| 393 | 393 |
| 394 g_sequence_foreach(service_list, compare_path, &data); | 394 g_sequence_foreach(service_list, compare_path, &data); |
| 395 | 395 |
| 396 return data.service; | 396 return data.service; |
| 397 } | 397 } |
| 398 | 398 |
| 399 struct connman_profile *__connman_service_get_profile( |
| 400 struct connman_service *service) |
| 401 { |
| 402 return service->profile; |
| 403 } |
| 404 |
| 405 /* |
| 406 * Set the service's bound profile. |
| 407 */ |
| 408 void __connman_service_set_profile(struct connman_service *service, |
| 409 struct connman_profile *profile) |
| 410 { |
| 411 _DBG_SERVICE("profile %p -> %p", service->profile, profile); |
| 412 |
| 413 service->profile = profile; |
| 414 } |
| 415 |
| 416 /* |
| 417 * Handle a profile being pop'd off the stack (e.g. on logout). |
| 418 * Invalidate and possibly disconnect all services bound to the |
| 419 * specified profile. Then re-load state from the profile (if |
| 420 * available). Note this is assumed called AFTER the specified |
| 421 * profile is pop'd off the stack (so we can explicitly re-load |
| 422 * state and get any other data present, e.g. in the global profile). |
| 423 */ |
| 399 static void invalidate_profile(gpointer value, gpointer user_data) | 424 static void invalidate_profile(gpointer value, gpointer user_data) |
| 400 { | 425 { |
| 401 struct connman_service *service = value; | 426 struct connman_service *service = value; |
| 402 » const struct connman_storage_ident *profile = user_data; | 427 » const struct connman_profile *profile = user_data; |
| 403 | 428 |
| 404 if (service->profile == profile) { | 429 if (service->profile == profile) { |
| 405 » » /* | 430 » » _DBG_SERVICE("service %p", service); |
| 406 » » * Invalidate profile-related data and force a re-load | 431 |
| 407 » » * the next time the service is to be used (so it can | |
| 408 » » * come from the active profile). | |
| 409 » » */ | |
| 410 service->profile = NULL; | 432 service->profile = NULL; |
| 411 | 433 |
| 412 /* | 434 /* |
| 413 * network_disconnect may drop the last reference to the | 435 * network_disconnect may drop the last reference to the |
| 414 * service and cause it to be freed, so take a reference | 436 * service and cause it to be freed, so take a reference |
| 415 * temporarily until we are done with it. | 437 * temporarily until we are done with it. |
| 416 */ | 438 */ |
| 417 connman_service_ref(service); | 439 connman_service_ref(service); |
| 440 |
| 418 /* TODO(sleffler) skip wired ethernet, open auth? */ | 441 /* TODO(sleffler) skip wired ethernet, open auth? */ |
| 442 service->autoconnect = FALSE; |
| 419 __connman_service_disconnect(service); | 443 __connman_service_disconnect(service); |
| 420 service_clear_passphrase(service); | 444 service_clear_passphrase(service); |
| 421 service_clear_eap(service); | 445 service_clear_eap(service); |
| 446 |
| 447 /* re-load profile state */ |
| 448 __connman_profile_load_service(service); |
| 449 |
| 422 connman_service_unref(service); | 450 connman_service_unref(service); |
| 423 } | 451 } |
| 424 } | 452 } |
| 453 static void service_profile_pop(struct connman_profile *profile) |
| 454 { |
| 455 _DBG_SERVICE("profile %p", profile); |
| 425 | 456 |
| 426 void __connman_service_invalidate_profile(const struct connman_storage_ident *id
ent) | 457 » g_sequence_foreach(service_list, invalidate_profile, (gpointer)profile); |
| 458 » /* NB: no need to kick auto-connect; it will happen due to invalidate */ |
| 459 } |
| 460 |
| 461 /* |
| 462 * Handle a profile being push'd on the stack (e.g. on login). |
| 463 * Try to bind any service objects that are currently unbound |
| 464 * and kick the autoconnect logic in case we can now login. |
| 465 */ |
| 466 static void load_profile(gpointer value, gpointer user_data) |
| 427 { | 467 { |
| 428 » _DBG_SERVICE("ident %s/%s", ident->user, ident->ident); | 468 » struct connman_service *service = value; |
| 429 | 469 |
| 430 » g_sequence_foreach(service_list, invalidate_profile, (gpointer) ident); | 470 » if (service->profile == NULL) |
| 471 » » __connman_profile_load_service(service); |
| 472 } |
| 473 static void service_profile_push(struct connman_profile *profile) |
| 474 { |
| 475 » _DBG_SERVICE("profile %p", profile); |
| 476 |
| 477 » g_sequence_foreach(service_list, load_profile, NULL); |
| 478 |
| 479 » __connman_service_auto_connect_any(); |
| 431 } | 480 } |
| 432 | 481 |
| 433 static const char *identifier(struct connman_service *service) | 482 static const char *identifier(struct connman_service *service) |
| 434 { | 483 { |
| 435 return service ? service->identifier : "<nil>"; | 484 return service ? service->identifier : "<nil>"; |
| 436 } | 485 } |
| 437 | 486 |
| 438 static const char *type2string(enum connman_service_type type) | 487 static const char *type2string(enum connman_service_type type) |
| 439 { | 488 { |
| 440 switch (type) { | 489 switch (type) { |
| (...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 873 static void proxy_configuration_changed(struct connman_service *service) | 922 static void proxy_configuration_changed(struct connman_service *service) |
| 874 { | 923 { |
| 875 if (service->proxy_config == NULL) | 924 if (service->proxy_config == NULL) |
| 876 return; | 925 return; |
| 877 | 926 |
| 878 connman_dbus_send_property_changed_variant(service->path, | 927 connman_dbus_send_property_changed_variant(service->path, |
| 879 CONNMAN_SERVICE_INTERFACE, "ProxyConfig", | 928 CONNMAN_SERVICE_INTERFACE, "ProxyConfig", |
| 880 DBUS_TYPE_STRING, &service->proxy_config); | 929 DBUS_TYPE_STRING, &service->proxy_config); |
| 881 } | 930 } |
| 882 | 931 |
| 932 static void profile_changed(struct connman_service *service) |
| 933 { |
| 934 const char *path; |
| 935 |
| 936 CONNMAN_ASSERT(service->profile != NULL); |
| 937 |
| 938 path = __connman_profile_get_path(service->profile); |
| 939 connman_dbus_send_property_changed_variant(service->path, |
| 940 CONNMAN_SERVICE_INTERFACE, "Profile", |
| 941 DBUS_TYPE_STRING, &path); |
| 942 } |
| 943 |
| 883 static void get_properties_802_1x(DBusMessageIter *dict, | 944 static void get_properties_802_1x(DBusMessageIter *dict, |
| 884 struct connman_service *service) | 945 struct connman_service *service) |
| 885 { | 946 { |
| 886 if (service->eap.identity != NULL) | 947 if (service->eap.identity != NULL) |
| 887 connman_dbus_dict_append_variant(dict, kEAPIdentity, | 948 connman_dbus_dict_append_variant(dict, kEAPIdentity, |
| 888 DBUS_TYPE_STRING, &service->eap.identity); | 949 DBUS_TYPE_STRING, &service->eap.identity); |
| 889 if (service->eap.eap != NULL) | 950 if (service->eap.eap != NULL) |
| 890 connman_dbus_dict_append_variant(dict, kEAPEAP, | 951 connman_dbus_dict_append_variant(dict, kEAPEAP, |
| 891 DBUS_TYPE_STRING, &service->eap.eap); | 952 DBUS_TYPE_STRING, &service->eap.eap); |
| 892 if (service->eap.inner_eap != NULL) | 953 if (service->eap.inner_eap != NULL) |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 990 str = security2string(service->security); | 1051 str = security2string(service->security); |
| 991 if (str != NULL) | 1052 if (str != NULL) |
| 992 connman_dbus_dict_append_variant(&dict, "Security", | 1053 connman_dbus_dict_append_variant(&dict, "Security", |
| 993 DBUS_TYPE_STRING, &str); | 1054 DBUS_TYPE_STRING, &str); |
| 994 | 1055 |
| 995 str = connman_service_get_state(service); | 1056 str = connman_service_get_state(service); |
| 996 if (str != NULL) | 1057 if (str != NULL) |
| 997 connman_dbus_dict_append_variant(&dict, "State", | 1058 connman_dbus_dict_append_variant(&dict, "State", |
| 998 DBUS_TYPE_STRING, &str); | 1059 DBUS_TYPE_STRING, &str); |
| 999 | 1060 |
| 1061 if (service->profile != NULL) { |
| 1062 str = __connman_profile_get_path(service->profile); |
| 1063 connman_dbus_dict_append_variant(&dict, "Profile", |
| 1064 DBUS_TYPE_STRING, &str); |
| 1065 } |
| 1066 |
| 1000 str = error2string(service->error); | 1067 str = error2string(service->error); |
| 1001 if (str != NULL) | 1068 if (str != NULL) |
| 1002 connman_dbus_dict_append_variant(&dict, "Error", | 1069 connman_dbus_dict_append_variant(&dict, "Error", |
| 1003 DBUS_TYPE_STRING, &str); | 1070 DBUS_TYPE_STRING, &str); |
| 1004 | 1071 |
| 1005 if (service->pri != CONNMAN_SERVICE_PRI_NONE) { | 1072 if (service->pri != CONNMAN_SERVICE_PRI_NONE) { |
| 1006 int pri = service->pri; | 1073 int pri = service->pri; |
| 1007 connman_dbus_dict_append_variant(&dict, "Priority", | 1074 connman_dbus_dict_append_variant(&dict, "Priority", |
| 1008 DBUS_TYPE_INT32, &pri); | 1075 DBUS_TYPE_INT32, &pri); |
| 1009 } | 1076 } |
| (...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1555 dbus_message_iter_get_basic(&iter, &name); | 1622 dbus_message_iter_get_basic(&iter, &name); |
| 1556 dbus_message_iter_next(&iter); | 1623 dbus_message_iter_next(&iter); |
| 1557 dbus_message_iter_recurse(&iter, &value); | 1624 dbus_message_iter_recurse(&iter, &value); |
| 1558 | 1625 |
| 1559 if (__connman_security_check_privilege(msg, | 1626 if (__connman_security_check_privilege(msg, |
| 1560 CONNMAN_SECURITY_PRIVILEGE_MODIFY) < 0) | 1627 CONNMAN_SECURITY_PRIVILEGE_MODIFY) < 0) |
| 1561 return __connman_error_permission_denied(msg); | 1628 return __connman_error_permission_denied(msg); |
| 1562 | 1629 |
| 1563 type = dbus_message_iter_get_arg_type(&value); | 1630 type = dbus_message_iter_get_arg_type(&value); |
| 1564 | 1631 |
| 1565 » if (g_str_equal(name, "WiFi.HiddenSSID") == TRUE) { | 1632 » if (g_str_equal(name, "Profile") == TRUE) { |
| 1633 » » const char *path; |
| 1634 » » struct connman_profile *profile; |
| 1635 |
| 1636 » » if (type != DBUS_TYPE_STRING) |
| 1637 » » » return __connman_error_invalid_arguments(msg); |
| 1638 |
| 1639 » » dbus_message_iter_get_basic(&value, &path); |
| 1640 |
| 1641 » » profile = __connman_profile_lookup_profile(path); |
| 1642 » » /* TODO(sleffler) support setting a NULL profile? */ |
| 1643 » » if (profile == NULL) |
| 1644 » » » return __connman_error_not_found(msg); |
| 1645 |
| 1646 » » if (service->profile != profile) { |
| 1647 » » » if (service->profile != NULL) { |
| 1648 » » » » /* remove old entry */ |
| 1649 » » » » (void) __connman_profile_delete_entry( |
| 1650 » » » » service->profile, service->identifier); |
| 1651 » » » } |
| 1652 » » » service->profile = profile; |
| 1653 |
| 1654 » » » profile_changed(service); |
| 1655 |
| 1656 » » » service_modified(service); |
| 1657 » » } |
| 1658 » } else if (g_str_equal(name, "WiFi.HiddenSSID") == TRUE) { |
| 1566 connman_bool_t hidden_ssid; | 1659 connman_bool_t hidden_ssid; |
| 1567 | 1660 |
| 1568 if (type != DBUS_TYPE_BOOLEAN) | 1661 if (type != DBUS_TYPE_BOOLEAN) |
| 1569 return __connman_error_invalid_arguments(msg); | 1662 return __connman_error_invalid_arguments(msg); |
| 1570 | 1663 |
| 1571 if (service->type != CONNMAN_SERVICE_TYPE_WIFI) | 1664 if (service->type != CONNMAN_SERVICE_TYPE_WIFI) |
| 1572 return __connman_error_invalid_service(msg); | 1665 return __connman_error_invalid_service(msg); |
| 1573 | 1666 |
| 1574 dbus_message_iter_get_basic(&value, &hidden_ssid); | 1667 dbus_message_iter_get_basic(&value, &hidden_ssid); |
| 1575 | 1668 |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1822 { | 1915 { |
| 1823 service_clear_passphrase(service); | 1916 service_clear_passphrase(service); |
| 1824 | 1917 |
| 1825 passphrase_required_changed(service); | 1918 passphrase_required_changed(service); |
| 1826 } | 1919 } |
| 1827 | 1920 |
| 1828 static void service_modified(struct connman_service *service) | 1921 static void service_modified(struct connman_service *service) |
| 1829 { | 1922 { |
| 1830 g_get_current_time(&service->modified); | 1923 g_get_current_time(&service->modified); |
| 1831 | 1924 |
| 1832 service->profile = __connman_profile_active_ident(); | |
| 1833 __connman_profile_save_service(service); | 1925 __connman_profile_save_service(service); |
| 1834 } | 1926 } |
| 1835 | 1927 |
| 1836 static void service_clear_eap(struct connman_service *service) | 1928 static void service_clear_eap(struct connman_service *service) |
| 1837 { | 1929 { |
| 1838 g_free(service->eap.identity); | 1930 g_free(service->eap.identity); |
| 1839 service->eap.identity = NULL; | 1931 service->eap.identity = NULL; |
| 1840 | 1932 |
| 1841 g_free(service->eap.eap); | 1933 g_free(service->eap.eap); |
| 1842 service->eap.eap = NULL; | 1934 service->eap.eap = NULL; |
| (...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2671 if (target->state != service->state) | 2763 if (target->state != service->state) |
| 2672 return __connman_error_invalid_service(msg); | 2764 return __connman_error_invalid_service(msg); |
| 2673 | 2765 |
| 2674 service_modified(service); | 2766 service_modified(service); |
| 2675 | 2767 |
| 2676 src = g_hash_table_lookup(service_hash, service->identifier); | 2768 src = g_hash_table_lookup(service_hash, service->identifier); |
| 2677 dst = g_hash_table_lookup(service_hash, target->identifier); | 2769 dst = g_hash_table_lookup(service_hash, target->identifier); |
| 2678 | 2770 |
| 2679 g_sequence_move(src, dst); | 2771 g_sequence_move(src, dst); |
| 2680 | 2772 |
| 2681 » __connman_profile_changed(FALSE); | 2773 » __connman_profile_changed(service->profile, FALSE); |
| 2682 | 2774 |
| 2683 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); | 2775 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); |
| 2684 } | 2776 } |
| 2685 | 2777 |
| 2686 static DBusMessage *move_after(DBusConnection *conn, | 2778 static DBusMessage *move_after(DBusConnection *conn, |
| 2687 DBusMessage *msg, void *user_data) | 2779 DBusMessage *msg, void *user_data) |
| 2688 { | 2780 { |
| 2689 struct connman_service *service = user_data; | 2781 struct connman_service *service = user_data; |
| 2690 struct connman_service *target; | 2782 struct connman_service *target; |
| 2691 const char *path; | 2783 const char *path; |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2779 if (service->in_watchlist == TRUE) | 2871 if (service->in_watchlist == TRUE) |
| 2780 connman_service_notify_watchlist(CONNMAN_SERVICE_STATE_UNKNOWN); | 2872 connman_service_notify_watchlist(CONNMAN_SERVICE_STATE_UNKNOWN); |
| 2781 | 2873 |
| 2782 remove_timeout(service); | 2874 remove_timeout(service); |
| 2783 | 2875 |
| 2784 g_hash_table_remove(service_hash, service->identifier); | 2876 g_hash_table_remove(service_hash, service->identifier); |
| 2785 | 2877 |
| 2786 service->path = NULL; | 2878 service->path = NULL; |
| 2787 | 2879 |
| 2788 if (path != NULL) { | 2880 if (path != NULL) { |
| 2789 » » __connman_profile_changed(FALSE); | 2881 » » __connman_profile_changed(service->profile, FALSE); |
| 2790 | 2882 |
| 2791 g_dbus_unregister_interface(connection, path, | 2883 g_dbus_unregister_interface(connection, path, |
| 2792 CONNMAN_SERVICE_INTERFACE); | 2884 CONNMAN_SERVICE_INTERFACE); |
| 2793 g_free(path); | 2885 g_free(path); |
| 2794 } | 2886 } |
| 2795 | 2887 |
| 2796 if (service->network != NULL) | 2888 if (service->network != NULL) |
| 2797 connman_network_unref(service->network); | 2889 connman_network_unref(service->network); |
| 2798 if (service->provider != NULL) | 2890 if (service->provider != NULL) |
| 2799 connman_provider_unref(service->provider); | 2891 connman_provider_unref(service->provider); |
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3113 if (iter == NULL) | 3205 if (iter == NULL) |
| 3114 return -ENOENT; | 3206 return -ENOENT; |
| 3115 | 3207 |
| 3116 if (service->favorite == favorite) | 3208 if (service->favorite == favorite) |
| 3117 return -EALREADY; | 3209 return -EALREADY; |
| 3118 | 3210 |
| 3119 service->favorite = favorite; | 3211 service->favorite = favorite; |
| 3120 | 3212 |
| 3121 g_sequence_sort_changed(iter, service_compare, NULL); | 3213 g_sequence_sort_changed(iter, service_compare, NULL); |
| 3122 | 3214 |
| 3123 » __connman_profile_changed(FALSE); | 3215 » __connman_profile_changed(service->profile, FALSE); |
| 3124 | 3216 |
| 3125 return 0; | 3217 return 0; |
| 3126 } | 3218 } |
| 3127 | 3219 |
| 3128 /** | 3220 /** |
| 3129 * connman_service_get_device: | 3221 * connman_service_get_device: |
| 3130 * @service: service structure | 3222 * @service: service structure |
| 3131 * | 3223 * |
| 3132 * Return device for specified service. | 3224 * Return device for specified service. |
| 3133 */ | 3225 */ |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3229 if (state == CONNMAN_SERVICE_STATE_FAILURE) { | 3321 if (state == CONNMAN_SERVICE_STATE_FAILURE) { |
| 3230 remove_timeout(service); | 3322 remove_timeout(service); |
| 3231 | 3323 |
| 3232 if (service->userconnect == FALSE) | 3324 if (service->userconnect == FALSE) |
| 3233 connman_service_auto_connect(service); | 3325 connman_service_auto_connect(service); |
| 3234 | 3326 |
| 3235 service_modified(service); | 3327 service_modified(service); |
| 3236 } else if (state != CONNMAN_SERVICE_STATE_ACTIVATION_FAILURE) | 3328 } else if (state != CONNMAN_SERVICE_STATE_ACTIVATION_FAILURE) |
| 3237 service->error = CONNMAN_SERVICE_ERROR_UNKNOWN; | 3329 service->error = CONNMAN_SERVICE_ERROR_UNKNOWN; |
| 3238 | 3330 |
| 3239 » __connman_profile_changed(FALSE); | 3331 » __connman_profile_changed(service->profile, FALSE); |
| 3240 | 3332 |
| 3241 if (state == CONNMAN_SERVICE_STATE_DISCONNECT) { | 3333 if (state == CONNMAN_SERVICE_STATE_DISCONNECT) { |
| 3242 struct connman_service *act_service = get_active_service(); | 3334 struct connman_service *act_service = get_active_service(); |
| 3243 | 3335 |
| 3244 /* TODO(sleffler) this looks wrong */ | 3336 /* TODO(sleffler) this looks wrong */ |
| 3245 if (__connman_connection_is_online() == FALSE && | 3337 if (__connman_connection_is_online() == FALSE && |
| 3246 act_service != NULL && act_service->provider != NULL) | 3338 act_service != NULL && act_service->provider != NULL) |
| 3247 __connman_provider_disconnect(act_service->provider); | 3339 __connman_provider_disconnect(act_service->provider); |
| 3248 } | 3340 } |
| 3249 | 3341 |
| (...skipping 677 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3927 } | 4019 } |
| 3928 | 4020 |
| 3929 service = connman_service_create(); | 4021 service = connman_service_create(); |
| 3930 if (service == NULL) | 4022 if (service == NULL) |
| 3931 return NULL; | 4023 return NULL; |
| 3932 | 4024 |
| 3933 _DBG_SERVICE("service %p", service); | 4025 _DBG_SERVICE("service %p", service); |
| 3934 | 4026 |
| 3935 service->identifier = g_strdup(identifier); | 4027 service->identifier = g_strdup(identifier); |
| 3936 | 4028 |
| 3937 service->profile = __connman_profile_active_ident(); | |
| 3938 | |
| 3939 __connman_profile_load_service(service); | 4029 __connman_profile_load_service(service); |
| 3940 | 4030 |
| 3941 iter = g_sequence_insert_sorted(service_list, service, | 4031 iter = g_sequence_insert_sorted(service_list, service, |
| 3942 service_compare, NULL); | 4032 service_compare, NULL); |
| 3943 | 4033 |
| 3944 g_hash_table_insert(service_hash, service->identifier, iter); | 4034 g_hash_table_insert(service_hash, service->identifier, iter); |
| 3945 | 4035 |
| 3946 return service; | 4036 return service; |
| 3947 } | 4037 } |
| 3948 | 4038 |
| 3949 static int service_register(struct connman_service *service) | 4039 static int service_register(struct connman_service *service) |
| 3950 { | 4040 { |
| 3951 const char *path = __connman_profile_active_path(); | |
| 3952 | |
| 3953 _DBG_SERVICE("service %p", service); | 4041 _DBG_SERVICE("service %p", service); |
| 3954 | 4042 |
| 3955 if (service->path != NULL) | 4043 if (service->path != NULL) |
| 3956 return -EALREADY; | 4044 return -EALREADY; |
| 3957 | 4045 |
| 3958 » service->path = g_strdup_printf("%s/%s", path, service->identifier); | 4046 » service->path = g_strdup_printf("/%s", service->identifier); |
| 3959 | |
| 3960 » _DBG_SERVICE("path %s", service->path); | |
| 3961 | 4047 |
| 3962 g_dbus_register_interface(connection, service->path, | 4048 g_dbus_register_interface(connection, service->path, |
| 3963 CONNMAN_SERVICE_INTERFACE, | 4049 CONNMAN_SERVICE_INTERFACE, |
| 3964 service_methods, service_signals, | 4050 service_methods, service_signals, |
| 3965 NULL, service, NULL); | 4051 NULL, service, NULL); |
| 3966 | 4052 |
| 3967 __connman_profile_load_service(service); | 4053 __connman_profile_load_service(service); |
| 3968 | 4054 |
| 3969 __service_resort(service); | 4055 __service_resort(service); |
| 3970 | 4056 |
| 3971 » __connman_profile_changed(TRUE); | 4057 » __connman_profile_changed(service->profile, TRUE); |
| 3972 | 4058 |
| 3973 return 0; | 4059 return 0; |
| 3974 } | 4060 } |
| 3975 | 4061 |
| 3976 /** | 4062 /** |
| 3977 * __connman_service_lookup_from_device: | 4063 * __connman_service_lookup_from_device: |
| 3978 * @device: device structure | 4064 * @device: device structure |
| 3979 * | 4065 * |
| 3980 * Look up a service by device (reference count will not be increased) | 4066 * Look up a service by device (reference count will not be increased) |
| 3981 */ | 4067 */ |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4016 | 4102 |
| 4017 name = g_strdup_printf("%s_%s", | 4103 name = g_strdup_printf("%s_%s", |
| 4018 __connman_device_get_type(device), ident); | 4104 __connman_device_get_type(device), ident); |
| 4019 service = __connman_service_get(name); | 4105 service = __connman_service_get(name); |
| 4020 g_free(name); | 4106 g_free(name); |
| 4021 | 4107 |
| 4022 if (service == NULL) | 4108 if (service == NULL) |
| 4023 return NULL; | 4109 return NULL; |
| 4024 | 4110 |
| 4025 if (service->path != NULL) { | 4111 if (service->path != NULL) { |
| 4026 » » __connman_profile_changed(TRUE); | 4112 » » __connman_profile_changed(service->profile, TRUE); |
| 4027 return service; | 4113 return service; |
| 4028 } | 4114 } |
| 4029 | 4115 |
| 4030 service->type = __connman_device_get_service_type(device); | 4116 service->type = __connman_device_get_service_type(device); |
| 4031 | 4117 |
| 4032 service->autoconnect = FALSE; | 4118 service->autoconnect = FALSE; |
| 4033 | 4119 |
| 4034 service->device = device; | 4120 service->device = device; |
| 4035 | 4121 |
| 4036 __connman_profile_load_service(service); | 4122 __connman_profile_load_service(service); |
| 4037 | 4123 |
| 4038 service_register(service); | 4124 service_register(service); |
| 4039 | 4125 |
| 4040 » __connman_profile_changed(TRUE); | 4126 » __connman_profile_changed(service->profile, TRUE); |
| 4041 | 4127 |
| 4042 if (service->favorite == TRUE) | 4128 if (service->favorite == TRUE) |
| 4043 connman_service_auto_connect(service); | 4129 connman_service_auto_connect(service); |
| 4044 | 4130 |
| 4045 return service; | 4131 return service; |
| 4046 } | 4132 } |
| 4047 | 4133 |
| 4048 void __connman_service_remove_from_device(struct connman_device *device) | 4134 void __connman_service_remove_from_device(struct connman_device *device) |
| 4049 { | 4135 { |
| 4050 struct connman_service *service; | 4136 struct connman_service *service; |
| (...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4402 g_free(name); | 4488 g_free(name); |
| 4403 | 4489 |
| 4404 if (service == NULL) | 4490 if (service == NULL) |
| 4405 return NULL; | 4491 return NULL; |
| 4406 | 4492 |
| 4407 if (__connman_network_get_weakness(network) == TRUE) | 4493 if (__connman_network_get_weakness(network) == TRUE) |
| 4408 return service; | 4494 return service; |
| 4409 | 4495 |
| 4410 if (service->path != NULL) { | 4496 if (service->path != NULL) { |
| 4411 update_from_network(service, network, FALSE); | 4497 update_from_network(service, network, FALSE); |
| 4412 » » __connman_profile_changed(TRUE); | 4498 » » __connman_profile_changed(service->profile, TRUE); |
| 4413 return service; | 4499 return service; |
| 4414 } | 4500 } |
| 4415 | 4501 |
| 4416 service->type = convert_network_type(network); | 4502 service->type = convert_network_type(network); |
| 4417 | 4503 |
| 4418 switch (service->type) { | 4504 switch (service->type) { |
| 4419 case CONNMAN_SERVICE_TYPE_UNKNOWN: | 4505 case CONNMAN_SERVICE_TYPE_UNKNOWN: |
| 4420 case CONNMAN_SERVICE_TYPE_ETHERNET: | 4506 case CONNMAN_SERVICE_TYPE_ETHERNET: |
| 4421 case CONNMAN_SERVICE_TYPE_WIMAX: | 4507 case CONNMAN_SERVICE_TYPE_WIMAX: |
| 4422 case CONNMAN_SERVICE_TYPE_BLUETOOTH: | 4508 case CONNMAN_SERVICE_TYPE_BLUETOOTH: |
| (...skipping 24 matching lines...) Expand all Loading... |
| 4447 | 4533 |
| 4448 str = connman_network_get_string(network, "WiFi.Security"); | 4534 str = connman_network_get_string(network, "WiFi.Security"); |
| 4449 service->security = convert_wifi_security(str); | 4535 service->security = convert_wifi_security(str); |
| 4450 | 4536 |
| 4451 update_from_network(service, network, FALSE); | 4537 update_from_network(service, network, FALSE); |
| 4452 | 4538 |
| 4453 __connman_profile_load_service(service); | 4539 __connman_profile_load_service(service); |
| 4454 | 4540 |
| 4455 service_register(service); | 4541 service_register(service); |
| 4456 | 4542 |
| 4457 » __connman_profile_changed(TRUE); | 4543 » __connman_profile_changed(service->profile, TRUE); |
| 4458 | 4544 |
| 4459 if (service->favorite == TRUE) | 4545 if (service->favorite == TRUE) |
| 4460 connman_service_auto_connect(service); | 4546 connman_service_auto_connect(service); |
| 4461 | 4547 |
| 4462 return service; | 4548 return service; |
| 4463 } | 4549 } |
| 4464 | 4550 |
| 4465 /** | 4551 /** |
| 4466 * connman_service_set_current_network: | 4552 * connman_service_set_current_network: |
| 4467 * @network: network structure | 4553 * @network: network structure |
| (...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5110 .service_load = service_load, | 5196 .service_load = service_load, |
| 5111 .service_save = service_save, | 5197 .service_save = service_save, |
| 5112 }; | 5198 }; |
| 5113 | 5199 |
| 5114 static struct connman_notifier service_notifier = { | 5200 static struct connman_notifier service_notifier = { |
| 5115 .name = "service", | 5201 .name = "service", |
| 5116 .priority = CONNMAN_NOTIFIER_PRIORITY_DEFAULT, | 5202 .priority = CONNMAN_NOTIFIER_PRIORITY_DEFAULT, |
| 5117 .service_state_changed = notify_state_changed, | 5203 .service_state_changed = notify_state_changed, |
| 5118 .system_suspend = service_system_suspend, | 5204 .system_suspend = service_system_suspend, |
| 5119 .system_resume = service_system_resume, | 5205 .system_resume = service_system_resume, |
| 5206 .profile_push = service_profile_push, |
| 5207 .profile_pop = service_profile_pop, |
| 5120 }; | 5208 }; |
| 5121 | 5209 |
| 5122 int __connman_service_init(const char *option_order) | 5210 int __connman_service_init(const char *option_order) |
| 5123 { | 5211 { |
| 5124 _DBG_SERVICE(""); | 5212 _DBG_SERVICE(""); |
| 5125 | 5213 |
| 5126 connection = connman_dbus_get_connection(); | 5214 connection = connman_dbus_get_connection(); |
| 5127 | 5215 |
| 5128 if (connman_storage_register(&service_storage) < 0) | 5216 if (connman_storage_register(&service_storage) < 0) |
| 5129 connman_error("Failed to register service storage"); | 5217 connman_error("Failed to register service storage"); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 5155 service_list = NULL; | 5243 service_list = NULL; |
| 5156 | 5244 |
| 5157 g_hash_table_destroy(service_hash); | 5245 g_hash_table_destroy(service_hash); |
| 5158 service_hash = NULL; | 5246 service_hash = NULL; |
| 5159 | 5247 |
| 5160 connman_storage_unregister(&service_storage); | 5248 connman_storage_unregister(&service_storage); |
| 5161 connman_notifier_unregister(&service_notifier); | 5249 connman_notifier_unregister(&service_notifier); |
| 5162 | 5250 |
| 5163 dbus_connection_unref(connection); | 5251 dbus_connection_unref(connection); |
| 5164 } | 5252 } |
| OLD | NEW |