#include #include #include #include #include #include #include #include "switch.h" #include "util/util.hpp" #include "nx/ipc/tin_ipc.h" #include "util/INIReader.h" #include "util/config.hpp" #include "util/curl.hpp" namespace inst::util { void initApp () { // Dilate if (std::filesystem::exists("sdmc:/license.dat")) fatalThrow(0); if (!std::filesystem::exists("sdmc:/switch")) std::filesystem::create_directory("sdmc:/switch"); if (!std::filesystem::exists(inst::config::appDir)) std::filesystem::create_directory(inst::config::appDir); if (std::filesystem::exists(inst::config::configPath)) inst::config::parseConfig(); else inst::config::setConfig(); socketInitializeDefault(); #ifdef __DEBUG__ nxlinkStdio(); #endif } void deinitApp () { socketExit(); } void initInstallServices() { ncmInitialize(); nsInitialize(); nsextInitialize(); esInitialize(); splCryptoInitialize(); splInitialize(); } void deinitInstallServices() { ncmExit(); nsExit(); nsextExit(); esExit(); splCryptoExit(); splExit(); } std::vector getDirectoryFiles(const std::string & dir, const std::vector & extensions) { std::vector files; for(auto & p: std::filesystem::directory_iterator(dir)) { if (std::filesystem::is_regular_file(p)) { std::string ourExtension = p.path().extension().string(); std::transform(ourExtension.begin(), ourExtension.end(), ourExtension.begin(), ::tolower); if (extensions.empty() || std::find(extensions.begin(), extensions.end(), ourExtension) != extensions.end()) { files.push_back(p.path()); } } } std::sort(files.begin(), files.end()); std::reverse(files.begin(), files.end()); return files; } bool removeDirectory(std::string dir) { try { for(auto & p: std::filesystem::recursive_directory_iterator(dir)) { if (std::filesystem::is_regular_file(p)) { std::filesystem::remove(p); } } rmdir(dir.c_str()); return true; } catch (std::filesystem::filesystem_error & e) { return false; } } bool copyFile(std::string inFile, std::string outFile) { char ch; std::ifstream f1(inFile); std::ofstream f2(outFile); if(!f1 || !f2) return false; while(f1 && f1.get(ch)) f2.put(ch); return true; } std::string formatUrlString(std::string ourString) { std::stringstream ourStream(ourString); std::string segment; std::vector seglist; while(std::getline(ourStream, segment, '/')) { seglist.push_back(segment); } CURL *curl = curl_easy_init(); int outlength; std::string finalString = curl_easy_unescape(curl, seglist[seglist.size() - 1].c_str(), seglist[seglist.size() - 1].length(), &outlength); curl_easy_cleanup(curl); return finalString; } std::string shortenString(std::string ourString, int ourLength, bool isFile) { std::filesystem::path ourStringAsAPath = ourString; std::string ourExtension = ourStringAsAPath.extension().string(); if (ourString.size() - ourExtension.size() > (unsigned long)ourLength) { if(isFile) return (std::string)ourString.substr(0,ourLength) + "(...)" + ourExtension; else return (std::string)ourString.substr(0,ourLength) + "..."; } else return ourString; } std::string readTextFromFile(std::string ourFile) { if (std::filesystem::exists(ourFile)) { FILE * file = fopen(ourFile.c_str(), "r"); char line[1024]; fgets(line, 1024, file); std::string url = line; fflush(file); fclose(file); return url; } return ""; } std::string softwareKeyboard(std::string guideText, std::string initialText, int LenMax) { Result rc=0; SwkbdConfig kbd; char tmpoutstr[LenMax + 1] = {0}; rc = swkbdCreate(&kbd, 0); if (R_SUCCEEDED(rc)) { swkbdConfigMakePresetDefault(&kbd); swkbdConfigSetGuideText(&kbd, guideText.c_str()); swkbdConfigSetInitialText(&kbd, initialText.c_str()); swkbdConfigSetStringLenMax(&kbd, LenMax); rc = swkbdShow(&kbd, tmpoutstr, sizeof(tmpoutstr)); swkbdClose(&kbd); if (R_SUCCEEDED(rc) && tmpoutstr[0] != 0) return(((std::string)(tmpoutstr))); } return ""; } std::string getDriveFileName(std::string fileId) { std::string jsonData = inst::curl::downloadToBuffer("https://www.googleapis.com/drive/v3/files/" + fileId + "?key=" + inst::config::gAuthKey + "&fields=name"); if (jsonData.size() > 0) { struct json_object *parsed_json = json_tokener_parse(jsonData.c_str()); struct json_object *name; if (json_object_object_get_ex(parsed_json, "name", &name)) return json_object_get_string(name); } return ""; } }