From ff642085b412a5614329c7ac207bb2516759a864 Mon Sep 17 00:00:00 2001 From: Michael Schuster Date: Tue, 3 Mar 2020 18:45:58 +0100 Subject: [PATCH 1/2] Fix Explorer pinning: Add fallbacks for Shell commands (fixes #1599) See: #1599 Signed-off-by: Michael Schuster --- src/gui/socketapi.cpp | 25 +++++++++++++++++++++++++ src/gui/socketapi.h | 7 +++++++ 2 files changed, 32 insertions(+) diff --git a/src/gui/socketapi.cpp b/src/gui/socketapi.cpp index 7967312b8..45ed44982 100644 --- a/src/gui/socketapi.cpp +++ b/src/gui/socketapi.cpp @@ -52,6 +52,7 @@ #include #include +#include #include @@ -291,6 +292,12 @@ void SocketApi::slotReadSocket() int indexOfMethod = staticMetaObject.indexOfMethod(functionWithArguments); QString argument = line.remove(0, command.length() + 1); + if (indexOfMethod == -1) { + // Fallback: Try upper-case command + functionWithArguments = "command_" + command.toUpper() + "(QString,SocketListener*)"; + indexOfMethod = staticMetaObject.indexOfMethod(functionWithArguments); + } + if (indexOfMethod != -1) { staticMetaObject.method(indexOfMethod).invoke(this, Q_ARG(QString, argument), Q_ARG(SocketListener *, listener)); } else { @@ -621,6 +628,24 @@ void SocketApi::command_COPY_PUBLIC_LINK(const QString &localFile, SocketListene job->run(); } +// Windows Shell / Explorer pinning fallbacks, see issue: https://github.com/nextcloud/desktop/issues/1599 +#ifdef Q_OS_WIN +void SocketApi::command_COPYASPATH(const QString &localFile, SocketListener *) +{ + QApplication::clipboard()->setText(localFile); +} + +void SocketApi::command_OPENNEWWINDOW(const QString &localFile, SocketListener *) +{ + QDesktopServices::openUrl(QUrl::fromLocalFile(localFile)); +} + +void SocketApi::command_OPEN(const QString &localFile, SocketListener *socketListener) +{ + command_OPENNEWWINDOW(localFile, socketListener); +} +#endif + // Fetches the private link url asynchronously and then calls the target slot void SocketApi::fetchPrivateLinkUrlHelper(const QString &localFile, const std::function &targetFun) { diff --git a/src/gui/socketapi.h b/src/gui/socketapi.h index 40adb5700..b31294c5b 100644 --- a/src/gui/socketapi.h +++ b/src/gui/socketapi.h @@ -106,6 +106,13 @@ private: Q_INVOKABLE void command_EMAIL_PRIVATE_LINK(const QString &localFile, SocketListener *listener); Q_INVOKABLE void command_OPEN_PRIVATE_LINK(const QString &localFile, SocketListener *listener); + // Windows Shell / Explorer pinning fallbacks, see issue: https://github.com/nextcloud/desktop/issues/1599 +#ifdef Q_OS_WIN + Q_INVOKABLE void command_COPYASPATH(const QString &localFile, SocketListener *listener); + Q_INVOKABLE void command_OPENNEWWINDOW(const QString &localFile, SocketListener *listener); + Q_INVOKABLE void command_OPEN(const QString &localFile, SocketListener *listener); +#endif + // Fetch the private link and call targetFun void fetchPrivateLinkUrlHelper(const QString &localFile, const std::function &targetFun); From a704cca09079cbad15f7e6bca1144a76d25709a9 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Wed, 27 Feb 2019 12:36:54 +0100 Subject: [PATCH 2/2] Windows: Fix context menu handling only own verbs #7004 Previously it'd handle all verbs as if they were our own. Signed-off-by: Michael Schuster --- .../windows/OCContextMenu/OCContextMenu.cpp | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/shell_integration/windows/OCContextMenu/OCContextMenu.cpp b/shell_integration/windows/OCContextMenu/OCContextMenu.cpp index 582783f48..9e9052211 100644 --- a/shell_integration/windows/OCContextMenu/OCContextMenu.cpp +++ b/shell_integration/windows/OCContextMenu/OCContextMenu.cpp @@ -182,20 +182,38 @@ IFACEMETHODIMP OCContextMenu::InvokeCommand(LPCMINVOKECOMMANDINFO pici) { std::wstring command; + CMINVOKECOMMANDINFOEX *piciEx = nullptr; + if (pici->cbSize == sizeof(CMINVOKECOMMANDINFOEX)) + piciEx = (CMINVOKECOMMANDINFOEX*)pici; + // For the Unicode case, if the high-order word is not zero, the // command's verb string is in lpcmi->lpVerbW. - if (HIWORD(((CMINVOKECOMMANDINFOEX*)pici)->lpVerbW)) - { - command = ((CMINVOKECOMMANDINFOEX *)pici)->lpVerbW; - } else { + if (piciEx + && (piciEx->fMask & CMIC_MASK_UNICODE) + && HIWORD(((CMINVOKECOMMANDINFOEX*)pici)->lpVerbW)) { + + command = piciEx->lpVerbW; + + // Verify that we handle the verb + bool handled = false; + for (auto &item : m_info.menuItems) { + if (item.command == command) { + handled = true; + break; + } + } + if (!handled) + return E_FAIL; + } else if (IS_INTRESOURCE(pici->lpVerb)) { // If the command cannot be identified through the verb string, then // check the identifier offset. - auto offset = LOWORD(pici->lpVerb); if (offset >= m_info.menuItems.size()) return E_FAIL; command = m_info.menuItems[offset].command; + } else { + return E_FAIL; } OCClientInterface::SendRequest(command.data(), m_selectedFiles);