From 237d87f4f62ec49c98e16346070b623a1701e77e Mon Sep 17 00:00:00 2001 From: Patrick Gaskin Date: Thu, 23 Apr 2020 10:23:44 -0400 Subject: [PATCH] Implemented nickel_extras:web_browser action --- src/action_cc.cc | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/action_cc.cc b/src/action_cc.cc index 87122e0..fdf1ff8 100644 --- a/src/action_cc.cc +++ b/src/action_cc.cc @@ -1,6 +1,7 @@ #include #include #include +#include #include @@ -19,6 +20,8 @@ typedef void Device; typedef void Settings; typedef void PlugWorkflowManager; +typedef void BrowserWorkflowManager; +typedef void N3SettingsExtrasController; extern "C" int nm_action_nickelsetting(const char *arg, char **err_out) { #define NM_ERR_RET 1 @@ -105,7 +108,36 @@ extern "C" int nm_action_nickelextras(const char *arg, char **err_out) { #define NM_ERR_RET 1 if (!strcmp(arg, "web_browser")) { - NM_RETURN_ERR("not implemented yet"); // TODO + void (*N3SettingsExtrasController_N3SettingsExtrasController)(N3SettingsExtrasController*); + reinterpret_cast(N3SettingsExtrasController_N3SettingsExtrasController) = dlsym(RTLD_DEFAULT, "_ZN26N3SettingsExtrasControllerC2Ev"); + NM_ASSERT(N3SettingsExtrasController_N3SettingsExtrasController, "could not dlsym N3SettingsExtrasController constructor"); + + void (*N3SettingsExtrasController_N3SettingsExtrasControllerD)(N3SettingsExtrasController*); + reinterpret_cast(N3SettingsExtrasController_N3SettingsExtrasControllerD) = dlsym(RTLD_DEFAULT, "_ZN26N3SettingsExtrasControllerD1Ev"); + NM_ASSERT(N3SettingsExtrasController_N3SettingsExtrasControllerD, "could not dlsym N3SettingsExtrasController destructor"); + + void (*N3SettingsExtrasController_openBrowser)(N3SettingsExtrasController*); + reinterpret_cast(N3SettingsExtrasController_openBrowser) = dlsym(RTLD_DEFAULT, "_ZN26N3SettingsExtrasController11openBrowserEv"); + NM_ASSERT(N3SettingsExtrasController_openBrowser, "could not dlsym BrowserWorkflowManager::openBrowser"); + + N3SettingsExtrasController *nse = alloca(128); // as of 4.20.14622, it's actually 48 bytes, but we're going to stay on the safe side + N3SettingsExtrasController_N3SettingsExtrasController(nse); + N3SettingsExtrasController_openBrowser(nse); + N3SettingsExtrasController_N3SettingsExtrasControllerD(nse); + + // the QObject is only used to pass events to it, but there's something I'm missing here which leads to it segfaulting after connecting to WiFi if it isn't already connected + /*void (*BrowserWorkflowManager_BrowserWorkflowManager)(BrowserWorkflowManager*, QObject*); + reinterpret_cast(BrowserWorkflowManager_BrowserWorkflowManager) = dlsym(RTLD_DEFAULT, "_ZN22BrowserWorkflowManagerC1EP7QObject"); + NM_ASSERT(BrowserWorkflowManager_BrowserWorkflowManager, "could not dlsym BrowserWorkflowManager constructor"); + + void (*BrowserWorkflowManager_openBrowser)(BrowserWorkflowManager*, bool, QUrl const&, QString const&); // the bool is whether to open it as a modal, the string is CSS to inject + reinterpret_cast(BrowserWorkflowManager_openBrowser) = dlsym(RTLD_DEFAULT, "_ZN22BrowserWorkflowManager11openBrowserEbRK4QUrlRK7QString"); + NM_ASSERT(BrowserWorkflowManager_openBrowser, "could not dlsym BrowserWorkflowManager::openBrowser"); + + BrowserWorkflowManager *bwm = alloca(128); // as of 4.20.14622, it's actually 20 bytes, but we're going to stay on the safe side + BrowserWorkflowManager_BrowserWorkflowManager(bwm, new QObject()); + BrowserWorkflowManager_openBrowser(bwm, false, QUrl(), QStringLiteral("")); // if !QUrl::isValid(), it loads the homepage*/ + NM_RETURN_OK(0); } const char* mimetype;