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

Reply via email to