From d1291f406bca3b128ca916b6c786900f0342a80c Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 21 May 2017 22:21:11 -0500 Subject: [PATCH] allow connecting without reloading content when content_get_crc matches with that of the current loaded game --- command.c | 38 ++++++++++++++++++++++++------- tasks/task_netplay_find_content.c | 33 ++++++++++++++++++++++++--- 2 files changed, 60 insertions(+), 11 deletions(-) diff --git a/command.c b/command.c index fbadb3236e..1f8a595a56 100644 --- a/command.c +++ b/command.c @@ -2244,6 +2244,7 @@ bool command_event(enum event_command cmd, void *data) case CMD_EVENT_NETWORK_INIT: network_init(); break; + /* init netplay manually */ case CMD_EVENT_NETPLAY_INIT: { char *hostname = (char *) data; @@ -2251,33 +2252,53 @@ bool command_event(enum event_command cmd, void *data) command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); - if (!init_netplay( - NULL, hostname ? hostname : settings->paths.netplay_server, - settings->uints.netplay_port)) + if (!init_netplay(NULL, hostname ? hostname : + settings->paths.netplay_server, + settings->uints.netplay_port)) { command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); return false; } } break; + /* init netplay via lobby when content is loaded */ case CMD_EVENT_NETPLAY_INIT_DIRECT: { + char *buf = (char *)data; settings_t *settings = config_get_ptr(); command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); - if (!init_netplay( - data, NULL, settings->uints.netplay_port)) + /* new codepath, uses the same logic as init_deferred, expects + buf to be addres|port */ + if (strstr(buf, "|")) + { + static struct string_list *hostname = NULL; + hostname = string_split(buf, "|"); + + if (!init_netplay(NULL, hostname->elems[0].data, + atoi(hostname->elems[1].data))) + { + string_list_free(hostname); + command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + string_list_free(hostname); + return false; + } + } + /* old codepath accessed via, netplay/scan local network + not sure how/if it works, it seems it doesn't */ + else if (!init_netplay(data, NULL, + settings->uints.netplay_port)) { command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); return false; } } break; + /* init netplay via lobby when content is notloaded */ case CMD_EVENT_NETPLAY_INIT_DIRECT_DEFERRED: { - /* 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 */ + /* buf is expected to be address|port */ char *buf = (char *)data; static struct string_list *hostname = NULL; hostname = string_split(buf, "|"); @@ -2285,10 +2306,11 @@ bool command_event(enum event_command cmd, void *data) command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); if (!init_netplay_deferred( - hostname->elems[0].data, atoi(hostname->elems[1].data))) + hostname->elems[0].data, atoi(hostname->elems[1].data))) { string_list_free(hostname); command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + string_list_free(hostname); return false; } diff --git a/tasks/task_netplay_find_content.c b/tasks/task_netplay_find_content.c index 077ad1a468..66897b3ec3 100644 --- a/tasks/task_netplay_find_content.c +++ b/tasks/task_netplay_find_content.c @@ -46,6 +46,8 @@ typedef struct char core_path[PATH_MAX_LENGTH]; char core_extensions[PATH_MAX_LENGTH]; bool found; + bool current; + bool contentless; } netplay_crc_handle_t; static void netplay_crc_scan_callback(void *task_data, @@ -63,6 +65,8 @@ static void netplay_crc_scan_callback(void *task_data, if (!string_is_empty(state->core_path) && !string_is_empty(state->content_path) && string_is_not_equal_fast(state->content_path, "N/A", 3)) { + RARCH_LOG("[lobby] loading core %s with content file %s\n", + state->core_path, state->content_path); command_event(CMD_EVENT_NETPLAY_INIT_DIRECT_DEFERRED, state->hostname); task_push_load_content_with_new_core_from_menu( state->core_path, state->content_path, @@ -72,9 +76,10 @@ static void netplay_crc_scan_callback(void *task_data, } else #endif - if (!string_is_empty(state->core_path) && !string_is_empty(state->content_path) && - string_is_equal_fast(state->content_path, "N/A", 3)) + if (!string_is_empty(state->core_path) && !string_is_empty(state->content_path) && + string_is_equal_fast(state->content_path, "N/A", 3) && !state->current) { + RARCH_LOG("[lobby] loading contentless core %s\n", state->core_path); content_ctx_info_t content_info = {0}; command_event(CMD_EVENT_NETPLAY_INIT_DIRECT_DEFERRED, state->hostname); @@ -82,6 +87,12 @@ static void netplay_crc_scan_callback(void *task_data, &content_info, CORE_TYPE_PLAIN, NULL, NULL); task_push_start_current_core(&content_info); } + else if (!string_is_empty(state->core_path) && !string_is_empty(state->content_path) && + string_is_equal_fast(state->content_path, "N/A", 3) && state->current) + { + RARCH_LOG("[lobby] loading core %s with current content\n", state->core_path); + command_event(CMD_EVENT_NETPLAY_INIT_DIRECT, state->hostname); + } else { /* TO-DO: Inform the user no compatible core or content was found */ @@ -100,7 +111,7 @@ static void task_netplay_crc_scan_handler(retro_task_t *task) { size_t i, j; netplay_crc_handle_t *state = (netplay_crc_handle_t*)task->state; - + char current[PATH_MAX_LENGTH]; task_set_progress(task, 0); task_free_title(task); task_set_title(task, strdup("Looking for compatible content...")); @@ -128,6 +139,22 @@ static void task_netplay_crc_scan_handler(retro_task_t *task) { RARCH_LOG("[lobby] testing CRC matching for: %s\n", state->content_crc); + snprintf(current, sizeof(current), "%X|crc", content_get_crc()); + RARCH_LOG("[lobby] current content crc: %s\n", current); + if (string_is_equal(current, state->content_crc)) + { + RARCH_LOG("[lobby] CRC match %s with currently loaded content\n", current); + strlcpy(state->content_path, "N/A", sizeof(state->content_path)); + state->found = true; + state->current = true; + task_set_data(task, state); + task_set_progress(task, 100); + task_free_title(task); + task_set_title(task, strdup(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_COMPAT_CONTENT_FOUND))); + task_set_finished(task, true); + string_list_free(state->lpl_list); + return; + } for (i = 0; i < state->lpl_list->size; i++) { playlist_t *playlist = NULL;