Use dbus method 'GetConnectedService' to get connected AP 76/258476/2
authorJaehyun Kim <jeik01.kim@samsung.com>
Tue, 18 May 2021 09:23:46 +0000 (18:23 +0900)
committerJaehyun Kim <jeik01.kim@samsung.com>
Tue, 25 May 2021 02:11:01 +0000 (11:11 +0900)
Change-Id: I887c0b85850785ce5f80ec65c98a9c9455545322
Signed-off-by: Jaehyun Kim <jeik01.kim@samsung.com>
include/network_interface.h
include/network_internal.h
include/wifi-manager.h
src/network_interface.c
src/wifi_internal.c

index beca6fde839358fa419f085e7cea6ad9007c06f8..b25d77f7a48ec79fe1a0950ef83b63ab3bc412a0 100755 (executable)
@@ -262,6 +262,8 @@ int net_get_interface_list(network_info_s *network_info, GSList **interface_list
 
 int net_get_profile_info(network_info_s *network_info,
                const char *profile_name, net_profile_info_s *prof_info);
+int net_get_connected_profile(network_info_s *network_info,
+               const char *ifname,  net_profile_info_s *prof_info);
 int net_get_profile_list(network_info_s *network_info, GSList **profile_list);
 
 int _net_extract_service_info(network_info_s *network_info,
index 73b5f33ce1fe5c771f5c940429ae2f1a6f0c4d70..386f147a00aa5bbc740292c49bcfad41c0c5eab6 100755 (executable)
@@ -146,6 +146,8 @@ int _net_check_profile_name(const char* ProfileName);
 gboolean _net_check_service_mac_addr(network_info_s *network_info, const char* service);
 int _net_get_interface_list(network_info_s *network_info, GSList **interface_list);
 int _net_get_profile_list(network_info_s *network_info, GSList **profile_list);
+int _net_get_connected_profile(network_info_s *network_info,
+               const char *ifname, net_profile_info_s *profile_info);
 net_err_e _net_get_wifi_state(network_info_s *network_info);
 void _net_clear_request_table(network_info_s *network_info);
 
index 102823e7a6f9b9b91a355f89cdd80f5229d3e194..96113637d0456e0aab5d11151105358a87623523 100755 (executable)
@@ -1497,6 +1497,7 @@ int wifi_manager_connect_hidden_ap(wifi_manager_h wifi,
  * @retval #WIFI_MANAGER_ERROR_NONE                 Successful
  * @retval #WIFI_MANAGER_ERROR_NOT_INITIALIZED      Not initialized
  * @retval #WIFI_MANAGER_ERROR_INVALID_PARAMETER    Invalid parameter
+ * @retval #WIFI_MANAGER_ERROR_OPERATION_FAILED     Operation failed
  * @retval #WIFI_MANAGER_ERROR_OUT_OF_MEMORY        Out of memory
  * @retval #WIFI_MANAGER_ERROR_NO_CONNECTION        There is no connected AP
  * @retval #WIFI_MANAGER_ERROR_PERMISSION_DENIED    Permission Denied
index a1deb5b096f2a595f3d3a8af4d946aca012c9c09..89bba2a6b230ead417de0ec85443da53eeacd63d 100755 (executable)
@@ -1265,6 +1265,37 @@ static net_err_e __net_get_wifi_state(network_info_s *network_info)
        return err;
 }
 
+static int __net_extract_connected_profile(network_info_s *network_info,
+               GVariant *message, net_profile_info_s *profile_info)
+{
+       int err = NET_ERR_NONE;
+       gchar *obj_path = NULL;
+       GVariantIter *iter = NULL;
+
+       __NETWORK_FUNC_ENTER__;
+
+       if (!g_variant_is_of_type(message, G_VARIANT_TYPE("(oa{sv})"))) {
+               WIFI_LOG(WIFI_ERROR, "There is no connected service");
+               __NETWORK_FUNC_EXIT__;
+               return NET_ERR_NO_PROFILE;
+       }
+
+       g_variant_get(message, "(oa{sv})", &obj_path, &iter);
+
+       if (g_str_has_prefix(obj_path, CONNMAN_WIFI_SERVICE_PROFILE_PREFIX) != TRUE) {
+               WIFI_LOG(WIFI_ERROR, "No wifi service");
+               __NETWORK_FUNC_EXIT__;
+               return NET_ERR_NO_PROFILE;
+       }
+
+       err = _net_extract_service_info(network_info, obj_path, iter, profile_info);
+
+       g_variant_iter_free(iter);
+       g_free(obj_path);
+
+       return err;
+}
+
 void net_forget_ap_finished(network_info_s *network_info, net_err_e Error)
 {
        __NETWORK_FUNC_ENTER__;
@@ -1426,6 +1457,35 @@ int _net_get_profile_list(network_info_s *network_info, GSList **profile_list)
        return Error;
 }
 
+int _net_get_connected_profile(network_info_s *network_info,
+               const char *ifname, net_profile_info_s *profile_info)
+{
+       __NETWORK_FUNC_ENTER__;
+
+       net_err_e err = NET_ERR_NO_PROFILE;
+       GVariant *message;
+       GVariant *params = NULL;
+
+       params = g_variant_new("(s)", ifname);
+
+       message = _net_invoke_dbus_method(network_info,
+                       CONNMAN_SERVICE, CONNMAN_MANAGER_PATH,
+                       CONNMAN_MANAGER_INTERFACE, "GetConnectedService",
+                       params, &err);
+       if (message == NULL) {
+               WIFI_LOG(WIFI_ERROR, "Failed to get connected service(profile)"); //LCOV_EXCL_LINE
+               __NETWORK_FUNC_EXIT__; //LCOV_EXCL_LINE
+               return err; //LCOV_EXCL_LINE
+       }
+
+       err = __net_extract_connected_profile(network_info, message, profile_info);
+
+       g_variant_unref(message);
+
+       __NETWORK_FUNC_EXIT__;
+       return err;
+}
+
 int net_init_profile_info(network_info_s *network_info, net_profile_info_s *ProfInfo)
 {
        int i = 0;
@@ -3240,6 +3300,24 @@ int net_get_profile_info(network_info_s *network_info,
        return Error;
 }
 
+int net_get_connected_profile(network_info_s *network_info,
+               const char *ifname,  net_profile_info_s *prof_info)
+{
+       __NETWORK_FUNC_ENTER__;
+
+       net_err_e err = NET_ERR_NONE;
+
+       err = _net_get_connected_profile(network_info, ifname, prof_info);
+       if (err != NET_ERR_NONE) {
+               WIFI_LOG(WIFI_ERROR, //LCOV_EXCL_LINE
+                               "Failed to get service(profile) list. Error [%s]",
+                               _net_print_error(err));
+       }
+
+       __NETWORK_FUNC_EXIT__;
+       return err;
+}
+
 //LCOV_EXCL_START
 int net_get_interface_list(network_info_s *network_info, GSList **interface_list)
 {
index 30cd2d564d37038a8bab8416094eb45c64033d7c..70b21d419391f1bc3f52de2dd28a38ae1860d3ac 100755 (executable)
@@ -2529,40 +2529,23 @@ int _wifi_get_connected_profile(wifi_manager_h wifi, wifi_manager_ap_h *ap)
        int rv;
        wifi_manager_handle_s *wifi_handle = wifi;
        net_profile_info_s *ap_info = NULL;
-       net_profile_info_s *connected_ap = NULL;
-       GSList *list;
-
-       rv = __update_profile_iterator(wifi_handle);
-       if (rv == NET_ERR_ACCESS_DENIED) {
-               WIFI_LOG(WIFI_ERROR, "Access denied"); //LCOV_EXCL_LINE
-               return WIFI_MANAGER_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
-       }
-
-       for (list = wifi_handle->profile_iterator; list; list = list->next) {
-               net_profile_info_s *prof_info = (net_profile_info_s *)list->data;
-               if (!g_strcmp0(prof_info->net_info.DevName, wifi_handle->interface_name)) {
-                       if (prof_info->ProfileState == NET_STATE_TYPE_ONLINE ||
-                           prof_info->ProfileState == NET_STATE_TYPE_READY) {
-                               connected_ap = prof_info;
-                               break;
-                       }
-               }
-       }
-
-       if (connected_ap == NULL) {
-               WIFI_LOG(WIFI_ERROR, "There is no connected AP"); //LCOV_EXCL_LINE
-               return WIFI_MANAGER_ERROR_NO_CONNECTION; //LCOV_EXCL_LINE
-       }
+       const char *ifname = wifi_handle->interface_name;
 
        ap_info = g_try_malloc0(sizeof(net_profile_info_s));
        if (ap_info == NULL)
                return WIFI_MANAGER_ERROR_OUT_OF_MEMORY;
 
-       memcpy(ap_info, connected_ap, sizeof(net_profile_info_s));
-       ap_info->vsie_list = g_slist_copy_deep(connected_ap->vsie_list,
-                                                       _wifi_copy_vsie_list, NULL);
-       ap_info->bssid_list = g_slist_copy_deep(connected_ap->bssid_list,
-                                                       _wifi_copy_bssid_list, NULL);
+       rv = net_get_connected_profile(wifi_handle->network_info, ifname, ap_info);
+
+       if (rv == NET_ERR_NO_PROFILE)
+               return WIFI_MANAGER_ERROR_NO_CONNECTION; //LCOV_EXCL_LINE
+       else if (rv == NET_ERR_ACCESS_DENIED) {
+               WIFI_LOG(WIFI_ERROR, "Access denied"); //LCOV_EXCL_LINE
+               return WIFI_MANAGER_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
+       } else if (rv == NET_ERR_INVALID_PARAM)
+               return WIFI_MANAGER_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
+       else if (rv != NET_ERR_NONE)
+               return WIFI_MANAGER_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
 
        _wifi_add_to_ap_list(ap_info);
        *ap = (wifi_manager_ap_h)ap_info;