loolwsd/LOOLKit.cpp | 40 ++++++++++++++++++++++++---------------- loolwsd/LibreOfficeKit.hpp | 27 ++++++++++++++++----------- 2 files changed, 40 insertions(+), 27 deletions(-)
New commits: commit 35ecc2b8d0c316742caa390279b873ada6d14b8d Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Wed May 18 06:37:22 2016 -0400 loolwsd: LibreOfficeKit* -> shared_ptr<lok::Office> Change-Id: I55cbd600a7000dbb356304c8f5493195c7778149 Reviewed-on: https://gerrit.libreoffice.org/25093 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp index 5c57bd6..43c0aca 100644 --- a/loolwsd/LOOLKit.cpp +++ b/loolwsd/LOOLKit.cpp @@ -349,7 +349,7 @@ public: /// 2) Document which require password to modify enum class PasswordType { ToView, ToModify }; - Document(LibreOfficeKit *loKit, + Document(const std::shared_ptr<lok::Office>& loKit, const std::string& jailId, const std::string& docKey, const std::string& url) @@ -367,6 +367,7 @@ public: { Log::info("Document ctor for url [" + _url + "] on child [" + _jailId + "] LOK_VIEW_CALLBACK=" + std::to_string(_multiView) + "."); + assert(_loKit && _loKit->get()); } ~Document() @@ -538,7 +539,7 @@ public: if (_isDocPasswordProtected && _haveDocPassword) { // it means this is the second attempt with the wrong password; abort the load operation - _loKit->pClass->setDocumentPassword(_loKit, _jailedUrl.c_str(), nullptr); + _loKit->setDocumentPassword(_jailedUrl.c_str(), nullptr); return; } @@ -549,11 +550,11 @@ public: else if (nPasswordType == LOK_CALLBACK_DOCUMENT_PASSWORD_TO_MODIFY) _docPasswordType = PasswordType::ToModify; - Log::info("Caling _loKit->pClass->setDocumentPassword"); + Log::info("Calling _loKit->setDocumentPassword"); if (_haveDocPassword) - _loKit->pClass->setDocumentPassword(_loKit, _jailedUrl.c_str(), _docPassword.c_str()); + _loKit->setDocumentPassword(_jailedUrl.c_str(), _docPassword.c_str()); else - _loKit->pClass->setDocumentPassword(_loKit, _jailedUrl.c_str(), nullptr); + _loKit->setDocumentPassword(_jailedUrl.c_str(), nullptr); Log::info("setDocumentPassword returned"); } @@ -938,12 +939,14 @@ private: // This is the first time we are loading the document Log::info("Loading new document from URI: [" + uri + "] for session [" + sessionId + "]."); - if (LIBREOFFICEKIT_HAS(_loKit, registerCallback)) + + auto lock(_loKit->getLock()); + if (LIBREOFFICEKIT_HAS(_loKit->get(), registerCallback)) { - _loKit->pClass->registerCallback(_loKit, DocumentCallback, this); + _loKit->get()->pClass->registerCallback(_loKit->get(), DocumentCallback, this); const auto flags = LOK_FEATURE_DOCUMENT_PASSWORD | LOK_FEATURE_DOCUMENT_PASSWORD_TO_MODIFY; - _loKit->pClass->setOptionalFeatures(_loKit, flags); + _loKit->setOptionalFeatures(flags); } // Save the provided password with us and the jailed url @@ -953,12 +956,12 @@ private: _isDocPasswordProtected = false; Log::debug("Calling lokit::documentLoad."); - _loKitDocument = std::make_shared<lok::Document>(_loKit->pClass->documentLoad(_loKit, uri.c_str())); + _loKitDocument = _loKit->documentLoad(uri.c_str()); Log::debug("Returned lokit::documentLoad."); if (!_loKitDocument) { - Log::error("Failed to load: " + uri + ", error: " + _loKit->pClass->getError(_loKit)); + Log::error("Failed to load: " + uri + ", error: " + _loKit->getError()); // Checking if wrong password or no password was reason for failure. if (_isDocPasswordProtected) @@ -1031,7 +1034,7 @@ private: private: const bool _multiView; - LibreOfficeKit* const _loKit; + std::shared_ptr<lok::Office> _loKit; const std::string _jailId; const std::string _docKey; const std::string _url; @@ -1212,20 +1215,25 @@ void lokit_main(const std::string& childRoot, instdir_path = "/" + loTemplate + "/program"; } - LibreOfficeKit* loKit; + std::shared_ptr<lok::Office> loKit; { const char *instdir = instdir_path.c_str(); const char *userdir = "file:///user"; - loKit = UnitKit::get().lok_init(instdir, userdir); - if (!loKit) - loKit = lok_init_2(instdir, userdir); - if (loKit == nullptr) + auto kit = UnitKit::get().lok_init(instdir, userdir); + if (!kit) + { + kit = lok_init_2(instdir, userdir); + } + + loKit = std::make_shared<lok::Office>(kit); + if (!loKit || !loKit->get()) { Log::error("LibreOfficeKit initialization failed. Exiting."); std::_Exit(Application::EXIT_SOFTWARE); } } + assert(loKit && loKit->get()); Log::info("Process is ready."); // Open websocket connection between the child process and WSD. diff --git a/loolwsd/LibreOfficeKit.hpp b/loolwsd/LibreOfficeKit.hpp index 584c4bc..be23fab 100644 --- a/loolwsd/LibreOfficeKit.hpp +++ b/loolwsd/LibreOfficeKit.hpp @@ -497,6 +497,7 @@ public: _pOffice(pThis) { Log::trace("lok::Office ctor."); + assert(_pOffice); } inline ~Office() @@ -506,15 +507,27 @@ public: _pOffice->pClass->destroy(_pOffice); } + /// This lock must be held while calling + /// one or more member of this class. + std::unique_lock<std::mutex> getLock() + { + return std::unique_lock<std::mutex>(_mutex); + } + + /// Gives access to the underlying C pointer. + inline LibreOfficeKit* get() + { + return _pOffice; + } + /** * Loads a document from an URL. * * @param pUrl the URL of the document to load * @param pFilterOptions options for the import filter, e.g. SkipImages. */ - inline Document* documentLoad(const char* pUrl, const char* pFilterOptions = NULL) + inline std::shared_ptr<Document> documentLoad(const char* pUrl, const char* pFilterOptions = NULL) { - std::unique_lock<std::mutex> lock(_mutex); Log::trace() << "lok::Office: documentLoad: URL: [" << pUrl << "], FilterOptions: [" << pFilterOptions << "]." << Log::end; @@ -525,23 +538,18 @@ public: else pDoc = _pOffice->pClass->documentLoad(_pOffice, pUrl); - if (pDoc == NULL) - return NULL; - - return new Document(pDoc); + return std::make_shared<lok::Document>(pDoc); } /// Returns the last error as a string, the returned pointer has to be freed by the caller. inline char* getError() { - std::unique_lock<std::mutex> lock(_mutex); return _pOffice->pClass->getError(_pOffice); } /// Frees the memory pointed to by pFree. inline void freeError(char* pFree) { - std::unique_lock<std::mutex> lock(_mutex); _pOffice->pClass->freeError(pFree); } @@ -563,7 +571,6 @@ public: */ inline char* getFilterTypes() { - std::unique_lock<std::mutex> lock(_mutex); return _pOffice->pClass->getFilterTypes(_pOffice); } @@ -574,7 +581,6 @@ public: */ void setOptionalFeatures(uint64_t features) { - std::unique_lock<std::mutex> lock(_mutex); return _pOffice->pClass->setOptionalFeatures(_pOffice, features); } @@ -599,7 +605,6 @@ public: */ inline void setDocumentPassword(char const* pURL, char const* pPassword) { - std::unique_lock<std::mutex> lock(_mutex); _pOffice->pClass->setDocumentPassword(_pOffice, pURL, pPassword); } #endif // defined LOK_USE_UNSTABLE_API || defined LIBO_INTERNAL_ONLY _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits