]> git.sesse.net Git - kdenlive/blobdiff - renderer/renderjob.cpp
* use KNotify so that now users get a popup when a rendering starts / ends
[kdenlive] / renderer / renderjob.cpp
index 08d4ed08051b577e8871375a68fe93093812dab3..0c8d402f5d793d3dad547b091920a590b2e575a5 100644 (file)
 
 
 #include <QtDBus>
+#include <QFile>
 
 #include "renderjob.h"
 
 static QDBusConnection connection(QLatin1String(""));
 
-RenderJob::RenderJob(bool erase, QString renderer, QString player, QString scenelist, QString dest, QStringList args, int in, int out) : QObject() {
+RenderJob::RenderJob(bool erase, const QString &renderer, const QString &profile, const QString &rendermodule, const QString &player, const QString &scenelist, const QString &dest, const QStringList &preargs, const QStringList &args, int in, int out) : QObject(), m_jobUiserver(NULL) {
     m_scenelist = scenelist;
     m_dest = dest;
     m_player = player;
@@ -35,7 +36,10 @@ RenderJob::RenderJob(bool erase, QString renderer, QString player, QString scene
     m_args << scenelist;
     if (in != -1) m_args << "in=" + QString::number(in);
     if (out != -1) m_args << "out=" + QString::number(out);
-    m_args << "-consumer" << "avformat:" + m_dest << "progress=1" << args;
+    m_args << preargs;
+    //qDebug()<<"PRE ARGS: "<<preargs;
+    m_args << "-profile" << profile;
+    m_args << "-consumer" << rendermodule + ":" + m_dest << "progress=1" << args;
     connect(m_renderProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotIsOver(int, QProcess::ExitStatus)));
     connect(m_renderProcess, SIGNAL(readyReadStandardError()), this, SLOT(receivedStderr()));
     m_renderProcess->setReadChannel(QProcess::StandardError);
@@ -43,7 +47,20 @@ RenderJob::RenderJob(bool erase, QString renderer, QString player, QString scene
 
 
 RenderJob::~RenderJob() {
-    delete m_renderProcess;
+    if (m_renderProcess) delete m_renderProcess;
+}
+
+void RenderJob::slotAbort() {
+    qDebug() << "Kdenlive-render: JOBĀ ABORTED BY USER...";
+    m_renderProcess->kill();
+    if (m_jobUiserver) QDBusReply<QString> reply = m_jobUiserver->call("terminate", "");
+    if (m_erase) {
+        QFile f(m_scenelist);
+        f.remove();
+    }
+    QFile f(m_dest);
+    f.remove();
+    qApp->quit();
 }
 
 void RenderJob::receivedStderr() {
@@ -53,32 +70,86 @@ void RenderJob::receivedStderr() {
     int pro = result.toInt();
     if (pro > m_progress) {
         m_progress = pro;
-        QDBusReply<QString> reply = m_jobUiserver->call("setPercent", (uint) m_progress);
+        if (m_jobUiserver) QDBusReply<QString> reply = m_jobUiserver->call("setPercent", (uint) m_progress);
     }
 }
 
 void RenderJob::start() {
-    QDBusInterface kuiserver("org.kde.JobViewServer", "/JobViewServer", "org.kde.JobViewServer");
-    QDBusReply<QDBusObjectPath> objectPath = kuiserver.call("requestView", "kdenlive", "kdenlive", 1);
-    QString reply = ((QDBusObjectPath) objectPath).path();
-    m_jobUiserver = new QDBusInterface("org.kde.JobViewServer", reply, "org.kde.JobView");
-    m_jobUiserver->call("setInfoMessage", tr("Rendering %1").arg(m_dest));
+    QDBusConnectionInterface* interface = QDBusConnection::sessionBus().interface();
+    if (interface && interface->isServiceRegistered("org.kde.JobViewServer")) {
+       QDBusInterface kuiserver("org.kde.JobViewServer", "/JobViewServer", "org.kde.JobViewServer");
+       QDBusReply<QDBusObjectPath> objectPath = kuiserver.call("requestView", "kdenlive", "kdenlive", 1);
+       QString reply = ((QDBusObjectPath) objectPath).path();
+       m_jobUiserver = new QDBusInterface("org.kde.JobViewServer", reply, "org.kde.JobView");
+       m_jobUiserver->call("setInfoMessage", tr("Rendering %1").arg(m_dest.section('/', -1)));
+
+       QDBusConnection::sessionBus().connect("org.kde.JobViewServer", reply, "org.kde.JobView",
+                                          "cancelRequested", this, SLOT(slotAbort()));
+    }
     m_renderProcess->start(m_prog, m_args);
 }
 
 
 void RenderJob::slotIsOver(int exitcode, QProcess::ExitStatus status) {
-    QDBusReply<QString> reply = m_jobUiserver->call("terminate", "");
+    if (m_jobUiserver) QDBusReply<QString> reply = m_jobUiserver->call("terminate", "");
     if (m_erase) {
         QFile f(m_scenelist);
         f.remove();
     }
-    if (m_player != "-") {
+    if (status == QProcess::CrashExit) {
+        // rendering crashed
         QStringList args;
-        args << m_dest;
-        QProcess::startDetached(m_player, args);
+        args << "--error" << tr("Rendering of %1 aborted, resulting video will probably be corrupted.").arg(m_dest);
+        QProcess::startDetached("kdialog", args);
+    } else {
+       QDBusConnectionInterface* interface = QDBusConnection::sessionBus().interface();
+        if (interface && interface->isServiceRegistered("org.kde.knotify")) {
+                       QDBusMessage m = QDBusMessage::createMethodCall("org.kde.knotify",
+                                              "/Notify",
+                                              "org.kde.KNotify",
+                                              "event");
+
+                       QList<QVariant> args;
+                       args.append( QString("RenderFinished") ); // action name
+                       args.append( QString("kdenlive") ); // app name
+                       args.append( QVariantList() ); // contexts
+                       args.append( tr("Rendering of %1 is over").arg(m_dest) ); // body
+                       args.append( QByteArray() ); // app icon
+                       QStringList actionList;
+                       args.append( actionList ); // actions
+                       qlonglong wid;
+                       args.append( wid ); // win id
+
+                       /*
+                       uint id = 0;
+                       int timeout = 5000;
+                       QDBusMessage m = QDBusMessage::createMethodCall("org.kde.VisualNotifications",
+                                              "/VisualNotifications",
+                                              "org.kde.VisualNotifications",
+                                              "Notify");
+
+                       args.append( QString("kdenlive") ); // app_name
+                       args.append( id ); // replaces_id
+                       args.append( QString("kdenlive") ); // app_icon
+                       args.append( tr("Rendering finished")); // summary
+                       args.append( tr("Rendering of %1 is over").arg(m_dest) ); // body
+                       QStringList actionList;
+                       args.append( actionList ); // actions
+                       args.append( QVariantMap() ); // hints - unused atm
+                       args.append( timeout ); // expire timout
+                       */
+
+                       m.setArguments( args );
+                       QDBusMessage replyMsg = QDBusConnection::sessionBus().call(m);
+               }
+
+               if (m_player != "-") {
+                       QStringList args;
+                       args << m_dest;
+                       QProcess::startDetached(m_player, args);
+               }
     }
-    exit(1);
+    qApp->quit();
 }
 
 #include "renderjob.moc"