Jacek Caban : schtasks: Added /delete command implementation.

Alexandre Julliard julliard at winehq.org
Fri Jan 19 15:43:21 CST 2018


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Jan 19 19:16:20 2018 +0100

schtasks: Added /delete command implementation.

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

---

 programs/schtasks/schtasks.c       | 87 +++++++++++++++++++++++++++++++++-----
 programs/schtasks/tests/schtasks.c |  3 +-
 2 files changed, 79 insertions(+), 11 deletions(-)

diff --git a/programs/schtasks/schtasks.c b/programs/schtasks/schtasks.c
index 24d6876..88a004f 100644
--- a/programs/schtasks/schtasks.c
+++ b/programs/schtasks/schtasks.c
@@ -26,17 +26,17 @@
 
 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 const WCHAR change_optW[] = {'/','c','h','a','n','g','e',0};
+static const WCHAR delete_optW[] = {'/','d','e','l','e','t','e',0};
+static const WCHAR enable_optW[] = {'/','e','n','a','b','l','e',0};
+static const WCHAR f_optW[] = {'/','f',0};
+static const WCHAR tn_optW[] = {'/','t','n',0};
 
-static IRegisteredTask *get_registered_task(const WCHAR *name)
+static ITaskFolder *get_tasks_root_folder(void)
 {
-    IRegisteredTask *registered_task;
     ITaskService *service;
-    ITaskFolder *folder;
+    ITaskFolder *root;
     VARIANT empty;
-    BSTR str;
     HRESULT hres;
 
     hres = CoCreateInstance(&CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER,
@@ -51,17 +51,31 @@ static IRegisteredTask *get_registered_task(const WCHAR *name)
         return NULL;
     }
 
-    hres = ITaskService_GetFolder(service, NULL, &folder);
+    hres = ITaskService_GetFolder(service, NULL, &root);
     ITaskService_Release(service);
     if (FAILED(hres)) {
         FIXME("GetFolder failed: %08x\n", hres);
         return NULL;
     }
 
+    return root;
+}
+
+static IRegisteredTask *get_registered_task(const WCHAR *name)
+{
+    IRegisteredTask *registered_task;
+    ITaskFolder *root;
+    BSTR str;
+    HRESULT hres;
+
+    root = get_tasks_root_folder();
+    if (!root)
+        return NULL;
+
     str = SysAllocString(name);
-    hres = ITaskFolder_GetTask(folder, str, &registered_task);
+    hres = ITaskFolder_GetTask(root, str, &registered_task);
     SysFreeString(str);
-    ITaskFolder_Release(folder);
+    ITaskFolder_Release(root);
     if (FAILED(hres)) {
         FIXME("GetTask failed: %08x\n", hres);
         return NULL;
@@ -118,6 +132,57 @@ static int change_command(int argc, WCHAR *argv[])
     return 0;
 }
 
+static int delete_command(int argc, WCHAR *argv[])
+{
+    const WCHAR *task_name = NULL;
+    ITaskFolder *root = NULL;
+    BSTR str;
+    HRESULT hres;
+
+    while (argc) {
+        if (!strcmpiW(argv[0], f_optW)) {
+            TRACE("force opt\n");
+            argc--;
+            argv++;
+        }else if(!strcmpiW(argv[0], tn_optW)) {
+            if (argc < 2) {
+                FIXME("Missing /tn value\n");
+                return 1;
+            }
+
+            if (task_name) {
+                FIXME("Duplicated /tn argument\n");
+                return 1;
+            }
+
+            task_name = argv[1];
+            argc -= 2;
+            argv += 2;
+        }else {
+            FIXME("Unsupported argument %s\n", debugstr_w(argv[0]));
+            return 1;
+        }
+    }
+
+    if (!task_name) {
+        FIXME("Missing /tn argument\n");
+        return 1;
+    }
+
+    root = get_tasks_root_folder();
+    if (!root)
+        return 1;
+
+    str = SysAllocString(task_name);
+    hres = ITaskFolder_DeleteTask(root, str, 0);
+    SysFreeString(str);
+    ITaskFolder_Release(root);
+    if (FAILED(hres))
+        return 1;
+
+    return 0;
+}
+
 int wmain(int argc, WCHAR *argv[])
 {
     int i, ret = 0;
@@ -132,6 +197,8 @@ int wmain(int argc, WCHAR *argv[])
         FIXME("Print current tasks state\n");
     else if (!strcmpiW(argv[1], change_optW))
         ret = change_command(argc - 2, argv + 2);
+    else if (!strcmpiW(argv[1], delete_optW))
+        ret = delete_command(argc - 2, argv + 2);
     else
         FIXME("Unsupported command %s\n", debugstr_w(argv[1]));
 
diff --git a/programs/schtasks/tests/schtasks.c b/programs/schtasks/tests/schtasks.c
index 03f4e43..7765038 100644
--- a/programs/schtasks/tests/schtasks.c
+++ b/programs/schtasks/tests/schtasks.c
@@ -180,7 +180,8 @@ START_TEST(schtasks)
     r = run_command("schtasks /CHANGE /tn wine\\test\\winetest /enable");
     ok(r == 0, "r = %u\n", r);
 
-    unregister_task("wine\\test\\winetest");
+    r = run_command("schtasks /delete /f /tn wine\\test\\winetest");
+    ok(r == 0, "r = %u\n", r);
 
     r = run_command("schtasks /Change /tn wine\\test\\winetest /enable");
     ok(r == 1, "r = %u\n", r);




More information about the wine-cvs mailing list