2 * Copyright 2012 Detlef Riekenberg
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
24 #include "wine/debug.h"
25 #include "wine/unicode.h"
27 WINE_DEFAULT_DEBUG_CHANNEL(schtasks
);
29 static const WCHAR change_optW
[] = {'/','c','h','a','n','g','e',0};
30 static const WCHAR create_optW
[] = {'/','c','r','e','a','t','e',0};
31 static const WCHAR delete_optW
[] = {'/','d','e','l','e','t','e',0};
32 static const WCHAR enable_optW
[] = {'/','e','n','a','b','l','e',0};
33 static const WCHAR f_optW
[] = {'/','f',0};
34 static const WCHAR ru_optW
[] = {'/','r','u',0};
35 static const WCHAR tn_optW
[] = {'/','t','n',0};
36 static const WCHAR tr_optW
[] = {'/','t','r',0};
37 static const WCHAR xml_optW
[] = {'/','x','m','l',0};
39 static ITaskFolder
*get_tasks_root_folder(void)
41 ITaskService
*service
;
46 hres
= CoCreateInstance(&CLSID_TaskScheduler
, NULL
, CLSCTX_INPROC_SERVER
,
47 &IID_ITaskService
, (void**)&service
);
51 V_VT(&empty
) = VT_EMPTY
;
52 hres
= ITaskService_Connect(service
, empty
, empty
, empty
, empty
);
54 FIXME("Connect failed: %08x\n", hres
);
58 hres
= ITaskService_GetFolder(service
, NULL
, &root
);
59 ITaskService_Release(service
);
61 FIXME("GetFolder failed: %08x\n", hres
);
68 static IRegisteredTask
*get_registered_task(const WCHAR
*name
)
70 IRegisteredTask
*registered_task
;
75 root
= get_tasks_root_folder();
79 str
= SysAllocString(name
);
80 hres
= ITaskFolder_GetTask(root
, str
, ®istered_task
);
82 ITaskFolder_Release(root
);
84 FIXME("GetTask failed: %08x\n", hres
);
88 return registered_task
;
91 static BSTR
read_file_to_bstr(const WCHAR
*file_name
)
93 LARGE_INTEGER file_size
;
94 DWORD read_size
, size
;
100 file
= CreateFileW(file_name
, GENERIC_READ
, FILE_SHARE_READ
, NULL
,
101 OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
102 if (file
== INVALID_HANDLE_VALUE
) {
103 FIXME("Could not open file\n");
107 if (!GetFileSizeEx(file
, &file_size
) || !file_size
.QuadPart
) {
108 FIXME("Empty file\n");
113 data
= HeapAlloc(GetProcessHeap(), 0, file_size
.QuadPart
);
115 r
= ReadFile(file
, data
, file_size
.QuadPart
, &read_size
, NULL
);
118 FIXME("Read filed\n");
119 HeapFree(GetProcessHeap(), 0, data
);
123 if (read_size
> 2 && data
[0] == 0xff && data
[1] == 0xfe) { /* UTF-16 BOM */
124 ret
= SysAllocStringLen((const WCHAR
*)(data
+ 2), (read_size
- 2) / sizeof(WCHAR
));
126 size
= MultiByteToWideChar(CP_ACP
, 0, (const char *)data
, read_size
, NULL
, 0);
127 ret
= SysAllocStringLen(NULL
, size
);
129 MultiByteToWideChar(CP_ACP
, 0, (const char *)data
, read_size
, ret
, size
);
131 HeapFree(GetProcessHeap(), 0, data
);
136 static int change_command(int argc
, WCHAR
*argv
[])
138 BOOL have_option
= FALSE
, enable
= FALSE
;
139 const WCHAR
*task_name
= NULL
;
140 IRegisteredTask
*task
;
144 if(!strcmpiW(argv
[0], tn_optW
)) {
146 FIXME("Missing /tn value\n");
151 FIXME("Duplicated /tn argument\n");
158 }else if (!strcmpiW(argv
[0], enable_optW
)) {
163 }else if (!strcmpiW(argv
[0], tr_optW
)) {
165 FIXME("Missing /tr value\n");
169 FIXME("Unsupported /tr option %s\n", debugstr_w(argv
[1]));
174 FIXME("Unsupported arguments %s\n", debugstr_w(argv
[0]));
180 FIXME("Missing /tn option\n");
185 FIXME("Missing change options\n");
189 task
= get_registered_task(task_name
);
194 hres
= IRegisteredTask_put_Enabled(task
, VARIANT_TRUE
);
196 IRegisteredTask_Release(task
);
197 FIXME("put_Enabled failed: %08x\n", hres
);
202 IRegisteredTask_Release(task
);
206 static int create_command(int argc
, WCHAR
*argv
[])
208 const WCHAR
*task_name
= NULL
, *xml_file
= NULL
;
209 ITaskFolder
*root
= NULL
;
210 LONG flags
= TASK_CREATE
;
211 IRegisteredTask
*task
;
217 if (!strcmpiW(argv
[0], xml_optW
)) {
219 FIXME("Missing /xml value\n");
224 FIXME("Duplicated /xml argument\n");
231 }else if(!strcmpiW(argv
[0], tn_optW
)) {
233 FIXME("Missing /tn value\n");
238 FIXME("Duplicated /tn argument\n");
245 }else if(!strcmpiW(argv
[0], f_optW
)) {
246 flags
= TASK_CREATE_OR_UPDATE
;
249 }else if (!strcmpiW(argv
[0], ru_optW
)) {
251 FIXME("Missing /ru value\n");
255 FIXME("Unsupported /ru option %s\n", debugstr_w(argv
[1]));
259 FIXME("Unsupported argument %s\n", debugstr_w(argv
[0]));
265 FIXME("Missing /tn argument\n");
270 FIXME("Missing /xml argument\n");
274 xml
= read_file_to_bstr(xml_file
);
278 root
= get_tasks_root_folder();
284 V_VT(&empty
) = VT_EMPTY
;
285 str
= SysAllocString(task_name
);
286 hres
= ITaskFolder_RegisterTask(root
, str
, xml
, flags
, empty
, empty
,
287 TASK_LOGON_NONE
, empty
, &task
);
290 ITaskFolder_Release(root
);
294 IRegisteredTask_Release(task
);
298 static int delete_command(int argc
, WCHAR
*argv
[])
300 const WCHAR
*task_name
= NULL
;
301 ITaskFolder
*root
= NULL
;
306 if (!strcmpiW(argv
[0], f_optW
)) {
307 TRACE("force opt\n");
310 }else if(!strcmpiW(argv
[0], tn_optW
)) {
312 FIXME("Missing /tn value\n");
317 FIXME("Duplicated /tn argument\n");
325 FIXME("Unsupported argument %s\n", debugstr_w(argv
[0]));
331 FIXME("Missing /tn argument\n");
335 root
= get_tasks_root_folder();
339 str
= SysAllocString(task_name
);
340 hres
= ITaskFolder_DeleteTask(root
, str
, 0);
342 ITaskFolder_Release(root
);
349 int wmain(int argc
, WCHAR
*argv
[])
353 for (i
= 0; i
< argc
; i
++)
354 TRACE(" %s", wine_dbgstr_w(argv
[i
]));
360 FIXME("Print current tasks state\n");
361 else if (!strcmpiW(argv
[1], change_optW
))
362 ret
= change_command(argc
- 2, argv
+ 2);
363 else if (!strcmpiW(argv
[1], create_optW
))
364 ret
= create_command(argc
- 2, argv
+ 2);
365 else if (!strcmpiW(argv
[1], delete_optW
))
366 ret
= delete_command(argc
- 2, argv
+ 2);
368 FIXME("Unsupported command %s\n", debugstr_w(argv
[1]));