From 6ce7c7a56b285b78a8f89074dde027930f522d13 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Mon, 15 Jan 2018 16:46:52 +0100 Subject: [PATCH] PlaceHolders: Trigger a download of the placeholder and open it --- src/gui/application.cpp | 28 ++++++++++++++++++++++++++++ src/gui/application.h | 4 ++++ src/gui/folder.cpp | 20 ++++++++++++++++++++ src/gui/folder.h | 5 +++++ 4 files changed, 57 insertions(+) diff --git a/src/gui/application.cpp b/src/gui/application.cpp index a408b392b..c0936f3bd 100644 --- a/src/gui/application.cpp +++ b/src/gui/application.cpp @@ -499,6 +499,9 @@ void Application::parseOptions(const QStringList &options) _backgroundMode = true; } else if (option == QLatin1String("--version") || option == QLatin1String("-v")) { _versionOnly = true; + } else if (option.endsWith(".owncloud")) { + // placeholder file, open it after the Folder were created (if the app is not terminated) + QTimer::singleShot(0, this, [this, option] { openPlaceholder(option); }); } else { showHint("Unrecognized option '" + option.toStdString() + "'"); } @@ -674,4 +677,29 @@ void Application::slotGuiIsShowingSettings() emit isShowingSettingsDialog(); } +void Application::openPlaceholder(const QString &filename) +{ + QLatin1String placeholderExt(".owncloud"); + if (!filename.endsWith(placeholderExt)) { + qWarning(lcApplication) << "Can only handle file ending in .owncloud. Unable to open" << filename; + return; + } + QString normalName = filename.left(filename.size() - placeholderExt.size()); + auto folder = FolderMan::instance()->folderForPath(filename); + if (!folder) { + qWarning(lcApplication) << "Can't find sync folder for" << filename; + // TODO: show a QMessageBox for errors + return; + } + QString relativePath = QDir::cleanPath(normalName).mid(folder->cleanPath().length() + 1); + folder->downloadPlaceholder(relativePath); + auto con = QSharedPointer::create(); + *con = QObject::connect(folder, &Folder::syncFinished, [con, normalName] { + QObject::disconnect(*con); + if (QFile::exists(normalName)) { + QDesktopServices::openUrl(QUrl::fromLocalFile(normalName)); + } + }); +} + } // namespace OCC diff --git a/src/gui/application.h b/src/gui/application.h index 36d994a31..a184cf5ef 100644 --- a/src/gui/application.h +++ b/src/gui/application.h @@ -73,6 +73,10 @@ public slots: // TODO: this should not be public void slotownCloudWizardDone(int); void slotCrash(); + /** + * Will download a placeholder file, and open the result. + */ + void openPlaceholder(const QString &filename); protected: void parseOptions(const QStringList &); diff --git a/src/gui/folder.cpp b/src/gui/folder.cpp index d6f84937e..8cd997340 100644 --- a/src/gui/folder.cpp +++ b/src/gui/folder.cpp @@ -514,6 +514,26 @@ void Folder::slotWatchedPathChanged(const QString &path) scheduleThisFolderSoon(); } +void Folder::downloadPlaceholder(const QString &_relativepath) +{ + qCInfo(lcFolder) << "Download placeholder: " << _relativepath; + auto relativepath = _relativepath.toUtf8(); + + // Set in the database that we should download the file + SyncJournalFileRecord record; + _journal.getFileRecord(relativepath, &record); + if (!record.isValid()) + return; + record._type = ItemTypePlaceholderDownload; + _journal.setFileRecord(record); + + // Make sure we go over that file during the discovery + _journal.avoidReadFromDbOnNextSync(relativepath); + + // Schedule a sync (Folder man will start the sync in a few ms) + slotScheduleThisFolder(); +} + void Folder::saveToSettings() const { // Remove first to make sure we don't get duplicates diff --git a/src/gui/folder.h b/src/gui/folder.h index 6f6423b7a..095a813d0 100644 --- a/src/gui/folder.h +++ b/src/gui/folder.h @@ -276,6 +276,11 @@ public slots: */ void slotWatchedPathChanged(const QString &path); + /** + * Mark a placeholder as being ready for download, and start a sync. + */ + void downloadPlaceholder(const QString &relativepath); + private slots: void slotSyncStarted(); void slotSyncFinished(bool);