fetchPrivateLinkUrlHelper(localFile, &SocketApi::openPrivateLink);
}
+void SocketApi::command_DOWNLOAD_PLACEHOLDER(const QString &filesArg, SocketListener *)
+{
+ QStringList files = filesArg.split(QLatin1Char('\x1e')); // Record Separator
+ auto placeholderSuffix = QStringLiteral(OWNCLOUD_PLACEHOLDER_SUFFIX);
+
+ for (const auto &file : files) {
+ if (!file.endsWith(placeholderSuffix))
+ continue;
+ auto folder = FolderMan::instance()->folderForPath(file);
+ if (folder) {
+ QString relativePath = QDir::cleanPath(file).mid(folder->cleanPath().length() + 1);
+ folder->downloadPlaceholder(relativePath);
+ }
+ }
+}
+
void SocketApi::copyUrlToClipboard(const QString &link)
{
QApplication::clipboard()->setText(link);
void SocketApi::command_GET_MENU_ITEMS(const QString &argument, OCC::SocketListener *listener)
{
listener->sendMessage(QString("GET_MENU_ITEMS:BEGIN"));
- bool hasSeveralFiles = argument.contains(QLatin1Char('\x1e')); // Record Separator
- FileData fileData = hasSeveralFiles ? FileData{} : FileData::get(argument);
- const auto record = fileData.journalRecord();
- const bool isOnTheServer = record.isValid();
- const auto isE2eEncryptedPath = fileData.journalRecord()._isE2eEncrypted || !fileData.journalRecord()._e2eMangledName.isEmpty();
- auto flagString = isOnTheServer && !isE2eEncryptedPath ? QLatin1String("::") : QLatin1String(":d:");
+ QStringList files = argument.split(QLatin1Char('\x1e')); // Record Separator
+
+ // Find the common sync folder.
+ // syncFolder will be null if files are in different folders.
+ Folder *syncFolder = nullptr;
+ for (const auto &file : files) {
+ auto folder = FolderMan::instance()->folderForPath(file);
+ if (folder != syncFolder) {
+ if (!syncFolder) {
+ syncFolder = folder;
+ } else {
+ syncFolder = nullptr;
+ break;
+ }
+ }
+ }
+
+ // Sharing actions show for single files only
+ if (syncFolder && files.size() == 1 && syncFolder->accountState()->isConnected()) {
+ QString systemPath = QDir::cleanPath(argument);
+ if (systemPath.endsWith(QLatin1Char('/'))) {
+ systemPath.truncate(systemPath.length() - 1);
+ }
+
+ FileData fileData = FileData::get(argument);
+ const auto record = fileData.journalRecord();
+ const bool isOnTheServer = record.isValid();
+ const auto isE2eEncryptedPath = fileData.journalRecord()._isE2eEncrypted || !fileData.journalRecord()._e2eMangledName.isEmpty();
+ auto flagString = isOnTheServer && !isE2eEncryptedPath ? QLatin1String("::") : QLatin1String(":d:");
- if (fileData.folder && fileData.folder->accountState()->isConnected()) {
DirectEditor* editor = getDirectEditorForLocalFile(fileData.localPath);
if (editor) {
//listener->sendMessage(QLatin1String("MENU_ITEM:EDIT") + flagString + tr("Edit via ") + editor->name());
}
}
}
+
+ // Placeholder download action
+ if (syncFolder) {
+ auto placeholderSuffix = QStringLiteral(OWNCLOUD_PLACEHOLDER_SUFFIX);
+ bool hasPlaceholderFile = false;
+ for (const auto &file : files) {
+ if (file.endsWith(placeholderSuffix))
+ hasPlaceholderFile = true;
+ }
+ if (hasPlaceholderFile)
+ listener->sendMessage(QLatin1String("MENU_ITEM:DOWNLOAD_PLACEHOLDER::") + tr("Download file(s)", "", files.size()));
+ }
+
listener->sendMessage(QString("GET_MENU_ITEMS:END"));
}
Q_INVOKABLE void command_COPY_PRIVATE_LINK(const QString &localFile, SocketListener *listener);
Q_INVOKABLE void command_EMAIL_PRIVATE_LINK(const QString &localFile, SocketListener *listener);
Q_INVOKABLE void command_OPEN_PRIVATE_LINK(const QString &localFile, SocketListener *listener);
+ Q_INVOKABLE void command_DOWNLOAD_PLACEHOLDER(const QString &filesArg, SocketListener *listener);
Q_INVOKABLE void command_RESOLVE_CONFLICT(const QString &localFile, SocketListener *listener);
Q_INVOKABLE void command_DELETE_ITEM(const QString &localFile, SocketListener *listener);
Q_INVOKABLE void command_MOVE_ITEM(const QString &localFile, SocketListener *listener);