diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 8215c06075..74675d5e4a 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -41,6 +41,7 @@ #include "../../paths.h" #include "../../runloop.h" #include "../../intl/intl.h" +#include "../../wifi/wifi_driver.h" #ifndef BIND_ACTION_GET_VALUE #define BIND_ACTION_GET_VALUE(cbs, name) \ @@ -707,6 +708,22 @@ static void menu_action_setting_disp_set_label_xmb_theme( } } +static void menu_action_setting_disp_set_label_wifi_is_online( + file_list_t* list, + unsigned *w, unsigned type, unsigned i, + const char *label, + char *s, size_t len, + const char *entry_label, + const char *path, + char *s2, size_t len2) +{ + strlcpy(s2, path, len2); + *w = 19; + + if (driver_wifi_ssid_is_online(i)) + strlcpy(s, "Online", len); +} + static void menu_action_setting_disp_set_label_xmb_menu_color_theme( file_list_t* list, unsigned *w, unsigned type, unsigned i, @@ -1515,6 +1532,10 @@ static int menu_cbs_init_bind_get_string_representation_compare_label( BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_xmb_theme); break; + case MENU_ENUM_LABEL_CONNECT_WIFI: + BIND_ACTION_GET_VALUE(cbs, + menu_action_setting_disp_set_label_wifi_is_online); + break; case MENU_ENUM_LABEL_XMB_MENU_COLOR_THEME: BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_xmb_menu_color_theme); diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 183e8d7f16..00ad93ac20 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -4674,7 +4674,8 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) { unsigned i; struct string_list *ssid_list = string_list_new(); - driver_wifi_scan(ssid_list); + driver_wifi_scan(); + driver_wifi_get_ssids(ssid_list); for (i = 0; i < ssid_list->size; i++) { diff --git a/wifi/drivers/connmanctl.c b/wifi/drivers/connmanctl.c index 9f6e643cb4..1b56b9f501 100644 --- a/wifi/drivers/connmanctl.c +++ b/wifi/drivers/connmanctl.c @@ -17,6 +17,8 @@ #include #include +static struct string_list* lines; + static void *connmanctl_init(const char *device, uint64_t caps, unsigned width, unsigned height) { @@ -40,29 +42,55 @@ static void connmanctl_stop(void *data) (void)data; } -static void connmanctl_scan(struct string_list *list) +static void connmanctl_scan() { union string_list_elem_attr attr; attr.i = RARCH_FILETYPE_UNSET; char line[512]; + if (lines) + free(lines); + lines = string_list_new(); pclose(popen("connmanctl scan wifi", "r")); FILE* serv_file = popen("connmanctl services", "r"); while (fgets (line, 512, serv_file) != NULL) { - char ssid[20]; - strlcpy(ssid, line+4, sizeof(ssid)); - string_list_append(list, ssid, attr); + //char ssid[20]; + //strlcpy(ssid, line+4, sizeof(ssid)); + string_list_append(lines, line, attr); } pclose(serv_file); } +static void connmanctl_get_ssids(struct string_list* ssids) +{ + unsigned i; + union string_list_elem_attr attr; + attr.i = RARCH_FILETYPE_UNSET; + + for (i = 0; i < lines->size; i++) + { + const char *line = lines->elems[i].data; + char ssid[20]; + strlcpy(ssid, line+4, sizeof(ssid)); + string_list_append(ssids, ssid, attr); + } +} + +static bool connmanctl_ssid_is_online(unsigned i) +{ + const char *line = lines->elems[i].data; + return line[2] == 'O'; +} + wifi_driver_t wifi_connmanctl = { connmanctl_init, connmanctl_free, connmanctl_start, connmanctl_stop, connmanctl_scan, + connmanctl_get_ssids, + connmanctl_ssid_is_online, "connmanctl", }; diff --git a/wifi/drivers/nullwifi.c b/wifi/drivers/nullwifi.c index 7cb6610436..c7c4fa65ad 100644 --- a/wifi/drivers/nullwifi.c +++ b/wifi/drivers/nullwifi.c @@ -38,15 +38,26 @@ static void nullwifi_stop(void *data) (void)data; } -static void nullwifi_scan(struct string_list *list) +static void nullwifi_scan() { } +static void nullwifi_get_ssids(struct string_list* ssids) +{ +} + +static bool nullwifi_ssid_is_online(unsigned i) +{ + return false; +} + wifi_driver_t wifi_null = { nullwifi_init, nullwifi_free, nullwifi_start, nullwifi_stop, nullwifi_scan, + nullwifi_get_ssids, + nullwifi_ssid_is_online, "null", }; diff --git a/wifi/wifi_driver.c b/wifi/wifi_driver.c index 03564c98b8..ccc0ddedb5 100644 --- a/wifi/wifi_driver.c +++ b/wifi/wifi_driver.c @@ -96,9 +96,19 @@ bool driver_wifi_start(void) return wifi_driver_ctl(RARCH_WIFI_CTL_START, NULL); } -void driver_wifi_scan(struct string_list *list) +void driver_wifi_scan() { - wifi_driver->scan(list); + wifi_driver->scan(); +} + +void driver_wifi_get_ssids(struct string_list* ssids) +{ + wifi_driver->get_ssids(ssids); +} + +bool driver_wifi_ssid_is_online(unsigned i) +{ + return wifi_driver->ssid_is_online(i); } bool wifi_driver_ctl(enum rarch_wifi_ctl_state state, void *data) diff --git a/wifi/wifi_driver.h b/wifi/wifi_driver.h index 7bfc983872..9090dd336f 100644 --- a/wifi/wifi_driver.h +++ b/wifi/wifi_driver.h @@ -53,7 +53,9 @@ typedef struct wifi_driver bool (*start)(void *data); void (*stop)(void *data); - void (*scan)(struct string_list *list); + void (*scan)(); + void (*get_ssids)(struct string_list *list); + bool (*ssid_is_online)(unsigned i); const char *ident; } wifi_driver_t; @@ -94,7 +96,11 @@ void driver_wifi_stop(void); bool driver_wifi_start(void); -void driver_wifi_scan(struct string_list *list); +void driver_wifi_scan(); + +void driver_wifi_get_ssids(struct string_list *list); + +bool driver_wifi_ssid_is_online(unsigned i); bool wifi_driver_ctl(enum rarch_wifi_ctl_state state, void *data);