diff --git a/common/common.h b/common/common.h index b27a68c..528c3ea 100644 --- a/common/common.h +++ b/common/common.h @@ -62,6 +62,7 @@ typedef union { #include "theme.h" #include "message-box.h" #include "power.h" +#include "netloader.h" void menuStartupPath(void); void menuStartup(void); diff --git a/common/menu.c b/common/menu.c index ca8efd3..b532985 100644 --- a/common/menu.c +++ b/common/menu.c @@ -43,13 +43,12 @@ static enum void launchMenuNetloaderTask() { if(hbmenu_state == HBMENU_DEFAULT) - if(netloader_activate() == 0) hbmenu_state = HBMENU_NETLOADER_ACTIVE; + workerSchedule(netloaderTask, NULL); } void launchMenuBackTask() { if(hbmenu_state == HBMENU_NETLOADER_ACTIVE) { - netloader_deactivate(); - hbmenu_state = HBMENU_DEFAULT; + netloaderSignalExit(); } else if(hbmenu_state == HBMENU_THEME_MENU) { hbmenu_state = HBMENU_DEFAULT; @@ -496,10 +495,13 @@ void drawButtons(menu_s* menu, bool emptyDir, int *x_image_out) { void menuLoop(void) { menuEntry_s* me; + menuEntry_s* netloader_me = NULL; menu_s* menu = menuGetCurrent(); int i; int x, y; int menupath_x_endpos = 918 + 40; + bool netloader_activated = 0, netloader_launch_app = 0; + char netloader_errormsg[1024]; for (y=0; y<450; y++) { for (x=0; x<1280; x+=4) {// don't draw bottom pixels as they are covered by the waves @@ -531,19 +533,23 @@ void menuLoop(void) { drawTime(); drawCharge(); + netloaderGetState(&netloader_activated, &netloader_launch_app, &netloader_me, netloader_errormsg, sizeof(netloader_errormsg)); + + if(hbmenu_state == HBMENU_DEFAULT && netloader_activated) { + hbmenu_state = HBMENU_NETLOADER_ACTIVE; + } else if(hbmenu_state == HBMENU_NETLOADER_ACTIVE && !netloader_activated && !netloader_launch_app) { + hbmenu_state = HBMENU_DEFAULT; + } + + if (netloader_errormsg[0]) menuCreateMsgBox(780,300, netloader_errormsg); + if (menu->nEntries==0 || hbmenu_state == HBMENU_NETLOADER_ACTIVE) { if (hbmenu_state == HBMENU_NETLOADER_ACTIVE) { - menuEntry_s me; - menuEntryInit(&me,ENTRY_TYPE_FILE); - - int netloader_result = netloader_loop(&me); - if( netloader_result != 0) { + if (netloader_launch_app) { hbmenu_state = HBMENU_DEFAULT; - if (netloader_result == 1) { - menuCreateMsgBox(240,240, textGetString(StrId_Loading)); - launchMenuEntryTask(&me); - } + menuCreateMsgBox(240,240, textGetString(StrId_Loading)); + launchMenuEntryTask(netloader_me); } } else { DrawText(interuiregular14, 64, 128 + 18, themeCurrent.textColor, textGetString(StrId_NoAppsFound_Msg)); diff --git a/common/netloader.c b/common/netloader.c index b80ba8e..86ca3cf 100644 --- a/common/netloader.c +++ b/common/netloader.c @@ -40,20 +40,22 @@ static int netloader_datafd = -1; #if PING_ENABLED static int netloader_udpfd = -1; #endif -unsigned char in[ZLIB_CHUNK]; -unsigned char out[ZLIB_CHUNK]; +static unsigned char in[ZLIB_CHUNK]; +static unsigned char out[ZLIB_CHUNK]; + +static mtx_t netloader_mtx; + +static bool netloader_initialized = 0; +static bool netloader_exitflag = 0; +static bool netloader_activated = 0, netloader_launchapp = 0; +static menuEntry_s netloader_me; +static char netloader_errortext[1024]; //--------------------------------------------------------------------------------- static void netloader_error(const char *func, int err) { //--------------------------------------------------------------------------------- - char errortext[1024]; - - memset(errortext, 0, sizeof(errortext)); - snprintf(errortext, sizeof(errortext)-1, "%s: err=%d\n %s\n", func, err, strerror(errno)); - - menuCreateMsgBox(780,300, errortext); - - netloader_deactivate(); + memset(netloader_errortext, 0, sizeof(netloader_errortext)); + snprintf(netloader_errortext, sizeof(netloader_errortext)-1, "%s: err=%d\n %s\n", func, err, strerror(errno)); } //--------------------------------------------------------------------------------- @@ -558,7 +560,6 @@ int netloader_loop(menuEntry_s *me) { if(netloader_datafd >= 0) { int result = loadnro(me, netloader_datafd,sa_remote.sin_addr); - netloader_deactivate(); if (result== 0) { return 1; } else { @@ -568,3 +569,84 @@ int netloader_loop(menuEntry_s *me) { return 0; } + +void netloaderGetState(bool *activated, bool *launch_app, menuEntry_s **me, char *errormsg, size_t errormsg_size) { + mtx_lock(&netloader_mtx); + + *activated = netloader_activated; + *launch_app = netloader_launchapp; + *me = &netloader_me; + + memset(errormsg, 0, errormsg_size); + if(netloader_errortext[0]) { + strncpy(errormsg, netloader_errortext, errormsg_size-1); + memset(netloader_errortext, 0, sizeof(netloader_errortext)); + } + + mtx_unlock(&netloader_mtx); +} + +static bool netloaderGetExit(void) { + bool flag; + mtx_lock(&netloader_mtx); + flag = netloader_exitflag; + mtx_unlock(&netloader_mtx); + return flag; +} + +void netloaderSignalExit(void) { + mtx_lock(&netloader_mtx); + netloader_exitflag = 1; + mtx_unlock(&netloader_mtx); +} + +bool netloaderInit(void) +{ + if (netloader_initialized) return 1; + + if (mtx_init(&netloader_mtx, mtx_plain) != thrd_success) return 0; + + netloader_initialized = 1; + return 1; +} + +void netloaderExit(void) +{ + if (!netloader_initialized) return; + netloader_initialized = 0; + + mtx_destroy(&netloader_mtx); +} + +//--------------------------------------------------------------------------------- +void netloaderTask(void* arg) { +//--------------------------------------------------------------------------------- + int ret=0; + menuEntryInit(&netloader_me,ENTRY_TYPE_FILE); + + mtx_lock(&netloader_mtx); + netloader_exitflag = 0; + netloader_activated = 0; + netloader_launchapp = 0; + mtx_unlock(&netloader_mtx); + + if(netloader_activate() == 0) { + mtx_lock(&netloader_mtx); + netloader_activated = 1; + mtx_unlock(&netloader_mtx); + } + else { + netloader_deactivate(); + return; + } + + while((ret = netloader_loop(&netloader_me)) == 0 && !netloaderGetExit()); + + netloader_deactivate(); + mtx_lock(&netloader_mtx); + netloader_exitflag = 0; + netloader_activated = 0; + if (ret==1) netloader_launchapp = 1; + mtx_unlock(&netloader_mtx); +} + diff --git a/common/netloader.h b/common/netloader.h index f3ea735..2c39a5f 100644 --- a/common/netloader.h +++ b/common/netloader.h @@ -2,4 +2,12 @@ int netloader_activate(void); int netloader_deactivate(void); -int netloader_loop( menuEntry_s *me); +int netloader_loop(menuEntry_s *me); + +bool netloaderInit(void); +void netloaderExit(void); + +void netloaderTask(void* arg); + +void netloaderGetState(bool *activated, bool *launch_app, menuEntry_s **me, char *errormsg, size_t errormsg_size); +void netloaderSignalExit(void); diff --git a/nx_main/main.c b/nx_main/main.c index 71fc793..f7cf9b4 100644 --- a/nx_main/main.c +++ b/nx_main/main.c @@ -83,6 +83,11 @@ int main(int argc, char **argv) snprintf(errormsg, sizeof(errormsg)-1, "Error: fontInitialize() failed."); } + if (R_SUCCEEDED(rc) && !netloaderInit()) { + rc = 4; + snprintf(errormsg, sizeof(errormsg)-1, "Error: netloaderInit() failed."); + } + #ifdef ENABLE_AUDIO if (R_SUCCEEDED(rc)) audio_initialize(); #endif @@ -164,6 +169,7 @@ int main(int argc, char **argv) audio_exit(); #endif + netloaderExit(); fontExit(); launchExit(); workerExit(); diff --git a/pc_main/main.cpp b/pc_main/main.cpp index 90e9775..a30cc9d 100644 --- a/pc_main/main.cpp +++ b/pc_main/main.cpp @@ -21,6 +21,7 @@ int main() fontInitialize(); workerInit(); menuStartup(); + netloaderInit(); while (window.isOpen()) { @@ -53,6 +54,7 @@ int main() window.display(); } + netloaderExit(); workerExit(); fontExit();