_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() + "'");
}
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<QMetaObject::Connection>::create();
+ *con = QObject::connect(folder, &Folder::syncFinished, [con, normalName] {
+ QObject::disconnect(*con);
+ if (QFile::exists(normalName)) {
+ QDesktopServices::openUrl(QUrl::fromLocalFile(normalName));
+ }
+ });
+}
+
} // namespace OCC
// 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 &);
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
*/
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);