mirror of
https://github.com/HamletDuFromage/aio-switch-updater.git
synced 2024-11-24 18:42:05 +00:00
Added internet settings editor and web browser
This commit is contained in:
parent
2ed12fa1e3
commit
12147ff18f
17 changed files with 443 additions and 13 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1,4 +1,4 @@
|
||||||
.vscode/
|
#.vscode/
|
||||||
build/
|
build/
|
||||||
screenshots/
|
screenshots/
|
||||||
switch/
|
switch/
|
||||||
|
|
24
.vscode/c_cpp_properties.json
vendored
Normal file
24
.vscode/c_cpp_properties.json
vendored
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "DKP Aarch64",
|
||||||
|
"includePath": [
|
||||||
|
"${workspaceFolder}/**",
|
||||||
|
"${DEVKITPRO}/devkitA64/include/**",
|
||||||
|
"${DEVKITPRO}/devkitA64/aarch64-none-elf/include/**",
|
||||||
|
"${DEVKITPRO}/libnx/include/**",
|
||||||
|
"${DEVKITPRO}/portlibs/switch/include/**"
|
||||||
|
],
|
||||||
|
"defines": [
|
||||||
|
"DEBUG",
|
||||||
|
"SWITCH",
|
||||||
|
"__SWITCH__"
|
||||||
|
],
|
||||||
|
"compilerPath": "${DEVKITPRO}/devkitA64/bin/aarch64-none-elf-g++",
|
||||||
|
"cStandard": "c11",
|
||||||
|
"cppStandard": "c++17",
|
||||||
|
"intelliSenseMode": "gcc-x64"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"version": 4
|
||||||
|
}
|
74
.vscode/settings.json
vendored
Normal file
74
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
{
|
||||||
|
"files.associations": {
|
||||||
|
"sstream": "cpp",
|
||||||
|
"format": "cpp",
|
||||||
|
"array": "cpp",
|
||||||
|
"atomic": "cpp",
|
||||||
|
"bit": "cpp",
|
||||||
|
"*.tcc": "cpp",
|
||||||
|
"bitset": "cpp",
|
||||||
|
"cctype": "cpp",
|
||||||
|
"chrono": "cpp",
|
||||||
|
"clocale": "cpp",
|
||||||
|
"cmath": "cpp",
|
||||||
|
"codecvt": "cpp",
|
||||||
|
"compare": "cpp",
|
||||||
|
"concepts": "cpp",
|
||||||
|
"condition_variable": "cpp",
|
||||||
|
"cstdarg": "cpp",
|
||||||
|
"cstddef": "cpp",
|
||||||
|
"cstdint": "cpp",
|
||||||
|
"cstdio": "cpp",
|
||||||
|
"cstdlib": "cpp",
|
||||||
|
"cstring": "cpp",
|
||||||
|
"ctime": "cpp",
|
||||||
|
"cwchar": "cpp",
|
||||||
|
"cwctype": "cpp",
|
||||||
|
"deque": "cpp",
|
||||||
|
"forward_list": "cpp",
|
||||||
|
"list": "cpp",
|
||||||
|
"map": "cpp",
|
||||||
|
"set": "cpp",
|
||||||
|
"unordered_map": "cpp",
|
||||||
|
"vector": "cpp",
|
||||||
|
"exception": "cpp",
|
||||||
|
"algorithm": "cpp",
|
||||||
|
"functional": "cpp",
|
||||||
|
"iterator": "cpp",
|
||||||
|
"memory": "cpp",
|
||||||
|
"memory_resource": "cpp",
|
||||||
|
"numeric": "cpp",
|
||||||
|
"optional": "cpp",
|
||||||
|
"random": "cpp",
|
||||||
|
"ratio": "cpp",
|
||||||
|
"regex": "cpp",
|
||||||
|
"string": "cpp",
|
||||||
|
"string_view": "cpp",
|
||||||
|
"system_error": "cpp",
|
||||||
|
"tuple": "cpp",
|
||||||
|
"type_traits": "cpp",
|
||||||
|
"utility": "cpp",
|
||||||
|
"fstream": "cpp",
|
||||||
|
"initializer_list": "cpp",
|
||||||
|
"iomanip": "cpp",
|
||||||
|
"iosfwd": "cpp",
|
||||||
|
"iostream": "cpp",
|
||||||
|
"istream": "cpp",
|
||||||
|
"limits": "cpp",
|
||||||
|
"new": "cpp",
|
||||||
|
"ostream": "cpp",
|
||||||
|
"ranges": "cpp",
|
||||||
|
"shared_mutex": "cpp",
|
||||||
|
"stdexcept": "cpp",
|
||||||
|
"stop_token": "cpp",
|
||||||
|
"streambuf": "cpp",
|
||||||
|
"thread": "cpp",
|
||||||
|
"cinttypes": "cpp",
|
||||||
|
"typeinfo": "cpp",
|
||||||
|
"valarray": "cpp",
|
||||||
|
"buffer": "cpp",
|
||||||
|
"internet": "cpp",
|
||||||
|
"socket": "cpp",
|
||||||
|
"variant": "cpp"
|
||||||
|
}
|
||||||
|
}
|
2
Makefile
2
Makefile
|
@ -45,7 +45,7 @@ DATA := data
|
||||||
INCLUDES := include lib/zipper/include
|
INCLUDES := include lib/zipper/include
|
||||||
APP_TITLE := All-in-One Switch Updater
|
APP_TITLE := All-in-One Switch Updater
|
||||||
APP_AUTHOR := HamletDuFromage
|
APP_AUTHOR := HamletDuFromage
|
||||||
APP_VERSION := 1.3.2
|
APP_VERSION := 1.4.0
|
||||||
TARGET := $(notdir $(CURDIR))-v$(APP_VERSION)
|
TARGET := $(notdir $(CURDIR))-v$(APP_VERSION)
|
||||||
|
|
||||||
ROMFS := resources
|
ROMFS := resources
|
||||||
|
|
|
@ -36,6 +36,8 @@ Downloads and extracts daily-updated cheat code. The program will only extract c
|
||||||
- Change software color scheme of Joy-Cons. Additional color profiles can be found in the releases and should be copied to `config/aio-switch-updater/jc_profiles.json`.
|
- Change software color scheme of Joy-Cons. Additional color profiles can be found in the releases and should be copied to `config/aio-switch-updater/jc_profiles.json`.
|
||||||
- Change software color scheme of Pro controllers (has to be paired as Player 1). Additional color profiles can be found in the releases and should be copied to `config/aio-switch-updater/pc_profiles.json`.
|
- Change software color scheme of Pro controllers (has to be paired as Player 1). Additional color profiles can be found in the releases and should be copied to `config/aio-switch-updater/pc_profiles.json`.
|
||||||
- View which of your games got cheat codes from the app.
|
- View which of your games got cheat codes from the app.
|
||||||
|
- Launch the Switch's web browser.
|
||||||
|
- Edit internet settings (DNS, IP address, MTU, etc). Add you own configs to `config/aio-switch-updater/internet.json`. You can find a template in the root of the repo.
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
![ss](https://user-images.githubusercontent.com/61667930/93691403-30fb2e80-fad4-11ea-9701-7992a1de53e0.jpg)
|
![ss](https://user-images.githubusercontent.com/61667930/93691403-30fb2e80-fad4-11ea-9701-7992a1de53e0.jpg)
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#define CHEATS_FILENAME "/config/aio-switch-updater/cheats.zip"
|
#define CHEATS_FILENAME "/config/aio-switch-updater/cheats.zip"
|
||||||
#define CHEATS_EXCLUDE "/config/aio-switch-updater/exclude.txt"
|
#define CHEATS_EXCLUDE "/config/aio-switch-updater/exclude.txt"
|
||||||
#define FILES_IGNORE "/config/aio-switch-updater/preserve.txt"
|
#define FILES_IGNORE "/config/aio-switch-updater/preserve.txt"
|
||||||
|
#define INTERNET_JSON "/config/aio-switch-updater/internet.json"
|
||||||
#define UPDATED_TITLES_PATH "/config/aio-switch-updater/updated.dat"
|
#define UPDATED_TITLES_PATH "/config/aio-switch-updater/updated.dat"
|
||||||
#define CHEATS_VERSION "/config/aio-switch-updater/cheats_version.dat"
|
#define CHEATS_VERSION "/config/aio-switch-updater/cheats_version.dat"
|
||||||
#define AMS_CONTENTS "/atmosphere/contents/"
|
#define AMS_CONTENTS "/atmosphere/contents/"
|
||||||
|
|
28
include/net_page.hpp
Normal file
28
include/net_page.hpp
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <borealis.hpp>
|
||||||
|
#include <switch.h>
|
||||||
|
#include <json.hpp>
|
||||||
|
#include "constants.hpp"
|
||||||
|
#include "main_frame.hpp"
|
||||||
|
#include <fstream>
|
||||||
|
#include <filesystem>
|
||||||
|
#include <tuple>
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
|
#define AF_INET 2
|
||||||
|
|
||||||
|
class NetPage : public brls::AppletFrame
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
brls::List* list;
|
||||||
|
brls::Label* label;
|
||||||
|
std::vector<brls::ListItem*> listItems;
|
||||||
|
brls::ListItem* cancel;
|
||||||
|
|
||||||
|
public:
|
||||||
|
NetPage();
|
||||||
|
std::string ipToString(u8* ip);
|
||||||
|
int stringToIp(std::string ip, u8* out);
|
||||||
|
|
||||||
|
};
|
|
@ -10,6 +10,7 @@
|
||||||
#include "language_option_page.hpp"
|
#include "language_option_page.hpp"
|
||||||
#include "JC_page.hpp"
|
#include "JC_page.hpp"
|
||||||
#include "PC_page.hpp"
|
#include "PC_page.hpp"
|
||||||
|
#include "net_page.hpp"
|
||||||
#include "extract.hpp"
|
#include "extract.hpp"
|
||||||
#include "utils.hpp"
|
#include "utils.hpp"
|
||||||
//#include "ntcp.hpp"
|
//#include "ntcp.hpp"
|
||||||
|
@ -27,6 +28,8 @@ class ToolsTab : public brls::List
|
||||||
brls::ListItem* language;
|
brls::ListItem* language;
|
||||||
brls::ListItem* cleanUp;
|
brls::ListItem* cleanUp;
|
||||||
brls::ListItem* ntcp;
|
brls::ListItem* ntcp;
|
||||||
|
brls::ListItem* netSettings;
|
||||||
|
brls::ListItem* browser;
|
||||||
|
|
||||||
brls::StagedAppletFrame* stagedFrame;
|
brls::StagedAppletFrame* stagedFrame;
|
||||||
|
|
||||||
|
|
14
internet.json
Normal file
14
internet.json
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"ip_addr": "10.13.222.222",
|
||||||
|
"subnet_mask": "255.255.0.0",
|
||||||
|
"gateway": "10.13.37.1",
|
||||||
|
"mtu": 1500,
|
||||||
|
"name": "ACNH lan-play"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dns1": "1.1.1.1",
|
||||||
|
"dns2": "1.0.0.1",
|
||||||
|
"name": "Cloudfare DNS"
|
||||||
|
}
|
||||||
|
]
|
|
@ -3,5 +3,15 @@
|
||||||
"BODY": "2d2d2d",
|
"BODY": "2d2d2d",
|
||||||
"BTN": "e6e6e6",
|
"BTN": "e6e6e6",
|
||||||
"name": "Default black"
|
"name": "Default black"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"BODY": "82FF96",
|
||||||
|
"BTN": "0A1E0A",
|
||||||
|
"name": "ACNH green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"BODY": "96F5F5",
|
||||||
|
"BTN": "0A1E28",
|
||||||
|
"name": "ACNH blue"
|
||||||
}
|
}
|
||||||
]
|
]
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
"app_page.cpp":"",
|
"app_page.cpp":"",
|
||||||
"app_title": "Installed cheats",
|
"app_title": "Installed cheats",
|
||||||
"app_label": "The following titles have recieved cheat code updates the last time you used the app. Please note that despite having been downloaded for a game, cheats may not match its current update.",
|
"app_label": "The following titles have received cheat code updates the last time you used the app. Please note that despite having been downloaded for a game, cheats may not match its current update.",
|
||||||
"text_download": "Downloading:\nLatest cheat codes\n\nFrom:\n",
|
"text_download": "Downloading:\nLatest cheat codes\n\nFrom:\n",
|
||||||
"text_download_list": "Download latest cheat codes",
|
"text_download_list": "Download latest cheat codes",
|
||||||
"text_title": "Getting cheat codes",
|
"text_title": "Getting cheat codes",
|
||||||
|
@ -48,6 +48,8 @@
|
||||||
"v1_3_1_text": "\uE016 Small fixes for bugs causing hangs.",
|
"v1_3_1_text": "\uE016 Small fixes for bugs causing hangs.",
|
||||||
"v1_3_2": "v1.3.2",
|
"v1_3_2": "v1.3.2",
|
||||||
"v1_3_2_text": "\uE016 Added ability to change the internet color of Pro controllers.\n\uE016 Added the ability to preserve specific files when updating.\n\uE016 Added the ability to clean up downloaded archives.",
|
"v1_3_2_text": "\uE016 Added ability to change the internet color of Pro controllers.\n\uE016 Added the ability to preserve specific files when updating.\n\uE016 Added the ability to clean up downloaded archives.",
|
||||||
|
"v1_4_0": "v1.4.0",
|
||||||
|
"v1_4_0_text": "\uE016 Added possibility to use pre-set network settings. Add your own in `config/aio-switch-updater/internet.json.\n\uE016 Added web browser.",
|
||||||
"Ok_button": "Ok",
|
"Ok_button": "Ok",
|
||||||
|
|
||||||
"cheats_page.cpp":"",
|
"cheats_page.cpp":"",
|
||||||
|
@ -99,6 +101,7 @@
|
||||||
"jc_change": "Changing color. Make sure the Joy-Con are docked. If the process hangs, try docking/undocking the JCs.",
|
"jc_change": "Changing color. Make sure the Joy-Con are docked. If the process hangs, try docking/undocking the JCs.",
|
||||||
"jc_all_": "All done! You may need to dock/undock your Joy-Cons for the change to take effect.",
|
"jc_all_": "All done! You may need to dock/undock your Joy-Cons for the change to take effect.",
|
||||||
|
|
||||||
|
"pro_con": "Pro-Con color swapper",
|
||||||
"pc_you_can" : "You can change the internal color of your Pro controller. Make sure it's set to Player 1.",
|
"pc_you_can" : "You can change the internal color of your Pro controller. Make sure it's set to Player 1.",
|
||||||
"pc_color": "Pro controller color swapper",
|
"pc_color": "Pro controller color swapper",
|
||||||
"pc_backing": "Backing up the color profile",
|
"pc_backing": "Backing up the color profile",
|
||||||
|
@ -162,6 +165,8 @@
|
||||||
"tool_all_done": " All done!",
|
"tool_all_done": " All done!",
|
||||||
"tool_changelog": "Changelog",
|
"tool_changelog": "Changelog",
|
||||||
"tool_cleanUp": "Clean up downloaded files",
|
"tool_cleanUp": "Clean up downloaded files",
|
||||||
|
"tool_net_settings": "Edit internet settings",
|
||||||
|
"tool_browser": "Web Brower",
|
||||||
|
|
||||||
"utils.cpp":"",
|
"utils.cpp":"",
|
||||||
"utils_because": "Because of the size of the FW archive, downloading firmwares in Applet Mode is not supported. Please launch the app with full RAM access.",
|
"utils_because": "Because of the size of the FW archive, downloading firmwares in Applet Mode is not supported. Please launch the app with full RAM access.",
|
||||||
|
@ -177,7 +182,12 @@
|
||||||
"reboot_rcm" : "The Switch will now launch reboot to a special payload in order to finalise the install.",
|
"reboot_rcm" : "The Switch will now launch reboot to a special payload in order to finalise the install.",
|
||||||
"hekate_dialogue" : "Do you want to also download Hekate?\nIf not, the Switch will now launch reboot to a special payload in order to finalise the install.",
|
"hekate_dialogue" : "Do you want to also download Hekate?\nIf not, the Switch will now launch reboot to a special payload in order to finalise the install.",
|
||||||
"Yes" : "Yes",
|
"Yes" : "Yes",
|
||||||
"No" : "No"
|
"No" : "No",
|
||||||
|
|
||||||
|
"go_back" : "Go back",
|
||||||
|
"Confirm_button" : "Confirm",
|
||||||
|
"Cancel_button" : "Cancel"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ namespace i18n = brls::i18n;
|
||||||
using namespace i18n::literals;
|
using namespace i18n::literals;
|
||||||
PCPage::PCPage() : AppletFrame(true, true)
|
PCPage::PCPage() : AppletFrame(true, true)
|
||||||
{
|
{
|
||||||
this->setTitle("menus/joy_con"_i18n );
|
this->setTitle("menus/pro_con"_i18n );
|
||||||
list = new brls::List();
|
list = new brls::List();
|
||||||
std::string labelText = "menus/pc_you_can"_i18n;
|
std::string labelText = "menus/pc_you_can"_i18n;
|
||||||
label = new brls::Label(brls::LabelStyle::DESCRIPTION, labelText, true);
|
label = new brls::Label(brls::LabelStyle::DESCRIPTION, labelText, true);
|
||||||
|
|
|
@ -58,6 +58,9 @@ ChangelogPage::ChangelogPage() : AppletFrame(true, true)
|
||||||
verTitles.push_back("menus/v1_3_2"_i18n );
|
verTitles.push_back("menus/v1_3_2"_i18n );
|
||||||
changes.push_back("menus/v1_3_2_text"_i18n );
|
changes.push_back("menus/v1_3_2_text"_i18n );
|
||||||
|
|
||||||
|
verTitles.push_back("menus/v1_4_0"_i18n );
|
||||||
|
changes.push_back("menus/v1_4_0_text"_i18n );
|
||||||
|
|
||||||
int nbVersions = verTitles.size();
|
int nbVersions = verTitles.size();
|
||||||
items.reserve(nbVersions);
|
items.reserve(nbVersions);
|
||||||
for(int i = nbVersions -1 ; i >= 0; i--){
|
for(int i = nbVersions -1 ; i >= 0; i--){
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#include <stdio.h>
|
//#include <stdio.h>
|
||||||
#include <stdlib.h>
|
//#include <stdlib.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <switch.h>
|
#include <switch.h>
|
||||||
|
|
||||||
|
@ -10,8 +10,8 @@
|
||||||
#include "utils.hpp"
|
#include "utils.hpp"
|
||||||
|
|
||||||
|
|
||||||
#include <string.h>
|
//#include <string.h>
|
||||||
#include <stdio.h>
|
//#include <stdio.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <sys/errno.h>
|
#include <sys/errno.h>
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
namespace i18n = brls::i18n;
|
namespace i18n = brls::i18n;
|
||||||
using namespace i18n::literals;
|
using namespace i18n::literals;
|
||||||
|
|
||||||
TimeServiceType __nx_time_service_type = TimeServiceType_System;
|
//TimeServiceType __nx_time_service_type = TimeServiceType_System;
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
|
|
@ -13,7 +13,7 @@ MainFrame::MainFrame() : TabFrame()
|
||||||
|
|
||||||
this->addTab("menus/main_about"_i18n , new AboutTab());
|
this->addTab("menus/main_about"_i18n , new AboutTab());
|
||||||
|
|
||||||
this->addSeparator();
|
//this->addSeparator();
|
||||||
|
|
||||||
this->addTab("menus/main_update_ams"_i18n , new AmsTab());
|
this->addTab("menus/main_update_ams"_i18n , new AmsTab());
|
||||||
this->addTab("menus/main_update_cfw"_i18n , new ListDownloadTab(cfw));
|
this->addTab("menus/main_update_cfw"_i18n , new ListDownloadTab(cfw));
|
||||||
|
|
216
source/net_page.cpp
Normal file
216
source/net_page.cpp
Normal file
|
@ -0,0 +1,216 @@
|
||||||
|
#include "net_page.hpp"
|
||||||
|
#include <iostream>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace i18n = brls::i18n;
|
||||||
|
using namespace i18n::literals;
|
||||||
|
using json = nlohmann::json;
|
||||||
|
|
||||||
|
NetPage::NetPage() : AppletFrame(true, true)
|
||||||
|
{
|
||||||
|
this->setTitle("menus/net_settings"_i18n );
|
||||||
|
|
||||||
|
nifmInitialize(NifmServiceType_User);
|
||||||
|
NifmNetworkProfileData profile;
|
||||||
|
nifmGetCurrentNetworkProfile (&profile);
|
||||||
|
nifmExit();
|
||||||
|
|
||||||
|
int uuid = 0;
|
||||||
|
for (int j = 0; j < 16; j++) uuid += int(profile.uuid.uuid[j]);
|
||||||
|
|
||||||
|
std::string labelText = "";
|
||||||
|
if(uuid){
|
||||||
|
labelText = "IP Adress: " + ipToString(profile.ip_setting_data.ip_address_setting.current_addr.addr)
|
||||||
|
+"\nSubnet Mask: " + ipToString(profile.ip_setting_data.ip_address_setting.subnet_mask.addr)
|
||||||
|
+"\nGateway: " + ipToString(profile.ip_setting_data.ip_address_setting.gateway.addr)
|
||||||
|
+"\nMTU: " + std::to_string(unsigned(profile.ip_setting_data.mtu));
|
||||||
|
|
||||||
|
if(profile.ip_setting_data.dns_setting.is_automatic){
|
||||||
|
labelText += "\nDNS: Automatic";
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
labelText += "\nPrimary DNS: " + ipToString(profile.ip_setting_data.dns_setting.primary_dns_server.addr)
|
||||||
|
+"\nSecondary DNS: "+ ipToString(profile.ip_setting_data.dns_setting.secondary_dns_server.addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
labelText = "Please connect to internet to use this feature.";
|
||||||
|
}
|
||||||
|
|
||||||
|
list = new brls::List();
|
||||||
|
label = new brls::Label(brls::LabelStyle::DESCRIPTION, labelText, true);
|
||||||
|
list->addView(label);
|
||||||
|
|
||||||
|
//ip_addr
|
||||||
|
//subnet_mask
|
||||||
|
//gateway
|
||||||
|
//dns1
|
||||||
|
//dns2
|
||||||
|
//mtu
|
||||||
|
//ip_auto
|
||||||
|
//dns_auto
|
||||||
|
|
||||||
|
if(uuid){
|
||||||
|
std::fstream profilesFile;
|
||||||
|
json profiles;
|
||||||
|
if(std::filesystem::exists(INTERNET_JSON)){
|
||||||
|
profilesFile.open(INTERNET_JSON, std::fstream::in);
|
||||||
|
profilesFile >> profiles;
|
||||||
|
profilesFile.close();
|
||||||
|
profiles.push_back(json::object({
|
||||||
|
{"name", "90DNS (Europe)"},
|
||||||
|
{"dns1", "163.172.141.219"},
|
||||||
|
{"dns2", "207.246.121.77"}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
profiles = {{
|
||||||
|
{"name", "90DNS (Europe)"},
|
||||||
|
{"dns1", "163.172.141.219"},
|
||||||
|
{"dns2", "207.246.121.77"}
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
|
profiles.push_back(json::object({
|
||||||
|
{"name", "90DNS (USA)"},
|
||||||
|
{"dns1", "207.246.121.77"},
|
||||||
|
{"dns2", "163.172.141.219"}
|
||||||
|
}));
|
||||||
|
|
||||||
|
profiles.push_back(json::object({
|
||||||
|
{"name", "Google DNS"},
|
||||||
|
{"dns1", "8.8.8.8"},
|
||||||
|
{"dns2", "8.8.4.4"}
|
||||||
|
}));
|
||||||
|
|
||||||
|
profiles.push_back(json::object({
|
||||||
|
{"name", "Automatic IP Address"},
|
||||||
|
{"ip_auto", true}
|
||||||
|
}));
|
||||||
|
|
||||||
|
profiles.push_back(json::object({
|
||||||
|
{"name", "Automatic DNS"},
|
||||||
|
{"dns_auto", true}
|
||||||
|
}));
|
||||||
|
|
||||||
|
profiles.push_back(json::object({
|
||||||
|
{"ip_addr", "10.13.111.111"},
|
||||||
|
{"subnet_mask", "255.255.0.0"},
|
||||||
|
{"gateway", "10.13.37.1"},
|
||||||
|
{"mtu", 1500},
|
||||||
|
{"name", "ACNH lan-play"}
|
||||||
|
}));
|
||||||
|
|
||||||
|
int nbProfiles = profiles.size();
|
||||||
|
listItems.reserve(nbProfiles);
|
||||||
|
|
||||||
|
int iter = 0;
|
||||||
|
for (const auto& p : profiles.items()){
|
||||||
|
json values = p.value();
|
||||||
|
if(values.find("name") != values.end()) listItems[iter] = new brls::ListItem(values["name"]);
|
||||||
|
else listItems[iter] = new brls::ListItem("Unnamed");
|
||||||
|
listItems[iter]->getClickEvent()->subscribe([&, values](brls::View* view){
|
||||||
|
brls::Dialog* dialog = new brls::Dialog(values.dump(0).substr(1, values.dump(0).size() - 2));
|
||||||
|
brls::GenericEvent::Callback callbackOk = [&, dialog, values](brls::View* view) {
|
||||||
|
nifmInitialize(NifmServiceType_Admin);
|
||||||
|
NifmNetworkProfileData profile;
|
||||||
|
nifmGetCurrentNetworkProfile (&profile);
|
||||||
|
unsigned char buf[sizeof(struct in6_addr)];
|
||||||
|
if(values.find("ip_addr") != values.end()){
|
||||||
|
if(inet_pton(AF_INET, std::string(values["ip_addr"]).c_str(), buf)){
|
||||||
|
profile.ip_setting_data.ip_address_setting.is_automatic = u8(0);
|
||||||
|
//nifmSetNetworkProfile(&profile, &profile.uuid);
|
||||||
|
stringToIp(std::string(values["ip_addr"]), profile.ip_setting_data.ip_address_setting.current_addr.addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(values.find("subnet_mask") != values.end()){
|
||||||
|
if(inet_pton(AF_INET, std::string(values["subnet_mask"]).c_str(), buf)){
|
||||||
|
stringToIp(std::string(values["subnet_mask"]), profile.ip_setting_data.ip_address_setting.subnet_mask.addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(values.find("gateway") != values.end()){
|
||||||
|
if(inet_pton(AF_INET, std::string(values["gateway"]).c_str(), buf)){
|
||||||
|
stringToIp(std::string(values["gateway"]), profile.ip_setting_data.ip_address_setting.gateway.addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(values.find("dns1") != values.end()){
|
||||||
|
if(inet_pton(AF_INET, std::string(values["dns1"]).c_str(), buf)){
|
||||||
|
profile.ip_setting_data.dns_setting.is_automatic = u8(0);
|
||||||
|
stringToIp(std::string(values["dns1"]), profile.ip_setting_data.dns_setting.primary_dns_server.addr);
|
||||||
|
//std::cout << unsigned(profile.ip_setting_data.dns_setting.primary_dns_server.addr[0]) << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(values.find("dns2") != values.end()){
|
||||||
|
if(inet_pton(AF_INET, std::string(values["dns2"]).c_str(), buf)){
|
||||||
|
profile.ip_setting_data.dns_setting.is_automatic = u8(0);
|
||||||
|
stringToIp(std::string(values["dns2"]), profile.ip_setting_data.dns_setting.secondary_dns_server.addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(values.find("mtu") != values.end()){
|
||||||
|
profile.ip_setting_data.mtu = u16(values["mtu"]);
|
||||||
|
/* try{
|
||||||
|
u8 mtu = u8(std::stoi(std::string(values["mtu"])));
|
||||||
|
profile.ip_setting_data.mtu = mtu;
|
||||||
|
}
|
||||||
|
catch(const std::invalid_argument& ia){} */
|
||||||
|
}
|
||||||
|
if(values.find("ip_auto") != values.end()){
|
||||||
|
profile.ip_setting_data.ip_address_setting.is_automatic = u8(values["ip_auto"]);
|
||||||
|
}
|
||||||
|
if(values.find("dns_auto") != values.end()){
|
||||||
|
profile.ip_setting_data.dns_setting.is_automatic = u8(values["dns_auto"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
nifmSetNetworkProfile(&profile, &profile.uuid);
|
||||||
|
nifmSetWirelessCommunicationEnabled(true);
|
||||||
|
nifmExit();
|
||||||
|
usleep(2500000); //Wait to avoid crashes when leaving too fast
|
||||||
|
dialog->close();
|
||||||
|
//brls::Application::pushView(new NetPage());
|
||||||
|
};
|
||||||
|
brls::GenericEvent::Callback callbackNo = [dialog](brls::View* view) {
|
||||||
|
dialog->close();
|
||||||
|
};
|
||||||
|
dialog->addButton("menus/Confirm_button"_i18n , callbackOk);
|
||||||
|
dialog->addButton("menus/Cancel_button"_i18n , callbackNo);
|
||||||
|
dialog->setCancelable(false);
|
||||||
|
dialog->open();
|
||||||
|
});
|
||||||
|
list->addView(listItems[iter]);
|
||||||
|
iter++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
cancel = new brls::ListItem("menus/go_back"_i18n);
|
||||||
|
cancel->getClickEvent()->subscribe([&](brls::View* view){
|
||||||
|
brls::Application::pushView(new MainFrame());
|
||||||
|
});
|
||||||
|
list->addView(cancel);
|
||||||
|
}
|
||||||
|
this->setContentView(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string NetPage::ipToString(u8* ip){
|
||||||
|
std::string res = "";
|
||||||
|
for (size_t i = 0; i < 3; i++){
|
||||||
|
res += std::to_string(unsigned(ip[i]));
|
||||||
|
res += ".";
|
||||||
|
}
|
||||||
|
res += std::to_string(unsigned(ip[4]));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int NetPage::stringToIp(std::string ip, u8 *out){
|
||||||
|
size_t start;
|
||||||
|
size_t end = 0;
|
||||||
|
int i = 0;
|
||||||
|
while ((start = ip.find_first_not_of(".", end)) != std::string::npos)
|
||||||
|
{
|
||||||
|
end = ip.find(".", start);
|
||||||
|
out[i] = u8(std::stoi(ip.substr(start, end - start)));
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -54,6 +54,50 @@ ToolsTab::ToolsTab(std::string tag) : brls::List()
|
||||||
ntcp->setHeight(LISTITEM_HEIGHT);
|
ntcp->setHeight(LISTITEM_HEIGHT);
|
||||||
this->addView(ntcp); */
|
this->addView(ntcp); */
|
||||||
|
|
||||||
|
netSettings = new brls::ListItem("menus/tool_net_settings"_i18n );
|
||||||
|
netSettings->getClickEvent()->subscribe([&](brls::View* view){
|
||||||
|
brls::Application::pushView(new NetPage());
|
||||||
|
});
|
||||||
|
netSettings->setHeight(LISTITEM_HEIGHT);
|
||||||
|
this->addView(netSettings);
|
||||||
|
|
||||||
|
browser = new brls::ListItem("menus/tool_browser"_i18n );
|
||||||
|
browser->getClickEvent()->subscribe([&](brls::View* view){
|
||||||
|
Result rc=0;
|
||||||
|
char url[0xc00] = {0};
|
||||||
|
strcpy(url, "https://duckduckgo.com");
|
||||||
|
int at = appletGetAppletType();
|
||||||
|
std::string error = "";
|
||||||
|
if(at == AppletType_Application) { // Running as a title
|
||||||
|
WebCommonConfig conf;
|
||||||
|
WebCommonReply out;
|
||||||
|
rc = webPageCreate(&conf, url);
|
||||||
|
if (R_FAILED(rc))
|
||||||
|
error += "Error starting Browser\nLookup error code for more info " + rc;
|
||||||
|
webConfigSetJsExtension(&conf, true);
|
||||||
|
webConfigSetPageCache(&conf, true);
|
||||||
|
webConfigSetBootLoadingIcon(&conf, true);
|
||||||
|
webConfigSetWhitelist(&conf, ".*");
|
||||||
|
rc = webConfigShow(&conf, &out);
|
||||||
|
if (R_FAILED(rc))
|
||||||
|
error += "Error starting Browser\nLookup error code for more info " + rc;
|
||||||
|
} else { // Running under applet
|
||||||
|
error += "Running in applet mode\nPlease launch hbmenu by holding R on an APP (e.g. a game) NOT an applet (e.g. Gallery)";
|
||||||
|
}
|
||||||
|
if(!error.empty()){
|
||||||
|
brls::Dialog* dialog = new brls::Dialog(error);
|
||||||
|
brls::GenericEvent::Callback callback = [dialog](brls::View* view) {
|
||||||
|
dialog->close();
|
||||||
|
};
|
||||||
|
dialog->addButton("menus/Ok_button"_i18n , callback);
|
||||||
|
dialog->setCancelable(true);
|
||||||
|
dialog->open();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
browser->setHeight(LISTITEM_HEIGHT);
|
||||||
|
this->addView(browser);
|
||||||
|
|
||||||
cleanUp = new brls::ListItem("menus/tool_cleanUp"_i18n );
|
cleanUp = new brls::ListItem("menus/tool_cleanUp"_i18n );
|
||||||
cleanUp->getClickEvent()->subscribe([&](brls::View* view){
|
cleanUp->getClickEvent()->subscribe([&](brls::View* view){
|
||||||
std::filesystem::remove(AMS_ZIP_PATH);
|
std::filesystem::remove(AMS_ZIP_PATH);
|
||||||
|
@ -117,3 +161,4 @@ ToolsTab::ToolsTab(std::string tag) : brls::List()
|
||||||
language->setHeight(LISTITEM_HEIGHT);
|
language->setHeight(LISTITEM_HEIGHT);
|
||||||
this->addView(language); */
|
this->addView(language); */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue