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->comment);
33 HeapFree(GetProcessHeap(), 0, This->parameters);
34 HeapFree(GetProcessHeap(), 0, This->taskName);
35 HeapFree(GetProcessHeap(), 0, This);
36 InterlockedDecrement(&dll_ref);
39 static HRESULT WINAPI MSTASK_ITask_QueryInterface(
44 TaskImpl * This = (TaskImpl *)iface;
46 TRACE("IID: %s\n", debugstr_guid(riid));
47 if (ppvObject == NULL)
50 if (IsEqualGUID(riid, &IID_IUnknown) ||
51 IsEqualGUID(riid, &IID_ITask))
53 *ppvObject = &This->lpVtbl;
57 else if (IsEqualGUID(riid, &IID_IPersistFile))
59 *ppvObject = &This->persistVtbl;
64 WARN("Unknown interface: %s\n", debugstr_guid(riid));
69 static ULONG WINAPI MSTASK_ITask_AddRef(
72 TaskImpl *This = (TaskImpl *)iface;
75 ref = InterlockedIncrement(&This->ref);
79 static ULONG WINAPI MSTASK_ITask_Release(
82 TaskImpl * This = (TaskImpl *)iface;
85 ref = InterlockedDecrement(&This->ref);
91 static HRESULT WINAPI MSTASK_ITask_CreateTrigger(
94 ITaskTrigger **ppTrigger)
96 FIXME("(%p, %p, %p): stub\n", iface, piNewTrigger, ppTrigger);
100 static HRESULT WINAPI MSTASK_ITask_DeleteTrigger(
104 FIXME("(%p, %d): stub\n", iface, iTrigger);
108 static HRESULT WINAPI MSTASK_ITask_GetTriggerCount(
112 FIXME("(%p, %p): stub\n", iface, plCount);
116 static HRESULT WINAPI MSTASK_ITask_GetTrigger(
119 ITaskTrigger **ppTrigger)
121 FIXME("(%p, %d, %p): stub\n", iface, iTrigger, ppTrigger);
125 static HRESULT WINAPI MSTASK_ITask_GetTriggerString(
128 LPWSTR *ppwszTrigger)
130 FIXME("(%p, %d, %p): stub\n", iface, iTrigger, ppwszTrigger);
134 static HRESULT WINAPI MSTASK_ITask_GetRunTimes(
136 const LPSYSTEMTIME pstBegin,
137 const LPSYSTEMTIME pstEnd,
139 LPSYSTEMTIME *rgstTaskTimes)
141 FIXME("(%p, %p, %p, %p, %p): stub\n", iface, pstBegin, pstEnd, pCount,
146 static HRESULT WINAPI MSTASK_ITask_GetNextRunTime(
148 SYSTEMTIME *pstNextRun)
150 FIXME("(%p, %p): stub\n", iface, pstNextRun);
154 static HRESULT WINAPI MSTASK_ITask_SetIdleWait(
157 WORD wDeadlineMinutes)
159 FIXME("(%p, %d, %d): stub\n", iface, wIdleMinutes, wDeadlineMinutes);
163 static HRESULT WINAPI MSTASK_ITask_GetIdleWait(
166 WORD *pwDeadlineMinutes)
168 FIXME("(%p, %p, %p): stub\n", iface, pwIdleMinutes, pwDeadlineMinutes);
172 static HRESULT WINAPI MSTASK_ITask_Run(
175 FIXME("(%p): stub\n", iface);
179 static HRESULT WINAPI MSTASK_ITask_Terminate(
182 FIXME("(%p): stub\n", iface);
186 static HRESULT WINAPI MSTASK_ITask_EditWorkItem(
191 FIXME("(%p, %p, %d): stub\n", iface, hParent, dwReserved);
195 static HRESULT WINAPI MSTASK_ITask_GetMostRecentRunTime(
197 SYSTEMTIME *pstLastRun)
199 FIXME("(%p, %p): stub\n", iface, pstLastRun);
203 static HRESULT WINAPI MSTASK_ITask_GetStatus(
207 FIXME("(%p, %p): stub\n", iface, phrStatus);
211 static HRESULT WINAPI MSTASK_ITask_GetExitCode(
215 FIXME("(%p, %p): stub\n", iface, pdwExitCode);
219 static HRESULT WINAPI MSTASK_ITask_SetComment(
224 TaskImpl *This = (TaskImpl *)iface;
227 TRACE("(%p, %s)\n", iface, debugstr_w(pwszComment));
230 if (pwszComment[0] == 0)
232 HeapFree(GetProcessHeap(), 0, This->comment);
233 This->comment = NULL;
237 /* Set to pwszComment */
238 n = (lstrlenW(pwszComment) + 1);
239 tmp_comment = HeapAlloc(GetProcessHeap(), 0, n * sizeof(WCHAR));
241 return E_OUTOFMEMORY;
242 lstrcpyW(tmp_comment, pwszComment);
243 HeapFree(GetProcessHeap(), 0, This->comment);
244 This->comment = tmp_comment;
249 static HRESULT WINAPI MSTASK_ITask_GetComment(
251 LPWSTR *ppwszComment)
254 TaskImpl *This = (TaskImpl *)iface;
256 TRACE("(%p, %p)\n", iface, ppwszComment);
258 n = This->comment ? lstrlenW(This->comment) + 1 : 1;
259 *ppwszComment = CoTaskMemAlloc(n * sizeof(WCHAR));
261 return E_OUTOFMEMORY;
264 *ppwszComment[0] = 0;
266 lstrcpyW(*ppwszComment, This->comment);
271 static HRESULT WINAPI MSTASK_ITask_SetCreator(
275 FIXME("(%p, %p): stub\n", iface, pwszCreator);
279 static HRESULT WINAPI MSTASK_ITask_GetCreator(
281 LPWSTR *ppwszCreator)
283 FIXME("(%p, %p): stub\n", iface, ppwszCreator);
287 static HRESULT WINAPI MSTASK_ITask_SetWorkItemData(
292 FIXME("(%p, %d, %p): stub\n", iface, cBytes, rgbData);
296 static HRESULT WINAPI MSTASK_ITask_GetWorkItemData(
301 FIXME("(%p, %p, %p): stub\n", iface, pcBytes, ppBytes);
305 static HRESULT WINAPI MSTASK_ITask_SetErrorRetryCount(
309 FIXME("(%p, %d): stub\n", iface, wRetryCount);
313 static HRESULT WINAPI MSTASK_ITask_GetErrorRetryCount(
317 FIXME("(%p, %p): stub\n", iface, pwRetryCount);
321 static HRESULT WINAPI MSTASK_ITask_SetErrorRetryInterval(
325 FIXME("(%p, %d): stub\n", iface, wRetryInterval);
329 static HRESULT WINAPI MSTASK_ITask_GetErrorRetryInterval(
331 WORD *pwRetryInterval)
333 FIXME("(%p, %p): stub\n", iface, pwRetryInterval);
337 static HRESULT WINAPI MSTASK_ITask_SetFlags(
341 FIXME("(%p, 0x%08x): stub\n", iface, dwFlags);
345 static HRESULT WINAPI MSTASK_ITask_GetFlags(
349 FIXME("(%p, %p): stub\n", iface, pdwFlags);
353 static HRESULT WINAPI MSTASK_ITask_SetAccountInformation(
355 LPCWSTR pwszAccountName,
356 LPCWSTR pwszPassword)
358 FIXME("(%p, %s, %s): stub\n", iface, debugstr_w(pwszAccountName),
359 debugstr_w(pwszPassword));
363 static HRESULT WINAPI MSTASK_ITask_GetAccountInformation(
365 LPWSTR *ppwszAccountName)
367 FIXME("(%p, %p): stub\n", iface, ppwszAccountName);
371 static HRESULT WINAPI MSTASK_ITask_SetApplicationName(
373 LPCWSTR pwszApplicationName)
376 TaskImpl *This = (TaskImpl *)iface;
379 TRACE("(%p, %s)\n", iface, debugstr_w(pwszApplicationName));
381 /* Empty application name */
382 if (pwszApplicationName[0] == 0)
384 HeapFree(GetProcessHeap(), 0, This->applicationName);
385 This->applicationName = NULL;
389 /* Attempt to set pwszApplicationName to a path resolved application name */
390 n = SearchPathW(NULL, pwszApplicationName, NULL, 0, NULL, NULL);
393 tmp_name = HeapAlloc(GetProcessHeap(), 0, n * sizeof(WCHAR));
395 return E_OUTOFMEMORY;
396 n = SearchPathW(NULL, pwszApplicationName, NULL, n, tmp_name, NULL);
399 HeapFree(GetProcessHeap(), 0, This->applicationName);
400 This->applicationName = tmp_name;
404 HeapFree(GetProcessHeap(), 0, tmp_name);
407 /* If unable to path resolve name, simply set to pwszApplicationName */
408 n = (lstrlenW(pwszApplicationName) + 1);
409 tmp_name = HeapAlloc(GetProcessHeap(), 0, n * sizeof(WCHAR));
411 return E_OUTOFMEMORY;
412 lstrcpyW(tmp_name, pwszApplicationName);
413 HeapFree(GetProcessHeap(), 0, This->applicationName);
414 This->applicationName = tmp_name;
418 static HRESULT WINAPI MSTASK_ITask_GetApplicationName(
420 LPWSTR *ppwszApplicationName)
423 TaskImpl *This = (TaskImpl *)iface;
425 TRACE("(%p, %p)\n", iface, ppwszApplicationName);
427 n = This->applicationName ? lstrlenW(This->applicationName) + 1 : 1;
428 *ppwszApplicationName = CoTaskMemAlloc(n * sizeof(WCHAR));
429 if (!*ppwszApplicationName)
430 return E_OUTOFMEMORY;
432 if (!This->applicationName)
433 *ppwszApplicationName[0] = 0;
435 lstrcpyW(*ppwszApplicationName, This->applicationName);
440 static HRESULT WINAPI MSTASK_ITask_SetParameters(
442 LPCWSTR pwszParameters)
445 TaskImpl *This = (TaskImpl *)iface;
446 LPWSTR tmp_parameters;
448 TRACE("(%p, %s)\n", iface, debugstr_w(pwszParameters));
450 /* Empty parameter list */
451 if (pwszParameters[0] == 0)
453 HeapFree(GetProcessHeap(), 0, This->parameters);
454 This->parameters = NULL;
458 /* Set to pwszParameters */
459 n = (lstrlenW(pwszParameters) + 1);
460 tmp_parameters = HeapAlloc(GetProcessHeap(), 0, n * sizeof(WCHAR));
462 return E_OUTOFMEMORY;
463 lstrcpyW(tmp_parameters, pwszParameters);
464 HeapFree(GetProcessHeap(), 0, This->parameters);
465 This->parameters = tmp_parameters;
469 static HRESULT WINAPI MSTASK_ITask_GetParameters(
471 LPWSTR *ppwszParameters)
474 TaskImpl *This = (TaskImpl *)iface;
476 TRACE("(%p, %p)\n", iface, ppwszParameters);
478 n = This->parameters ? lstrlenW(This->parameters) + 1 : 1;
479 *ppwszParameters = CoTaskMemAlloc(n * sizeof(WCHAR));
480 if (!*ppwszParameters)
481 return E_OUTOFMEMORY;
483 if (!This->parameters)
484 *ppwszParameters[0] = 0;
486 lstrcpyW(*ppwszParameters, This->parameters);
491 static HRESULT WINAPI MSTASK_ITask_SetWorkingDirectory(
493 LPCWSTR pwszWorkingDirectory)
495 FIXME("(%p, %s): stub\n", iface, debugstr_w(pwszWorkingDirectory));
499 static HRESULT WINAPI MSTASK_ITask_GetWorkingDirectory(
501 LPWSTR *ppwszWorkingDirectory)
503 FIXME("(%p, %p): stub\n", iface, ppwszWorkingDirectory);
507 static HRESULT WINAPI MSTASK_ITask_SetPriority(
511 FIXME("(%p, 0x%08x): stub\n", iface, dwPriority);
515 static HRESULT WINAPI MSTASK_ITask_GetPriority(
519 FIXME("(%p, %p): stub\n", iface, pdwPriority);
523 static HRESULT WINAPI MSTASK_ITask_SetTaskFlags(
527 FIXME("(%p, 0x%08x): stub\n", iface, dwFlags);
531 static HRESULT WINAPI MSTASK_ITask_GetTaskFlags(
535 FIXME("(%p, %p): stub\n", iface, pdwFlags);
539 static HRESULT WINAPI MSTASK_ITask_SetMaxRunTime(
543 FIXME("(%p, %d): stub\n", iface, dwMaxRunTime);
547 static HRESULT WINAPI MSTASK_ITask_GetMaxRunTime(
549 DWORD *pdwMaxRunTime)
551 FIXME("(%p, %p): stub\n", iface, pdwMaxRunTime);
555 static HRESULT WINAPI MSTASK_IPersistFile_QueryInterface(
560 TaskImpl *This = impl_from_IPersistFile(iface);
561 TRACE("(%p, %s, %p)\n", iface, debugstr_guid(riid), ppvObject);
562 return ITask_QueryInterface((ITask *) This, riid, ppvObject);
565 static ULONG WINAPI MSTASK_IPersistFile_AddRef(
568 TaskImpl *This = impl_from_IPersistFile(iface);
571 ref = InterlockedIncrement(&This->ref);
575 static ULONG WINAPI MSTASK_IPersistFile_Release(
578 TaskImpl *This = impl_from_IPersistFile(iface);
581 ref = InterlockedDecrement(&This->ref);
583 TaskDestructor(This);
587 static HRESULT WINAPI MSTASK_IPersistFile_GetClassID(
591 FIXME("(%p, %p): stub\n", iface, pClassID);
595 static HRESULT WINAPI MSTASK_IPersistFile_IsDirty(
598 FIXME("(%p): stub\n", iface);
602 static HRESULT WINAPI MSTASK_IPersistFile_Load(
604 LPCOLESTR pszFileName,
607 FIXME("(%p, %p, 0x%08x): stub\n", iface, pszFileName, dwMode);
611 static HRESULT WINAPI MSTASK_IPersistFile_Save(
613 LPCOLESTR pszFileName,
616 FIXME("(%p, %p, %d): stub\n", iface, pszFileName, fRemember);
620 static HRESULT WINAPI MSTASK_IPersistFile_SaveCompleted(
622 LPCOLESTR pszFileName)
624 FIXME("(%p, %p): stub\n", iface, pszFileName);
628 static HRESULT WINAPI MSTASK_IPersistFile_GetCurFile(
630 LPOLESTR *ppszFileName)
632 FIXME("(%p, %p): stub\n", iface, ppszFileName);
637 static const ITaskVtbl MSTASK_ITaskVtbl =
639 MSTASK_ITask_QueryInterface,
641 MSTASK_ITask_Release,
642 MSTASK_ITask_CreateTrigger,
643 MSTASK_ITask_DeleteTrigger,
644 MSTASK_ITask_GetTriggerCount,
645 MSTASK_ITask_GetTrigger,
646 MSTASK_ITask_GetTriggerString,
647 MSTASK_ITask_GetRunTimes,
648 MSTASK_ITask_GetNextRunTime,
649 MSTASK_ITask_SetIdleWait,
650 MSTASK_ITask_GetIdleWait,
652 MSTASK_ITask_Terminate,
653 MSTASK_ITask_EditWorkItem,
654 MSTASK_ITask_GetMostRecentRunTime,
655 MSTASK_ITask_GetStatus,
656 MSTASK_ITask_GetExitCode,
657 MSTASK_ITask_SetComment,
658 MSTASK_ITask_GetComment,
659 MSTASK_ITask_SetCreator,
660 MSTASK_ITask_GetCreator,
661 MSTASK_ITask_SetWorkItemData,
662 MSTASK_ITask_GetWorkItemData,
663 MSTASK_ITask_SetErrorRetryCount,
664 MSTASK_ITask_GetErrorRetryCount,
665 MSTASK_ITask_SetErrorRetryInterval,
666 MSTASK_ITask_GetErrorRetryInterval,
667 MSTASK_ITask_SetFlags,
668 MSTASK_ITask_GetFlags,
669 MSTASK_ITask_SetAccountInformation,
670 MSTASK_ITask_GetAccountInformation,
671 MSTASK_ITask_SetApplicationName,
672 MSTASK_ITask_GetApplicationName,
673 MSTASK_ITask_SetParameters,
674 MSTASK_ITask_GetParameters,
675 MSTASK_ITask_SetWorkingDirectory,
676 MSTASK_ITask_GetWorkingDirectory,
677 MSTASK_ITask_SetPriority,
678 MSTASK_ITask_GetPriority,
679 MSTASK_ITask_SetTaskFlags,
680 MSTASK_ITask_GetTaskFlags,
681 MSTASK_ITask_SetMaxRunTime,
682 MSTASK_ITask_GetMaxRunTime
685 static const IPersistFileVtbl MSTASK_IPersistFileVtbl =
687 MSTASK_IPersistFile_QueryInterface,
688 MSTASK_IPersistFile_AddRef,
689 MSTASK_IPersistFile_Release,
690 MSTASK_IPersistFile_GetClassID,
691 MSTASK_IPersistFile_IsDirty,
692 MSTASK_IPersistFile_Load,
693 MSTASK_IPersistFile_Save,
694 MSTASK_IPersistFile_SaveCompleted,
695 MSTASK_IPersistFile_GetCurFile
698 HRESULT TaskConstructor(LPCWSTR pwszTaskName, LPVOID *ppObj)
703 TRACE("(%s, %p)\n", debugstr_w(pwszTaskName), ppObj);
705 This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
707 return E_OUTOFMEMORY;
709 This->lpVtbl = &MSTASK_ITaskVtbl;
710 This->persistVtbl = &MSTASK_IPersistFileVtbl;
712 n = (lstrlenW(pwszTaskName) + 1) * sizeof(WCHAR);
713 This->taskName = HeapAlloc(GetProcessHeap(), 0, n);
716 HeapFree(GetProcessHeap(), 0, This);
717 return E_OUTOFMEMORY;
719 lstrcpyW(This->taskName, pwszTaskName);
720 This->applicationName = NULL;
721 This->parameters = NULL;
722 This->comment = NULL;
724 *ppObj = &This->lpVtbl;
725 InterlockedIncrement(&dll_ref);