comphelper/source/misc/lok.cxx | 64 +++++++++++++++------------- desktop/qa/desktop_lib/test_desktop_lib.cxx | 10 +--- desktop/source/lib/init.cxx | 43 +++++------------- include/LibreOfficeKit/LibreOfficeKit.h | 22 +++------ include/LibreOfficeKit/LibreOfficeKit.hxx | 18 +------ include/comphelper/lok.hxx | 8 +-- include/sfx2/lokhelper.hxx | 6 -- sfx2/source/control/unoctitm.cxx | 42 +++++++----------- sfx2/source/view/lokhelper.cxx | 16 +++---- 9 files changed, 93 insertions(+), 136 deletions(-)
New commits: commit be717e5062f353526e78749b74f3c9888ecfcc5c Author: Pranam Lashkari <lpra...@collabora.com> AuthorDate: Wed Sep 15 23:39:32 2021 +0530 Commit: Tor Lillqvist <t...@collabora.com> CommitDate: Mon Oct 18 15:16:54 2021 +0200 LOK: unify freemium APIs and uno command restriction APIs Signed-off-by: Pranam Lashkari <lpra...@collabora.com> Change-Id: I3badb038822331ab5cb30df6a66ce9a0640cf340 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122162 Tested-by: Tor Lillqvist <t...@collabora.com> Reviewed-by: Tor Lillqvist <t...@collabora.com> diff --git a/comphelper/source/misc/lok.cxx b/comphelper/source/misc/lok.cxx index 659765f802da..d3b3e9bdec2d 100644 --- a/comphelper/source/misc/lok.cxx +++ b/comphelper/source/misc/lok.cxx @@ -35,9 +35,9 @@ static bool g_bLocalRendering(false); static Compat g_eCompatFlags(Compat::none); -static std::vector<OUString> g_vFreemiumDenyList; +static std::unordered_set<OUString> g_vFreemiumDenyList; -static std::vector<OUString> g_vRestrictedCommandList; +static std::unordered_set<OUString> g_vRestrictedCommandList; namespace { @@ -289,54 +289,60 @@ void statusIndicatorFinish() pStatusIndicatorCallback(pStatusIndicatorCallbackData, statusIndicatorCallbackType::Finish, 0, nullptr); } -void setFreemiumDenyList(const char* freemiumDenyList) +void setBlockedCommandList(const char* bolckedCommandList) { - if(!g_vFreemiumDenyList.empty()) - return; - OUString DenyListString(freemiumDenyList, strlen(freemiumDenyList), RTL_TEXTENCODING_UTF8); + OUString BolckedListString(bolckedCommandList, strlen(bolckedCommandList), RTL_TEXTENCODING_UTF8); - OUString command = DenyListString.getToken(0, ' '); - for (size_t i = 1; !command.isEmpty(); i++) + OUString type = BolckedListString.getToken(0, '-'); + + if (type == "freemium") { - g_vFreemiumDenyList.emplace_back(command); - command = DenyListString.getToken(i, ' '); + if(!g_vFreemiumDenyList.empty()) + return; + OUString commands = BolckedListString.getToken(1, '-'); + + OUString command = commands.getToken(0, ' '); + for (size_t i = 1; !command.isEmpty(); i++) + { + g_vFreemiumDenyList.emplace(command); + command = commands.getToken(i, ' '); + } + } + else + { + if(!g_vRestrictedCommandList.empty()) + return; + + OUString commands = BolckedListString.getToken(1, '-'); + + OUString command = commands.getToken(0, ' '); + for (size_t i = 1; !command.isEmpty(); i++) + { + g_vRestrictedCommandList.emplace(command); + command = commands.getToken(i, ' '); + } } } -const std::vector<OUString>& getFreemiumDenyList() +const std::unordered_set<OUString>& getFreemiumDenyList() { return g_vFreemiumDenyList; } bool isCommandFreemiumDenied(const OUString& command) { - return std::find(g_vFreemiumDenyList.begin(), g_vFreemiumDenyList.end(), command) != g_vFreemiumDenyList.end(); -} - -void setRestrictedCommandList(const char* restrictedCommandList) -{ - if(!g_vRestrictedCommandList.empty()) - return; - - OUString RestrictedListString(restrictedCommandList, strlen(restrictedCommandList), RTL_TEXTENCODING_UTF8); - - OUString command = RestrictedListString.getToken(0, ' '); - for (size_t i = 1; !command.isEmpty(); i++) - { - g_vRestrictedCommandList.emplace_back(command); - command = RestrictedListString.getToken(i, ' '); - } + return g_vFreemiumDenyList.find(command) != g_vFreemiumDenyList.end(); } -const std::vector<OUString>& getRestrictedCommandList() +const std::unordered_set<OUString>& getRestrictedCommandList() { return g_vRestrictedCommandList; } bool isRestrictedCommand(const OUString& command) { - return std::find(g_vRestrictedCommandList.begin(), g_vRestrictedCommandList.end(), command) != g_vRestrictedCommandList.end(); + return g_vRestrictedCommandList.find(command) != g_vRestrictedCommandList.end(); } } // namespace diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx index e66ebb159cb3..ee4d0e8a4b34 100644 --- a/desktop/qa/desktop_lib/test_desktop_lib.cxx +++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx @@ -3547,15 +3547,13 @@ void DesktopLOKTest::testABI() CPPUNIT_ASSERT_EQUAL(documentClassOffset(59), offsetof(struct _LibreOfficeKitDocumentClass, completeFunction)); CPPUNIT_ASSERT_EQUAL(documentClassOffset(60), offsetof(struct _LibreOfficeKitDocumentClass, setWindowTextSelection)); CPPUNIT_ASSERT_EQUAL(documentClassOffset(61), offsetof(struct _LibreOfficeKitDocumentClass, sendFormFieldEvent)); - CPPUNIT_ASSERT_EQUAL(documentClassOffset(62), offsetof(struct _LibreOfficeKitDocumentClass, setFreemiumDenyList)); - CPPUNIT_ASSERT_EQUAL(documentClassOffset(63), offsetof(struct _LibreOfficeKitDocumentClass, setFreemiumView)); - CPPUNIT_ASSERT_EQUAL(documentClassOffset(64), offsetof(struct _LibreOfficeKitDocumentClass, setRestrictedCommandList)); - CPPUNIT_ASSERT_EQUAL(documentClassOffset(65), offsetof(struct _LibreOfficeKitDocumentClass, setRestrictedView)); - CPPUNIT_ASSERT_EQUAL(documentClassOffset(66), offsetof(struct _LibreOfficeKitDocumentClass, renderSearchResult)); + CPPUNIT_ASSERT_EQUAL(documentClassOffset(62), offsetof(struct _LibreOfficeKitDocumentClass, setBlockedCommandList)); + CPPUNIT_ASSERT_EQUAL(documentClassOffset(63), offsetof(struct _LibreOfficeKitDocumentClass, setBlockedCommandView)); + CPPUNIT_ASSERT_EQUAL(documentClassOffset(64), offsetof(struct _LibreOfficeKitDocumentClass, renderSearchResult)); // Extending is fine, update this, and add new assert for the offsetof the // new method - CPPUNIT_ASSERT_EQUAL(documentClassOffset(67), sizeof(struct _LibreOfficeKitDocumentClass)); + CPPUNIT_ASSERT_EQUAL(documentClassOffset(65), sizeof(struct _LibreOfficeKitDocumentClass)); } CPPUNIT_TEST_SUITE_REGISTRATION(DesktopLOKTest); diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 93eaa3e78f42..eb560c56a13e 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -1076,19 +1076,13 @@ static void doc_postKeyEvent(LibreOfficeKitDocument* pThis, int nType, int nCharCode, int nKeyCode); -static void doc_setFreemiumDenyList(LibreOfficeKitDocument* pThis, - const char* freemiumDenyList); +static void doc_setBlockedCommandList(LibreOfficeKitDocument* pThis, + const char* bolckedCommandList); -static void doc_setFreemiumView(LibreOfficeKitDocument* pThis, +static void doc_setBlockedCommandView(LibreOfficeKitDocument* pThis, int nViewId, - bool isFreemium); - -static void doc_setRestrictedCommandList(LibreOfficeKitDocument* pThis, - const char* restrictedCommandList); - -static void doc_setRestrictedView(LibreOfficeKitDocument* pThis, - int nViewId, - bool isRestricted); + const char* type, + bool isBlocked); static void doc_postWindowExtTextInputEvent(LibreOfficeKitDocument* pThis, unsigned nWindowId, @@ -1380,11 +1374,8 @@ LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XCompone m_pDocumentClass->sendFormFieldEvent = doc_sendFormFieldEvent; m_pDocumentClass->renderSearchResult = doc_renderSearchResult; - m_pDocumentClass->setFreemiumDenyList = doc_setFreemiumDenyList; - m_pDocumentClass->setFreemiumView = doc_setFreemiumView; - - m_pDocumentClass->setRestrictedCommandList = doc_setRestrictedCommandList; - m_pDocumentClass->setRestrictedView = doc_setRestrictedView; + m_pDocumentClass->setBlockedCommandList = doc_setBlockedCommandList; + m_pDocumentClass->setBlockedCommandView = doc_setBlockedCommandView; gDocumentClass = m_pDocumentClass; } @@ -3690,26 +3681,16 @@ static void doc_postKeyEvent(LibreOfficeKitDocument* pThis, int nType, int nChar } } -static void doc_setFreemiumDenyList(LibreOfficeKitDocument* /*pThis*/, const char* freemiumDenyList) -{ - comphelper::LibreOfficeKit::setFreemiumDenyList(freemiumDenyList); -} - -static void doc_setFreemiumView(LibreOfficeKitDocument* /*pThis*/, int nViewId, bool isFreemium) -{ - SolarMutexGuard aGuard; - SfxLokHelper::setFreemiumView(nViewId, isFreemium); -} - -static void doc_setRestrictedCommandList(LibreOfficeKitDocument* /*pThis*/, const char* restrictedCommandList) +static void doc_setBlockedCommandList(LibreOfficeKitDocument* /*pThis*/, const char* bolckedCommandList) { - comphelper::LibreOfficeKit::setRestrictedCommandList(restrictedCommandList); + comphelper::LibreOfficeKit::setBlockedCommandList(bolckedCommandList); } -static void doc_setRestrictedView(LibreOfficeKitDocument* /*pThis*/, int nViewId, bool isRestricted) +static void doc_setBlockedCommandView(LibreOfficeKitDocument* /*pThis*/, int nViewId, const char* type, bool isBlocked) { SolarMutexGuard aGuard; - SfxLokHelper::setRestrictedView(nViewId, isRestricted); + OUString aType(type, strlen(type), RTL_TEXTENCODING_UTF8); + SfxLokHelper::setBlockedCommandView(nViewId, aType, isBlocked); } static void doc_postWindowExtTextInputEvent(LibreOfficeKitDocument* pThis, unsigned nWindowId, int nType, const char* pText) diff --git a/include/LibreOfficeKit/LibreOfficeKit.h b/include/LibreOfficeKit/LibreOfficeKit.h index 6a94583b8bf3..72beeb613246 100644 --- a/include/LibreOfficeKit/LibreOfficeKit.h +++ b/include/LibreOfficeKit/LibreOfficeKit.h @@ -458,23 +458,15 @@ struct _LibreOfficeKitDocumentClass void (*sendFormFieldEvent) (LibreOfficeKitDocument* pThis, const char* pArguments); - /// @see lok::Document::setFreemiumDenyList - void (*setFreemiumDenyList) (LibreOfficeKitDocument* pThis, - const char* freemiumDenyList); + /// @see lok::Document::setBlockedCommandList + void (*setBlockedCommandList) (LibreOfficeKitDocument* pThis, + const char* bolckedCommandList); - /// @see lok::Document::setFreemiumView - void (*setFreemiumView) (LibreOfficeKitDocument* pThis, + /// @see lok::Document::setBlockedCommandView + void (*setBlockedCommandView) (LibreOfficeKitDocument* pThis, int nViewId, - bool isFreemium); - - /// @see lok::Document::setRestrictedCommandList - void (*setRestrictedCommandList) (LibreOfficeKitDocument* pThis, - const char* restrictedCommandList); - - /// @see lok::Document::setRestrictedView - void (*setRestrictedView) (LibreOfficeKitDocument* pThis, - int nViewId, - bool isRestricted); + const char* type, + bool isBlocked); /// @see lok::Document::renderSearchResult bool (*renderSearchResult) (LibreOfficeKitDocument* pThis, diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx index 14170ed361a7..506befe74bb8 100644 --- a/include/LibreOfficeKit/LibreOfficeKit.hxx +++ b/include/LibreOfficeKit/LibreOfficeKit.hxx @@ -787,24 +787,14 @@ public: mpDoc->pClass->sendFormFieldEvent(mpDoc, pArguments); } - void setFreemiumDenyList(const char* freemiumDenyList) + void setBlockedCommandList(const char* bolckedCommandList) { - mpDoc->pClass->setFreemiumDenyList(mpDoc, freemiumDenyList); + mpDoc->pClass->setBlockedCommandList(mpDoc, bolckedCommandList); } - void setFreemiumView(int nViewId, bool isFreemium) + void setBlockedCommandView(int nViewId, const char* type, bool isBlocked) { - mpDoc->pClass->setFreemiumView(mpDoc, nViewId, isFreemium); - } - - void setRestrictedCommandList(const char* restrictedCommandList) - { - mpDoc->pClass->setRestrictedCommandList(mpDoc, restrictedCommandList); - } - - void setRestrictedView(int nViewId, bool isRestricted) - { - mpDoc->pClass->setRestrictedView(mpDoc, nViewId, isRestricted); + mpDoc->pClass->setBlockedCommandView(mpDoc, nViewId, type, isBlocked); } /** diff --git a/include/comphelper/lok.hxx b/include/comphelper/lok.hxx index 847c56012565..1ea5b23f017d 100644 --- a/include/comphelper/lok.hxx +++ b/include/comphelper/lok.hxx @@ -13,6 +13,7 @@ #include <comphelper/comphelperdllapi.h> #include <rtl/ustring.hxx> #include <vector> +#include <unordered_set> class LanguageTag; @@ -110,12 +111,11 @@ COMPHELPER_DLLPUBLIC void statusIndicatorStart(const OUString& sText); COMPHELPER_DLLPUBLIC void statusIndicatorSetValue(int percent); COMPHELPER_DLLPUBLIC void statusIndicatorFinish(); -COMPHELPER_DLLPUBLIC void setFreemiumDenyList(const char* freemiumDenyList); -COMPHELPER_DLLPUBLIC const std::vector<OUString>& getFreemiumDenyList(); +COMPHELPER_DLLPUBLIC void setBlockedCommandList(const char* bolckedCommandList); +COMPHELPER_DLLPUBLIC const std::unordered_set<OUString>& getFreemiumDenyList(); COMPHELPER_DLLPUBLIC bool isCommandFreemiumDenied(const OUString& command); -COMPHELPER_DLLPUBLIC void setRestrictedCommandList(const char* restrictedCommandList); -COMPHELPER_DLLPUBLIC const std::vector<OUString>& getRestrictedCommandList(); +COMPHELPER_DLLPUBLIC const std::unordered_set<OUString>& getRestrictedCommandList(); COMPHELPER_DLLPUBLIC bool isRestrictedCommand(const OUString& command); } diff --git a/include/sfx2/lokhelper.hxx b/include/sfx2/lokhelper.hxx index 76f822a1af5f..13a01c91d347 100644 --- a/include/sfx2/lokhelper.hxx +++ b/include/sfx2/lokhelper.hxx @@ -62,10 +62,8 @@ public: static std::size_t getViewsCount(int nDocId); /// Get viewIds of views of the current DocId. static bool getViewIds(int nDocId, int* pArray, size_t nSize); - /// Set View Freemium - static void setFreemiumView(int nViewId, bool isFreemium); - /// Set View Restricted - static void setRestrictedView(int nViewId, bool isRestricted); + /// Set View Blocked for some uno commands + static void setBlockedCommandView(int nViewId, const OUString& type, bool isBlocked); /// Get the document id for a view static int getDocumentIdOfView(int nViewId); /// Get the default language that should be used for views diff --git a/sfx2/source/control/unoctitm.cxx b/sfx2/source/control/unoctitm.cxx index fe52ed3ff9fb..d9e6b4d10069 100644 --- a/sfx2/source/control/unoctitm.cxx +++ b/sfx2/source/control/unoctitm.cxx @@ -49,6 +49,7 @@ #include <vcl/svapp.hxx> #include <vcl/uitest/logger.hxx> #include <boost/property_tree/json_parser.hpp> +#include <tools/json_writer.hxx> #include <sfx2/app.hxx> #include <unoctitm.hxx> @@ -635,6 +636,17 @@ void collectUIInformation(const util::URL& rURL, const css::uno::Sequence< css:: } } +void lcl_BlockCommand(const rtl::OUString& command, const rtl::OUString& kind) +{ + tools::JsonWriter aTree; + aTree.put("code", ""); + aTree.put("kind", kind); + aTree.put("cmd", command); + aTree.put("message", "Blocked feature"); + aTree.put("viewID", SfxViewShell::Current()->GetViewShellId().get()); + + SfxViewShell::Current()->libreOfficeKitViewCallback(LOK_CALLBACK_ERROR, aTree.extractData()); +} void SfxDispatchController_Impl::dispatch( const css::util::URL& aURL, const css::uno::Sequence< css::beans::PropertyValue >& aArgs, @@ -646,36 +658,18 @@ void SfxDispatchController_Impl::dispatch( const css::util::URL& aURL, SolarMutexGuard aGuard; if (comphelper::LibreOfficeKit::isActive() && - SfxViewShell::Current()->isFreemiumView() && - comphelper::LibreOfficeKit::isCommandFreemiumDenied(aURL.Complete)) + SfxViewShell::Current()->isRestrictedView() && + comphelper::LibreOfficeKit::isRestrictedCommand(aURL.Complete)) { - boost::property_tree::ptree aTree; - aTree.put("code", ""); - aTree.put("kind", "freemiumdeny"); - aTree.put("cmd", aURL.Complete); - aTree.put("message", "Blocked Freemium feature"); - aTree.put("viewID", SfxViewShell::Current()->GetViewShellId().get()); - - std::stringstream aStream; - boost::property_tree::write_json(aStream, aTree); - SfxViewShell::Current()->libreOfficeKitViewCallback(LOK_CALLBACK_ERROR, aStream.str().c_str()); + lcl_BlockCommand(aURL.Complete, "restricted"); return; } if (comphelper::LibreOfficeKit::isActive() && - SfxViewShell::Current()->isRestrictedView() && - comphelper::LibreOfficeKit::isRestrictedCommand(aURL.Complete)) + SfxViewShell::Current()->isFreemiumView() && + comphelper::LibreOfficeKit::isCommandFreemiumDenied(aURL.Complete)) { - boost::property_tree::ptree aTree; - aTree.put("code", ""); - aTree.put("kind", "restricted"); - aTree.put("cmd", aURL.Complete); - aTree.put("message", "Blocked restricted feature"); - aTree.put("viewID", SfxViewShell::Current()->GetViewShellId().get()); - - std::stringstream aStream; - boost::property_tree::write_json(aStream, aTree); - SfxViewShell::Current()->libreOfficeKitViewCallback(LOK_CALLBACK_ERROR, aStream.str().c_str()); + lcl_BlockCommand(aURL.Complete, "freemiumdeny"); return; } diff --git a/sfx2/source/view/lokhelper.cxx b/sfx2/source/view/lokhelper.cxx index 2e9be1d80c2f..1b944a709719 100644 --- a/sfx2/source/view/lokhelper.cxx +++ b/sfx2/source/view/lokhelper.cxx @@ -737,21 +737,19 @@ void SfxLokHelper::postKeyEventAsync(const VclPtr<vcl::Window> &xWindow, postEventAsync(pLOKEv); } -void SfxLokHelper::setFreemiumView(int nViewId, bool isFreemium) +void SfxLokHelper::setBlockedCommandView(int nViewId, const OUString& type, bool isBlocked) { SfxViewShell* pViewShell = SfxLokHelper::getViewOfId(nViewId); if(pViewShell) - pViewShell->setFreemiumView(isFreemium); + { + if(type == "freemium") + pViewShell->setFreemiumView(isBlocked); + else + pViewShell->setRestrictedView(isBlocked); + } } -void SfxLokHelper::setRestrictedView(int nViewId, bool isRestricted) -{ - SfxViewShell* pViewShell = SfxLokHelper::getViewOfId(nViewId); - - if(pViewShell) - pViewShell->setRestrictedView(isRestricted); -} void SfxLokHelper::postExtTextEventAsync(const VclPtr<vcl::Window> &xWindow, int nType, const OUString &rText) {