common/Util.cpp | 3 + gtk/Makefile | 37 +++++++++++++++++++ gtk/main.cpp | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ wsd/LOOLWSD.cpp | 13 +++++- wsd/Storage.cpp | 8 +--- 5 files changed, 157 insertions(+), 10 deletions(-)
New commits: commit 58db979291da40c4016516100873ea97951a6b99 Author: Tor Lillqvist <t...@collabora.com> AuthorDate: Wed Oct 17 00:40:49 2018 +0300 Commit: Tor Lillqvist <t...@collabora.com> CommitDate: Wed Oct 17 00:45:35 2018 +0300 Start on a gtk+-based workalike to the iOS app The idea is that it would work sufficiently identically, so that even people without a Mac and without an iOS device could participate in development of the non-iOS-specific bits, like the JavaScript, or the online MOBILEAPP-specific plumbing. Which would be great. No, this doesn't do anything sane yet. It does compile the same online C++ files as the iOS app, though. (Some minor tweaks were needed in a couple of them to silence gcc warnings.) There is a plain Makefile, but I should change to using autofoo, too. Eventually, this will need to be built in a separate tree from a normal online, just like when using the --enable-iosapp configure switch. (But for now, doesn't matter.) Change-Id: I13e4d921acb99d802d2f9da4b0df4a237ca60ad6 diff --git a/common/Util.cpp b/common/Util.cpp index e6a9aefec..ad510e4f1 100644 --- a/common/Util.cpp +++ b/common/Util.cpp @@ -292,6 +292,8 @@ namespace Util return std::getenv("DISPLAY") != nullptr; } +#ifndef MOBILEAPP + static const char *startsWith(const char *line, const char *tag) { size_t len = strlen(tag); @@ -306,7 +308,6 @@ namespace Util return nullptr; } -#ifndef MOBILEAPP std::string getHumanizedBytes(unsigned long nBytes) { constexpr unsigned factor = 1024; diff --git a/gtk/Makefile b/gtk/Makefile new file mode 100644 index 000000000..cefbeb992 --- /dev/null +++ b/gtk/Makefile @@ -0,0 +1,37 @@ +PROGS = mobile + +all : $(PROGS) + +WARNINGFLAGS = -Wall -Werror -Wno-parentheses -Wno-sign-compare -Wno-unused-variable +INCLUDEFLAGS = -I../common -I../net -I../kit -I../wsd -I../bundled/include -I.. -I. +DEFINEFLAGS = -DMOBILEAPP -DLOOLWSD_DATADIR='"/usr/local/share/loolwsd"' -DLOOLWSD_CONFIGDIR='"/usr/local/etc/loolwsd"' -DTOPSRCDIR='"'$(realpath $(PWD)/..)'"' + +CFLAGS = -g $(WARNINGFLAGS) `pkg-config --cflags webkit2gtk-4.0` $(INCLUDEFLAGS) $(DEFINEFLAGS) +CXXFLAGS = $(CFLAGS) + +LIBS=`pkg-config --libs webkit2gtk-4.0` -lPocoFoundationd -lPocoUtild -lPocoXMLd -lPocoJSONd -lPocoNetd -lpng -lpthread -ldl + +common_OBJS = Unit.o FileUtil.o Log.o MessageQueue.o Protocol.o Session.o SigUtil.o SpookyV2.o Util.o +kit_OBJS = ChildSession.o Kit.o +net_OBJS = FakeSocket.o Socket.o +wsd_OBJS = ClientSession.o DocumentBroker.o LOOLWSD.o Storage.o TileCache.o + +mobile_OBJS = main.o $(common_OBJS) $(kit_OBJS) $(net_OBJS) $(wsd_OBJS) + +$(common_OBJS) : %.o : ../common/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $^ + +$(kit_OBJS) : %.o : ../kit/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $^ + +$(net_OBJS) : %.o : ../net/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $^ + +$(wsd_OBJS) : %.o : ../wsd/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $^ + +mobile : $(mobile_OBJS) + $(CXX) -o $@ $(mobile_OBJS) $(LIBS) + +clean : + rm -f $(PROGS) *.o 2>/dev/null diff --git a/gtk/main.cpp b/gtk/main.cpp new file mode 100644 index 000000000..e7dc9f4d6 --- /dev/null +++ b/gtk/main.cpp @@ -0,0 +1,106 @@ +// -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- +/* + * Copyright (C) 2006, 2007 Apple Inc. + * Copyright (C) 2007 Alp Toker <a...@atoker.com> + * Copyright (C) 2011 Lukasz Slachciak + * Copyright (C) 2011 Bob Murphy + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <iostream> + +#include <gtk/gtk.h> +#include <webkit2/webkit2.h> + +#include "FakeSocket.hpp" +#include "Log.hpp" +#include "LOOLWSD.hpp" +#include "Util.hpp" + +static void destroyWindowCb(GtkWidget* widget, GtkWidget* window); +static gboolean closeWebViewCb(WebKitWebView* webView, GtkWidget* window); + +int loolwsd_server_socket_fd; + +int main(int argc, char* argv[]) +{ + Log::initialize("Mobile", "trace", false, false, {}); + Util::setThreadName("main"); + fakeSocketSetLoggingCallback([](const std::string& line) + { + LOG_TRC_NOFILE(line); + }); + + // Initialize GTK+ + gtk_init(&argc, &argv); + + // Create an 800x600 window that will contain the browser instance + GtkWidget *main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_default_size(GTK_WINDOW(main_window), 800, 600); + + // Create a "user content manager" + WebKitUserContentManager *userContentManager = WEBKIT_USER_CONTENT_MANAGER(webkit_user_content_manager_new()); + + // Create a browser instance + WebKitWebView *webView = WEBKIT_WEB_VIEW(webkit_web_view_new_with_user_content_manager(userContentManager)); + + // Put the browser area into the main window + gtk_container_add(GTK_CONTAINER(main_window), GTK_WIDGET(webView)); + + // Set up callbacks so that if either the main window or the browser instance is + // closed, the program will exit + g_signal_connect(main_window, "destroy", G_CALLBACK(destroyWindowCb), NULL); + g_signal_connect(webView, "close", G_CALLBACK(closeWebViewCb), main_window); + + // Load a web page into the browser instance + webkit_web_view_load_uri(webView, + "file://" TOPSRCDIR "/loleaflet/dist/loleaflet.html" + "?file_path=" TOPSRCDIR "/test/data/hello-world.odt" + "&closebutton=1" + "&permission=edit" + "&debug=true"); + + // Make sure that when the browser area becomes visible, it will get mouse + // and keyboard events + gtk_widget_grab_focus(GTK_WIDGET(webView)); + + // Make sure the main window and all its contents are visible + gtk_widget_show_all(main_window); + + // Run the main GTK+ event loop + gtk_main(); + + return 0; +} + + +static void destroyWindowCb(GtkWidget* widget, GtkWidget* window) +{ + gtk_main_quit(); +} + +static gboolean closeWebViewCb(WebKitWebView* webView, GtkWidget* window) +{ + gtk_widget_destroy(window); + return TRUE; +} diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp index e65fbd282..df69c7152 100644 --- a/wsd/LOOLWSD.cpp +++ b/wsd/LOOLWSD.cpp @@ -133,8 +133,12 @@ using Poco::Net::PartHandler; #include <ServerSocket.hpp> +#ifdef MOBILEAPP #ifdef IOS #include "ios.h" +#else +#include "gtk.h" +#endif #endif using namespace LOOLProtocol; @@ -262,11 +266,11 @@ inline void checkSessionLimitsAndWarnClients() #endif } +#ifndef MOBILEAPP /// Internal implementation to alert all clients /// connected to any document. void alertAllUsersInternal(const std::string& msg) { -#ifndef MOBILEAPP std::lock_guard<std::mutex> docBrokersLock(DocBrokersMutex); @@ -280,8 +284,8 @@ void alertAllUsersInternal(const std::string& msg) std::shared_ptr<DocumentBroker> docBroker = brokerIt.second; docBroker->addCallback([msg, docBroker](){ docBroker->alertAllUsers(msg); }); } -#endif } +#endif static void checkDiskSpaceAndWarnClients(const bool cacheLastCheck) { @@ -1068,7 +1072,6 @@ void LOOLWSD::initialize(Application& self) docProcSettings.LimitFileSizeMb = getConfigValue<int>("per_document.limit_file_size_mb", 0); docProcSettings.LimitNumberOpenFiles = getConfigValue<int>("per_document.limit_num_open_files", 0); Admin::instance().setDefDocProcSettings(docProcSettings, false); -#endif #if ENABLE_DEBUG std::cerr << "\nLaunch one of these in your browser:\n\n" @@ -1082,6 +1085,8 @@ void LOOLWSD::initialize(Application& self) std::cerr << "\nOr for the Admin Console:\n\n" << adminURI << '\n' << std::endl; #endif + +#endif } void LOOLWSD::initializeSSL() @@ -2991,7 +2996,9 @@ int LOOLWSD::innerMain() std::cerr << "Ready to accept connections on port " << ClientPortNumber << ".\n" << std::endl; #endif +#ifndef MOBILEAPP const auto startStamp = std::chrono::steady_clock::now(); +#endif while (!TerminationFlag && !ShutdownRequestFlag) { diff --git a/wsd/Storage.cpp b/wsd/Storage.cpp index 951fe31d0..96fa903fb 100644 --- a/wsd/Storage.cpp +++ b/wsd/Storage.cpp @@ -354,11 +354,11 @@ StorageBase::SaveResult LocalStorage::saveLocalFileToStorage(const Authorization return StorageBase::SaveResult(StorageBase::SaveResult::OK); } +#ifndef MOBILEAPP + namespace { -#ifndef MOBILEAPP - inline Poco::Net::HTTPClientSession* getHTTPClientSession(const Poco::URI& uri) { @@ -370,8 +370,6 @@ Poco::Net::HTTPClientSession* getHTTPClientSession(const Poco::URI& uri) : new Poco::Net::HTTPClientSession(uri.getHost(), uri.getPort()); } -#endif - void addStorageDebugCookie(Poco::Net::HTTPRequest& request) { (void) request; @@ -411,8 +409,6 @@ Poco::Timestamp iso8601ToTimestamp(const std::string& iso8601Time, const std::st } // anonymous namespace -#ifndef MOBILEAPP - std::unique_ptr<WopiStorage::WOPIFileInfo> WopiStorage::getWOPIFileInfo(const Authorization& auth) { // update the access_token to the one matching to the session _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits