diff --git a/libctru/include/3ds.h b/libctru/include/3ds.h index 4cfc52e57..f3be0a860 100644 --- a/libctru/include/3ds.h +++ b/libctru/include/3ds.h @@ -93,7 +93,7 @@ extern "C" { #include <3ds/applets/swkbd.h> #include <3ds/applets/error.h> - +#include <3ds/applets/browser.h> #include <3ds/applets/miiselector.h> #include <3ds/archive.h> diff --git a/libctru/include/3ds/applets/browser.h b/libctru/include/3ds/applets/browser.h new file mode 100644 index 000000000..14669678d --- /dev/null +++ b/libctru/include/3ds/applets/browser.h @@ -0,0 +1,12 @@ +/** + * @file browser.h + * @brief Browser Applet + */ + +#pragma once + +/** + * @brief Open the browser at a url + * @param url The url to open at, max-length 1024 characters including the trailing zero. If invalid or null, just opens the browser. + */ +void browserOpenUrl(const char* url); diff --git a/libctru/source/applets/browser.c b/libctru/source/applets/browser.c new file mode 100644 index 000000000..b559bbcbe --- /dev/null +++ b/libctru/source/applets/browser.c @@ -0,0 +1,21 @@ +#include <3ds/types.h> +#include <3ds/services/apt.h> + +#include <3ds/applets/browser.h> + +#include +#include + +void browserOpenUrl(const char* url) +{ + size_t url_len = url ? (strlen(url) + 1) : 0; + // check that we passed a url, it isn't too long and not too short (needs at least "http://") + // if that is not the case, we just claim our buffer was 0 in size + if (url_len > 0x400 || url_len < 8) url_len = 0; + // Something (aptLaunchSystemApplet? webbrowser?) tries to write / trashes the buffer. + // So, we copy the url onto the heap so that all still works out and our original argument remains const + void* buffer = malloc(url_len); + if (buffer) memcpy(buffer, url, url_len); + aptLaunchSystemApplet(APPID_WEB, buffer, url_len, 0); + if (buffer) free(buffer); +}