Module: wine Branch: master Commit: a5af50c5db8e12a5eac3ff0a201238d801f30c5b URL: https://source.winehq.org/git/wine.git/?a=commit;h=a5af50c5db8e12a5eac3ff0a2...
Author: Jacek Caban jacek@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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, ®istered_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; }