Display netloader status with a modified msgbox.
* Enabled StrIds in language.c for this with some adjustments. * Moved sockets init/exit into netloaderInit/netloaderExit, netloaderInit now returns Result. * Changed the params for netloaderGetState to an output struct. * In netloaderTask(), check netloader_exitflag at the end before clearing it. * Moved code calling loadnro from netloader_loop into netloaderTask. * Call thrd_sleep with the while-loop calling netloader_loop in netloaderTask. * Various other changes.
This commit is contained in:
parent
ba4c80d76d
commit
86632292b0
@ -752,20 +752,20 @@ const char* const g_strings[StrId_Max][16] =
|
|||||||
STR_TW("網路執行模組"),
|
STR_TW("網路執行模組"),
|
||||||
},
|
},
|
||||||
|
|
||||||
/*[StrId_NetLoaderUnavailable] =
|
[StrId_NetLoaderUnavailable] =
|
||||||
{
|
{
|
||||||
STR_EN("The NetLoader is currently unavailable."),
|
STR_EN("The NetLoader is currently unavailable."),
|
||||||
STR_ES("El cargador de programas no está disponible."),
|
STR_ES("El cargador de programas no está disponible."),
|
||||||
STR_DE("Der Netzwerk-Loader ist zur Zeit nicht verfügbar."),
|
STR_DE("Der Netzwerk-Loader ist zur Zeit nicht verfügbar."),
|
||||||
STR_FR("Le chargeur de programme 3dslink est indisponible."),
|
STR_FR("Le chargeur de programme nxlink est indisponible."),
|
||||||
STR_IT("Il caricamento programmi 3dslink non è disponibile."),
|
STR_IT("Il caricamento programmi nxlink non è disponibile."),
|
||||||
STR_JP("3dslinkネットローダは現在利用できません。"),
|
STR_JP("nxlinkネットローダは現在利用できません。"),
|
||||||
STR_PT("O carregador de programas está de momento indisponível."),
|
STR_PT("O carregador de programas está de momento indisponível."),
|
||||||
STR_NL("De netwerk lader is niet beschikbaar."),
|
STR_NL("De netwerk lader is niet beschikbaar."),
|
||||||
STR_KO("현재 네트워크 로더는 사용이 불가합니다."),
|
STR_KO("현재 네트워크 로더는 사용이 불가합니다."),
|
||||||
STR_RU("Загрузчик в настоящее время недоступен."),
|
STR_RU("Загрузчик в настоящее время недоступен."),
|
||||||
STR_ZH("无法启动 3dslink 网络执行模块。"),
|
STR_ZH("无法启动 nxlink 网络执行模块。"),
|
||||||
STR_TW("無法啓動 3dslink 網路執行模組。"),
|
STR_TW("無法啓動 nxlink 網路執行模組。"),
|
||||||
},
|
},
|
||||||
|
|
||||||
[StrId_NetLoaderError] =
|
[StrId_NetLoaderError] =
|
||||||
@ -786,76 +786,64 @@ const char* const g_strings[StrId_Max][16] =
|
|||||||
|
|
||||||
[StrId_NetLoaderOffline] =
|
[StrId_NetLoaderOffline] =
|
||||||
{
|
{
|
||||||
STR_EN("Offline, waiting for network…\n\n\n \xEE\x80\x81 Cancel"),
|
STR_EN("Offline, waiting for network…\n\n\n"),
|
||||||
STR_FR("Hors-ligne, en attente d'une connection...\n\n\n \xEE\x80\x81 Annuler"),
|
STR_FR("Hors-ligne, en attente d'une connection...\n\n\n"),
|
||||||
STR_IT("Disconnesso, in attesa della connessione…\n\n\n \xEE\x80\x81 Annullare"),
|
STR_IT("Disconnesso, in attesa della connessione…\n\n\n"),
|
||||||
STR_JP("オフラインです。ネットワーク接続を待っています…\n\n\n \xEE\x80\x81 キャンセル"),
|
STR_JP("オフラインです。ネットワーク接続を待っています…\n\n\n"),
|
||||||
STR_KO("연결 끊김, 네트워크 기다리는 중…\n\n\n \xEE\x80\x81 취소")
|
STR_KO("연결 끊김, 네트워크 기다리는 중…\n\n\n"),
|
||||||
STR_ZH("无法连接网络,等待网络连接…\n\n\n \xEE\x80\x81 取消"),
|
STR_ZH("无法连接网络,等待网络连接…\n\n\n"),
|
||||||
STR_TW("當前離線,等待網路連線…\n\n\n \xEE\x80\x81 取消"),
|
STR_TW("當前離線,等待網路連線…\n\n\n"),
|
||||||
},
|
},
|
||||||
|
|
||||||
[StrId_NetLoaderActive] =
|
[StrId_NetLoaderActive] =
|
||||||
{
|
{
|
||||||
STR_EN(
|
STR_EN(
|
||||||
"Waiting for 3dslink to connect…\n"
|
"Waiting for nxlink to connect…\n"
|
||||||
"IP Addr: %lu.%lu.%lu.%lu, Port: %d\n\n"
|
"IP Addr: %lu.%lu.%lu.%lu, Port: %d\n\n"
|
||||||
" \xEE\x80\x81 Cancel"
|
|
||||||
),
|
),
|
||||||
STR_ES(
|
STR_ES(
|
||||||
"Esperando a que se conecte 3dslink…\n"
|
"Esperando a que se conecte nxlink…\n"
|
||||||
"Dir.IP: %lu.%lu.%lu.%lu, Puerto: %d\n\n"
|
"Dir.IP: %lu.%lu.%lu.%lu, Puerto: %d\n\n"
|
||||||
" \xEE\x80\x81 Cancelar"
|
|
||||||
),
|
),
|
||||||
STR_DE(
|
STR_DE(
|
||||||
"Warte auf Verbindung von 3dslink…\n"
|
"Warte auf Verbindung von 3dslink…\n"
|
||||||
"IP Addr: %lu.%lu.%lu.%lu, Port: %d\n\n"
|
"IP Addr: %lu.%lu.%lu.%lu, Port: %d\n\n"
|
||||||
" \xEE\x80\x81 Abbrechen"
|
|
||||||
),
|
),
|
||||||
STR_FR(
|
STR_FR(
|
||||||
"En attente de la connexion de 3dslink…\n"
|
"En attente de la connexion de nxlink…\n"
|
||||||
"Adr. IP : %lu.%lu.%lu.%lu, Port : %d\n\n"
|
"Adr. IP : %lu.%lu.%lu.%lu, Port : %d\n\n"
|
||||||
" \xEE\x80\x81 Annuler"
|
|
||||||
),
|
),
|
||||||
STR_IT(
|
STR_IT(
|
||||||
"In attesa della connessione di 3dslink…\n"
|
"In attesa della connessione di nxlink…\n"
|
||||||
"Ind. IP : %lu.%lu.%lu.%lu, Porta : %d\n\n"
|
"Ind. IP : %lu.%lu.%lu.%lu, Porta : %d\n\n"
|
||||||
" \xEE\x80\x81 Annullare"
|
|
||||||
),
|
),
|
||||||
STR_JP(
|
STR_JP(
|
||||||
"3dslinkが接続されるのを待っています…\n"
|
"nxlinkが接続されるのを待っています…\n"
|
||||||
"IPアドレス:%lu.%lu.%lu.%lu, ポート番号:%d\n\n"
|
"IPアドレス:%lu.%lu.%lu.%lu, ポート番号:%d\n\n"
|
||||||
" \xEE\x80\x81 キャンセル"
|
|
||||||
),
|
),
|
||||||
STR_PT(
|
STR_PT(
|
||||||
"A aguardar pela conexão do 3dslink…\n"
|
"A aguardar pela conexão do nxlink…\n"
|
||||||
"End. IP: %lu.%lu.%lu.%lu, Porta: %d\n\n"
|
"End. IP: %lu.%lu.%lu.%lu, Porta: %d\n\n"
|
||||||
" \xEE\x80\x81 Cancelar"
|
|
||||||
),
|
),
|
||||||
STR_NL(
|
STR_NL(
|
||||||
"Wachten op 3dslink verbinding…\n"
|
"Wachten op nxlink verbinding…\n"
|
||||||
"IP Addr: %lu.%lu.%lu.%lu, Poort: %d\n\n"
|
"IP Addr: %lu.%lu.%lu.%lu, Poort: %d\n\n"
|
||||||
" \xEE\x80\x81 Annuleren"
|
|
||||||
),
|
),
|
||||||
STR_KO(
|
STR_KO(
|
||||||
"3dslink의 연결을 대기중…\n"
|
"nxlink의 연결을 대기중…\n"
|
||||||
"IP 주소: %lu.%lu.%lu.%lu, 포트: %d\n\n"
|
"IP 주소: %lu.%lu.%lu.%lu, 포트: %d\n\n"
|
||||||
" \xEE\x80\x81 취소"
|
|
||||||
),
|
),
|
||||||
STR_RU(
|
STR_RU(
|
||||||
"Ожидание подключения 3dslink…\n"
|
"Ожидание подключения nxlink…\n"
|
||||||
"айпи адрес: %lu.%lu.%lu.%lu, Порт: %d\n\n"
|
"айпи адрес: %lu.%lu.%lu.%lu, Порт: %d\n\n"
|
||||||
" \xEE\x80\x81 Отмена"
|
|
||||||
),
|
),
|
||||||
STR_ZH(
|
STR_ZH(
|
||||||
"等待 3dslink 连接…\n"
|
"等待 nxlink 连接…\n"
|
||||||
"IP 地址:%lu.%lu.%lu.%lu,端口:%d\n\n"
|
"IP 地址:%lu.%lu.%lu.%lu,端口:%d\n\n"
|
||||||
" \xEE\x80\x81 取消等待"
|
|
||||||
),
|
),
|
||||||
STR_TW(
|
STR_TW(
|
||||||
"等待 3dslink 連接…\n"
|
"等待 nxlink 連接…\n"
|
||||||
"IP 位址:%lu.%lu.%lu.%lu,連接埠:%d\n\n"
|
"IP 位址:%lu.%lu.%lu.%lu,連接埠:%d\n\n"
|
||||||
" \xEE\x80\x81 取消等待"
|
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -909,6 +897,6 @@ const char* const g_strings[StrId_Max][16] =
|
|||||||
"正在傳輸…\n"
|
"正在傳輸…\n"
|
||||||
"已完成 %zu / %zu KiB"
|
"已完成 %zu / %zu KiB"
|
||||||
),
|
),
|
||||||
},*/
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ void launchMenuBackTask() {
|
|||||||
void menuHandleAButton(void) {
|
void menuHandleAButton(void) {
|
||||||
menu_s* menu = menuGetCurrent();
|
menu_s* menu = menuGetCurrent();
|
||||||
|
|
||||||
if (menuIsMsgBoxOpen()) {
|
if (hbmenu_state != HBMENU_NETLOADER_ACTIVE && menuIsMsgBoxOpen()) {
|
||||||
menuCloseMsgBox();
|
menuCloseMsgBox();
|
||||||
}
|
}
|
||||||
else if (menu->nEntries > 0 && (hbmenu_state == HBMENU_DEFAULT || hbmenu_state == HBMENU_THEME_MENU))
|
else if (menu->nEntries > 0 && (hbmenu_state == HBMENU_DEFAULT || hbmenu_state == HBMENU_THEME_MENU))
|
||||||
@ -493,15 +493,33 @@ void drawButtons(menu_s* menu, bool emptyDir, int *x_image_out) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void menuUpdateNetloader(char* netloader_displaytext, size_t netloader_displaytext_size, netloaderState *netloader_state) {
|
||||||
|
char textbody[256];
|
||||||
|
|
||||||
|
memset(textbody, 0, sizeof(textbody));
|
||||||
|
|
||||||
|
u32 ip = gethostid();
|
||||||
|
|
||||||
|
if (ip == INADDR_LOOPBACK)
|
||||||
|
snprintf(textbody, sizeof(textbody)-1, "%s", textGetString(StrId_NetLoaderOffline));
|
||||||
|
else {
|
||||||
|
if (!netloader_state->sock_connected)
|
||||||
|
snprintf(textbody, sizeof(textbody)-1, textGetString(StrId_NetLoaderActive), ip&0xFF, (ip>>8)&0xFF, (ip>>16)&0xFF, (ip>>24)&0xFF, NXLINK_SERVER_PORT);
|
||||||
|
else
|
||||||
|
snprintf(textbody, sizeof(textbody)-1, textGetString(StrId_NetLoaderTransferring), netloader_state->filetotal/1024, netloader_state->filelen/1024);
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(netloader_displaytext, netloader_displaytext_size-1, "%s\n\n\n%s", textGetString(StrId_NetLoader), textbody);
|
||||||
|
}
|
||||||
|
|
||||||
void menuLoop(void) {
|
void menuLoop(void) {
|
||||||
menuEntry_s* me;
|
menuEntry_s* me;
|
||||||
menuEntry_s* netloader_me = NULL;
|
|
||||||
menu_s* menu = NULL;
|
menu_s* menu = NULL;
|
||||||
int i;
|
int i;
|
||||||
int x, y;
|
int x, y;
|
||||||
int menupath_x_endpos = 918 + 40;
|
int menupath_x_endpos = 918 + 40;
|
||||||
bool netloader_activated = 0, netloader_launch_app = 0;
|
netloaderState netloader_state;
|
||||||
char netloader_errormsg[1024];
|
char netloader_displaytext[256];
|
||||||
|
|
||||||
for (y=0; y<450; y++) {
|
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
|
for (x=0; x<1280; x+=4) {// don't draw bottom pixels as they are covered by the waves
|
||||||
@ -533,26 +551,43 @@ void menuLoop(void) {
|
|||||||
drawTime();
|
drawTime();
|
||||||
drawCharge();
|
drawCharge();
|
||||||
|
|
||||||
netloaderGetState(&netloader_activated, &netloader_launch_app, &netloader_me, netloader_errormsg, sizeof(netloader_errormsg));
|
memset(&netloader_state, 0, sizeof(netloader_state));
|
||||||
|
netloaderGetState(&netloader_state);
|
||||||
|
|
||||||
if(hbmenu_state == HBMENU_DEFAULT && netloader_activated) {
|
if(hbmenu_state == HBMENU_DEFAULT && netloader_state.activated) {
|
||||||
hbmenu_state = HBMENU_NETLOADER_ACTIVE;
|
hbmenu_state = HBMENU_NETLOADER_ACTIVE;
|
||||||
} else if(hbmenu_state == HBMENU_NETLOADER_ACTIVE && !netloader_activated && !netloader_launch_app) {
|
|
||||||
|
menuCloseMsgBox();
|
||||||
|
menuCreateMsgBox(780,300, "");
|
||||||
|
} else if(hbmenu_state == HBMENU_NETLOADER_ACTIVE && !netloader_state.activated && !netloader_state.launch_app) {
|
||||||
hbmenu_state = HBMENU_DEFAULT;
|
hbmenu_state = HBMENU_DEFAULT;
|
||||||
menuScan(".");//Reload the menu since netloader may have deleted the NRO if the transfer aborted.
|
menuScan(".");//Reload the menu since netloader may have deleted the NRO if the transfer aborted.
|
||||||
|
|
||||||
|
menuCloseMsgBox();
|
||||||
|
menuMsgBoxSetNetloaderState(0, NULL);
|
||||||
|
|
||||||
|
if (netloader_state.errormsg[0]) menuCreateMsgBox(780,300, netloader_state.errormsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(hbmenu_state == HBMENU_NETLOADER_ACTIVE) {
|
||||||
|
memset(netloader_displaytext, 0, sizeof(netloader_displaytext));
|
||||||
|
|
||||||
|
menuUpdateNetloader(netloader_displaytext, sizeof(netloader_displaytext), &netloader_state);
|
||||||
|
|
||||||
|
menuMsgBoxSetNetloaderState(1, netloader_displaytext);
|
||||||
}
|
}
|
||||||
|
|
||||||
menu = menuGetCurrent();
|
menu = menuGetCurrent();
|
||||||
|
|
||||||
if (netloader_errormsg[0]) menuCreateMsgBox(780,300, netloader_errormsg);
|
|
||||||
|
|
||||||
if (menu->nEntries==0 || hbmenu_state == HBMENU_NETLOADER_ACTIVE)
|
if (menu->nEntries==0 || hbmenu_state == HBMENU_NETLOADER_ACTIVE)
|
||||||
{
|
{
|
||||||
if (hbmenu_state == HBMENU_NETLOADER_ACTIVE) {
|
if (hbmenu_state == HBMENU_NETLOADER_ACTIVE) {
|
||||||
if (netloader_launch_app) {
|
if (netloader_state.launch_app) {
|
||||||
hbmenu_state = HBMENU_DEFAULT;
|
hbmenu_state = HBMENU_DEFAULT;
|
||||||
|
menuCloseMsgBox();
|
||||||
|
menuMsgBoxSetNetloaderState(0, NULL);
|
||||||
menuCreateMsgBox(240,240, textGetString(StrId_Loading));
|
menuCreateMsgBox(240,240, textGetString(StrId_Loading));
|
||||||
launchMenuEntryTask(netloader_me);
|
launchMenuEntryTask(netloader_state.me);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
DrawText(interuiregular14, 64, 128 + 18, themeCurrent.textColor, textGetString(StrId_NoAppsFound_Msg));
|
DrawText(interuiregular14, 64, 128 + 18, themeCurrent.textColor, textGetString(StrId_NoAppsFound_Msg));
|
||||||
|
@ -3,6 +3,9 @@
|
|||||||
|
|
||||||
MessageBox currMsgBox;
|
MessageBox currMsgBox;
|
||||||
|
|
||||||
|
static bool msgboxNetloaderEnabled;
|
||||||
|
static char msgboxNetloaderText[256];
|
||||||
|
|
||||||
void drawMsgBoxBgToBuff(color_t *buff, int width, int height) {
|
void drawMsgBoxBgToBuff(color_t *buff, int width, int height) {
|
||||||
int x, y;
|
int x, y;
|
||||||
int off;
|
int off;
|
||||||
@ -90,6 +93,8 @@ void menuDrawMsgBox() {
|
|||||||
color_t shadow_color;
|
color_t shadow_color;
|
||||||
uint8_t shadow_alpha_base = 80;
|
uint8_t shadow_alpha_base = 80;
|
||||||
|
|
||||||
|
const char* textptr = currMsgBox.text;
|
||||||
|
|
||||||
border_color = MakeColor(themeCurrent.highlightColor.r + (255 - themeCurrent.highlightColor.r) * highlight_multiplier, themeCurrent.highlightColor.g + (255 - themeCurrent.highlightColor.g) * highlight_multiplier, themeCurrent.highlightColor.b + (255 - themeCurrent.highlightColor.b) * highlight_multiplier, 255);
|
border_color = MakeColor(themeCurrent.highlightColor.r + (255 - themeCurrent.highlightColor.r) * highlight_multiplier, themeCurrent.highlightColor.g + (255 - themeCurrent.highlightColor.g) * highlight_multiplier, themeCurrent.highlightColor.b + (255 - themeCurrent.highlightColor.b) * highlight_multiplier, 255);
|
||||||
|
|
||||||
// Darken the background
|
// Darken the background
|
||||||
@ -105,22 +110,26 @@ void menuDrawMsgBox() {
|
|||||||
off = (y * currMsgBox.width + x);
|
off = (y * currMsgBox.width + x);
|
||||||
curr_color = currMsgBox.bg[off];
|
curr_color = currMsgBox.bg[off];
|
||||||
|
|
||||||
if (((x<border_thickness || x>=currMsgBox.width-border_thickness) && y>sep_start_y) ||
|
if (!msgboxNetloaderEnabled) {
|
||||||
(y>sep_start_y && y<=sep_start_y+border_thickness) || (y>=currMsgBox.height-border_thickness)) {
|
if (((x<border_thickness || x>=currMsgBox.width-border_thickness) && y>sep_start_y) ||
|
||||||
curr_color = border_color;
|
(y>sep_start_y && y<=sep_start_y+border_thickness) || (y>=currMsgBox.height-border_thickness)) {
|
||||||
|
curr_color = border_color;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawPixel(start_x+x, start_y+y, curr_color);
|
DrawPixel(start_x+x, start_y+y, curr_color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GetTextDimensions(interuimedium20, currMsgBox.text, &text_width, &text_height);
|
if (msgboxNetloaderEnabled) textptr = msgboxNetloaderText;
|
||||||
|
|
||||||
|
GetTextDimensions(interuimedium20, textptr, &text_width, &text_height);
|
||||||
|
|
||||||
if (text_width < currMsgBox.width && text_height < sep_start_y) {
|
if (text_width < currMsgBox.width && text_height < sep_start_y) {
|
||||||
DrawText(interuiregular18, start_x + (currMsgBox.width - text_width) / 2, start_y + (currMsgBox.height - text_height - 80) / 2, MakeColor(0, 0, 0, 255), currMsgBox.text);
|
DrawText(interuiregular18, start_x + (currMsgBox.width - text_width) / 2, start_y + (currMsgBox.height - text_height - 80) / 2, MakeColor(0, 0, 0, 255), textptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawText(interuimedium20, start_x + 365, start_y + 245 + 26, MakeColor(0, 0, 0, 255), textGetString(StrId_MsgBox_OK));
|
if (!msgboxNetloaderEnabled) DrawText(interuimedium20, start_x + 365, start_y + 245 + 26, MakeColor(0, 0, 0, 255), textGetString(StrId_MsgBox_OK));
|
||||||
|
|
||||||
shadow_start_y = start_y + currMsgBox.height;
|
shadow_start_y = start_y + currMsgBox.height;
|
||||||
|
|
||||||
@ -174,3 +183,10 @@ void menuCloseMsgBox() {
|
|||||||
MessageBox menuGetCurrentMsgBox() {
|
MessageBox menuGetCurrentMsgBox() {
|
||||||
return currMsgBox;
|
return currMsgBox;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void menuMsgBoxSetNetloaderState(bool enabled, const char *text) {
|
||||||
|
msgboxNetloaderEnabled = enabled;
|
||||||
|
|
||||||
|
memset(msgboxNetloaderText, 0, sizeof(msgboxNetloaderText));
|
||||||
|
if (text) strncpy(msgboxNetloaderText, text, sizeof(msgboxNetloaderText)-1);
|
||||||
|
}
|
||||||
|
@ -13,3 +13,4 @@ void menuCloseMsgBox();
|
|||||||
bool menuIsMsgBoxOpen();
|
bool menuIsMsgBoxOpen();
|
||||||
void menuDrawMsgBox(void);
|
void menuDrawMsgBox(void);
|
||||||
MessageBox menuGetCurrentMsgBox();
|
MessageBox menuGetCurrentMsgBox();
|
||||||
|
void menuMsgBoxSetNetloaderState(bool enabled, const char *text);
|
||||||
|
@ -45,19 +45,20 @@ static unsigned char out[ZLIB_CHUNK];
|
|||||||
|
|
||||||
static mtx_t netloader_mtx;
|
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 menuEntry_s netloader_me;
|
||||||
static char netloader_errortext[1024];
|
static volatile bool netloader_initialized = 0;
|
||||||
|
static volatile bool netloader_exitflag = 0;
|
||||||
|
static volatile bool netloader_activated = 0, netloader_launchapp = 0;
|
||||||
|
static volatile size_t netloader_filelen, netloader_filetotal;
|
||||||
|
static volatile char netloader_errortext[1024];
|
||||||
|
|
||||||
static bool netloaderGetExit(void);
|
static bool netloaderGetExit(void);
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
static void netloader_error(const char *func, int err) {
|
static void netloader_error(const char *func, int err) {
|
||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
memset(netloader_errortext, 0, sizeof(netloader_errortext));
|
memset((char*)netloader_errortext, 0, sizeof(netloader_errortext));
|
||||||
snprintf(netloader_errortext, sizeof(netloader_errortext)-1, "%s: err=%d\n %s\n", func, err, strerror(errno));
|
snprintf((char*)netloader_errortext, sizeof(netloader_errortext)-1, "%s: err=%d\n %s\n", func, err, strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
@ -283,6 +284,9 @@ static int decompress(int sock, FILE *fh, size_t filesize) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
total += have;
|
total += have;
|
||||||
|
mtx_lock(&netloader_mtx);
|
||||||
|
netloader_filetotal = total;
|
||||||
|
mtx_unlock(&netloader_mtx);
|
||||||
//printf("%zu (%zd%%)",total, (100 * total) / filesize);
|
//printf("%zu (%zd%%)",total, (100 * total) / filesize);
|
||||||
} while (strm.avail_out == 0);
|
} while (strm.avail_out == 0);
|
||||||
|
|
||||||
@ -329,6 +333,10 @@ int loadnro(menuEntry_s *me, int sock, struct in_addr remote) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mtx_lock(&netloader_mtx);
|
||||||
|
netloader_filelen = filelen;
|
||||||
|
mtx_unlock(&netloader_mtx);
|
||||||
|
|
||||||
int response = 0;
|
int response = 0;
|
||||||
|
|
||||||
sanitisePath(filename);
|
sanitisePath(filename);
|
||||||
@ -411,19 +419,6 @@ int netloader_activate(void) {
|
|||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
struct sockaddr_in serv_addr;
|
struct sockaddr_in serv_addr;
|
||||||
|
|
||||||
#ifdef __SWITCH__
|
|
||||||
socketInitializeDefault();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __WIN32__
|
|
||||||
WSADATA wsa_data;
|
|
||||||
if (WSAStartup (MAKEWORD(2,2), &wsa_data)) {
|
|
||||||
netloader_error("WSAStartup failed\n",1);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
memset(&serv_addr, 0, sizeof(serv_addr));
|
memset(&serv_addr, 0, sizeof(serv_addr));
|
||||||
serv_addr.sin_family = AF_INET;
|
serv_addr.sin_family = AF_INET;
|
||||||
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
|
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||||
@ -506,40 +501,30 @@ int netloader_deactivate(void) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __SWITCH__
|
|
||||||
socketExit();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __WIN32__
|
|
||||||
WSACleanup ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
int netloader_loop(menuEntry_s *me) {
|
int netloader_loop(struct sockaddr_in *sa_remote) {
|
||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
|
|
||||||
struct sockaddr_in sa_remote;
|
|
||||||
|
|
||||||
#if PING_ENABLED
|
#if PING_ENABLED
|
||||||
char recvbuf[256];
|
char recvbuf[256];
|
||||||
socklen_t fromlen = sizeof(sa_remote);
|
socklen_t fromlen = sizeof(struct sockaddr_in);
|
||||||
|
|
||||||
int len = recvfrom(netloader_udpfd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr*) &sa_remote, &fromlen);
|
int len = recvfrom(netloader_udpfd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr*) sa_remote, &fromlen);
|
||||||
|
|
||||||
if (len!=-1) {
|
if (len!=-1) {
|
||||||
if (strncmp(recvbuf,"nxboot",strlen("nxboot")) == 0) {
|
if (strncmp(recvbuf,"nxboot",strlen("nxboot")) == 0) {
|
||||||
sa_remote.sin_family=AF_INET;
|
sa_remote->sin_family=AF_INET;
|
||||||
sa_remote.sin_port=htons(NXLINK_CLIENT_PORT);
|
sa_remote->sin_port=htons(NXLINK_CLIENT_PORT);
|
||||||
sendto(netloader_udpfd, "bootnx", strlen("bootnx"), 0, (struct sockaddr*) &sa_remote,sizeof(sa_remote));
|
sendto(netloader_udpfd, "bootnx", strlen("bootnx"), 0, (struct sockaddr*) sa_remote,sizeof(struct sockaddr_in));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if(netloader_listenfd >= 0 && netloader_datafd < 0) {
|
if(netloader_listenfd >= 0 && netloader_datafd < 0) {
|
||||||
socklen_t addrlen = sizeof(sa_remote);
|
socklen_t addrlen = sizeof(struct sockaddr_in);
|
||||||
netloader_datafd = accept(netloader_listenfd, (struct sockaddr*)&sa_remote, &addrlen);
|
netloader_datafd = accept(netloader_listenfd, (struct sockaddr*)sa_remote, &addrlen);
|
||||||
if(netloader_datafd < 0)
|
if(netloader_datafd < 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -561,33 +546,30 @@ int netloader_loop(menuEntry_s *me) {
|
|||||||
{
|
{
|
||||||
close(netloader_listenfd);
|
close(netloader_listenfd);
|
||||||
netloader_listenfd = -1;
|
netloader_listenfd = -1;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(netloader_datafd >= 0)
|
|
||||||
{
|
|
||||||
int result = loadnro(me, netloader_datafd,sa_remote.sin_addr);
|
|
||||||
if (result== 0) {
|
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void netloaderGetState(bool *activated, bool *launch_app, menuEntry_s **me, char *errormsg, size_t errormsg_size) {
|
void netloaderGetState(netloaderState *state) {
|
||||||
|
if(state==NULL)return;
|
||||||
mtx_lock(&netloader_mtx);
|
mtx_lock(&netloader_mtx);
|
||||||
|
|
||||||
*activated = netloader_activated;
|
state->activated = netloader_activated;
|
||||||
*launch_app = netloader_launchapp;
|
state->launch_app = netloader_launchapp;
|
||||||
*me = &netloader_me;
|
state->me = &netloader_me;
|
||||||
|
|
||||||
memset(errormsg, 0, errormsg_size);
|
state->transferring = (netloader_datafd >= 0 && netloader_filelen);
|
||||||
|
state->sock_connected = netloader_datafd >= 0;
|
||||||
|
state->filelen = netloader_filelen;
|
||||||
|
state->filetotal = netloader_filetotal;
|
||||||
|
|
||||||
|
memset(state->errormsg, 0, sizeof(state->errormsg));
|
||||||
if(netloader_errortext[0]) {
|
if(netloader_errortext[0]) {
|
||||||
strncpy(errormsg, netloader_errortext, errormsg_size-1);
|
strncpy(state->errormsg, (char*)netloader_errortext, sizeof(state->errormsg)-1);
|
||||||
memset(netloader_errortext, 0, sizeof(netloader_errortext));
|
memset((char*)netloader_errortext, 0, sizeof(netloader_errortext));
|
||||||
}
|
}
|
||||||
|
|
||||||
mtx_unlock(&netloader_mtx);
|
mtx_unlock(&netloader_mtx);
|
||||||
@ -609,13 +591,31 @@ void netloaderSignalExit(void) {
|
|||||||
mtx_unlock(&netloader_mtx);
|
mtx_unlock(&netloader_mtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool netloaderInit(void) {
|
Result netloaderInit(void) {
|
||||||
if (netloader_initialized) return 1;
|
Result rc=0;
|
||||||
|
if (netloader_initialized) return 0;
|
||||||
|
|
||||||
if (mtx_init(&netloader_mtx, mtx_plain) != thrd_success) return 0;
|
if (mtx_init(&netloader_mtx, mtx_plain) != thrd_success) return 1;
|
||||||
|
|
||||||
|
#ifdef __SWITCH__
|
||||||
|
rc = socketInitializeDefault();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __WIN32__
|
||||||
|
WSADATA wsa_data;
|
||||||
|
if (WSAStartup (MAKEWORD(2,2), &wsa_data)) {
|
||||||
|
//netloader_error("WSAStartup failed\n",1);
|
||||||
|
rc = 2;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (rc) {
|
||||||
|
mtx_destroy(&netloader_mtx);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
netloader_initialized = 1;
|
netloader_initialized = 1;
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void netloaderExit(void) {
|
void netloaderExit(void) {
|
||||||
@ -623,16 +623,28 @@ void netloaderExit(void) {
|
|||||||
netloader_initialized = 0;
|
netloader_initialized = 0;
|
||||||
|
|
||||||
mtx_destroy(&netloader_mtx);
|
mtx_destroy(&netloader_mtx);
|
||||||
|
|
||||||
|
#ifdef __SWITCH__
|
||||||
|
socketExit();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __WIN32__
|
||||||
|
WSACleanup ();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void netloaderTask(void* arg) {
|
void netloaderTask(void* arg) {
|
||||||
int ret=0;
|
int ret=0;
|
||||||
|
struct sockaddr_in sa_remote;
|
||||||
|
struct timespec duration = {.tv_nsec = 100000000};
|
||||||
menuEntryInit(&netloader_me,ENTRY_TYPE_FILE);
|
menuEntryInit(&netloader_me,ENTRY_TYPE_FILE);
|
||||||
|
|
||||||
mtx_lock(&netloader_mtx);
|
mtx_lock(&netloader_mtx);
|
||||||
netloader_exitflag = 0;
|
netloader_exitflag = 0;
|
||||||
netloader_activated = 0;
|
netloader_activated = 0;
|
||||||
netloader_launchapp = 0;
|
netloader_launchapp = 0;
|
||||||
|
netloader_filelen = 0;
|
||||||
|
netloader_filetotal = 0;
|
||||||
mtx_unlock(&netloader_mtx);
|
mtx_unlock(&netloader_mtx);
|
||||||
|
|
||||||
if(netloader_activate() == 0) {
|
if(netloader_activate() == 0) {
|
||||||
@ -645,13 +657,24 @@ void netloaderTask(void* arg) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
while((ret = netloader_loop(&netloader_me)) == 0 && !netloaderGetExit());
|
while((ret = netloader_loop(&sa_remote)) == 0 && !netloaderGetExit()) {
|
||||||
|
thrd_sleep(&duration, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ret == 1 && !netloaderGetExit()) {
|
||||||
|
int result = loadnro(&netloader_me, netloader_datafd,sa_remote.sin_addr);
|
||||||
|
if (result== 0) {
|
||||||
|
ret = 1;
|
||||||
|
} else {
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
netloader_deactivate();
|
netloader_deactivate();
|
||||||
mtx_lock(&netloader_mtx);
|
mtx_lock(&netloader_mtx);
|
||||||
|
if (ret==1 && !netloader_exitflag) netloader_launchapp = 1;//Access netloader_exitflag directly since the mutex is already locked.
|
||||||
netloader_exitflag = 0;
|
netloader_exitflag = 0;
|
||||||
netloader_activated = 0;
|
netloader_activated = 0;
|
||||||
if (ret==1 && !netloader_exitflag) netloader_launchapp = 1;//Access netloader_exitflag directly since the mutex is already locked.
|
|
||||||
mtx_unlock(&netloader_mtx);
|
mtx_unlock(&netloader_mtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,13 +1,23 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
bool activated;
|
||||||
|
bool launch_app;
|
||||||
|
bool transferring;
|
||||||
|
bool sock_connected;
|
||||||
|
menuEntry_s *me;
|
||||||
|
size_t filelen, filetotal;
|
||||||
|
char errormsg[1025];
|
||||||
|
} netloaderState;
|
||||||
|
|
||||||
int netloader_activate(void);
|
int netloader_activate(void);
|
||||||
int netloader_deactivate(void);
|
int netloader_deactivate(void);
|
||||||
int netloader_loop(menuEntry_s *me);
|
int netloader_loop(struct sockaddr_in *sa_remote);
|
||||||
|
|
||||||
bool netloaderInit(void);
|
Result netloaderInit(void);
|
||||||
void netloaderExit(void);
|
void netloaderExit(void);
|
||||||
|
|
||||||
void netloaderTask(void* arg);
|
void netloaderTask(void* arg);
|
||||||
|
|
||||||
void netloaderGetState(bool *activated, bool *launch_app, menuEntry_s **me, char *errormsg, size_t errormsg_size);
|
void netloaderGetState(netloaderState *state);
|
||||||
void netloaderSignalExit(void);
|
void netloaderSignalExit(void);
|
||||||
|
@ -64,13 +64,15 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
if (R_SUCCEEDED(rc)) powerInit();
|
if (R_SUCCEEDED(rc)) powerInit();
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc) && !netloaderInit()) {
|
if (R_SUCCEEDED(rc)) {
|
||||||
rc = 1;
|
rc = netloaderInit();
|
||||||
snprintf(errormsg, sizeof(errormsg)-1, "Error: netloaderInit() failed.");
|
if (R_FAILED(rc)) {
|
||||||
|
snprintf(errormsg, sizeof(errormsg)-1, "Error: netloaderInit() failed: 0x%x.", rc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc) && !workerInit()) {
|
if (R_SUCCEEDED(rc) && !workerInit()) {
|
||||||
rc = 2;
|
rc = 1;
|
||||||
snprintf(errormsg, sizeof(errormsg)-1, "Error: workerInit() failed.");
|
snprintf(errormsg, sizeof(errormsg)-1, "Error: workerInit() failed.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,13 +80,13 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
if (R_SUCCEEDED(rc)) {
|
if (R_SUCCEEDED(rc)) {
|
||||||
if (!launchInit()) {
|
if (!launchInit()) {
|
||||||
rc = 3;
|
rc = 2;
|
||||||
snprintf(errormsg, sizeof(errormsg)-1, "Error: launchInit() failed.");
|
snprintf(errormsg, sizeof(errormsg)-1, "Error: launchInit() failed.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc) && !fontInitialize()) {
|
if (R_SUCCEEDED(rc) && !fontInitialize()) {
|
||||||
rc = 4;
|
rc = 3;
|
||||||
snprintf(errormsg, sizeof(errormsg)-1, "Error: fontInitialize() failed.");
|
snprintf(errormsg, sizeof(errormsg)-1, "Error: fontInitialize() failed.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user