[Libreoffice-commits] online.git: ios/ios.mm ios/Mobile kit/Kit.cpp

Tor Lillqvist (via logerrit) logerrit at kemper.freedesktop.org
Mon Nov 4 14:26:12 UTC 2019


 ios/Mobile/AppDelegate.mm            |    5 ++++
 ios/Mobile/DocumentViewController.h  |    3 ++
 ios/Mobile/DocumentViewController.mm |   42 +++++++++++++++++++++++------------
 ios/ios.mm                           |    2 -
 kit/Kit.cpp                          |    3 ++
 5 files changed, 40 insertions(+), 15 deletions(-)

New commits:
commit 9d6c1744624639df75b29bc3b2b72b915b064ed3
Author:     Tor Lillqvist <tml at collabora.com>
AuthorDate: Mon Nov 4 14:07:16 2019 +0200
Commit:     Tor Lillqvist <tml at collabora.com>
CommitDate: Mon Nov 4 15:25:54 2019 +0100

    tdf#128577: Close an already open document when asked to open a new one
    
    Add a "singleton" class method to DocumentViewController to return the
    (as for now) singleton DocumentViewController.
    
    Change-Id: I0b8a8def558cfe7f9469b6062a86311dfa63f549
    Reviewed-on: https://gerrit.libreoffice.org/82007
    Reviewed-by: Tor Lillqvist <tml at collabora.com>
    Tested-by: Tor Lillqvist <tml at collabora.com>
    (cherry picked from commit 2807f907d947549a17c5bae586b85d412d552a09)
    Reviewed-on: https://gerrit.libreoffice.org/82021

diff --git a/ios/Mobile/AppDelegate.mm b/ios/Mobile/AppDelegate.mm
index dbc02e66e..40e47a64b 100644
--- a/ios/Mobile/AppDelegate.mm
+++ b/ios/Mobile/AppDelegate.mm
@@ -291,6 +291,11 @@ static void updateTemplates(NSData *data, NSURLResponse *response)
         return NO;
     }
 
+    // If we already have a document open, close it
+    if (lok_document != nullptr && [DocumentViewController singleton] != nil) {
+        [[DocumentViewController singleton] bye];
+    }
+
     // Reveal / import the document at the URL
     DocumentBrowserViewController *documentBrowserViewController = (DocumentBrowserViewController *)self.window.rootViewController;
     [documentBrowserViewController revealDocumentAtURL:inputURL importIfNeeded:YES completion:^(NSURL * _Nullable revealedDocumentURL, NSError * _Nullable error) {
diff --git a/ios/Mobile/DocumentViewController.h b/ios/Mobile/DocumentViewController.h
index 8f4d97b43..1f443b206 100644
--- a/ios/Mobile/DocumentViewController.h
+++ b/ios/Mobile/DocumentViewController.h
@@ -19,6 +19,9 @@
 @property std::string slideshowFile;
 @property (strong) NSURL *slideshowURL;
 
+- (void)bye;
++ (DocumentViewController*)singleton;
+
 @end
 
 // vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/Mobile/DocumentViewController.mm b/ios/Mobile/DocumentViewController.mm
index c9d8c5cac..47d096553 100644
--- a/ios/Mobile/DocumentViewController.mm
+++ b/ios/Mobile/DocumentViewController.mm
@@ -22,6 +22,8 @@
 
 #import "DocumentViewController.h"
 
+static DocumentViewController* theSingleton = nil;
+
 @interface DocumentViewController() <WKNavigationDelegate, WKUIDelegate, WKScriptMessageHandler, UIScrollViewDelegate> {
     int closeNotificationPipeForForwardingThread[2];
 }
@@ -33,6 +35,8 @@
 - (void)viewDidLoad {
     [super viewDidLoad];
 
+    theSingleton = self;
+
     WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
     WKUserContentController *userContentController = [[WKUserContentController alloc] init];
 
@@ -256,20 +260,7 @@
         } else if ([message.body isEqualToString:@"BYE"]) {
             LOG_TRC("Document window terminating on JavaScript side. Closing our end of the socket.");
 
-            // Close one end of the socket pair, that will wake up the forwarding thread above
-            fakeSocketClose(closeNotificationPipeForForwardingThread[0]);
-
-            [self.document saveToURL:[self.document fileURL]
-                    forSaveOperation:UIDocumentSaveForOverwriting
-                   completionHandler:^(BOOL success) {
-                      LOG_TRC("save completion handler gets " << (success?"YES":"NO"));
-                   }];
-
-            // Wait for lokit_main thread to exit
-            std::lock_guard<std::mutex> lock(lokit_main_mutex);
-
-            // And only then let the document browsing view show up again
-            [self dismissDocumentViewController];
+            [self bye];
             return;
         } else if ([message.body isEqualToString:@"SLIDESHOW"]) {
 
@@ -368,6 +359,29 @@
     scrollView.pinchGestureRecognizer.enabled = NO;
 }
 
+- (void)bye {
+    // Close one end of the socket pair, that will wake up the forwarding thread above
+    fakeSocketClose(closeNotificationPipeForForwardingThread[0]);
+
+    [self.document saveToURL:[self.document fileURL]
+            forSaveOperation:UIDocumentSaveForOverwriting
+           completionHandler:^(BOOL success) {
+              LOG_TRC("save completion handler gets " << (success?"YES":"NO"));
+           }];
+
+    // Wait for lokit_main thread to exit
+    std::lock_guard<std::mutex> lock(lokit_main_mutex);
+
+    theSingleton = nil;
+
+    // And only then let the document browsing view show up again
+    [self dismissDocumentViewController];
+}
+
++ (DocumentViewController*)singleton {
+    return theSingleton;
+}
+
 @end
 
 // vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/ios.mm b/ios/ios.mm
index 1416d31e0..8f3ccc3ca 100644
--- a/ios/ios.mm
+++ b/ios/ios.mm
@@ -18,7 +18,7 @@ extern "C" {
 }
 
 int loolwsd_server_socket_fd = -1;
-lok::Document *lok_document;
+lok::Document *lok_document = nullptr;
 LibreOfficeKit *lo_kit;
 std::mutex lokit_main_mutex;
 
diff --git a/kit/Kit.cpp b/kit/Kit.cpp
index 9eac5dc7e..5dede6dd9 100644
--- a/kit/Kit.cpp
+++ b/kit/Kit.cpp
@@ -1391,6 +1391,9 @@ private:
 #endif
             LOG_INF("Document [" << anonymizeUrl(_url) << "] has no more views, but has " <<
                     _sessions.size() << " sessions still. Destroying the document.");
+#ifdef IOS
+            lok_document = nullptr;
+#endif
             _loKitDocument.reset();
             LOG_INF("Document [" << anonymizeUrl(_url) << "] session [" << sessionId << "] unloaded Document.");
             return;


More information about the Libreoffice-commits mailing list