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