2 * Copyright (C) 2008 Google (Roy Shea)
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
19 #include "mstask_private.h"
20 #include "wine/debug.h"
22 WINE_DEFAULT_DEBUG_CHANNEL(mstask);
24 static inline TaskImpl *impl_from_IPersistFile( IPersistFile *iface )
26 return (TaskImpl*) ((char*)(iface) - FIELD_OFFSET(TaskImpl, persistVtbl));
29 static void TaskDestructor(TaskImpl *This)
32 HeapFree(GetProcessHeap(), 0, This->taskName);
33 HeapFree(GetProcessHeap(), 0, This);
34 InterlockedDecrement(&dll_ref);
37 static HRESULT WINAPI MSTASK_ITask_QueryInterface(
42 TaskImpl * This = (TaskImpl *)iface;
44 TRACE("IID: %s\n", debugstr_guid(riid));
45 if (ppvObject == NULL)
48 if (IsEqualGUID(riid, &IID_IUnknown) ||
49 IsEqualGUID(riid, &IID_ITask))
51 *ppvObject = &This->lpVtbl;
55 else if (IsEqualGUID(riid, &IID_IPersistFile))
57 *ppvObject = &This->persistVtbl;
62 WARN("Unknown interface: %s\n", debugstr_guid(riid));
67 static ULONG WINAPI MSTASK_ITask_AddRef(
70 TaskImpl *This = (TaskImpl *)iface;
73 ref = InterlockedIncrement(&This->ref);
77 static ULONG WINAPI MSTASK_ITask_Release(
80 TaskImpl * This = (TaskImpl *)iface;
83 ref = InterlockedDecrement(&This->ref);
89 static HRESULT WINAPI MSTASK_ITask_CreateTrigger(
92 ITaskTrigger **ppTrigger)
94 FIXME("(%p, %p, %p): stub\n", iface, piNewTrigger, ppTrigger);
98 static HRESULT WINAPI MSTASK_ITask_DeleteTrigger(
102 FIXME("(%p, %d): stub\n", iface, iTrigger);
106 static HRESULT WINAPI MSTASK_ITask_GetTriggerCount(
110 FIXME("(%p, %p): stub\n", iface, plCount);
114 static HRESULT WINAPI MSTASK_ITask_GetTrigger(
117 ITaskTrigger **ppTrigger)
119 FIXME("(%p, %d, %p): stub\n", iface, iTrigger, ppTrigger);
123 static HRESULT WINAPI MSTASK_ITask_GetTriggerString(
126 LPWSTR *ppwszTrigger)
128 FIXME("(%p, %d, %p): stub\n", iface, iTrigger, ppwszTrigger);
132 static HRESULT WINAPI MSTASK_ITask_GetRunTimes(
134 const LPSYSTEMTIME pstBegin,
135 const LPSYSTEMTIME pstEnd,
137 LPSYSTEMTIME *rgstTaskTimes)
139 FIXME("(%p, %p, %p, %p, %p): stub\n", iface, pstBegin, pstEnd, pCount,
144 static HRESULT WINAPI MSTASK_ITask_GetNextRunTime(
146 SYSTEMTIME *pstNextRun)
148 FIXME("(%p, %p): stub\n", iface, pstNextRun);
152 static HRESULT WINAPI MSTASK_ITask_SetIdleWait(
155 WORD wDeadlineMinutes)
157 FIXME("(%p, %d, %d): stub\n", iface, wIdleMinutes, wDeadlineMinutes);
161 static HRESULT WINAPI MSTASK_ITask_GetIdleWait(
164 WORD *pwDeadlineMinutes)
166 FIXME("(%p, %p, %p): stub\n", iface, pwIdleMinutes, pwDeadlineMinutes);
170 static HRESULT WINAPI MSTASK_ITask_Run(
173 FIXME("(%p): stub\n", iface);
177 static HRESULT WINAPI MSTASK_ITask_Terminate(
180 FIXME("(%p): stub\n", iface);
184 static HRESULT WINAPI MSTASK_ITask_EditWorkItem(
189 FIXME("(%p, %p, %d): stub\n", iface, hParent, dwReserved);
193 static HRESULT WINAPI MSTASK_ITask_GetMostRecentRunTime(
195 SYSTEMTIME *pstLastRun)
197 FIXME("(%p, %p): stub\n", iface, pstLastRun);
201 static HRESULT WINAPI MSTASK_ITask_GetStatus(
205 FIXME("(%p, %p): stub\n", iface, phrStatus);
209 static HRESULT WINAPI MSTASK_ITask_GetExitCode(
213 FIXME("(%p, %p): stub\n", iface, pdwExitCode);
217 static HRESULT WINAPI MSTASK_ITask_SetComment(
221 FIXME("(%p, %s): stub\n", iface, debugstr_w(pwszComment));
225 static HRESULT WINAPI MSTASK_ITask_GetComment(
227 LPWSTR *ppwszComment)
229 FIXME("(%p, %p): stub\n", iface, ppwszComment);
233 static HRESULT WINAPI MSTASK_ITask_SetCreator(
237 FIXME("(%p, %p): stub\n", iface, pwszCreator);
241 static HRESULT WINAPI MSTASK_ITask_GetCreator(
243 LPWSTR *ppwszCreator)
245 FIXME("(%p, %p): stub\n", iface, ppwszCreator);
249 static HRESULT WINAPI MSTASK_ITask_SetWorkItemData(
254 FIXME("(%p, %d, %p): stub\n", iface, cBytes, rgbData);
258 static HRESULT WINAPI MSTASK_ITask_GetWorkItemData(
263 FIXME("(%p, %p, %p): stub\n", iface, pcBytes, ppBytes);
267 static HRESULT WINAPI MSTASK_ITask_SetErrorRetryCount(
271 FIXME("(%p, %d): stub\n", iface, wRetryCount);
275 static HRESULT WINAPI MSTASK_ITask_GetErrorRetryCount(
279 FIXME("(%p, %p): stub\n", iface, pwRetryCount);
283 static HRESULT WINAPI MSTASK_ITask_SetErrorRetryInterval(
287 FIXME("(%p, %d): stub\n", iface, wRetryInterval);
291 static HRESULT WINAPI MSTASK_ITask_GetErrorRetryInterval(
293 WORD *pwRetryInterval)
295 FIXME("(%p, %p): stub\n", iface, pwRetryInterval);
299 static HRESULT WINAPI MSTASK_ITask_SetFlags(
303 FIXME("(%p, 0x%08x): stub\n", iface, dwFlags);
307 static HRESULT WINAPI MSTASK_ITask_GetFlags(
311 FIXME("(%p, %p): stub\n", iface, pdwFlags);
315 static HRESULT WINAPI MSTASK_ITask_SetAccountInformation(
317 LPCWSTR pwszAccountName,
318 LPCWSTR pwszPassword)
320 FIXME("(%p, %s, %s): stub\n", iface, debugstr_w(pwszAccountName),
321 debugstr_w(pwszPassword));
325 static HRESULT WINAPI MSTASK_ITask_GetAccountInformation(
327 LPWSTR *ppwszAccountName)
329 FIXME("(%p, %p): stub\n", iface, ppwszAccountName);
333 static HRESULT WINAPI MSTASK_ITask_SetApplicationName(
335 LPCWSTR pwszApplicationName)
338 TaskImpl *This = (TaskImpl *)iface;
341 TRACE("(%p, %s)\n", iface, debugstr_w(pwszApplicationName));
343 /* Empty application name */
344 if (pwszApplicationName[0] == 0)
346 HeapFree(GetProcessHeap(), 0, This->applicationName);
347 This->applicationName = NULL;
351 /* Attempt to set pwszApplicationName to a path resolved application name */
352 n = SearchPathW(NULL, pwszApplicationName, NULL, 0, NULL, NULL);
355 tmp_name = HeapAlloc(GetProcessHeap(), 0, n * sizeof(WCHAR));
357 return E_OUTOFMEMORY;
358 n = SearchPathW(NULL, pwszApplicationName, NULL, n, tmp_name, NULL);
361 HeapFree(GetProcessHeap(), 0, This->applicationName);
362 This->applicationName = tmp_name;
366 HeapFree(GetProcessHeap(), 0, tmp_name);
369 /* If unable to path resolve name, simply set to pwszApplicationName */
370 n = (lstrlenW(pwszApplicationName) + 1);
371 tmp_name = HeapAlloc(GetProcessHeap(), 0, n * sizeof(WCHAR));
373 return E_OUTOFMEMORY;
374 lstrcpyW(tmp_name, pwszApplicationName);
375 HeapFree(GetProcessHeap(), 0, This->applicationName);
376 This->applicationName = tmp_name;
380 static HRESULT WINAPI MSTASK_ITask_GetApplicationName(
382 LPWSTR *ppwszApplicationName)
385 TaskImpl *This = (TaskImpl *)iface;
387 TRACE("(%p, %p)\n", iface, ppwszApplicationName);
389 n = This->applicationName ? lstrlenW(This->applicationName) + 1 : 1;
390 *ppwszApplicationName = CoTaskMemAlloc(n * sizeof(WCHAR));
391 if (!*ppwszApplicationName)
392 return E_OUTOFMEMORY;
394 if (!This->applicationName)
395 *ppwszApplicationName[0] = 0;
397 lstrcpyW(*ppwszApplicationName, This->applicationName);
402 static HRESULT WINAPI MSTASK_ITask_SetParameters(
404 LPCWSTR pwszParameters)
406 FIXME("(%p, %s): stub\n", iface, debugstr_w(pwszParameters));
410 static HRESULT WINAPI MSTASK_ITask_GetParameters(
412 LPWSTR *ppwszParameters)
414 FIXME("(%p, %p): stub\n", iface, ppwszParameters);
418 static HRESULT WINAPI MSTASK_ITask_SetWorkingDirectory(
420 LPCWSTR pwszWorkingDirectory)
422 FIXME("(%p, %s): stub\n", iface, debugstr_w(pwszWorkingDirectory));
426 static HRESULT WINAPI MSTASK_ITask_GetWorkingDirectory(
428 LPWSTR *ppwszWorkingDirectory)
430 FIXME("(%p, %p): stub\n", iface, ppwszWorkingDirectory);
434 static HRESULT WINAPI MSTASK_ITask_SetPriority(
438 FIXME("(%p, 0x%08x): stub\n", iface, dwPriority);
442 static HRESULT WINAPI MSTASK_ITask_GetPriority(
446 FIXME("(%p, %p): stub\n", iface, pdwPriority);
450 static HRESULT WINAPI MSTASK_ITask_SetTaskFlags(
454 FIXME("(%p, 0x%08x): stub\n", iface, dwFlags);
458 static HRESULT WINAPI MSTASK_ITask_GetTaskFlags(
462 FIXME("(%p, %p): stub\n", iface, pdwFlags);
466 static HRESULT WINAPI MSTASK_ITask_SetMaxRunTime(
470 FIXME("(%p, %d): stub\n", iface, dwMaxRunTime);
474 static HRESULT WINAPI MSTASK_ITask_GetMaxRunTime(
476 DWORD *pdwMaxRunTime)
478 FIXME("(%p, %p): stub\n", iface, pdwMaxRunTime);
482 static HRESULT WINAPI MSTASK_IPersistFile_QueryInterface(
487 TaskImpl *This = impl_from_IPersistFile(iface);
488 TRACE("(%p, %s, %p)\n", iface, debugstr_guid(riid), ppvObject);
489 return ITask_QueryInterface((ITask *) This, riid, ppvObject);
492 static ULONG WINAPI MSTASK_IPersistFile_AddRef(
495 TaskImpl *This = impl_from_IPersistFile(iface);
498 ref = InterlockedIncrement(&This->ref);
502 static ULONG WINAPI MSTASK_IPersistFile_Release(
505 TaskImpl *This = impl_from_IPersistFile(iface);
508 ref = InterlockedDecrement(&This->ref);
510 TaskDestructor(This);
514 static HRESULT WINAPI MSTASK_IPersistFile_GetClassID(
518 FIXME("(%p, %p): stub\n", iface, pClassID);
522 static HRESULT WINAPI MSTASK_IPersistFile_IsDirty(
525 FIXME("(%p): stub\n", iface);
529 static HRESULT WINAPI MSTASK_IPersistFile_Load(
531 LPCOLESTR pszFileName,
534 FIXME("(%p, %p, 0x%08x): stub\n", iface, pszFileName, dwMode);
538 static HRESULT WINAPI MSTASK_IPersistFile_Save(
540 LPCOLESTR pszFileName,
543 FIXME("(%p, %p, %d): stub\n", iface, pszFileName, fRemember);
547 static HRESULT WINAPI MSTASK_IPersistFile_SaveCompleted(
549 LPCOLESTR pszFileName)
551 FIXME("(%p, %p): stub\n", iface, pszFileName);
555 static HRESULT WINAPI MSTASK_IPersistFile_GetCurFile(
557 LPOLESTR *ppszFileName)
559 FIXME("(%p, %p): stub\n", iface, ppszFileName);
564 static const ITaskVtbl MSTASK_ITaskVtbl =
566 MSTASK_ITask_QueryInterface,
568 MSTASK_ITask_Release,
569 MSTASK_ITask_CreateTrigger,
570 MSTASK_ITask_DeleteTrigger,
571 MSTASK_ITask_GetTriggerCount,
572 MSTASK_ITask_GetTrigger,
573 MSTASK_ITask_GetTriggerString,
574 MSTASK_ITask_GetRunTimes,
575 MSTASK_ITask_GetNextRunTime,
576 MSTASK_ITask_SetIdleWait,
577 MSTASK_ITask_GetIdleWait,
579 MSTASK_ITask_Terminate,
580 MSTASK_ITask_EditWorkItem,
581 MSTASK_ITask_GetMostRecentRunTime,
582 MSTASK_ITask_GetStatus,
583 MSTASK_ITask_GetExitCode,
584 MSTASK_ITask_SetComment,
585 MSTASK_ITask_GetComment,
586 MSTASK_ITask_SetCreator,
587 MSTASK_ITask_GetCreator,
588 MSTASK_ITask_SetWorkItemData,
589 MSTASK_ITask_GetWorkItemData,
590 MSTASK_ITask_SetErrorRetryCount,
591 MSTASK_ITask_GetErrorRetryCount,
592 MSTASK_ITask_SetErrorRetryInterval,
593 MSTASK_ITask_GetErrorRetryInterval,
594 MSTASK_ITask_SetFlags,
595 MSTASK_ITask_GetFlags,
596 MSTASK_ITask_SetAccountInformation,
597 MSTASK_ITask_GetAccountInformation,
598 MSTASK_ITask_SetApplicationName,
599 MSTASK_ITask_GetApplicationName,
600 MSTASK_ITask_SetParameters,
601 MSTASK_ITask_GetParameters,
602 MSTASK_ITask_SetWorkingDirectory,
603 MSTASK_ITask_GetWorkingDirectory,
604 MSTASK_ITask_SetPriority,
605 MSTASK_ITask_GetPriority,
606 MSTASK_ITask_SetTaskFlags,
607 MSTASK_ITask_GetTaskFlags,
608 MSTASK_ITask_SetMaxRunTime,
609 MSTASK_ITask_GetMaxRunTime
612 static const IPersistFileVtbl MSTASK_IPersistFileVtbl =
614 MSTASK_IPersistFile_QueryInterface,
615 MSTASK_IPersistFile_AddRef,
616 MSTASK_IPersistFile_Release,
617 MSTASK_IPersistFile_GetClassID,
618 MSTASK_IPersistFile_IsDirty,
619 MSTASK_IPersistFile_Load,
620 MSTASK_IPersistFile_Save,
621 MSTASK_IPersistFile_SaveCompleted,
622 MSTASK_IPersistFile_GetCurFile
625 HRESULT TaskConstructor(LPCWSTR pwszTaskName, LPVOID *ppObj)
630 TRACE("(%s, %p)\n", debugstr_w(pwszTaskName), ppObj);
632 This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
634 return E_OUTOFMEMORY;
636 This->lpVtbl = &MSTASK_ITaskVtbl;
637 This->persistVtbl = &MSTASK_IPersistFileVtbl;
639 n = (lstrlenW(pwszTaskName) + 1) * sizeof(WCHAR);
640 This->taskName = HeapAlloc(GetProcessHeap(), 0, n);
643 HeapFree(GetProcessHeap(), 0, This);
644 return E_OUTOFMEMORY;
646 lstrcpyW(This->taskName, pwszTaskName);
647 This->applicationName = NULL;
649 *ppObj = &This->lpVtbl;
650 InterlockedIncrement(&dll_ref);