diff ui/taskscheduler.cpp @ 827:8de162b91a22

(Issue49) Create a Scheduled daily task to run trustbridge
author Andre Heinecke <andre.heinecke@intevation.de>
date Wed, 23 Jul 2014 19:47:59 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ui/taskscheduler.cpp	Wed Jul 23 19:47:59 2014 +0200
@@ -0,0 +1,188 @@
+#ifdef WIN32
+#include "taskscheduler.h"
+
+/* Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik
+ * Software engineering by Intevation GmbH
+ *
+ * This file is Free Software under the GNU GPL (v>=2)
+ * and comes with ABSOLUTELY NO WARRANTY!
+ * See LICENSE.txt for details.
+ */
+
+#include <windows.h>
+
+#include <QDate>
+#include <QDebug>
+#include <QApplication>
+
+#define TASK_NAME L"TrustBridge Update"
+
+TaskScheduler::TaskScheduler() :
+    mInitialized (false),
+    mTaskScheduler (NULL)
+{
+    HRESULT hr;
+
+    hr = CoInitialize(NULL);
+    if(FAILED(hr)) {
+        qDebug() << "TaskScheduler CoInitializeEx failed: " << hr;
+        return;
+    }
+
+    hr = CoCreateInstance(CLSID_CTaskScheduler,
+                          NULL,
+                          CLSCTX_INPROC_SERVER,
+                          IID_ITaskScheduler,
+                          (void**)&mTaskScheduler);
+    if(FAILED(hr)) {
+        qDebug() << "TaskScheduler create instance failed: " << hr;
+        CoUninitialize();
+        return;
+    }
+
+    mInitialized = true;
+    qDebug() << "Initialization done";
+    return;
+}
+
+TaskScheduler::~TaskScheduler() {
+    qDebug() << "TaskSched dtor;";
+
+    if (!isInitialized()) {
+        return;
+    }
+    mTaskScheduler->Release();
+    CoUninitialize();
+}
+
+bool createTrigger(ITask *task, const QTime &startTime)
+{
+    ITaskTrigger *pITaskTrigger = NULL;
+    WORD piNewTrigger = 0;
+    HRESULT hr;
+    TASK_TRIGGER pTrigger;
+    ZeroMemory(&pTrigger, sizeof (TASK_TRIGGER));
+    QDate startdate = QDate::currentDate();
+
+    if (!startTime.isValid() || task == NULL) {
+        qDebug() << "Invalid args.";
+        return false;
+    }
+
+    hr = task->CreateTrigger(&piNewTrigger,
+            &pITaskTrigger);
+
+    if (FAILED(hr)) {
+        qDebug() << "Failed to create trigger.";
+        return false;
+    }
+
+    pTrigger.wBeginDay = startdate.day();
+    pTrigger.wBeginMonth = startdate.month();
+    pTrigger.wBeginYear = startdate.year();
+    pTrigger.wStartHour = startTime.hour();
+    pTrigger.wStartMinute = startTime.minute();
+    pTrigger.cbTriggerSize = sizeof (TASK_TRIGGER);
+    pTrigger.TriggerType = TASK_TIME_TRIGGER_DAILY;
+    pTrigger.Type.Daily.DaysInterval = 1;
+
+    hr = pITaskTrigger->SetTrigger(&pTrigger);
+
+    pITaskTrigger->Release();
+    if (FAILED(hr)) {
+        qDebug() << "Failed to create trigger.";
+        return false;
+    }
+
+    return true;
+}
+
+bool TaskScheduler::createDailyTask(const QString &executable,
+                                    const QString &args,
+                                    const QTime &startTime) {
+    ITask *task = NULL;
+    IPersistFile *persistFile = NULL;
+    HRESULT hr;
+
+    hr = mTaskScheduler->NewWorkItem(TASK_NAME,
+            CLSID_CTask,
+            IID_ITask,
+            (IUnknown**)&task);
+
+    if (FAILED(hr)) {
+        qDebug() << "Failed to create new work item.";
+        return false;
+    }
+
+    /* Set the task parameters */
+    hr = task->SetApplicationName(reinterpret_cast<LPCWSTR> (executable.utf16()));
+    if (FAILED(hr)) {
+        qDebug() << "Failed to set application name.";
+        task->Release();
+        return false;
+    }
+
+    hr = task->SetParameters(reinterpret_cast<LPCWSTR> (args.utf16()));
+    if (FAILED(hr)) {
+        qDebug() << "Failed to set parameters.";
+        task->Release();
+        return false;
+    }
+
+    hr = task->SetComment(reinterpret_cast<LPCWSTR>(QObject::tr("TrustBridge automatic update check.").utf16()));
+    if (FAILED(hr)) {
+        qDebug() << "Failed to set comment.";
+        task->Release();
+        return false;
+    }
+
+    QString username = QString::fromLocal8Bit(qgetenv("USERNAME").constData());
+    if (username.isEmpty()) {
+        qDebug() << "Failed to obtain username from envrionment.";
+        task->Release();
+        return false;
+    }
+
+    hr = task->SetAccountInformation(reinterpret_cast<LPCWSTR>(username.utf16()), NULL);
+
+    if (FAILED(hr)) {
+        qDebug() << "Failed to set username.";
+        task->Release();
+        return false;
+    }
+
+    hr = task->SetFlags(TASK_FLAG_RUN_ONLY_IF_LOGGED_ON);
+
+    if (FAILED(hr)) {
+        qDebug() << "Failed to set flags.";
+        task->Release();
+        return false;
+    }
+
+    /* Now create the trigger for this task */
+    if (!createTrigger(task, startTime)) {
+        qDebug() << "Failed to create trigger.";
+        task->Release();
+        return false;
+    }
+
+    hr = task->QueryInterface(IID_IPersistFile,
+                             (void **)&persistFile);
+    task->Release();
+
+    if (FAILED(hr)) {
+        qDebug() << "Failed to get persist file interface.";
+        task->Release();
+        return false;
+    }
+
+    hr = persistFile->Save(NULL, TRUE);
+    persistFile->Release();
+    if (FAILED(hr)) {
+        qDebug() << "Failed to save task";
+        return false;
+    }
+
+    return true;
+}
+#endif /* WIN32 */

http://wald.intevation.org/projects/trustbridge/