ソースを参照

PlaceHolders: Trigger a download of the placeholder and open it

Olivier Goffart 8 年 前
コミット
6ce7c7a56b
4 ファイル変更57 行追加0 行削除
  1. 28 0
      src/gui/application.cpp
  2. 4 0
      src/gui/application.h
  3. 20 0
      src/gui/folder.cpp
  4. 5 0
      src/gui/folder.h

+ 28 - 0
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<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

+ 4 - 0
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 &);

+ 20 - 0
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

+ 5 - 0
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);