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->parameters);
33 HeapFree(GetProcessHeap(), 0, This->taskName);
34 HeapFree(GetProcessHeap(), 0, This);
35 InterlockedDecrement(&dll_ref);
38 static HRESULT WINAPI MSTASK_ITask_QueryInterface(
43 TaskImpl * This = (TaskImpl *)iface;
45 TRACE("IID: %s\n", debugstr_guid(riid));
46 if (ppvObject == NULL)
49 if (IsEqualGUID(riid, &IID_IUnknown) ||
50 IsEqualGUID(riid, &IID_ITask))
52 *ppvObject = &This->lpVtbl;
56 else if (IsEqualGUID(riid, &IID_IPersistFile))
58 *ppvObject = &This->persistVtbl;
63 WARN("Unknown interface: %s\n", debugstr_guid(riid));
68 static ULONG WINAPI MSTASK_ITask_AddRef(
71 TaskImpl *This = (TaskImpl *)iface;
74 ref = InterlockedIncrement(&This->ref);
78 static ULONG WINAPI MSTASK_ITask_Release(
81 TaskImpl * This = (TaskImpl *)iface;
84 ref = InterlockedDecrement(&This->ref);
90 static HRESULT WINAPI MSTASK_ITask_CreateTrigger(
93 ITaskTrigger **ppTrigger)
95 FIXME("(%p, %p, %p): stub\n", iface, piNewTrigger, ppTrigger);
99 static HRESULT WINAPI MSTASK_ITask_DeleteTrigger(
103 FIXME("(%p, %d): stub\n", iface, iTrigger);
107 static HRESULT WINAPI MSTASK_ITask_GetTriggerCount(
111 FIXME("(%p, %p): stub\n", iface, plCount);
115 static HRESULT WINAPI MSTASK_ITask_GetTrigger(
118 ITaskTrigger **ppTrigger)
120 FIXME("(%p, %d, %p): stub\n", iface, iTrigger, ppTrigger);
124 static HRESULT WINAPI MSTASK_ITask_GetTriggerString(
127 LPWSTR *ppwszTrigger)
129 FIXME("(%p, %d, %p): stub\n", iface, iTrigger, ppwszTrigger);
133 static HRESULT WINAPI MSTASK_ITask_GetRunTimes(
135 const LPSYSTEMTIME pstBegin,
136 const LPSYSTEMTIME pstEnd,
138 LPSYSTEMTIME *rgstTaskTimes)
140 FIXME("(%p, %p, %p, %p, %p): stub\n", iface, pstBegin, pstEnd, pCount,
145 static HRESULT WINAPI MSTASK_ITask_GetNextRunTime(
147 SYSTEMTIME *pstNextRun)
149 FIXME("(%p, %p): stub\n", iface, pstNextRun);
153 static HRESULT WINAPI MSTASK_ITask_SetIdleWait(
156 WORD wDeadlineMinutes)
158 FIXME("(%p, %d, %d): stub\n", iface, wIdleMinutes, wDeadlineMinutes);
162 static HRESULT WINAPI MSTASK_ITask_GetIdleWait(
165 WORD *pwDeadlineMinutes)
167 FIXME("(%p, %p, %p): stub\n", iface, pwIdleMinutes, pwDeadlineMinutes);
171 static HRESULT WINAPI MSTASK_ITask_Run(
174 FIXME("(%p): stub\n", iface);
178 static HRESULT WINAPI MSTASK_ITask_Terminate(
181 FIXME("(%p): stub\n", iface);
185 static HRESULT WINAPI MSTASK_ITask_EditWorkItem(
190 FIXME("(%p, %p, %d): stub\n", iface, hParent, dwReserved);
194 static HRESULT WINAPI MSTASK_ITask_GetMostRecentRunTime(
196 SYSTEMTIME *pstLastRun)
198 FIXME("(%p, %p): stub\n", iface, pstLastRun);
202 static HRESULT WINAPI MSTASK_ITask_GetStatus(
206 FIXME("(%p, %p): stub\n", iface, phrStatus);
210 static HRESULT WINAPI MSTASK_ITask_GetExitCode(
214 FIXME("(%p, %p): stub\n", iface, pdwExitCode);
218 static HRESULT WINAPI MSTASK_ITask_SetComment(
222 FIXME("(%p, %s): stub\n", iface, debugstr_w(pwszComment));
226 static HRESULT WINAPI MSTASK_ITask_GetComment(
228 LPWSTR *ppwszComment)
230 FIXME("(%p, %p): stub\n", iface, ppwszComment);
234 static HRESULT WINAPI MSTASK_ITask_SetCreator(
238 FIXME("(%p, %p): stub\n", iface, pwszCreator);
242 static HRESULT WINAPI MSTASK_ITask_GetCreator(
244 LPWSTR *ppwszCreator)
246 FIXME("(%p, %p): stub\n", iface, ppwszCreator);
250 static HRESULT WINAPI MSTASK_ITask_SetWorkItemData(
255 FIXME("(%p, %d, %p): stub\n", iface, cBytes, rgbData);
259 static HRESULT WINAPI MSTASK_ITask_GetWorkItemData(
264 FIXME("(%p, %p, %p): stub\n", iface, pcBytes, ppBytes);
268 static HRESULT WINAPI MSTASK_ITask_SetErrorRetryCount(
272 FIXME("(%p, %d): stub\n", iface, wRetryCount);
276 static HRESULT WINAPI MSTASK_ITask_GetErrorRetryCount(
280 FIXME("(%p, %p): stub\n", iface, pwRetryCount);
284 static HRESULT WINAPI MSTASK_ITask_SetErrorRetryInterval(
288 FIXME("(%p, %d): stub\n", iface, wRetryInterval);
292 static HRESULT WINAPI MSTASK_ITask_GetErrorRetryInterval(
294 WORD *pwRetryInterval)
296 FIXME("(%p, %p): stub\n", iface, pwRetryInterval);
300 static HRESULT WINAPI MSTASK_ITask_SetFlags(
304 FIXME("(%p, 0x%08x): stub\n", iface, dwFlags);
308 static HRESULT WINAPI MSTASK_ITask_GetFlags(
312 FIXME("(%p, %p): stub\n", iface, pdwFlags);
316 static HRESULT WINAPI MSTASK_ITask_SetAccountInformation(
318 LPCWSTR pwszAccountName,
319 LPCWSTR pwszPassword)
321 FIXME("(%p, %s, %s): stub\n", iface, debugstr_w(pwszAccountName),
322 debugstr_w(pwszPassword));
326 static HRESULT WINAPI MSTASK_ITask_GetAccountInformation(
328 LPWSTR *ppwszAccountName)
330 FIXME("(%p, %p): stub\n", iface, ppwszAccountName);
334 static HRESULT WINAPI MSTASK_ITask_SetApplicationName(
336 LPCWSTR pwszApplicationName)
339 TaskImpl *This = (TaskImpl *)iface;
342 TRACE("(%p, %s)\n", iface, debugstr_w(pwszApplicationName));
344 /* Empty application name */
345 if (pwszApplicationName[0] == 0)
347 HeapFree(GetProcessHeap(), 0, This->applicationName);
348 This->applicationName = NULL;
352 /* Attempt to set pwszApplicationName to a path resolved application name */
353 n = SearchPathW(NULL, pwszApplicationName, NULL, 0, NULL, NULL);
356 tmp_name = HeapAlloc(GetProcessHeap(), 0, n * sizeof(WCHAR));
358 return E_OUTOFMEMORY;
359 n = SearchPathW(NULL, pwszApplicationName, NULL, n, tmp_name, NULL);
362 HeapFree(GetProcessHeap(), 0, This->applicationName);
363 This->applicationName = tmp_name;
367 HeapFree(GetProcessHeap(), 0, tmp_name);
370 /* If unable to path resolve name, simply set to pwszApplicationName */
371 n = (lstrlenW(pwszApplicationName) + 1);
372 tmp_name = HeapAlloc(GetProcessHeap(), 0, n * sizeof(WCHAR));
374 return E_OUTOFMEMORY;
375 lstrcpyW(tmp_name, pwszApplicationName);
376 HeapFree(GetProcessHeap(), 0, This->applicationName);
377 This->applicationName = tmp_name;
381 static HRESULT WINAPI MSTASK_ITask_GetApplicationName(
383 LPWSTR *ppwszApplicationName)
386 TaskImpl *This = (TaskImpl *)iface;
388 TRACE("(%p, %p)\n", iface, ppwszApplicationName);
390 n = This->applicationName ? lstrlenW(This->applicationName) + 1 : 1;
391 *ppwszApplicationName = CoTaskMemAlloc(n * sizeof(WCHAR));
392 if (!*ppwszApplicationName)
393 return E_OUTOFMEMORY;
395 if (!This->applicationName)
396 *ppwszApplicationName[0] = 0;
398 lstrcpyW(*ppwszApplicationName, This->applicationName);
403 static HRESULT WINAPI MSTASK_ITask_SetParameters(
405 LPCWSTR pwszParameters)
408 TaskImpl *This = (TaskImpl *)iface;
409 LPWSTR tmp_parameters;
411 TRACE("(%p, %s)\n", iface, debugstr_w(pwszParameters));
413 /* Empty parameter list */
414 if (pwszParameters[0] == 0)
416 HeapFree(GetProcessHeap(), 0, This->parameters);
417 This->parameters = NULL;
421 /* Set to pwszParameters */
422 n = (lstrlenW(pwszParameters) + 1);
423 tmp_parameters = HeapAlloc(GetProcessHeap(), 0, n * sizeof(WCHAR));
425 return E_OUTOFMEMORY;
426 lstrcpyW(tmp_parameters, pwszParameters);
427 HeapFree(GetProcessHeap(), 0, This->parameters);
428 This->parameters = tmp_parameters;
432 static HRESULT WINAPI MSTASK_ITask_GetParameters(
434 LPWSTR *ppwszParameters)
437 TaskImpl *This = (TaskImpl *)iface;
439 TRACE("(%p, %p)\n", iface, ppwszParameters);
441 n = This->parameters ? lstrlenW(This->parameters) + 1 : 1;
442 *ppwszParameters = CoTaskMemAlloc(n * sizeof(WCHAR));
443 if (!*ppwszParameters)
444 return E_OUTOFMEMORY;
446 if (!This->parameters)
447 *ppwszParameters[0] = 0;
449 lstrcpyW(*ppwszParameters, This->parameters);
454 static HRESULT WINAPI MSTASK_ITask_SetWorkingDirectory(
456 LPCWSTR pwszWorkingDirectory)
458 FIXME("(%p, %s): stub\n", iface, debugstr_w(pwszWorkingDirectory));
462 static HRESULT WINAPI MSTASK_ITask_GetWorkingDirectory(
464 LPWSTR *ppwszWorkingDirectory)
466 FIXME("(%p, %p): stub\n", iface, ppwszWorkingDirectory);
470 static HRESULT WINAPI MSTASK_ITask_SetPriority(
474 FIXME("(%p, 0x%08x): stub\n", iface, dwPriority);
478 static HRESULT WINAPI MSTASK_ITask_GetPriority(
482 FIXME("(%p, %p): stub\n", iface, pdwPriority);
486 static HRESULT WINAPI MSTASK_ITask_SetTaskFlags(
490 FIXME("(%p, 0x%08x): stub\n", iface, dwFlags);
494 static HRESULT WINAPI MSTASK_ITask_GetTaskFlags(
498 FIXME("(%p, %p): stub\n", iface, pdwFlags);
502 static HRESULT WINAPI MSTASK_ITask_SetMaxRunTime(
506 FIXME("(%p, %d): stub\n", iface, dwMaxRunTime);
510 static HRESULT WINAPI MSTASK_ITask_GetMaxRunTime(
512 DWORD *pdwMaxRunTime)
514 FIXME("(%p, %p): stub\n", iface, pdwMaxRunTime);
518 static HRESULT WINAPI MSTASK_IPersistFile_QueryInterface(
523 TaskImpl *This = impl_from_IPersistFile(iface);
524 TRACE("(%p, %s, %p)\n", iface, debugstr_guid(riid), ppvObject);
525 return ITask_QueryInterface((ITask *) This, riid, ppvObject);
528 static ULONG WINAPI MSTASK_IPersistFile_AddRef(
531 TaskImpl *This = impl_from_IPersistFile(iface);
534 ref = InterlockedIncrement(&This->ref);
538 static ULONG WINAPI MSTASK_IPersistFile_Release(
541 TaskImpl *This = impl_from_IPersistFile(iface);
544 ref = InterlockedDecrement(&This->ref);
546 TaskDestructor(This);
550 static HRESULT WINAPI MSTASK_IPersistFile_GetClassID(
554 FIXME("(%p, %p): stub\n", iface, pClassID);
558 static HRESULT WINAPI MSTASK_IPersistFile_IsDirty(
561 FIXME("(%p): stub\n", iface);
565 static HRESULT WINAPI MSTASK_IPersistFile_Load(
567 LPCOLESTR pszFileName,
570 FIXME("(%p, %p, 0x%08x): stub\n", iface, pszFileName, dwMode);
574 static HRESULT WINAPI MSTASK_IPersistFile_Save(
576 LPCOLESTR pszFileName,
579 FIXME("(%p, %p, %d): stub\n", iface, pszFileName, fRemember);
583 static HRESULT WINAPI MSTASK_IPersistFile_SaveCompleted(
585 LPCOLESTR pszFileName)
587 FIXME("(%p, %p): stub\n", iface, pszFileName);
591 static HRESULT WINAPI MSTASK_IPersistFile_GetCurFile(
593 LPOLESTR *ppszFileName)
595 FIXME("(%p, %p): stub\n", iface, ppszFileName);
600 static const ITaskVtbl MSTASK_ITaskVtbl =
602 MSTASK_ITask_QueryInterface,
604 MSTASK_ITask_Release,
605 MSTASK_ITask_CreateTrigger,
606 MSTASK_ITask_DeleteTrigger,
607 MSTASK_ITask_GetTriggerCount,
608 MSTASK_ITask_GetTrigger,
609 MSTASK_ITask_GetTriggerString,
610 MSTASK_ITask_GetRunTimes,
611 MSTASK_ITask_GetNextRunTime,
612 MSTASK_ITask_SetIdleWait,
613 MSTASK_ITask_GetIdleWait,
615 MSTASK_ITask_Terminate,
616 MSTASK_ITask_EditWorkItem,
617 MSTASK_ITask_GetMostRecentRunTime,
618 MSTASK_ITask_GetStatus,
619 MSTASK_ITask_GetExitCode,
620 MSTASK_ITask_SetComment,
621 MSTASK_ITask_GetComment,
622 MSTASK_ITask_SetCreator,
623 MSTASK_ITask_GetCreator,
624 MSTASK_ITask_SetWorkItemData,
625 MSTASK_ITask_GetWorkItemData,
626 MSTASK_ITask_SetErrorRetryCount,
627 MSTASK_ITask_GetErrorRetryCount,
628 MSTASK_ITask_SetErrorRetryInterval,
629 MSTASK_ITask_GetErrorRetryInterval,
630 MSTASK_ITask_SetFlags,
631 MSTASK_ITask_GetFlags,
632 MSTASK_ITask_SetAccountInformation,
633 MSTASK_ITask_GetAccountInformation,
634 MSTASK_ITask_SetApplicationName,
635 MSTASK_ITask_GetApplicationName,
636 MSTASK_ITask_SetParameters,
637 MSTASK_ITask_GetParameters,
638 MSTASK_ITask_SetWorkingDirectory,
639 MSTASK_ITask_GetWorkingDirectory,
640 MSTASK_ITask_SetPriority,
641 MSTASK_ITask_GetPriority,
642 MSTASK_ITask_SetTaskFlags,
643 MSTASK_ITask_GetTaskFlags,
644 MSTASK_ITask_SetMaxRunTime,
645 MSTASK_ITask_GetMaxRunTime
648 static const IPersistFileVtbl MSTASK_IPersistFileVtbl =
650 MSTASK_IPersistFile_QueryInterface,
651 MSTASK_IPersistFile_AddRef,
652 MSTASK_IPersistFile_Release,
653 MSTASK_IPersistFile_GetClassID,
654 MSTASK_IPersistFile_IsDirty,
655 MSTASK_IPersistFile_Load,
656 MSTASK_IPersistFile_Save,
657 MSTASK_IPersistFile_SaveCompleted,
658 MSTASK_IPersistFile_GetCurFile
661 HRESULT TaskConstructor(LPCWSTR pwszTaskName, LPVOID *ppObj)
666 TRACE("(%s, %p)\n", debugstr_w(pwszTaskName), ppObj);
668 This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
670 return E_OUTOFMEMORY;
672 This->lpVtbl = &MSTASK_ITaskVtbl;
673 This->persistVtbl = &MSTASK_IPersistFileVtbl;
675 n = (lstrlenW(pwszTaskName) + 1) * sizeof(WCHAR);
676 This->taskName = HeapAlloc(GetProcessHeap(), 0, n);
679 HeapFree(GetProcessHeap(), 0, This);
680 return E_OUTOFMEMORY;
682 lstrcpyW(This->taskName, pwszTaskName);
683 This->applicationName = NULL;
684 This->parameters = NULL;
686 *ppObj = &This->lpVtbl;
687 InterlockedIncrement(&dll_ref);