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
);