Jacek Caban : schtasks: Added partial /change command implementation.

Alexandre Julliard julliard at winehq.org
Mon Jan 8 16:08:07 CST 2018


Module: wine
Branch: master
Commit: a5af50c5db8e12a5eac3ff0a201238d801f30c5b
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=a5af50c5db8e12a5eac3ff0a201238d801f30c5b

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Jan  5 23:12:39 2018 +0100

schtasks: Added partial /change command implementation.

This is needed by Office 2016 installer.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/schtasks/Makefile.in |   1 +
 programs/schtasks/schtasks.c  | 117 ++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 113 insertions(+), 5 deletions(-)

diff --git a/programs/schtasks/Makefile.in b/programs/schtasks/Makefile.in
index d06bef2..8c3b790 100644
--- a/programs/schtasks/Makefile.in
+++ b/programs/schtasks/Makefile.in
@@ -1,5 +1,6 @@
 MODULE    = schtasks.exe
 APPMODE   = -mconsole -municode
+IMPORTS   = oleaut32 ole32
 
 C_SRCS = \
 	schtasks.c
diff --git a/programs/schtasks/schtasks.c b/programs/schtasks/schtasks.c
index a3af346..c620154 100644
--- a/programs/schtasks/schtasks.c
+++ b/programs/schtasks/schtasks.c
@@ -16,18 +16,125 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#define COBJMACROS
+
+#include "initguid.h"
+#include "taskschd.h"
+
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(schtasks);
 
+const WCHAR change_optW[] = {'/','c','h','a','n','g','e',0};
+const WCHAR enable_optW[] = {'/','e','n','a','b','l','e',0};
+const WCHAR tn_optW[] = {'/','t','n',0};
+
+static IRegisteredTask *get_registered_task(const WCHAR *name)
+{
+    IRegisteredTask *registered_task;
+    ITaskService *service;
+    ITaskFolder *folder;
+    VARIANT empty;
+    BSTR str;
+    HRESULT hres;
+
+    hres = CoCreateInstance(&CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER,
+                            &IID_ITaskService, (void**)&service);
+    if (FAILED(hres))
+        return NULL;
+
+    V_VT(&empty) = VT_EMPTY;
+    hres = ITaskService_Connect(service, empty, empty, empty, empty);
+    if (FAILED(hres)) {
+        FIXME("Connect failed: %08x\n", hres);
+        return NULL;
+    }
+
+    hres = ITaskService_GetFolder(service, NULL, &folder);
+    ITaskService_Release(service);
+    if (FAILED(hres)) {
+        FIXME("GetFolder failed: %08x\n", hres);
+        return NULL;
+    }
+
+    str = SysAllocString(name);
+    hres = ITaskFolder_GetTask(folder, str, &registered_task);
+    SysFreeString(str);
+    ITaskFolder_Release(folder);
+    if (FAILED(hres)) {
+        FIXME("GetTask failed: %08x\n", hres);
+        return NULL;
+    }
+
+    return registered_task;
+}
+
+static int change_command(int argc, WCHAR *argv[])
+{
+    const WCHAR *task_name;
+    IRegisteredTask *task;
+    HRESULT hres;
+
+    if (!argc) {
+        FIXME("Missing /tn option\n");
+        return 1;
+    }
+
+    if (strcmpiW(argv[0], tn_optW)) {
+        FIXME("Unsupported %s option\n", debugstr_w(argv[0]));
+        return 0;
+    }
+
+    if (argc < 2) {
+        FIXME("Missing /tn value\n");
+        return 1;
+    }
+
+    task_name = argv[1];
+    argc -= 2;
+    argv += 2;
+    if (!argc) {
+        FIXME("Missing change options\n");
+        return 1;
+    }
+
+    if (strcmpiW(argv[0], enable_optW) || argc > 1) {
+        FIXME("Unsupported arguments %s\n", debugstr_w(argv[0]));
+        return 0;
+    }
+
+    task = get_registered_task(task_name);
+    if (!task)
+        return 1;
+
+    hres = IRegisteredTask_put_Enabled(task, VARIANT_TRUE);
+    IRegisteredTask_Release(task);
+    if (FAILED(hres)) {
+        FIXME("put_Enabled failed: %08x\n", hres);
+        return 1;
+    }
+
+    return 0;
+}
+
 int wmain(int argc, WCHAR *argv[])
 {
-    int i;
+    int i, ret = 0;
 
-    WINE_FIXME("stub:");
     for (i = 0; i < argc; i++)
-        WINE_FIXME(" %s", wine_dbgstr_w(argv[i]));
-    WINE_FIXME("\n");
+        TRACE(" %s", wine_dbgstr_w(argv[i]));
+    TRACE("\n");
 
-    return 0;
+    CoInitialize(NULL);
+
+    if (argc < 2)
+        FIXME("Print current tasks state\n");
+    else if (!strcmpW(argv[1], change_optW))
+        ret = change_command(argc - 2, argv + 2);
+    else
+        FIXME("Unsupported command %s\n", debugstr_w(argv[1]));
+
+    CoUninitialize();
+    return ret;
 }




More information about the wine-cvs mailing list