diff --git a/file_path_special.h b/file_path_special.h index 521866143a..9a119dad7d 100644 --- a/file_path_special.h +++ b/file_path_special.h @@ -53,6 +53,7 @@ enum file_path_enum FILE_PATH_LAKKA_URL, FILE_PATH_CORE_THUMBNAILS_URL, FILE_PATH_INDEX_DIRS_URL, + FILE_PATH_NETPLAY_ROOM_LIST_URL, FILE_PATH_INDEX_URL, FILE_PATH_INDEX_EXTENDED_URL, FILE_PATH_CGP_EXTENSION, diff --git a/file_path_str.c b/file_path_str.c index fea26786c2..77009bcf46 100644 --- a/file_path_str.c +++ b/file_path_str.c @@ -101,6 +101,8 @@ const char *file_path_str(enum file_path_enum enum_idx) return ".index-dirs"; case FILE_PATH_INDEX_EXTENDED_URL: return ".index-extended"; + case FILE_PATH_NETPLAY_ROOM_LIST_URL: + return "registry.lpl"; case FILE_PATH_CORE_THUMBNAILS_URL: return "http://thumbnailpacks.libretro.com"; case FILE_PATH_LAKKA_URL: diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index e307a25cd5..b90ab38ac9 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -839,6 +839,8 @@ MSG_HASH(MENU_ENUM_LABEL_SCAN_DIRECTORY, "scan_directory") MSG_HASH(MENU_ENUM_LABEL_SCAN_FILE, "scan_file") +MSG_HASH(MENU_ENUM_LABEL_NETPLAY_REFRESH_ROOMS, + "refresh_rooms") MSG_HASH(MENU_ENUM_LABEL_SCAN_THIS_DIRECTORY, "scan_this_directory") MSG_HASH(MENU_ENUM_LABEL_SCREENSHOT_DIRECTORY, diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 944791e075..d0741abab1 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3262,6 +3262,18 @@ static int action_ok_push_content_list(const char *path, entry_idx, ACTION_OK_DL_CONTENT_LIST); } +struct room +{ + char nickname [PATH_MAX_LENGTH]; + char address [PATH_MAX_LENGTH]; + int port; + char corename [PATH_MAX_LENGTH]; + char coreversion [PATH_MAX_LENGTH]; + char gamename [PATH_MAX_LENGTH]; + int gamecrc; + int timestamp; +}; + static int action_ok_push_scan_file(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -3269,6 +3281,102 @@ static int action_ok_push_scan_file(const char *path, return action_ok_push_content_list(path, label, type, idx, entry_idx); } +static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const char *err) +{ + char buf[PATH_MAX_LENGTH]; + + http_transfer_data_t *data = (http_transfer_data_t*)task_data; + menu_file_transfer_t *state = (menu_file_transfer_t*)user_data; + + buf[0] = '\0'; + + if (!data || err) + goto finish; + + memcpy(buf, data->data, data->len * sizeof(char)); + buf[data->len] = '\0'; + + +finish: + if (!err && !strstr(buf, file_path_str(FILE_PATH_NETPLAY_ROOM_LIST_URL))) + { + if (string_is_empty(buf)) + RARCH_LOG("Room list empty\n"); + else + { + int rooms, i = 0; + char tmp[PATH_MAX_LENGTH]; + struct string_list *room_data = NULL; + room_data = string_split(buf, "\n"); + + rooms = room_data->size / 8; + struct room *room_list = NULL; + room_list = (struct room*)malloc(sizeof(struct room) * rooms); + + /*for (int i = 0; i < room_data->size; i++) + { + strlcpy(tmp, + room_data->elems[i].data, sizeof(tmp)); + RARCH_LOG("tmp %s\n", tmp); + + }*/ + + RARCH_LOG ("Found %d rooms\n", rooms); + for (i = 0; i < rooms; i++) + { + strlcpy(room_list[i].nickname, room_data->elems[(i+1)*0].data, sizeof(room_list[i].nickname)); + strlcpy(room_list[i].address, room_data->elems[(i+1)*1].data, sizeof(room_list[i].address)); + room_list[i].port = atoi(room_data->elems[(i+1)*2].data); + strlcpy(room_list[i].corename, room_data->elems[(i+1)*3].data, sizeof(room_list[i].corename)); + strlcpy(room_list[i].coreversion, room_data->elems[(i+1)*4].data, sizeof(room_list[i].coreversion)); + strlcpy(room_list[i].gamename, room_data->elems[(i+1)*5].data, sizeof(room_list[i].coreversion)); + room_list[i].gamecrc = atoi(room_data->elems[(i+1)*6].data); + room_list[i].timestamp = atoi(room_data->elems[(i+1)*7].data); + RARCH_LOG("Room Data: \n" + "Nickname: %s\n" + "Address: %s\n" + "Port: %d\n" + "Core: %s\n" + "Core Version: %s\n" + "Game: %s\n" + "Game CRC: %d\n" + "Timestamp: %d\n", + room_list[i].nickname, + room_list[i].address, + room_list[i].port, + room_list[i].corename, + room_list[i].coreversion, + room_list[i].gamename, + room_list[i].gamecrc, + room_list[i].timestamp); + } + } + } + + if (err) + RARCH_ERR("%s: %s\n", msg_hash_to_str(MSG_DOWNLOAD_FAILED), err); + + if (data) + { + if (data->data) + free(data->data); + free(data); + } + + if (user_data) + free(user_data); + +} + +static int action_ok_push_netplay_refresh_rooms(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + char url [2048] = "http://lobby.libretro.com/registry.lpl"; + task_push_http_transfer(url, true, NULL, netplay_refresh_rooms_cb, NULL); + return 0; +} + + static int action_ok_scan_directory_list(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -3779,7 +3887,7 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, first_char = atoi(&str[0]); - if (first_char != (i+1)) + if (first_char != ((i+1))) continue; BIND_ACTION_OK(cbs, action_ok_push_user_binds_list); @@ -3992,6 +4100,9 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_SCAN_FILE: BIND_ACTION_OK(cbs, action_ok_push_scan_file); break; + case MENU_ENUM_LABEL_NETPLAY_REFRESH_ROOMS: + BIND_ACTION_OK(cbs, action_ok_push_netplay_refresh_rooms); + break; case MENU_ENUM_LABEL_FAVORITES: BIND_ACTION_OK(cbs, action_ok_push_content_list); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 8f6ee38771..9fc439adf2 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -2955,8 +2955,8 @@ static int menu_displaylist_parse_netplay_room_list( #ifdef HAVE_NETWORKING menu_entries_append_enum(info->list, "Refresh Room List", - msg_hash_to_str(MENU_ENUM_LABEL_SCAN_DIRECTORY), - MENU_ENUM_LABEL_SCAN_DIRECTORY, + msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_REFRESH_ROOMS), + MENU_ENUM_LABEL_NETPLAY_REFRESH_ROOMS, MENU_SETTING_ACTION, 0, 0); #endif diff --git a/msg_hash.h b/msg_hash.h index f3cd259221..1f1dfcc362 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -867,6 +867,7 @@ enum msg_hash_enums MENU_LABEL(SCAN_THIS_DIRECTORY), MENU_LABEL(SCAN_DIRECTORY), MENU_LABEL(SCAN_FILE), + MENU_LABEL(NETPLAY_REFRESH_ROOMS), MENU_LABEL(ADD_CONTENT_LIST), MENU_LABEL(CONFIGURATIONS_LIST),