From f2beb49fd8990d64ee57923e1896df10e81a117e Mon Sep 17 00:00:00 2001 From: radius Date: Mon, 16 Jan 2017 22:24:35 -0500 Subject: [PATCH 01/32] Announce netplay games to lobby.libretro.com --- network/netplay/netplay_frontend.c | 31 ++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index 89c5ab5535..e460d50209 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -28,6 +28,11 @@ #include "../../input/input_driver.h" #include "../../runloop.h" +#include "tasks/tasks_internal.h" +#include +#include "file_path_special.h" +#include "paths.h" + /* Only used before init_netplay */ static bool netplay_enabled = false; static bool netplay_is_client = false; @@ -827,6 +832,14 @@ void deinit_netplay(void) core_unset_netplay_callbacks(); } + + +static void netplay_announce(void *task_data, void *user_data, const char *error) +{ + RARCH_LOG("Announcing netplay game... \n"); + return; +} + /** * init_netplay * @direct_host : Host to connect to directly, if applicable (client only) @@ -881,6 +894,22 @@ bool init_netplay(void *direct_host, const char *server, unsigned port) runloop_msg_queue_push( msg_hash_to_str(MSG_WAITING_FOR_CLIENT), 0, 180, false); + + rarch_system_info_t *system = NULL; + + runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system); + char url [2048] = "http://lobby.libretro.com/?"; + char buf [2048]; + buf[0] = '\0'; + + snprintf(buf, sizeof(buf), "%susername=%s&corename=%s&coreversion=%s + &gamename=%s&gamecrc=%08x&port=%d", + url, settings->username, system->info.library_name, + system->info.library_version, + path_basename(path_get(RARCH_PATH_BASENAME)),0, + settings->netplay.port); + + task_push_http_transfer(buf, true, NULL, netplay_announce, NULL); } netplay_data = (netplay_t*)netplay_new( @@ -902,6 +931,8 @@ bool init_netplay(void *direct_host, const char *server, unsigned port) return false; } + + /** * netplay_driver_ctl * From ca2c2a8ce737a060305150de75eda0b7e2c53c9d Mon Sep 17 00:00:00 2001 From: radius Date: Wed, 18 Jan 2017 21:12:01 -0500 Subject: [PATCH 02/32] separate this --- network/netplay/netplay_frontend.c | 38 +++++++++++++++++------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index e460d50209..e21cc1edf3 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -834,12 +834,32 @@ void deinit_netplay(void) -static void netplay_announce(void *task_data, void *user_data, const char *error) +static void netplay_announce_cb(void *task_data, void *user_data, const char *error) { RARCH_LOG("Announcing netplay game... \n"); return; } +static void netplay_announce() +{ + rarch_system_info_t *system = NULL; + settings_t *settings = config_get_ptr(); + + runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system); + char url [2048] = "http://lobby.libretro.com/?"; + char buf [2048]; + buf[0] = '\0'; + + snprintf(buf, sizeof(buf), "%susername=%s&corename=%s&coreversion=%s&" + "gamename=%s&gamecrc=%08x&port=%d", + url, settings->username, system->info.library_name, + system->info.library_version, + path_basename(path_get(RARCH_PATH_BASENAME)),0, + settings->netplay.port); + + task_push_http_transfer(buf, true, NULL, netplay_announce_cb, NULL); +} + /** * init_netplay * @direct_host : Host to connect to directly, if applicable (client only) @@ -895,21 +915,7 @@ bool init_netplay(void *direct_host, const char *server, unsigned port) msg_hash_to_str(MSG_WAITING_FOR_CLIENT), 0, 180, false); - rarch_system_info_t *system = NULL; - - runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system); - char url [2048] = "http://lobby.libretro.com/?"; - char buf [2048]; - buf[0] = '\0'; - - snprintf(buf, sizeof(buf), "%susername=%s&corename=%s&coreversion=%s - &gamename=%s&gamecrc=%08x&port=%d", - url, settings->username, system->info.library_name, - system->info.library_version, - path_basename(path_get(RARCH_PATH_BASENAME)),0, - settings->netplay.port); - - task_push_http_transfer(buf, true, NULL, netplay_announce, NULL); + netplay_announce(); } netplay_data = (netplay_t*)netplay_new( From 72cdb390cb1dc6d6112793df98bd01ab48f414dc Mon Sep 17 00:00:00 2001 From: radius Date: Wed, 18 Jan 2017 21:31:02 -0500 Subject: [PATCH 03/32] reannounce roughly every minute --- network/netplay/netplay_frontend.c | 61 ++++++++++++++++-------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index e21cc1edf3..d8a9bc6b41 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -393,6 +393,34 @@ static int16_t netplay_input_state(netplay_t *netplay, } } +static int reannounce = 0; + +static void netplay_announce_cb(void *task_data, void *user_data, const char *error) +{ + RARCH_LOG("Announcing netplay game... \n"); + return; +} + +static void netplay_announce() +{ + rarch_system_info_t *system = NULL; + settings_t *settings = config_get_ptr(); + + runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system); + char url [2048] = "http://lobby.libretro.com/?"; + char buf [2048]; + buf[0] = '\0'; + + snprintf(buf, sizeof(buf), "%susername=%s&corename=%s&coreversion=%s&" + "gamename=%s&gamecrc=%08x&port=%d", + url, settings->username, system->info.library_name, + system->info.library_version, + path_basename(path_get(RARCH_PATH_BASENAME)),0, + settings->netplay.port); + + task_push_http_transfer(buf, true, NULL, netplay_announce_cb, NULL); +} + int16_t input_state_net(unsigned port, unsigned device, unsigned idx, unsigned id) { @@ -522,7 +550,10 @@ static void netplay_frontend_paused(netplay_t *netplay, bool paused) bool netplay_pre_frame(netplay_t *netplay) { bool sync_stalled; - + reannounce ++; + RARCH_LOG("%d\n", reannounce); + if (reannounce % 3600 == 0) + netplay_announce(); retro_assert(netplay); /* FIXME: This is an ugly way to learn we're not paused anymore */ @@ -832,34 +863,6 @@ void deinit_netplay(void) core_unset_netplay_callbacks(); } - - -static void netplay_announce_cb(void *task_data, void *user_data, const char *error) -{ - RARCH_LOG("Announcing netplay game... \n"); - return; -} - -static void netplay_announce() -{ - rarch_system_info_t *system = NULL; - settings_t *settings = config_get_ptr(); - - runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system); - char url [2048] = "http://lobby.libretro.com/?"; - char buf [2048]; - buf[0] = '\0'; - - snprintf(buf, sizeof(buf), "%susername=%s&corename=%s&coreversion=%s&" - "gamename=%s&gamecrc=%08x&port=%d", - url, settings->username, system->info.library_name, - system->info.library_version, - path_basename(path_get(RARCH_PATH_BASENAME)),0, - settings->netplay.port); - - task_push_http_transfer(buf, true, NULL, netplay_announce_cb, NULL); -} - /** * init_netplay * @direct_host : Host to connect to directly, if applicable (client only) From 95a2da81e4b43fd7edcf1eeceb15cac5a171238a Mon Sep 17 00:00:00 2001 From: radius Date: Wed, 18 Jan 2017 22:46:48 -0500 Subject: [PATCH 04/32] start adding ui elements to insert room list into --- intl/msg_hash_lbl.h | 2 ++ intl/msg_hash_us.h | 10 +++++--- menu/cbs/menu_cbs_left.c | 3 +++ menu/cbs/menu_cbs_right.c | 3 +++ menu/cbs/menu_cbs_title.c | 2 ++ menu/drivers/xmb.c | 33 +++++++++++++++++++++++-- menu/menu_displaylist.c | 39 ++++++++++++++++++++++++++---- menu/menu_displaylist.h | 1 + menu/menu_driver.h | 1 + msg_hash.h | 1 + network/netplay/netplay_frontend.c | 1 - 11 files changed, 85 insertions(+), 11 deletions(-) diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index b223e9fa33..e307a25cd5 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -14,6 +14,8 @@ MSG_HASH(MENU_ENUM_LABEL_CONFIGURATIONS_LIST, "configurations_list") MSG_HASH(MENU_ENUM_LABEL_ADD_TAB, "add_tab") +MSG_HASH(MENU_ENUM_LABEL_NETPLAY_TAB, + "netplay_tab") MSG_HASH(MENU_ENUM_LABEL_ARCHIVE_MODE, "archive_mode") MSG_HASH(MENU_ENUM_LABEL_ASSETS_DIRECTORY, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 4301bdd150..ffcfb615bf 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -199,6 +199,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_ADD_TAB, "Import content" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_TAB, + "Netplay Rooms" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ARCHIVE_MODE, "Archive File Association Action" @@ -967,13 +971,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_CLIENT_SWAP_INPUT, MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_DELAY_FRAMES, "Netplay Delay Frames") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_DISCONNECT, - "Disconnect") + "Disconnect from netplay host") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE, "Netplay Enable") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_CLIENT, - "Connect to Netplay host") + "Connect to netplay host") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_HOST, - "Start hosting") + "Start netplay host") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_IP_ADDRESS, "Server Address") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_LAN_SCAN_SETTINGS, diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index 3a139c101b..dc8b6e1e3f 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -487,6 +487,7 @@ static int menu_cbs_init_bind_left_compare_label(menu_file_list_cbs_t *cbs, string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_HISTORY_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_ADD_TAB)) || + string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_MUSIC_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_IMAGES_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_TAB)) || @@ -586,6 +587,7 @@ static int menu_cbs_init_bind_left_compare_type(menu_file_list_cbs_t *cbs, if ( string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_HISTORY_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_ADD_TAB)) || + string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_MUSIC_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_IMAGES_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_TAB)) || @@ -625,6 +627,7 @@ int menu_cbs_init_bind_left(menu_file_list_cbs_t *cbs, if ( string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_HISTORY_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_ADD_TAB)) || + string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_MAIN_MENU)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_MUSIC_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_IMAGES_TAB)) || diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index 92f2d02912..c313ff1271 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -474,6 +474,7 @@ static int menu_cbs_init_bind_right_compare_type(menu_file_list_cbs_t *cbs, if ( string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_HISTORY_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_ADD_TAB)) || + string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_MUSIC_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_IMAGES_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_TAB)) || @@ -594,6 +595,7 @@ static int menu_cbs_init_bind_right_compare_label(menu_file_list_cbs_t *cbs, if ( string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_HISTORY_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_ADD_TAB)) || + string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_MUSIC_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_IMAGES_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_TAB)) || @@ -632,6 +634,7 @@ int menu_cbs_init_bind_right(menu_file_list_cbs_t *cbs, if ( string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_HISTORY_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_ADD_TAB)) || + string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_MAIN_MENU)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_MUSIC_TAB)) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_IMAGES_TAB)) || diff --git a/menu/cbs/menu_cbs_title.c b/menu/cbs/menu_cbs_title.c index 89710e9c5c..0c1cc995df 100644 --- a/menu/cbs/menu_cbs_title.c +++ b/menu/cbs/menu_cbs_title.c @@ -257,6 +257,8 @@ static int action_get_title_group_settings(const char *path, const char *label, strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB), len); else if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_ADD_TAB))) strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_TAB), len); + else if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_TAB))) + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_TAB), len); else if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_HORIZONTAL_MENU))) strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_HORIZONTAL_MENU), len); else diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 2a436e6fbd..88d0327bc1 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -96,6 +96,9 @@ enum XMB_TEXTURE_MUSICS, XMB_TEXTURE_MOVIES, #endif +#ifdef HAVE_NETWORKING + XMB_TEXTURE_NETPLAY, +#endif #ifdef HAVE_IMAGEVIEWER XMB_TEXTURE_IMAGES, #endif @@ -151,10 +154,15 @@ enum #ifdef HAVE_IMAGEVIEWER XMB_SYSTEM_TAB_IMAGES, #endif - XMB_SYSTEM_TAB_ADD + XMB_SYSTEM_TAB_ADD, +#ifdef HAVE_NETWORKING + XMB_SYSTEM_TAB_NETPLAY +#endif }; -#ifdef HAVE_LIBRETRODB +#ifdef HAVE_NETWORKING +#define XMB_SYSTEM_TAB_END XMB_SYSTEM_TAB_NETPLAY +#elif defined(HAVE_LIBRETRODB) #define XMB_SYSTEM_TAB_END XMB_SYSTEM_TAB_ADD #elif defined(HAVE_IMAGEVIEWER) #define XMB_SYSTEM_TAB_END XMB_SYSTEM_TAB_IMAGES @@ -164,6 +172,7 @@ enum #define XMB_SYSTEM_TAB_END XMB_SYSTEM_TAB_HISTORY #endif + typedef struct xmb_handle { file_list_t *menu_stack_old; @@ -300,6 +309,7 @@ typedef struct xmb_handle xmb_node_t settings_tab_node; xmb_node_t history_tab_node; xmb_node_t add_tab_node; + xmb_node_t netplay_tab_node; font_data_t *font; font_data_t *font2; @@ -1466,6 +1476,8 @@ static xmb_node_t* xmb_get_node(xmb_handle_t *xmb, unsigned i) return &xmb->history_tab_node; case XMB_SYSTEM_TAB_ADD: return &xmb->add_tab_node; + case XMB_SYSTEM_TAB_NETPLAY: + return &xmb->netplay_tab_node; default: if (i > xmb->system_tab_end) return xmb_get_userdata_from_horizontal_list( @@ -3249,6 +3261,9 @@ static void *xmb_init(void **userdata) if (settings->menu.xmb.show_add) xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_ADD; #endif +#ifdef HAVE_NETWORKING + xmb->tabs[++xmb->system_tab_end] = XMB_SYSTEM_TAB_NETPLAY; +#endif menu_driver_ctl(RARCH_MENU_CTL_UNSET_PREVENT_POPULATE, NULL); @@ -3464,6 +3479,8 @@ static const char *xmb_texture_path(unsigned id) return "off.png"; case XMB_TEXTURE_ADD: return "add.png"; + case XMB_TEXTURE_NETPLAY: + return "wifi.png"; case XMB_TEXTURE_KEY: return "key.png"; case XMB_TEXTURE_KEY_HOVER: @@ -3514,6 +3531,12 @@ static void xmb_context_reset_textures( xmb->add_tab_node.icon = xmb->textures.list[XMB_TEXTURE_ADD]; xmb->add_tab_node.alpha = xmb->categories.active.alpha; xmb->add_tab_node.zoom = xmb->categories.active.zoom; + +#ifdef HAVE_NETWORKING + xmb->netplay_tab_node.icon = xmb->textures.list[XMB_TEXTURE_NETPLAY]; + xmb->netplay_tab_node.alpha = xmb->categories.active.alpha; + xmb->netplay_tab_node.zoom = xmb->categories.active.zoom; +#endif } static void xmb_context_reset_background(const char *iconpath) @@ -3826,6 +3849,12 @@ static void xmb_list_cache(void *data, enum menu_list_type type, unsigned action menu_stack->list[stack_size - 1].type = MENU_ADD_TAB; break; + case XMB_SYSTEM_TAB_NETPLAY: + menu_stack->list[stack_size - 1].label = + strdup(msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_TAB)); + menu_stack->list[stack_size - 1].type = + MENU_NETPLAY_TAB; + break; default: menu_stack->list[stack_size - 1].label = strdup(msg_hash_to_str(MENU_ENUM_LABEL_HORIZONTAL_MENU)); diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 84f802422e..8f6ee38771 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -244,11 +244,6 @@ static int menu_displaylist_parse_netplay( MENU_ENUM_LABEL_NETPLAY_DISCONNECT, MENU_SETTING_ACTION, 0, 0); - menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_SETTINGS), - msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_SETTINGS), - MENU_ENUM_LABEL_NETWORK_SETTINGS, MENU_SETTING_GROUP, 0, 0); - menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_LAN_SCAN_SETTINGS), msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_LAN_SCAN_SETTINGS), @@ -2697,6 +2692,11 @@ static int menu_displaylist_parse_load_content_settings( MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS, MENU_SETTING_ACTION, 0, 0); +#ifdef HAVE_NETWORKING + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_NETPLAY, + PARSE_ACTION, false); +#endif menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_CHEAT_OPTIONS), @@ -2930,6 +2930,7 @@ static int menu_displaylist_parse_add_content_list( static int menu_displaylist_parse_scan_directory_list( menu_displaylist_info_t *info) { + #ifdef HAVE_LIBRETRODB menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), @@ -2947,6 +2948,21 @@ static int menu_displaylist_parse_scan_directory_list( return 0; } +static int menu_displaylist_parse_netplay_room_list( + menu_displaylist_info_t *info) +{ + +#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, + MENU_SETTING_ACTION, 0, 0); +#endif + + return 0; +} + static int menu_displaylist_parse_options( menu_displaylist_info_t *info) { @@ -3781,6 +3797,12 @@ static bool menu_displaylist_push_internal( return false; return true; } + else if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_TAB))) + { + if (!menu_displaylist_ctl(DISPLAYLIST_NETPLAY_ROOM_LIST, info)) + return false; + return true; + } else if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_HORIZONTAL_MENU))) { if (!menu_displaylist_ctl(DISPLAYLIST_HORIZONTAL, info)) @@ -3909,6 +3931,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) case DISPLAYLIST_ADD_CONTENT_LIST: case DISPLAYLIST_CONFIGURATIONS_LIST: case DISPLAYLIST_SCAN_DIRECTORY_LIST: + case DISPLAYLIST_NETPLAY_ROOM_LIST: case DISPLAYLIST_LOAD_CONTENT_LIST: case DISPLAYLIST_USER_BINDS_LIST: case DISPLAYLIST_ACCOUNTS_LIST: @@ -5312,6 +5335,12 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) case DISPLAYLIST_SCAN_DIRECTORY_LIST: ret = menu_displaylist_parse_scan_directory_list(info); + info->need_push = true; + info->need_refresh = true; + break; + case DISPLAYLIST_NETPLAY_ROOM_LIST: + ret = menu_displaylist_parse_netplay_room_list(info); + info->need_push = true; info->need_refresh = true; break; diff --git a/menu/menu_displaylist.h b/menu/menu_displaylist.h index 5e63c5f768..c7156ec55d 100644 --- a/menu/menu_displaylist.h +++ b/menu/menu_displaylist.h @@ -151,6 +151,7 @@ enum menu_displaylist_ctl_state DISPLAYLIST_ADD_CONTENT_LIST, DISPLAYLIST_CONFIGURATIONS_LIST, DISPLAYLIST_SCAN_DIRECTORY_LIST, + DISPLAYLIST_NETPLAY_ROOM_LIST, DISPLAYLIST_ARCHIVE_ACTION, DISPLAYLIST_ARCHIVE_ACTION_DETECT_CORE, DISPLAYLIST_CORE_CONTENT, diff --git a/menu/menu_driver.h b/menu/menu_driver.h index e097fd6a06..3429cac4f6 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -158,6 +158,7 @@ enum menu_settings_type MENU_MUSIC_TAB, MENU_VIDEO_TAB, MENU_IMAGES_TAB, + MENU_NETPLAY_TAB, MENU_ADD_TAB, MENU_PLAYLISTS_TAB, MENU_SETTING_NO_ITEM, diff --git a/msg_hash.h b/msg_hash.h index 863c19246d..f3cd259221 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1146,6 +1146,7 @@ enum msg_hash_enums MENU_LABEL(SETTINGS_TAB), MENU_LABEL(HISTORY_TAB), MENU_LABEL(ADD_TAB), + MENU_LABEL(NETPLAY_TAB), MENU_LABEL(PLAYLISTS_TAB), MENU_LABEL(MAIN_MENU), MENU_LABEL(INPUT_SETTINGS), diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index d8a9bc6b41..1181c0eaab 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -551,7 +551,6 @@ bool netplay_pre_frame(netplay_t *netplay) { bool sync_stalled; reannounce ++; - RARCH_LOG("%d\n", reannounce); if (reannounce % 3600 == 0) netplay_announce(); retro_assert(netplay); From 7c833074bb9943673ba613e38f06e7ca2085942c Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 19 Jan 2017 00:52:53 -0500 Subject: [PATCH 05/32] parsing now works --- file_path_special.h | 1 + file_path_str.c | 2 + intl/msg_hash_lbl.h | 2 + menu/cbs/menu_cbs_ok.c | 113 +++++++++++++++++++++++++++++++++++++++- menu/menu_displaylist.c | 4 +- msg_hash.h | 1 + 6 files changed, 120 insertions(+), 3 deletions(-) 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), From 9e1f267ab275ab97e3d50f9acbf59d7ab7653b5d Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 19 Jan 2017 02:05:33 -0500 Subject: [PATCH 06/32] fix listing --- menu/cbs/menu_cbs_ok.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index d0741abab1..c7ba6f80af 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3304,7 +3304,7 @@ finish: RARCH_LOG("Room list empty\n"); else { - int rooms, i = 0; + int rooms, i, j = 0; char tmp[PATH_MAX_LENGTH]; struct string_list *room_data = NULL; room_data = string_split(buf, "\n"); @@ -3324,14 +3324,14 @@ finish: 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); + strlcpy(room_list[i].nickname, room_data->elems[j+0].data, sizeof(room_list[i].nickname)); + strlcpy(room_list[i].address, room_data->elems[j+1].data, sizeof(room_list[i].address)); + room_list[i].port = atoi(room_data->elems[j+2].data); + strlcpy(room_list[i].corename, room_data->elems[j+3].data, sizeof(room_list[i].corename)); + strlcpy(room_list[i].coreversion, room_data->elems[j+4].data, sizeof(room_list[i].coreversion)); + strlcpy(room_list[i].gamename, room_data->elems[j+5].data, sizeof(room_list[i].coreversion)); + room_list[i].gamecrc = atoi(room_data->elems[j+6].data); + room_list[i].timestamp = atoi(room_data->elems[j+7].data); RARCH_LOG("Room Data: \n" "Nickname: %s\n" "Address: %s\n" @@ -3349,6 +3349,7 @@ finish: room_list[i].gamename, room_list[i].gamecrc, room_list[i].timestamp); + j+=8; } } } From 9237752d915f3ffdff5b6e777dc7bf2edef16ca2 Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 19 Jan 2017 02:09:09 -0500 Subject: [PATCH 07/32] styling --- menu/cbs/menu_cbs_ok.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index c7ba6f80af..7026b04a64 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3262,6 +3262,8 @@ static int action_ok_push_content_list(const char *path, entry_idx, ACTION_OK_DL_CONTENT_LIST); } +/* data is ordered like this on the server, I left it in this ordered + for reference */ struct room { char nickname [PATH_MAX_LENGTH]; @@ -3324,14 +3326,15 @@ finish: RARCH_LOG ("Found %d rooms\n", rooms); for (i = 0; i < rooms; i++) { - strlcpy(room_list[i].nickname, room_data->elems[j+0].data, sizeof(room_list[i].nickname)); - strlcpy(room_list[i].address, room_data->elems[j+1].data, sizeof(room_list[i].address)); - room_list[i].port = atoi(room_data->elems[j+2].data); - strlcpy(room_list[i].corename, room_data->elems[j+3].data, sizeof(room_list[i].corename)); - strlcpy(room_list[i].coreversion, room_data->elems[j+4].data, sizeof(room_list[i].coreversion)); - strlcpy(room_list[i].gamename, room_data->elems[j+5].data, sizeof(room_list[i].coreversion)); - room_list[i].gamecrc = atoi(room_data->elems[j+6].data); - room_list[i].timestamp = atoi(room_data->elems[j+7].data); + strlcpy(room_list[i].nickname, room_data->elems[j + 0].data, sizeof(room_list[i].nickname)); + strlcpy(room_list[i].address, room_data->elems[j + 1].data, sizeof(room_list[i].address)); + strlcpy(room_list[i].corename, room_data->elems[j + 3].data, sizeof(room_list[i].corename)); + strlcpy(room_list[i].coreversion, room_data->elems[j + 4].data, sizeof(room_list[i].coreversion)); + strlcpy(room_list[i].gamename, room_data->elems[j + 5].data, sizeof(room_list[i].coreversion)); + room_list[i].port = atoi(room_data->elems[j + 2].data); + room_list[i].gamecrc = atoi(room_data->elems[j + 6].data); + room_list[i].timestamp = atoi(room_data->elems[j + 7].data); + RARCH_LOG("Room Data: \n" "Nickname: %s\n" "Address: %s\n" From 3dd6c91493aae16d16fea312e127703777ed011e Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 19 Jan 2017 08:56:56 -0500 Subject: [PATCH 08/32] start populating the list --- menu/cbs/menu_cbs_ok.c | 63 +++++++++++++---------------- menu/menu_displaylist.c | 16 ++++++++ network/netplay/netplay_discovery.h | 19 +++++++++ 3 files changed, 62 insertions(+), 36 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 7026b04a64..5de72e1ca1 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3262,19 +3262,7 @@ static int action_ok_push_content_list(const char *path, entry_idx, ACTION_OK_DL_CONTENT_LIST); } -/* data is ordered like this on the server, I left it in this ordered - for reference */ -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) @@ -3303,17 +3291,20 @@ finish: if (!err && !strstr(buf, file_path_str(FILE_PATH_NETPLAY_ROOM_LIST_URL))) { if (string_is_empty(buf)) + { + netplay_room_count = 0; RARCH_LOG("Room list empty\n"); + } else { - int rooms, i, j = 0; + int i, j = 0; char tmp[PATH_MAX_LENGTH]; - struct string_list *room_data = NULL; + static 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); + netplay_room_count = room_data->size / 8; + netplay_room_list = (struct netplay_room*)malloc(sizeof(struct netplay_room) * netplay_room_count); /*for (int i = 0; i < room_data->size; i++) { @@ -3323,17 +3314,17 @@ finish: }*/ - RARCH_LOG ("Found %d rooms\n", rooms); - for (i = 0; i < rooms; i++) + RARCH_LOG ("Found %d rooms\n", netplay_room_count); + for (i = 0; i < netplay_room_count; i++) { - strlcpy(room_list[i].nickname, room_data->elems[j + 0].data, sizeof(room_list[i].nickname)); - strlcpy(room_list[i].address, room_data->elems[j + 1].data, sizeof(room_list[i].address)); - strlcpy(room_list[i].corename, room_data->elems[j + 3].data, sizeof(room_list[i].corename)); - strlcpy(room_list[i].coreversion, room_data->elems[j + 4].data, sizeof(room_list[i].coreversion)); - strlcpy(room_list[i].gamename, room_data->elems[j + 5].data, sizeof(room_list[i].coreversion)); - room_list[i].port = atoi(room_data->elems[j + 2].data); - room_list[i].gamecrc = atoi(room_data->elems[j + 6].data); - room_list[i].timestamp = atoi(room_data->elems[j + 7].data); + strlcpy(netplay_room_list[i].nickname, room_data->elems[j + 0].data, sizeof(netplay_room_list[i].nickname)); + strlcpy(netplay_room_list[i].address, room_data->elems[j + 1].data, sizeof(netplay_room_list[i].address)); + strlcpy(netplay_room_list[i].corename, room_data->elems[j + 3].data, sizeof(netplay_room_list[i].corename)); + strlcpy(netplay_room_list[i].coreversion, room_data->elems[j + 4].data, sizeof(netplay_room_list[i].coreversion)); + strlcpy(netplay_room_list[i].gamename, room_data->elems[j + 5].data, sizeof(netplay_room_list[i].coreversion)); + netplay_room_list[i].port = atoi(room_data->elems[j + 2].data); + netplay_room_list[i].gamecrc = atoi(room_data->elems[j + 6].data); + netplay_room_list[i].timestamp = atoi(room_data->elems[j + 7].data); RARCH_LOG("Room Data: \n" "Nickname: %s\n" @@ -3344,14 +3335,14 @@ finish: "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); + netplay_room_list[i].nickname, + netplay_room_list[i].address, + netplay_room_list[i].port, + netplay_room_list[i].corename, + netplay_room_list[i].coreversion, + netplay_room_list[i].gamename, + netplay_room_list[i].gamecrc, + netplay_room_list[i].timestamp); j+=8; } } diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 9fc439adf2..9e2eb89e59 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -2958,6 +2958,22 @@ static int menu_displaylist_parse_netplay_room_list( msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_REFRESH_ROOMS), MENU_ENUM_LABEL_NETPLAY_REFRESH_ROOMS, MENU_SETTING_ACTION, 0, 0); + + if (netplay_room_count > 0) + { + unsigned i; + for (i = 0; i < netplay_room_count; i++) + { + char s[PATH_MAX_LENGTH]; + snprintf(s, sizeof(s), "Nickname: %s", netplay_room_list[i].nickname); + const char *label = s; + menu_entries_append_enum(info->list, + label, + msg_hash_to_str(MENU_ENUM_LABEL_CONNECT_WIFI), + MENU_ENUM_LABEL_CONNECT_WIFI, + MENU_WIFI, 0, 0); + } + } #endif return 0; diff --git a/network/netplay/netplay_discovery.h b/network/netplay/netplay_discovery.h index f0b7358c78..9548b88cb9 100644 --- a/network/netplay/netplay_discovery.h +++ b/network/netplay/netplay_discovery.h @@ -18,6 +18,7 @@ #define __RARCH_NETPLAY_DISCOVERY_H #include +#include #define NETPLAY_HOST_STR_LEN 32 @@ -44,6 +45,24 @@ struct netplay_host_list { size_t size; }; +/* data is ordered like this on the server, I left it in this ordered + for reference */ +struct netplay_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; +}; + +struct netplay_room *netplay_room_list; + +int netplay_room_count; + /** Initialize Netplay discovery */ bool init_netplay_discovery(void); From 702f0cd95de82a7197c4b170967e7aac0895b1c4 Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 19 Jan 2017 09:16:37 -0500 Subject: [PATCH 09/32] add entries to the list --- menu/cbs/menu_cbs_ok.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 5de72e1ca1..cff20c87b4 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3300,6 +3300,9 @@ finish: int i, j = 0; char tmp[PATH_MAX_LENGTH]; static struct string_list *room_data = NULL; + file_list_t *file_list = NULL; + file_list = menu_entries_get_selection_buf_ptr(0); + menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, file_list); room_data = string_split(buf, "\n"); @@ -3313,6 +3316,11 @@ finish: RARCH_LOG("tmp %s\n", tmp); }*/ + menu_entries_append_enum(file_list, + "Refresh Room List", + msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_REFRESH_ROOMS), + MENU_ENUM_LABEL_NETPLAY_REFRESH_ROOMS, + MENU_SETTING_ACTION, 0, 0); RARCH_LOG ("Found %d rooms\n", netplay_room_count); for (i = 0; i < netplay_room_count; i++) @@ -3344,6 +3352,14 @@ finish: netplay_room_list[i].gamecrc, netplay_room_list[i].timestamp); j+=8; + char s[PATH_MAX_LENGTH]; + snprintf(s, sizeof(s), "Nickname: %s", netplay_room_list[i].nickname); + menu_entries_append_enum(file_list, + s, + msg_hash_to_str(MENU_ENUM_LABEL_CONNECT_WIFI), + MENU_ENUM_LABEL_CONNECT_WIFI, + MENU_WIFI, 0, 0); + } } } From d2e09622c86712ec8ebb78e45255f2f1c390e7cd Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 19 Jan 2017 09:31:01 -0500 Subject: [PATCH 10/32] add own labels --- intl/msg_hash_lbl.h | 2 ++ menu/cbs/menu_cbs_ok.c | 4 ++-- menu/menu_displaylist.c | 4 ++-- msg_hash.h | 1 + 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index b90ab38ac9..412e0148e3 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -157,6 +157,8 @@ MSG_HASH(MENU_ENUM_LABEL_CONFIG_SAVE_ON_EXIT, "config_save_on_exit") MSG_HASH(MENU_ENUM_LABEL_CONNECT_WIFI, "connect_wifi") +MSG_HASH(MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM, + "connect_room") MSG_HASH(MENU_ENUM_LABEL_CONTENT_ACTIONS, "content_actions") MSG_HASH(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST, diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index cff20c87b4..7cd975c3e1 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3356,8 +3356,8 @@ finish: snprintf(s, sizeof(s), "Nickname: %s", netplay_room_list[i].nickname); menu_entries_append_enum(file_list, s, - msg_hash_to_str(MENU_ENUM_LABEL_CONNECT_WIFI), - MENU_ENUM_LABEL_CONNECT_WIFI, + msg_hash_to_str(MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM), + MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM, MENU_WIFI, 0, 0); } diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 9e2eb89e59..145c6b9cac 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -2969,8 +2969,8 @@ static int menu_displaylist_parse_netplay_room_list( const char *label = s; menu_entries_append_enum(info->list, label, - msg_hash_to_str(MENU_ENUM_LABEL_CONNECT_WIFI), - MENU_ENUM_LABEL_CONNECT_WIFI, + msg_hash_to_str(MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM), + MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM, MENU_WIFI, 0, 0); } } diff --git a/msg_hash.h b/msg_hash.h index 1f1dfcc362..dffb8238ff 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -746,6 +746,7 @@ enum msg_hash_enums MENU_LABEL(NETPLAY_LAN_SCAN_SETTINGS), MENU_ENUM_LABEL_CONNECT_WIFI, + MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM, MENU_ENUM_LABEL_CONNECT_NETPLAY_LAN, MENU_LABEL(MENU_ENUM_LINEAR_FILTER), From bde244645e35e12b71b68cfd3526f4f2a152dc01 Mon Sep 17 00:00:00 2001 From: fr500 Date: Thu, 19 Jan 2017 17:01:50 -0500 Subject: [PATCH 11/32] switch to the new sqlite backend instead of a plain text file --- menu/cbs/menu_cbs_ok.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 7cd975c3e1..0a61d3fc03 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3382,7 +3382,7 @@ finish: 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"; + char url [2048] = "http://lobby.libretro.com/"; task_push_http_transfer(url, true, NULL, netplay_refresh_rooms_cb, NULL); return 0; } From b8f7d69923583f720fd798f5c9e05c406e53fe6e Mon Sep 17 00:00:00 2001 From: fr500 Date: Thu, 19 Jan 2017 18:11:02 -0500 Subject: [PATCH 12/32] add sublabels --- menu/cbs/menu_cbs_sublabel.c | 24 ++++++++++++++++++++++++ menu/menu_driver.h | 1 + 2 files changed, 25 insertions(+) diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 4544e51cfe..b4b22f1c7d 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -21,6 +21,7 @@ #ifdef HAVE_CHEEVOS #include "../../cheevos.h" #endif +#include "../../verbosity.h" #ifndef BIND_ACTION_SUBLABEL #define BIND_ACTION_SUBLABEL(cbs, name) \ @@ -28,6 +29,11 @@ cbs->action_sublabel_ident = #name; #endif +#ifdef HAVE_NETWORKING +#include "../../network/netplay/netplay.h" +#include "../../network/netplay/netplay_discovery.h" +#endif + #define default_sublabel_macro(func_name, lbl) \ static int (func_name)(file_list_t *list, unsigned type, unsigned i, const char *label, const char *path, char *s, size_t len) \ { \ @@ -117,6 +123,8 @@ default_sublabel_macro(action_bind_sublabel_content_history_size, MENU_ default_sublabel_macro(action_bind_sublabel_menu_input_unified_controls, MENU_ENUM_SUBLABEL_INPUT_UNIFIED_MENU_CONTROLS) default_sublabel_macro(action_bind_sublabel_onscreen_notifications_enable, MENU_ENUM_SUBLABEL_VIDEO_FONT_ENABLE) +/* MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM*/ + static int action_bind_sublabel_cheevos_entry( file_list_t *list, unsigned type, unsigned i, @@ -136,6 +144,19 @@ static int action_bind_sublabel_cheevos_entry( return 0; } +static int action_bind_sublabel_netplay_room( + file_list_t *list, + unsigned type, unsigned i, + const char *label, const char *path, + char *s, size_t len) +{ + if (i < 1) + return 0; + + strlcpy(s, netplay_room_list[i - 1].corename, len); + return 0; +} + static int action_bind_sublabel_generic( file_list_t *list, unsigned type, unsigned i, @@ -233,6 +254,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_entry); break; + case MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_netplay_room); + break; case MENU_ENUM_LABEL_CHEEVOS_ENABLE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_enable); break; diff --git a/menu/menu_driver.h b/menu/menu_driver.h index 3429cac4f6..15edc1e702 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -50,6 +50,7 @@ RETRO_BEGIN_DECLS #define MENU_SETTINGS_CORE_OPTION_START 0x10000 #define MENU_SETTINGS_PLAYLIST_ASSOCIATION_START 0x20000 #define MENU_SETTINGS_CHEEVOS_START 0x40000 +#define MENU_SETTINGS_NETPLAY_ROOMS_START 0x80000 enum menu_image_type { From 90f0dc994258cd85fcc78f9b00dfa4b81a961bac Mon Sep 17 00:00:00 2001 From: fr500 Date: Thu, 19 Jan 2017 18:14:33 -0500 Subject: [PATCH 13/32] add more info --- menu/cbs/menu_cbs_sublabel.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index b4b22f1c7d..6486ca9809 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -153,7 +153,9 @@ static int action_bind_sublabel_netplay_room( if (i < 1) return 0; - strlcpy(s, netplay_room_list[i - 1].corename, len); + snprintf(s,len, "%s - %s\n%s", netplay_room_list[i - 1].corename, + netplay_room_list[i - 1].coreversion, netplay_room_list[i - 1].gamename); + //strlcpy(s, netplay_room_list[i - 1].corename, len); return 0; } From f979ff58a7bfb1957ccd7514188e1843d7d19c3a Mon Sep 17 00:00:00 2001 From: fr500 Date: Thu, 19 Jan 2017 20:39:05 -0500 Subject: [PATCH 14/32] clean this up a bit --- menu/cbs/menu_cbs_sublabel.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 6486ca9809..352a801e70 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -153,9 +153,9 @@ static int action_bind_sublabel_netplay_room( if (i < 1) return 0; - snprintf(s,len, "%s - %s\n%s", netplay_room_list[i - 1].corename, - netplay_room_list[i - 1].coreversion, netplay_room_list[i - 1].gamename); - //strlcpy(s, netplay_room_list[i - 1].corename, len); + snprintf(s,len, "Core:%s %s\nGame: %s", + netplay_room_list[i - 1].corename, netplay_room_list[i - 1].coreversion, + netplay_room_list[i - 1].gamename); return 0; } From 930cde21a24c20167a2ea94da9282bd0a20c4c37 Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 19 Jan 2017 21:43:46 -0500 Subject: [PATCH 15/32] crc is announced now (for cores that don't have needs_fullpath set) --- menu/cbs/menu_cbs_ok.c | 4 ++-- menu/cbs/menu_cbs_sublabel.c | 5 +++-- network/netplay/netplay_frontend.c | 6 ++++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 0a61d3fc03..9cb41d26ff 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3334,7 +3334,7 @@ finish: netplay_room_list[i].gamecrc = atoi(room_data->elems[j + 6].data); netplay_room_list[i].timestamp = atoi(room_data->elems[j + 7].data); - RARCH_LOG("Room Data: \n" + RARCH_LOG("Room Data: %d\n" "Nickname: %s\n" "Address: %s\n" "Port: %d\n" @@ -3342,7 +3342,7 @@ finish: "Core Version: %s\n" "Game: %s\n" "Game CRC: %d\n" - "Timestamp: %d\n", + "Timestamp: %d\n", room_data->elems[j + 6].data, netplay_room_list[i].nickname, netplay_room_list[i].address, netplay_room_list[i].port, diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 6486ca9809..ff86e30ce9 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -153,8 +153,9 @@ static int action_bind_sublabel_netplay_room( if (i < 1) return 0; - snprintf(s,len, "%s - %s\n%s", netplay_room_list[i - 1].corename, - netplay_room_list[i - 1].coreversion, netplay_room_list[i - 1].gamename); + snprintf(s,len, "%s (%s)\n%s (%08x)", + netplay_room_list[i - 1].corename, netplay_room_list[i - 1].coreversion, + netplay_room_list[i - 1].gamename, netplay_room_list[i - 1].gamecrc); //strlcpy(s, netplay_room_list[i - 1].corename, len); return 0; } diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index 1181c0eaab..dca6133334 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -405,6 +405,8 @@ static void netplay_announce() { rarch_system_info_t *system = NULL; settings_t *settings = config_get_ptr(); + uint32_t *content_crc_ptr = NULL; + content_get_crc(&content_crc_ptr); runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system); char url [2048] = "http://lobby.libretro.com/?"; @@ -412,10 +414,10 @@ static void netplay_announce() buf[0] = '\0'; snprintf(buf, sizeof(buf), "%susername=%s&corename=%s&coreversion=%s&" - "gamename=%s&gamecrc=%08x&port=%d", + "gamename=%s&gamecrc=%d&port=%d", url, settings->username, system->info.library_name, system->info.library_version, - path_basename(path_get(RARCH_PATH_BASENAME)),0, + path_basename(path_get(RARCH_PATH_BASENAME)),*content_crc_ptr, settings->netplay.port); task_push_http_transfer(buf, true, NULL, netplay_announce_cb, NULL); From 8a1fb24fe98c3a228e91fa8950f6ee13ad950040 Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 19 Jan 2017 23:21:22 -0500 Subject: [PATCH 16/32] update url --- menu/cbs/menu_cbs_ok.c | 2 +- network/netplay/netplay_frontend.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 9cb41d26ff..d4c74f44b1 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3382,7 +3382,7 @@ finish: 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/"; + char url [2048] = "http://lobby.libretro.com/raw/"; task_push_http_transfer(url, true, NULL, netplay_refresh_rooms_cb, NULL); return 0; } diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index dca6133334..715fec24bf 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -409,7 +409,7 @@ static void netplay_announce() content_get_crc(&content_crc_ptr); runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system); - char url [2048] = "http://lobby.libretro.com/?"; + char url [2048] = "http://lobby.libretro.com/raw/?"; char buf [2048]; buf[0] = '\0'; From 8d25b2b0a33bbf2c209d13a232bf9925393467d7 Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 19 Jan 2017 23:44:10 -0500 Subject: [PATCH 17/32] add stub connection handler --- menu/cbs/menu_cbs_ok.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index d4c74f44b1..8e68d20457 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3115,6 +3115,12 @@ static int action_ok_netplay_lan_scan_list(const char *path, entry_idx, ACTION_OK_DL_NETPLAY_LAN_SCAN_SETTINGS_LIST); } +static int action_ok_netplay_connect_room(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + RARCH_LOG("Connect %s %d\n", netplay_room_list[idx - 1].address, netplay_room_list[idx - 1].port); + return 0; +} static int action_ok_lakka_services(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -4218,6 +4224,9 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_NETPLAY_LAN_SCAN_SETTINGS: BIND_ACTION_OK(cbs, action_ok_netplay_lan_scan_list); break; + case MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM: + BIND_ACTION_OK(cbs, action_ok_netplay_connect_room); + break; case MENU_ENUM_LABEL_LAKKA_SERVICES: BIND_ACTION_OK(cbs, action_ok_lakka_services); break; From b5357493adca45b04cac135250723e4dded4f378 Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 19 Jan 2017 23:53:45 -0500 Subject: [PATCH 18/32] log crc properly --- menu/cbs/menu_cbs_ok.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 8e68d20457..2b9883d19f 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3347,7 +3347,7 @@ finish: "Core: %s\n" "Core Version: %s\n" "Game: %s\n" - "Game CRC: %d\n" + "Game CRC: %08x\n" "Timestamp: %d\n", room_data->elems[j + 6].data, netplay_room_list[i].nickname, netplay_room_list[i].address, From dcca2f813111adb142025f83e951088a5461b44b Mon Sep 17 00:00:00 2001 From: radius Date: Fri, 20 Jan 2017 14:33:57 -0500 Subject: [PATCH 19/32] only announce if host --- network/netplay/netplay_frontend.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index 715fec24bf..7157f2375e 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -28,9 +28,9 @@ #include "../../input/input_driver.h" #include "../../runloop.h" -#include "tasks/tasks_internal.h" +#include "../../tasks/tasks_internal.h" #include -#include "file_path_special.h" +#include "../../file_path_special.h" #include "paths.h" /* Only used before init_netplay */ @@ -553,7 +553,7 @@ bool netplay_pre_frame(netplay_t *netplay) { bool sync_stalled; reannounce ++; - if (reannounce % 3600 == 0) + if (netplay->is_server && (reannounce % 3600 == 0)) netplay_announce(); retro_assert(netplay); From 0acf34dcdde856294a6ec4405d2da93e101b8895 Mon Sep 17 00:00:00 2001 From: radius Date: Fri, 20 Jan 2017 15:13:38 -0500 Subject: [PATCH 20/32] now we can connect (if the game is already loaded --- menu/cbs/menu_cbs_ok.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 2b9883d19f..367db662d8 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3118,9 +3118,36 @@ static int action_ok_netplay_lan_scan_list(const char *path, static int action_ok_netplay_connect_room(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { - RARCH_LOG("Connect %s %d\n", netplay_room_list[idx - 1].address, netplay_room_list[idx - 1].port); +#ifdef HAVE_NETWORKING + settings_t *settings = config_get_ptr(); + + if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) + command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + netplay_driver_ctl(RARCH_NETPLAY_CTL_ENABLE_CLIENT, NULL); + + /* If we haven't yet started, this will load on its own */ + if (!content_is_inited()) + { + runloop_msg_queue_push( + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_START_WHEN_LOADED), + 1, 480, true); + return 0; + } + + char tmp_hostname[512]; + strlcpy(tmp_hostname, "192.168.1.241", sizeof(tmp_hostname)); + + /* Enable Netplay itself */ + if (!command_event(CMD_EVENT_NETPLAY_INIT, (void *) tmp_hostname)) + return -1; + +#else + return -1; + +#endif return 0; } + static int action_ok_lakka_services(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { From 42dc8c7e1560a4227592eab37fb9c09ac2324086 Mon Sep 17 00:00:00 2001 From: radius Date: Fri, 20 Jan 2017 15:14:30 -0500 Subject: [PATCH 21/32] woops fix hardcoded address --- menu/cbs/menu_cbs_ok.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 367db662d8..10f126ddeb 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3135,7 +3135,7 @@ static int action_ok_netplay_connect_room(const char *path, } char tmp_hostname[512]; - strlcpy(tmp_hostname, "192.168.1.241", sizeof(tmp_hostname)); + strlcpy(tmp_hostname, netplay_room_list[idx - 1].address, sizeof(tmp_hostname)); /* Enable Netplay itself */ if (!command_event(CMD_EVENT_NETPLAY_INIT, (void *) tmp_hostname)) From 0de43b954edd6eb06d256e5b537c74841359d638 Mon Sep 17 00:00:00 2001 From: radius Date: Fri, 20 Jan 2017 16:04:10 -0500 Subject: [PATCH 22/32] can now connect when starting a game too --- command.c | 15 +++++++++++++++ command.h | 2 ++ menu/cbs/menu_cbs_ok.c | 24 ++++++++++++++++-------- network/netplay/netplay.h | 2 ++ network/netplay/netplay_frontend.c | 24 +++++++++++++++++++++++- 5 files changed, 58 insertions(+), 9 deletions(-) diff --git a/command.c b/command.c index c5ec6d3e7a..c40d703ea5 100644 --- a/command.c +++ b/command.c @@ -2441,6 +2441,20 @@ bool command_event(enum event_command cmd, void *data) } } break; + case CMD_EVENT_NETPLAY_INIT_DIRECT_DEFERRED: + { + char *hostname = (char *) data; + + settings_t *settings = config_get_ptr(); + command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + if (!init_netplay_deferred( + hostname, settings->netplay.port)) + { + command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + return false; + } + } + break; case CMD_EVENT_NETPLAY_FLIP_PLAYERS: netplay_driver_ctl(RARCH_NETPLAY_CTL_FLIP_PLAYERS, NULL); break; @@ -2453,6 +2467,7 @@ bool command_event(enum event_command cmd, void *data) case CMD_EVENT_NETWORK_INIT: case CMD_EVENT_NETPLAY_INIT: case CMD_EVENT_NETPLAY_INIT_DIRECT: + case CMD_EVENT_NETPLAY_INIT_DIRECT_DEFERRED: case CMD_EVENT_NETPLAY_FLIP_PLAYERS: case CMD_EVENT_NETPLAY_GAME_WATCH: return false; diff --git a/command.h b/command.h index 19d8009c86..f15b108388 100644 --- a/command.h +++ b/command.h @@ -171,6 +171,8 @@ enum event_command CMD_EVENT_NETPLAY_INIT, /* Initializes netplay system with a direct host specified. */ CMD_EVENT_NETPLAY_INIT_DIRECT, + /* Initializes netplay system with a direct host specified after loading content. */ + CMD_EVENT_NETPLAY_INIT_DIRECT_DEFERRED, /* Deinitializes netplay system. */ CMD_EVENT_NETPLAY_DEINIT, /* Flip netplay players. */ diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 10f126ddeb..cbfdbc6e6b 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3125,21 +3125,29 @@ static int action_ok_netplay_connect_room(const char *path, command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); netplay_driver_ctl(RARCH_NETPLAY_CTL_ENABLE_CLIENT, NULL); + char tmp_hostname[512]; + + /* For testing purposes + strlcpy(tmp_hostname, "192.168.1.241", sizeof(tmp_hostname));*/ + strlcpy(tmp_hostname, netplay_room_list[idx - 1].address, sizeof(tmp_hostname)); + /* If we haven't yet started, this will load on its own */ if (!content_is_inited()) { runloop_msg_queue_push( msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_START_WHEN_LOADED), 1, 480, true); - return 0; + /* Enable Netplay itself */ + + if (!command_event(CMD_EVENT_NETPLAY_INIT_DIRECT_DEFERRED, (void *) tmp_hostname)) + return -1; + } + else + { + /* Enable Netplay itself */ + if (!command_event(CMD_EVENT_NETPLAY_INIT, (void *) tmp_hostname)) + return -1; } - - char tmp_hostname[512]; - strlcpy(tmp_hostname, netplay_room_list[idx - 1].address, sizeof(tmp_hostname)); - - /* Enable Netplay itself */ - if (!command_event(CMD_EVENT_NETPLAY_INIT, (void *) tmp_hostname)) - return -1; #else return -1; diff --git a/network/netplay/netplay.h b/network/netplay/netplay.h index c7e27def05..5d285cb4d9 100644 --- a/network/netplay/netplay.h +++ b/network/netplay/netplay.h @@ -57,6 +57,8 @@ void audio_sample_net(int16_t left, int16_t right); size_t audio_sample_batch_net(const int16_t *data, size_t frames); +bool init_netplay_deferred(const char* server, unsigned port); + /** * init_netplay * @direct_host : Host to connect to directly, if applicable (client only) diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index 7157f2375e..619d7f3ca4 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "netplay_private.h" @@ -43,6 +44,11 @@ static netplay_t *netplay_data = NULL; /* Used to avoid recursive netplay calls */ static bool in_netplay = false; +/* Used for deferred netplay initialization */ +static bool netplay_client_deferred = false; +static char server_address_deferred[512] = ""; +static unsigned server_port_deferred = 0; + /** * netplay_is_alive: * @netplay : pointer to netplay object @@ -156,6 +162,22 @@ static bool get_self_input_state(netplay_t *netplay) return true; } +bool init_netplay_deferred(const char* server, unsigned port) +{ + + RARCH_LOG("deferred! %s\n", server); + if (!string_is_empty(server) && port != 0) + { + strlcpy(server_address_deferred, server, sizeof(server_address_deferred)); + server_port_deferred = port; + netplay_client_deferred = true; + } + else + netplay_client_deferred = false; + return netplay_client_deferred; +} + + /** * netplay_poll: * @netplay : pointer to netplay object @@ -924,7 +946,7 @@ bool init_netplay(void *direct_host, const char *server, unsigned port) netplay_data = (netplay_t*)netplay_new( netplay_is_client ? direct_host : NULL, - netplay_is_client ? server : NULL, + netplay_is_client ? (!netplay_client_deferred ? server : server_address_deferred) : NULL, port ? port : RARCH_DEFAULT_PORT, settings->netplay.stateless_mode, settings->netplay.check_frames, &cbs, settings->netplay.nat_traversal, settings->username, From 2dee8f77b6e17818ae6bf6393c6b94d3ff090fd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Andr=C3=A9=20Santoni?= Date: Sun, 22 Jan 2017 03:17:50 +0100 Subject: [PATCH 23/32] (Netplay) Add a task to find a game from its CRC --- Makefile.common | 3 +- griffin/griffin.c | 1 + tasks/task_netplay_crc.c | 136 +++++++++++++++++++++++++++++++++++++++ tasks/tasks_internal.h | 2 + 4 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 tasks/task_netplay_crc.c diff --git a/Makefile.common b/Makefile.common index e3e3d219ae..f1e460b8ab 100644 --- a/Makefile.common +++ b/Makefile.common @@ -1110,7 +1110,8 @@ ifeq ($(HAVE_NETWORKING), 1) network/net_http_special.o \ tasks/task_http.o \ tasks/task_netplay_lan_scan.o \ - tasks/task_wifi.o + tasks/task_wifi.o \ + tasks/task_netplay_crc.o ifneq ($(HAVE_SOCKET_LEGACY),1) OBJ += $(LIBRETRO_COMM_DIR)/net/net_ifinfo.o diff --git a/griffin/griffin.c b/griffin/griffin.c index 041d9b92c9..d4954defa8 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -900,6 +900,7 @@ NETPLAY #include "../tasks/task_http.c" #include "../tasks/task_netplay_lan_scan.c" #include "../tasks/task_wifi.c" +#include "../tasks/task_netplay_crc.c" #endif /*============================================================ diff --git a/tasks/task_netplay_crc.c b/tasks/task_netplay_crc.c new file mode 100644 index 0000000000..7e49775768 --- /dev/null +++ b/tasks/task_netplay_crc.c @@ -0,0 +1,136 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2016 - Jean-André Santoni + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tasks_internal.h" +#include "../file_path_special.h" +#include "../verbosity.h" +#include "../configuration.h" +#include "../playlist.h" + +typedef struct +{ + struct string_list *lpl_list; + char crc[PATH_MAX_LENGTH]; +} netplay_crc_handle_t; + +static void netplay_crc_scan_callback(void *task_data, + void *user_data, const char *error) +{ + printf("CALLBACK\n"); +} + +static void task_netplay_crc_scan_handler(retro_task_t *task) +{ + netplay_crc_handle_t *state = (netplay_crc_handle_t*)task->state; + size_t i, j; + + task_set_progress(task, 0); + task_set_title(task, "Checking for ROM presence."); + task_set_finished(task, false); + + if (!state->lpl_list) + { + task_set_progress(task, 100); + task_set_title(task, "Playlist directory not found."); + task_set_finished(task, true); + return; + } + + if (state->lpl_list->size == 0) + goto no_playlists; + + for (i = 0; i < state->lpl_list->size; i++) + { + const char *lpl_path = state->lpl_list->elems[i].data; + + if (!strstr(lpl_path, file_path_str(FILE_PATH_LPL_EXTENSION))) + continue; + + printf("%s\n", lpl_path); + + playlist_t *playlist = playlist_init(lpl_path, 99999); + + for (j = 0; j < playlist->size; j++) + { + printf("%s\n", playlist->entries[j].crc32); + if (string_is_equal(playlist->entries[j].crc32, "6BE4CA95|crc")) + { + task_set_progress(task, 100); + task_set_title(task, "Game found."); + task_set_finished(task, true); + string_list_free(state->lpl_list); + return; + } + + task_set_progress(task, (int)(j/playlist->size*100.0)); + } + } + +no_playlists: + string_list_free(state->lpl_list); + task_set_progress(task, 100); + task_set_title(task, "No game found."); + task_set_finished(task, true); + return; +} + +bool task_push_netplay_crc_scan(uint32_t crc) +{ + settings_t *settings = config_get_ptr(); + retro_task_t *task = (retro_task_t *)calloc(1, sizeof(*task)); + netplay_crc_handle_t *state = (netplay_crc_handle_t*)calloc(1, sizeof(*state)); + + if (!task || !state) + goto error; + + state->crc[0] = '\0'; + snprintf(state->crc, sizeof(state->crc), "%08X|crc", crc); + + state->lpl_list = dir_list_new(settings->directory.playlist, + NULL, true, true, true, false); + + /* blocking means no other task can run while this one is running, + * which is the default */ + task->type = TASK_TYPE_BLOCKING; + task->state = state; + task->handler = task_netplay_crc_scan_handler; + task->callback = netplay_crc_scan_callback; + task->title = strdup("Checking for ROM presence."); + + task_queue_ctl(TASK_QUEUE_CTL_PUSH, task); + + return true; + +error: + if (state) + free(state); + if (task) + free(task); + + return false; +} diff --git a/tasks/tasks_internal.h b/tasks/tasks_internal.h index 0d50899867..51bbfea46f 100644 --- a/tasks/tasks_internal.h +++ b/tasks/tasks_internal.h @@ -98,6 +98,8 @@ bool task_push_wifi_scan(void); bool task_push_netplay_lan_scan(void); +bool task_push_netplay_crc_scan(uint32_t crc); + #endif bool task_push_image_load(const char *fullpath, From 8c216bd2335aaab9230482f3a76c813dc1423508 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Sun, 22 Jan 2017 11:31:54 -0500 Subject: [PATCH 24/32] task title must point to memory that can be freed --- tasks/task_netplay_crc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tasks/task_netplay_crc.c b/tasks/task_netplay_crc.c index 7e49775768..6234f3e17a 100644 --- a/tasks/task_netplay_crc.c +++ b/tasks/task_netplay_crc.c @@ -50,13 +50,13 @@ static void task_netplay_crc_scan_handler(retro_task_t *task) size_t i, j; task_set_progress(task, 0); - task_set_title(task, "Checking for ROM presence."); + task_set_title(task, strdup("Checking for ROM presence.")); task_set_finished(task, false); if (!state->lpl_list) { task_set_progress(task, 100); - task_set_title(task, "Playlist directory not found."); + task_set_title(task, strdup("Playlist directory not found.")); task_set_finished(task, true); return; } @@ -81,7 +81,7 @@ static void task_netplay_crc_scan_handler(retro_task_t *task) if (string_is_equal(playlist->entries[j].crc32, "6BE4CA95|crc")) { task_set_progress(task, 100); - task_set_title(task, "Game found."); + task_set_title(task, strdup("Game found.")); task_set_finished(task, true); string_list_free(state->lpl_list); return; @@ -94,7 +94,7 @@ static void task_netplay_crc_scan_handler(retro_task_t *task) no_playlists: string_list_free(state->lpl_list); task_set_progress(task, 100); - task_set_title(task, "No game found."); + task_set_title(task, strdup("No game found.")); task_set_finished(task, true); return; } From 45d4a8865c8911b9efa297f8a90752ce34d20949 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Sun, 22 Jan 2017 11:33:20 -0500 Subject: [PATCH 25/32] free task state when finished --- tasks/task_netplay_crc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tasks/task_netplay_crc.c b/tasks/task_netplay_crc.c index 6234f3e17a..22ae3484b6 100644 --- a/tasks/task_netplay_crc.c +++ b/tasks/task_netplay_crc.c @@ -58,6 +58,7 @@ static void task_netplay_crc_scan_handler(retro_task_t *task) task_set_progress(task, 100); task_set_title(task, strdup("Playlist directory not found.")); task_set_finished(task, true); + free(state); return; } @@ -84,6 +85,7 @@ static void task_netplay_crc_scan_handler(retro_task_t *task) task_set_title(task, strdup("Game found.")); task_set_finished(task, true); string_list_free(state->lpl_list); + free(state); return; } @@ -96,6 +98,7 @@ no_playlists: task_set_progress(task, 100); task_set_title(task, strdup("No game found.")); task_set_finished(task, true); + free(state); return; } From 33cc168eb9e689415ba943d392a978689cd988ff Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 22 Jan 2017 12:29:29 -0500 Subject: [PATCH 26/32] allow connecting to lobby port instead of the port in settings --- command.c | 8 ++++++-- menu/cbs/menu_cbs_ok.c | 2 ++ network/netplay/netplay_frontend.c | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/command.c b/command.c index c40d703ea5..bfcf708684 100644 --- a/command.c +++ b/command.c @@ -2443,12 +2443,16 @@ bool command_event(enum event_command cmd, void *data) break; case CMD_EVENT_NETPLAY_INIT_DIRECT_DEFERRED: { - char *hostname = (char *) data; + /* buf is expected to be address:port, there must be a better way + to do this but for now I'll just use a string list */ + char *buf = (char *) data; + static struct string_list *hostname = NULL; + hostname = string_split(buf, ":"); settings_t *settings = config_get_ptr(); command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); if (!init_netplay_deferred( - hostname, settings->netplay.port)) + hostname->elems[0].data, atoi(hostname->elems[1].data))) { command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); return false; diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index cbfdbc6e6b..0abace4aa6 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3130,6 +3130,8 @@ static int action_ok_netplay_connect_room(const char *path, /* For testing purposes strlcpy(tmp_hostname, "192.168.1.241", sizeof(tmp_hostname));*/ strlcpy(tmp_hostname, netplay_room_list[idx - 1].address, sizeof(tmp_hostname)); + snprintf(tmp_hostname, sizeof(tmp_hostname), "%s:%d", + netplay_room_list[idx - 1].address, netplay_room_list[idx - 1].port); /* If we haven't yet started, this will load on its own */ if (!content_is_inited()) diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index 619d7f3ca4..09c9211591 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -947,7 +947,7 @@ bool init_netplay(void *direct_host, const char *server, unsigned port) netplay_data = (netplay_t*)netplay_new( netplay_is_client ? direct_host : NULL, netplay_is_client ? (!netplay_client_deferred ? server : server_address_deferred) : NULL, - port ? port : RARCH_DEFAULT_PORT, + port ? ( !netplay_client_deferred ? port : server_port_deferred) : RARCH_DEFAULT_PORT, settings->netplay.stateless_mode, settings->netplay.check_frames, &cbs, settings->netplay.nat_traversal, settings->username, quirks); From 5e7d9affe34cdd7221d5331ba33cd3dca092c5e4 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 22 Jan 2017 12:33:14 -0500 Subject: [PATCH 27/32] free netplay_room_list before allocating again --- menu/cbs/menu_cbs_ok.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 0abace4aa6..b219bbba07 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3349,6 +3349,9 @@ finish: room_data = string_split(buf, "\n"); + if (netplay_room_list) + free(netplay_room_list); + netplay_room_count = room_data->size / 8; netplay_room_list = (struct netplay_room*)malloc(sizeof(struct netplay_room) * netplay_room_count); From 469aed2e0f628eedd297a619a3256bf1104dc5b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Andr=C3=A9=20Santoni?= Date: Sun, 22 Jan 2017 18:39:19 +0100 Subject: [PATCH 28/32] Improve the task, with hostname and corename --- menu/cbs/menu_cbs_ok.c | 9 ++------- tasks/task_netplay_crc.c | 34 +++++++++++++++++++++++++++++++--- tasks/tasks_internal.h | 3 ++- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index b219bbba07..0cde92d32f 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3136,13 +3136,8 @@ static int action_ok_netplay_connect_room(const char *path, /* If we haven't yet started, this will load on its own */ if (!content_is_inited()) { - runloop_msg_queue_push( - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_START_WHEN_LOADED), - 1, 480, true); - /* Enable Netplay itself */ - - if (!command_event(CMD_EVENT_NETPLAY_INIT_DIRECT_DEFERRED, (void *) tmp_hostname)) - return -1; + task_push_netplay_crc_scan(netplay_room_list[idx - 1].gamecrc, + tmp_hostname, netplay_room_list[idx - 1].corename); } else { diff --git a/tasks/task_netplay_crc.c b/tasks/task_netplay_crc.c index 22ae3484b6..0b3a08ec8d 100644 --- a/tasks/task_netplay_crc.c +++ b/tasks/task_netplay_crc.c @@ -31,17 +31,35 @@ #include "../verbosity.h" #include "../configuration.h" #include "../playlist.h" +#include "../command.h" typedef struct { struct string_list *lpl_list; char crc[PATH_MAX_LENGTH]; + char path[PATH_MAX_LENGTH]; + char hostname[512]; + char corename[PATH_MAX_LENGTH]; + bool found; } netplay_crc_handle_t; static void netplay_crc_scan_callback(void *task_data, void *user_data, const char *error) { printf("CALLBACK\n"); + + netplay_crc_handle_t *state = (netplay_crc_handle_t*)task_data; + + if (!state) + return; + + printf("%s\n", state->hostname); + printf("%s\n", state->path); + printf("%s\n", state->corename); + + command_event(CMD_EVENT_NETPLAY_INIT, state->hostname); + + free(state); } static void task_netplay_crc_scan_handler(retro_task_t *task) @@ -81,11 +99,13 @@ static void task_netplay_crc_scan_handler(retro_task_t *task) printf("%s\n", playlist->entries[j].crc32); if (string_is_equal(playlist->entries[j].crc32, "6BE4CA95|crc")) { + strlcpy(state->path, playlist->entries[j].path, sizeof(state->path)); + state->found = true; + task_set_data(task, state); task_set_progress(task, 100); task_set_title(task, strdup("Game found.")); task_set_finished(task, true); string_list_free(state->lpl_list); - free(state); return; } @@ -98,11 +118,11 @@ no_playlists: task_set_progress(task, 100); task_set_title(task, strdup("No game found.")); task_set_finished(task, true); - free(state); return; } -bool task_push_netplay_crc_scan(uint32_t crc) +bool task_push_netplay_crc_scan(uint32_t crc, + const char *hostname, const char *corename) { settings_t *settings = config_get_ptr(); retro_task_t *task = (retro_task_t *)calloc(1, sizeof(*task)); @@ -114,9 +134,17 @@ bool task_push_netplay_crc_scan(uint32_t crc) state->crc[0] = '\0'; snprintf(state->crc, sizeof(state->crc), "%08X|crc", crc); + state->hostname[0] = '\0'; + snprintf(state->hostname, sizeof(state->hostname), "%s", hostname); + + state->corename[0] = '\0'; + snprintf(state->corename, sizeof(state->corename), "%s", corename); + state->lpl_list = dir_list_new(settings->directory.playlist, NULL, true, true, true, false); + state->found = false; + /* blocking means no other task can run while this one is running, * which is the default */ task->type = TASK_TYPE_BLOCKING; diff --git a/tasks/tasks_internal.h b/tasks/tasks_internal.h index 51bbfea46f..2da59a4eb0 100644 --- a/tasks/tasks_internal.h +++ b/tasks/tasks_internal.h @@ -98,7 +98,8 @@ bool task_push_wifi_scan(void); bool task_push_netplay_lan_scan(void); -bool task_push_netplay_crc_scan(uint32_t crc); +bool task_push_netplay_crc_scan(uint32_t crc, + const char *hostname, const char *corename); #endif From 680d281cb94d52b956f20f342e04b91d1aab122e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Andr=C3=A9=20Santoni?= Date: Sun, 22 Jan 2017 18:53:33 +0100 Subject: [PATCH 29/32] Unhardcode CRC --- tasks/task_netplay_crc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/task_netplay_crc.c b/tasks/task_netplay_crc.c index 0b3a08ec8d..8b05bff0b8 100644 --- a/tasks/task_netplay_crc.c +++ b/tasks/task_netplay_crc.c @@ -97,7 +97,7 @@ static void task_netplay_crc_scan_handler(retro_task_t *task) for (j = 0; j < playlist->size; j++) { printf("%s\n", playlist->entries[j].crc32); - if (string_is_equal(playlist->entries[j].crc32, "6BE4CA95|crc")) + if (string_is_equal(playlist->entries[j].crc32, state->crc)) { strlcpy(state->path, playlist->entries[j].path, sizeof(state->path)); state->found = true; From a0e6a24f38a40d1e0a06d46500001aeb5b9aabee Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 22 Jan 2017 13:07:30 -0500 Subject: [PATCH 30/32] use deferred netplay init --- menu/cbs/menu_cbs_ok.c | 2 +- network/netplay/netplay_frontend.c | 2 -- tasks/task_netplay_crc.c | 5 +---- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 0cde92d32f..a403645904 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3132,7 +3132,7 @@ static int action_ok_netplay_connect_room(const char *path, strlcpy(tmp_hostname, netplay_room_list[idx - 1].address, sizeof(tmp_hostname)); snprintf(tmp_hostname, sizeof(tmp_hostname), "%s:%d", netplay_room_list[idx - 1].address, netplay_room_list[idx - 1].port); - + RARCH_LOG("%s %s %08x", netplay_room_list[idx - 1].address, netplay_room_list[idx - 1].gamename, netplay_room_list[idx - 1].gamecrc); /* If we haven't yet started, this will load on its own */ if (!content_is_inited()) { diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index 09c9211591..f63c178155 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -164,8 +164,6 @@ static bool get_self_input_state(netplay_t *netplay) bool init_netplay_deferred(const char* server, unsigned port) { - - RARCH_LOG("deferred! %s\n", server); if (!string_is_empty(server) && port != 0) { strlcpy(server_address_deferred, server, sizeof(server_address_deferred)); diff --git a/tasks/task_netplay_crc.c b/tasks/task_netplay_crc.c index 8b05bff0b8..47fbf7d32e 100644 --- a/tasks/task_netplay_crc.c +++ b/tasks/task_netplay_crc.c @@ -46,8 +46,6 @@ typedef struct static void netplay_crc_scan_callback(void *task_data, void *user_data, const char *error) { - printf("CALLBACK\n"); - netplay_crc_handle_t *state = (netplay_crc_handle_t*)task_data; if (!state) @@ -56,8 +54,7 @@ static void netplay_crc_scan_callback(void *task_data, printf("%s\n", state->hostname); printf("%s\n", state->path); printf("%s\n", state->corename); - - command_event(CMD_EVENT_NETPLAY_INIT, state->hostname); + command_event(CMD_EVENT_NETPLAY_INIT_DIRECT_DEFERRED, state->hostname); free(state); } From fc68abebddb801535219968b72489811cbe0c5c7 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 22 Jan 2017 13:39:27 -0500 Subject: [PATCH 31/32] find the core from core_info --- tasks/task_netplay_crc.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/tasks/task_netplay_crc.c b/tasks/task_netplay_crc.c index 47fbf7d32e..76bc184a3f 100644 --- a/tasks/task_netplay_crc.c +++ b/tasks/task_netplay_crc.c @@ -32,6 +32,7 @@ #include "../configuration.h" #include "../playlist.h" #include "../command.h" +#include "../core_info.h" typedef struct { @@ -47,13 +48,24 @@ static void netplay_crc_scan_callback(void *task_data, void *user_data, const char *error) { netplay_crc_handle_t *state = (netplay_crc_handle_t*)task_data; + core_info_list_t *info = NULL; + int i; + core_info_get_list(&info); if (!state) return; - printf("%s\n", state->hostname); - printf("%s\n", state->path); - printf("%s\n", state->corename); + for (i=0; i < info->count; i++) + { + if(string_is_equal(info->list[i].core_name, state->corename)) + break; + } + + printf("Hostname: %s\n", state->hostname); + printf("Content: %s\n", state->path); + printf("Corename: %s\n", state->corename); + printf("Corepath: %s\n", info->list[i].path); + command_event(CMD_EVENT_NETPLAY_INIT_DIRECT_DEFERRED, state->hostname); free(state); From c8081bc3df9cf16da66fa401a762f5138f059f66 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 22 Jan 2017 13:52:35 -0500 Subject: [PATCH 32/32] it loads now --- tasks/task_netplay_crc.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tasks/task_netplay_crc.c b/tasks/task_netplay_crc.c index 76bc184a3f..16f7ba0da7 100644 --- a/tasks/task_netplay_crc.c +++ b/tasks/task_netplay_crc.c @@ -49,6 +49,8 @@ static void netplay_crc_scan_callback(void *task_data, { netplay_crc_handle_t *state = (netplay_crc_handle_t*)task_data; core_info_list_t *info = NULL; + content_ctx_info_t content_info = {0}; + int i; core_info_get_list(&info); @@ -67,6 +69,12 @@ static void netplay_crc_scan_callback(void *task_data, printf("Corepath: %s\n", info->list[i].path); command_event(CMD_EVENT_NETPLAY_INIT_DIRECT_DEFERRED, state->hostname); + task_push_content_load_default( + info->list[i].path, state->path, + &content_info, + CORE_TYPE_PLAIN, + CONTENT_MODE_LOAD_CONTENT_WITH_NEW_CORE_FROM_MENU, + NULL, NULL); free(state); }