2 * Copyright 2013 Dmitry Timoshkov
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
31 #include "taskschd_private.h"
33 #include "wine/unicode.h"
34 #include "wine/debug.h"
36 WINE_DEFAULT_DEBUG_CHANNEL(taskschd
);
39 IDailyTrigger IDailyTrigger_iface
;
42 WCHAR
*start_boundary
;
46 static inline DailyTrigger
*impl_from_IDailyTrigger(IDailyTrigger
*iface
)
48 return CONTAINING_RECORD(iface
, DailyTrigger
, IDailyTrigger_iface
);
51 static HRESULT WINAPI
DailyTrigger_QueryInterface(IDailyTrigger
*iface
, REFIID riid
, void **ppv
)
53 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
55 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
57 if(IsEqualGUID(&IID_IUnknown
, riid
) ||
58 IsEqualGUID(&IID_IDispatch
, riid
) ||
59 IsEqualGUID(&IID_ITrigger
, riid
) ||
60 IsEqualGUID(&IID_IDailyTrigger
, riid
))
62 *ppv
= &This
->IDailyTrigger_iface
;
66 FIXME("unsupported riid %s\n", debugstr_guid(riid
));
71 IUnknown_AddRef((IUnknown
*)*ppv
);
75 static ULONG WINAPI
DailyTrigger_AddRef(IDailyTrigger
*iface
)
77 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
78 LONG ref
= InterlockedIncrement(&This
->ref
);
80 TRACE("(%p) ref=%d\n", This
, ref
);
85 static ULONG WINAPI
DailyTrigger_Release(IDailyTrigger
*iface
)
87 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
88 LONG ref
= InterlockedDecrement(&This
->ref
);
90 TRACE("(%p) ref=%d\n", This
, ref
);
94 TRACE("destroying %p\n", iface
);
95 heap_free(This
->start_boundary
);
102 static HRESULT WINAPI
DailyTrigger_GetTypeInfoCount(IDailyTrigger
*iface
, UINT
*count
)
104 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
105 FIXME("(%p)->(%p)\n", This
, count
);
109 static HRESULT WINAPI
DailyTrigger_GetTypeInfo(IDailyTrigger
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
111 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
112 FIXME("(%p)->(%u %u %p)\n", This
, index
, lcid
, info
);
116 static HRESULT WINAPI
DailyTrigger_GetIDsOfNames(IDailyTrigger
*iface
, REFIID riid
, LPOLESTR
*names
,
117 UINT count
, LCID lcid
, DISPID
*dispid
)
119 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
120 FIXME("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
124 static HRESULT WINAPI
DailyTrigger_Invoke(IDailyTrigger
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
125 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
127 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
128 FIXME("(%p)->(%d %s %x %x %p %p %p %p)\n", This
, dispid
, debugstr_guid(riid
), lcid
, flags
,
129 params
, result
, excepinfo
, argerr
);
133 static HRESULT WINAPI
DailyTrigger_get_Type(IDailyTrigger
*iface
, TASK_TRIGGER_TYPE2
*type
)
135 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
136 FIXME("(%p)->(%p)\n", This
, type
);
140 static HRESULT WINAPI
DailyTrigger_get_Id(IDailyTrigger
*iface
, BSTR
*id
)
142 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
143 FIXME("(%p)->(%p)\n", This
, id
);
147 static HRESULT WINAPI
DailyTrigger_put_Id(IDailyTrigger
*iface
, BSTR id
)
149 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
150 FIXME("(%p)->(%s)\n", This
, debugstr_w(id
));
154 static HRESULT WINAPI
DailyTrigger_get_Repetition(IDailyTrigger
*iface
, IRepetitionPattern
**repeat
)
156 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
157 FIXME("(%p)->(%p)\n", This
, repeat
);
161 static HRESULT WINAPI
DailyTrigger_put_Repetition(IDailyTrigger
*iface
, IRepetitionPattern
*repeat
)
163 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
164 FIXME("(%p)->(%p)\n", This
, repeat
);
168 static HRESULT WINAPI
DailyTrigger_get_ExecutionTimeLimit(IDailyTrigger
*iface
, BSTR
*limit
)
170 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
171 FIXME("(%p)->(%p)\n", This
, limit
);
175 static HRESULT WINAPI
DailyTrigger_put_ExecutionTimeLimit(IDailyTrigger
*iface
, BSTR limit
)
177 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
178 FIXME("(%p)->(%s)\n", This
, debugstr_w(limit
));
182 static HRESULT WINAPI
DailyTrigger_get_StartBoundary(IDailyTrigger
*iface
, BSTR
*start
)
184 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
186 TRACE("(%p)->(%p)\n", This
, start
);
188 if (!start
) return E_POINTER
;
190 if (!This
->start_boundary
) *start
= NULL
;
191 else if (!(*start
= SysAllocString(This
->start_boundary
))) return E_OUTOFMEMORY
;
196 static HRESULT WINAPI
DailyTrigger_put_StartBoundary(IDailyTrigger
*iface
, BSTR start
)
198 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
201 TRACE("(%p)->(%s)\n", This
, debugstr_w(start
));
203 if (start
&& !(str
= heap_strdupW(start
))) return E_OUTOFMEMORY
;
204 heap_free(This
->start_boundary
);
205 This
->start_boundary
= str
;
210 static HRESULT WINAPI
DailyTrigger_get_EndBoundary(IDailyTrigger
*iface
, BSTR
*end
)
212 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
213 FIXME("(%p)->(%p)\n", This
, end
);
217 static HRESULT WINAPI
DailyTrigger_put_EndBoundary(IDailyTrigger
*iface
, BSTR end
)
219 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
220 FIXME("(%p)->(%s)\n", This
, debugstr_w(end
));
224 static HRESULT WINAPI
DailyTrigger_get_Enabled(IDailyTrigger
*iface
, VARIANT_BOOL
*enabled
)
226 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
228 TRACE("(%p)->(%p)\n", This
, enabled
);
230 if (!enabled
) return E_POINTER
;
232 *enabled
= This
->enabled
? VARIANT_TRUE
: VARIANT_FALSE
;
236 static HRESULT WINAPI
DailyTrigger_put_Enabled(IDailyTrigger
*iface
, VARIANT_BOOL enabled
)
238 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
240 TRACE("(%p)->(%x)\n", This
, enabled
);
242 This
->enabled
= enabled
? TRUE
: FALSE
;
246 static HRESULT WINAPI
DailyTrigger_get_DaysInterval(IDailyTrigger
*iface
, short *days
)
248 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
250 TRACE("(%p)->(%p)\n", This
, days
);
252 *days
= This
->interval
;
256 static HRESULT WINAPI
DailyTrigger_put_DaysInterval(IDailyTrigger
*iface
, short days
)
258 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
260 TRACE("(%p)->(%d)\n", This
, days
);
265 This
->interval
= days
;
269 static HRESULT WINAPI
DailyTrigger_get_RandomDelay(IDailyTrigger
*iface
, BSTR
*pRandomDelay
)
271 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
272 FIXME("(%p)->(%p)\n", This
, pRandomDelay
);
276 static HRESULT WINAPI
DailyTrigger_put_RandomDelay(IDailyTrigger
*iface
, BSTR randomDelay
)
278 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
279 FIXME("(%p)->(%s)\n", This
, debugstr_w(randomDelay
));
283 static const IDailyTriggerVtbl DailyTrigger_vtbl
= {
284 DailyTrigger_QueryInterface
,
286 DailyTrigger_Release
,
287 DailyTrigger_GetTypeInfoCount
,
288 DailyTrigger_GetTypeInfo
,
289 DailyTrigger_GetIDsOfNames
,
291 DailyTrigger_get_Type
,
294 DailyTrigger_get_Repetition
,
295 DailyTrigger_put_Repetition
,
296 DailyTrigger_get_ExecutionTimeLimit
,
297 DailyTrigger_put_ExecutionTimeLimit
,
298 DailyTrigger_get_StartBoundary
,
299 DailyTrigger_put_StartBoundary
,
300 DailyTrigger_get_EndBoundary
,
301 DailyTrigger_put_EndBoundary
,
302 DailyTrigger_get_Enabled
,
303 DailyTrigger_put_Enabled
,
304 DailyTrigger_get_DaysInterval
,
305 DailyTrigger_put_DaysInterval
,
306 DailyTrigger_get_RandomDelay
,
307 DailyTrigger_put_RandomDelay
310 static HRESULT
DailyTrigger_create(ITrigger
**trigger
)
312 DailyTrigger
*daily_trigger
;
314 daily_trigger
= heap_alloc(sizeof(*daily_trigger
));
316 return E_OUTOFMEMORY
;
318 daily_trigger
->IDailyTrigger_iface
.lpVtbl
= &DailyTrigger_vtbl
;
319 daily_trigger
->ref
= 1;
320 daily_trigger
->interval
= 1;
321 daily_trigger
->start_boundary
= NULL
;
322 daily_trigger
->enabled
= TRUE
;
324 *trigger
= (ITrigger
*)&daily_trigger
->IDailyTrigger_iface
;
330 ITriggerCollection ITriggerCollection_iface
;
332 } trigger_collection
;
334 static inline trigger_collection
*impl_from_ITriggerCollection(ITriggerCollection
*iface
)
336 return CONTAINING_RECORD(iface
, trigger_collection
, ITriggerCollection_iface
);
339 static HRESULT WINAPI
TriggerCollection_QueryInterface(ITriggerCollection
*iface
, REFIID riid
, void **ppv
)
341 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
343 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
345 if(IsEqualGUID(&IID_IUnknown
, riid
) ||
346 IsEqualGUID(&IID_IDispatch
, riid
) ||
347 IsEqualGUID(&IID_ITriggerCollection
, riid
)) {
348 *ppv
= &This
->ITriggerCollection_iface
;
350 FIXME("unimplemented interface %s\n", debugstr_guid(riid
));
352 return E_NOINTERFACE
;
355 IUnknown_AddRef((IUnknown
*)*ppv
);
359 static ULONG WINAPI
TriggerCollection_AddRef(ITriggerCollection
*iface
)
361 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
362 LONG ref
= InterlockedIncrement(&This
->ref
);
364 TRACE("(%p) ref=%d\n", This
, ref
);
369 static ULONG WINAPI
TriggerCollection_Release(ITriggerCollection
*iface
)
371 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
372 LONG ref
= InterlockedDecrement(&This
->ref
);
374 TRACE("(%p) ref=%d\n", This
, ref
);
382 static HRESULT WINAPI
TriggerCollection_GetTypeInfoCount(ITriggerCollection
*iface
, UINT
*count
)
384 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
385 FIXME("(%p)->(%p)\n", This
, count
);
389 static HRESULT WINAPI
TriggerCollection_GetTypeInfo(ITriggerCollection
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
391 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
392 FIXME("(%p)->(%u %u %p)\n", This
, index
, lcid
, info
);
396 static HRESULT WINAPI
TriggerCollection_GetIDsOfNames(ITriggerCollection
*iface
, REFIID riid
, LPOLESTR
*names
,
397 UINT count
, LCID lcid
, DISPID
*dispid
)
399 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
400 FIXME("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
404 static HRESULT WINAPI
TriggerCollection_Invoke(ITriggerCollection
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
405 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
407 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
408 FIXME("(%p)->(%d %s %x %x %p %p %p %p)\n", This
, dispid
, debugstr_guid(riid
), lcid
, flags
,
409 params
, result
, excepinfo
, argerr
);
413 static HRESULT WINAPI
TriggerCollection_get_Count(ITriggerCollection
*iface
, LONG
*count
)
415 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
416 FIXME("(%p)->(%p)\n", This
, count
);
420 static HRESULT WINAPI
TriggerCollection_get_Item(ITriggerCollection
*iface
, LONG index
, ITrigger
**trigger
)
422 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
423 FIXME("(%p)->(%d %p)\n", This
, index
, trigger
);
427 static HRESULT WINAPI
TriggerCollection_get__NewEnum(ITriggerCollection
*iface
, IUnknown
**penum
)
429 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
430 FIXME("(%p)->(%p)\n", This
, penum
);
434 static HRESULT WINAPI
TriggerCollection_Create(ITriggerCollection
*iface
, TASK_TRIGGER_TYPE2 type
, ITrigger
**trigger
)
436 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
438 TRACE("(%p)->(%d %p)\n", This
, type
, trigger
);
441 case TASK_TRIGGER_DAILY
:
442 return DailyTrigger_create(trigger
);
444 FIXME("Unimplemented type %d\n", type
);
451 static HRESULT WINAPI
TriggerCollection_Remove(ITriggerCollection
*iface
, VARIANT index
)
453 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
454 FIXME("(%p)->(%s)\n", This
, debugstr_variant(&index
));
458 static HRESULT WINAPI
TriggerCollection_Clear(ITriggerCollection
*iface
)
460 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
461 FIXME("(%p)\n", This
);
465 static const ITriggerCollectionVtbl TriggerCollection_vtbl
= {
466 TriggerCollection_QueryInterface
,
467 TriggerCollection_AddRef
,
468 TriggerCollection_Release
,
469 TriggerCollection_GetTypeInfoCount
,
470 TriggerCollection_GetTypeInfo
,
471 TriggerCollection_GetIDsOfNames
,
472 TriggerCollection_Invoke
,
473 TriggerCollection_get_Count
,
474 TriggerCollection_get_Item
,
475 TriggerCollection_get__NewEnum
,
476 TriggerCollection_Create
,
477 TriggerCollection_Remove
,
478 TriggerCollection_Clear
483 IRegistrationInfo IRegistrationInfo_iface
;
485 WCHAR
*description
, *author
, *version
, *date
, *documentation
, *uri
, *source
;
488 static inline registration_info
*impl_from_IRegistrationInfo(IRegistrationInfo
*iface
)
490 return CONTAINING_RECORD(iface
, registration_info
, IRegistrationInfo_iface
);
493 static ULONG WINAPI
RegistrationInfo_AddRef(IRegistrationInfo
*iface
)
495 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
496 return InterlockedIncrement(®info
->ref
);
499 static ULONG WINAPI
RegistrationInfo_Release(IRegistrationInfo
*iface
)
501 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
502 LONG ref
= InterlockedDecrement(®info
->ref
);
506 TRACE("destroying %p\n", iface
);
507 heap_free(reginfo
->description
);
508 heap_free(reginfo
->author
);
509 heap_free(reginfo
->version
);
510 heap_free(reginfo
->date
);
511 heap_free(reginfo
->documentation
);
512 heap_free(reginfo
->uri
);
513 heap_free(reginfo
->source
);
520 static HRESULT WINAPI
RegistrationInfo_QueryInterface(IRegistrationInfo
*iface
, REFIID riid
, void **obj
)
522 if (!riid
|| !obj
) return E_INVALIDARG
;
524 TRACE("%p,%s,%p\n", iface
, debugstr_guid(riid
), obj
);
526 if (IsEqualGUID(riid
, &IID_IRegistrationInfo
) ||
527 IsEqualGUID(riid
, &IID_IDispatch
) ||
528 IsEqualGUID(riid
, &IID_IUnknown
))
530 IRegistrationInfo_AddRef(iface
);
535 FIXME("interface %s is not implemented\n", debugstr_guid(riid
));
537 return E_NOINTERFACE
;
540 static HRESULT WINAPI
RegistrationInfo_GetTypeInfoCount(IRegistrationInfo
*iface
, UINT
*count
)
542 FIXME("%p,%p: stub\n", iface
, count
);
546 static HRESULT WINAPI
RegistrationInfo_GetTypeInfo(IRegistrationInfo
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
548 FIXME("%p,%u,%u,%p: stub\n", iface
, index
, lcid
, info
);
552 static HRESULT WINAPI
RegistrationInfo_GetIDsOfNames(IRegistrationInfo
*iface
, REFIID riid
, LPOLESTR
*names
,
553 UINT count
, LCID lcid
, DISPID
*dispid
)
555 FIXME("%p,%s,%p,%u,%u,%p: stub\n", iface
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
559 static HRESULT WINAPI
RegistrationInfo_Invoke(IRegistrationInfo
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
560 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
562 FIXME("%p,%d,%s,%04x,%04x,%p,%p,%p,%p: stub\n", iface
, dispid
, debugstr_guid(riid
), lcid
, flags
,
563 params
, result
, excepinfo
, argerr
);
567 static HRESULT WINAPI
RegistrationInfo_get_Description(IRegistrationInfo
*iface
, BSTR
*description
)
569 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
571 TRACE("%p,%p\n", iface
, description
);
573 if (!description
) return E_POINTER
;
575 if (!reginfo
->description
) *description
= NULL
;
576 else if (!(*description
= SysAllocString(reginfo
->description
))) return E_OUTOFMEMORY
;
581 static HRESULT WINAPI
RegistrationInfo_put_Description(IRegistrationInfo
*iface
, BSTR description
)
583 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
585 TRACE("%p,%s\n", iface
, debugstr_w(description
));
587 if (!description
) return E_INVALIDARG
;
589 heap_free(reginfo
->description
);
590 reginfo
->description
= heap_strdupW(description
);
591 /* FIXME: update XML on the server side */
592 return reginfo
->description
? S_OK
: E_OUTOFMEMORY
;
595 static HRESULT WINAPI
RegistrationInfo_get_Author(IRegistrationInfo
*iface
, BSTR
*author
)
597 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
599 TRACE("%p,%p\n", iface
, author
);
601 if (!author
) return E_POINTER
;
603 if (!reginfo
->author
) *author
= NULL
;
604 else if (!(*author
= SysAllocString(reginfo
->author
))) return E_OUTOFMEMORY
;
609 static HRESULT WINAPI
RegistrationInfo_put_Author(IRegistrationInfo
*iface
, BSTR author
)
611 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
613 TRACE("%p,%s\n", iface
, debugstr_w(author
));
615 if (!author
) return E_INVALIDARG
;
617 heap_free(reginfo
->author
);
618 reginfo
->author
= heap_strdupW(author
);
619 /* FIXME: update XML on the server side */
620 return reginfo
->author
? S_OK
: E_OUTOFMEMORY
;
623 static HRESULT WINAPI
RegistrationInfo_get_Version(IRegistrationInfo
*iface
, BSTR
*version
)
625 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
627 TRACE("%p,%p\n", iface
, version
);
629 if (!version
) return E_POINTER
;
631 if (!reginfo
->version
) *version
= NULL
;
632 else if (!(*version
= SysAllocString(reginfo
->version
))) return E_OUTOFMEMORY
;
637 static HRESULT WINAPI
RegistrationInfo_put_Version(IRegistrationInfo
*iface
, BSTR version
)
639 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
641 TRACE("%p,%s\n", iface
, debugstr_w(version
));
643 if (!version
) return E_INVALIDARG
;
645 heap_free(reginfo
->version
);
646 reginfo
->version
= heap_strdupW(version
);
647 /* FIXME: update XML on the server side */
648 return reginfo
->version
? S_OK
: E_OUTOFMEMORY
;
651 static HRESULT WINAPI
RegistrationInfo_get_Date(IRegistrationInfo
*iface
, BSTR
*date
)
653 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
655 TRACE("%p,%p\n", iface
, date
);
657 if (!date
) return E_POINTER
;
659 if (!reginfo
->date
) *date
= NULL
;
660 else if (!(*date
= SysAllocString(reginfo
->date
))) return E_OUTOFMEMORY
;
665 static HRESULT WINAPI
RegistrationInfo_put_Date(IRegistrationInfo
*iface
, BSTR date
)
667 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
669 TRACE("%p,%s\n", iface
, debugstr_w(date
));
671 if (!date
) return E_INVALIDARG
;
673 heap_free(reginfo
->date
);
674 reginfo
->date
= heap_strdupW(date
);
675 /* FIXME: update XML on the server side */
676 return reginfo
->date
? S_OK
: E_OUTOFMEMORY
;
679 static HRESULT WINAPI
RegistrationInfo_get_Documentation(IRegistrationInfo
*iface
, BSTR
*doc
)
681 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
683 TRACE("%p,%p\n", iface
, doc
);
685 if (!doc
) return E_POINTER
;
687 if (!reginfo
->documentation
) *doc
= NULL
;
688 else if (!(*doc
= SysAllocString(reginfo
->documentation
))) return E_OUTOFMEMORY
;
693 static HRESULT WINAPI
RegistrationInfo_put_Documentation(IRegistrationInfo
*iface
, BSTR doc
)
695 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
697 TRACE("%p,%s\n", iface
, debugstr_w(doc
));
699 if (!doc
) return E_INVALIDARG
;
701 heap_free(reginfo
->documentation
);
702 reginfo
->documentation
= heap_strdupW(doc
);
703 /* FIXME: update XML on the server side */
704 return reginfo
->documentation
? S_OK
: E_OUTOFMEMORY
;
707 static HRESULT WINAPI
RegistrationInfo_get_XmlText(IRegistrationInfo
*iface
, BSTR
*xml
)
709 FIXME("%p,%p: stub\n", iface
, xml
);
713 static HRESULT WINAPI
RegistrationInfo_put_XmlText(IRegistrationInfo
*iface
, BSTR xml
)
715 FIXME("%p,%s: stub\n", iface
, debugstr_w(xml
));
719 static HRESULT WINAPI
RegistrationInfo_get_URI(IRegistrationInfo
*iface
, BSTR
*uri
)
721 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
723 TRACE("%p,%p\n", iface
, uri
);
725 if (!uri
) return E_POINTER
;
727 if (!reginfo
->uri
) *uri
= NULL
;
728 else if (!(*uri
= SysAllocString(reginfo
->uri
))) return E_OUTOFMEMORY
;
733 static HRESULT WINAPI
RegistrationInfo_put_URI(IRegistrationInfo
*iface
, BSTR uri
)
735 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
737 TRACE("%p,%s\n", iface
, debugstr_w(uri
));
739 if (!uri
) return E_INVALIDARG
;
741 heap_free(reginfo
->uri
);
742 reginfo
->uri
= heap_strdupW(uri
);
743 /* FIXME: update XML on the server side */
744 return reginfo
->uri
? S_OK
: E_OUTOFMEMORY
;
747 static HRESULT WINAPI
RegistrationInfo_get_SecurityDescriptor(IRegistrationInfo
*iface
, VARIANT
*sddl
)
749 FIXME("%p,%p: stub\n", iface
, sddl
);
753 static HRESULT WINAPI
RegistrationInfo_put_SecurityDescriptor(IRegistrationInfo
*iface
, VARIANT sddl
)
755 FIXME("%p,%s: stub\n", iface
, debugstr_variant(&sddl
));
759 static HRESULT WINAPI
RegistrationInfo_get_Source(IRegistrationInfo
*iface
, BSTR
*source
)
761 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
763 TRACE("%p,%p\n", iface
, source
);
765 if (!source
) return E_POINTER
;
767 if (!reginfo
->source
) *source
= NULL
;
768 else if (!(*source
= SysAllocString(reginfo
->source
))) return E_OUTOFMEMORY
;
773 static HRESULT WINAPI
RegistrationInfo_put_Source(IRegistrationInfo
*iface
, BSTR source
)
775 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
777 TRACE("%p,%s\n", iface
, debugstr_w(source
));
779 if (!source
) return E_INVALIDARG
;
781 heap_free(reginfo
->source
);
782 reginfo
->source
= heap_strdupW(source
);
783 /* FIXME: update XML on the server side */
784 return reginfo
->source
? S_OK
: E_OUTOFMEMORY
;
787 static const IRegistrationInfoVtbl RegistrationInfo_vtbl
=
789 RegistrationInfo_QueryInterface
,
790 RegistrationInfo_AddRef
,
791 RegistrationInfo_Release
,
792 RegistrationInfo_GetTypeInfoCount
,
793 RegistrationInfo_GetTypeInfo
,
794 RegistrationInfo_GetIDsOfNames
,
795 RegistrationInfo_Invoke
,
796 RegistrationInfo_get_Description
,
797 RegistrationInfo_put_Description
,
798 RegistrationInfo_get_Author
,
799 RegistrationInfo_put_Author
,
800 RegistrationInfo_get_Version
,
801 RegistrationInfo_put_Version
,
802 RegistrationInfo_get_Date
,
803 RegistrationInfo_put_Date
,
804 RegistrationInfo_get_Documentation
,
805 RegistrationInfo_put_Documentation
,
806 RegistrationInfo_get_XmlText
,
807 RegistrationInfo_put_XmlText
,
808 RegistrationInfo_get_URI
,
809 RegistrationInfo_put_URI
,
810 RegistrationInfo_get_SecurityDescriptor
,
811 RegistrationInfo_put_SecurityDescriptor
,
812 RegistrationInfo_get_Source
,
813 RegistrationInfo_put_Source
816 static HRESULT
RegistrationInfo_create(IRegistrationInfo
**obj
)
818 registration_info
*reginfo
;
820 reginfo
= heap_alloc_zero(sizeof(*reginfo
));
821 if (!reginfo
) return E_OUTOFMEMORY
;
823 reginfo
->IRegistrationInfo_iface
.lpVtbl
= &RegistrationInfo_vtbl
;
825 *obj
= ®info
->IRegistrationInfo_iface
;
827 TRACE("created %p\n", *obj
);
834 ITaskSettings ITaskSettings_iface
;
836 WCHAR
*restart_interval
;
837 WCHAR
*execution_time_limit
;
838 WCHAR
*delete_expired_task_after
;
841 TASK_INSTANCES_POLICY policy
;
842 TASK_COMPATIBILITY compatibility
;
843 BOOL allow_on_demand_start
;
844 BOOL stop_if_going_on_batteries
;
845 BOOL disallow_start_if_on_batteries
;
846 BOOL allow_hard_terminate
;
847 BOOL start_when_available
;
848 BOOL run_only_if_network_available
;
851 BOOL run_only_if_idle
;
855 static inline TaskSettings
*impl_from_ITaskSettings(ITaskSettings
*iface
)
857 return CONTAINING_RECORD(iface
, TaskSettings
, ITaskSettings_iface
);
860 static ULONG WINAPI
TaskSettings_AddRef(ITaskSettings
*iface
)
862 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
863 return InterlockedIncrement(&taskset
->ref
);
866 static ULONG WINAPI
TaskSettings_Release(ITaskSettings
*iface
)
868 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
869 LONG ref
= InterlockedDecrement(&taskset
->ref
);
873 TRACE("destroying %p\n", iface
);
874 heap_free(taskset
->restart_interval
);
875 heap_free(taskset
->execution_time_limit
);
876 heap_free(taskset
->delete_expired_task_after
);
883 static HRESULT WINAPI
TaskSettings_QueryInterface(ITaskSettings
*iface
, REFIID riid
, void **obj
)
885 if (!riid
|| !obj
) return E_INVALIDARG
;
887 TRACE("%p,%s,%p\n", iface
, debugstr_guid(riid
), obj
);
889 if (IsEqualGUID(riid
, &IID_ITaskSettings
) ||
890 IsEqualGUID(riid
, &IID_IDispatch
) ||
891 IsEqualGUID(riid
, &IID_IUnknown
))
893 ITaskSettings_AddRef(iface
);
898 FIXME("interface %s is not implemented\n", debugstr_guid(riid
));
900 return E_NOINTERFACE
;
903 static HRESULT WINAPI
TaskSettings_GetTypeInfoCount(ITaskSettings
*iface
, UINT
*count
)
905 FIXME("%p,%p: stub\n", iface
, count
);
909 static HRESULT WINAPI
TaskSettings_GetTypeInfo(ITaskSettings
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
911 FIXME("%p,%u,%u,%p: stub\n", iface
, index
, lcid
, info
);
915 static HRESULT WINAPI
TaskSettings_GetIDsOfNames(ITaskSettings
*iface
, REFIID riid
, LPOLESTR
*names
,
916 UINT count
, LCID lcid
, DISPID
*dispid
)
918 FIXME("%p,%s,%p,%u,%u,%p: stub\n", iface
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
922 static HRESULT WINAPI
TaskSettings_Invoke(ITaskSettings
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
923 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
925 FIXME("%p,%d,%s,%04x,%04x,%p,%p,%p,%p: stub\n", iface
, dispid
, debugstr_guid(riid
), lcid
, flags
,
926 params
, result
, excepinfo
, argerr
);
930 static HRESULT WINAPI
TaskSettings_get_AllowDemandStart(ITaskSettings
*iface
, VARIANT_BOOL
*allow
)
932 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
934 TRACE("%p,%p\n", iface
, allow
);
936 if (!allow
) return E_POINTER
;
938 *allow
= taskset
->allow_on_demand_start
? VARIANT_TRUE
: VARIANT_FALSE
;
943 static HRESULT WINAPI
TaskSettings_put_AllowDemandStart(ITaskSettings
*iface
, VARIANT_BOOL allow
)
945 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
947 TRACE("%p,%d\n", iface
, allow
);
949 taskset
->allow_on_demand_start
= allow
? TRUE
: FALSE
;
954 static HRESULT WINAPI
TaskSettings_get_RestartInterval(ITaskSettings
*iface
, BSTR
*interval
)
956 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
958 TRACE("%p,%p\n", iface
, interval
);
960 if (!interval
) return E_POINTER
;
962 if (!taskset
->restart_interval
)
968 if (!taskset
->restart_interval
) *interval
= NULL
;
969 else if (!(*interval
= SysAllocString(taskset
->restart_interval
))) return E_OUTOFMEMORY
;
974 static HRESULT WINAPI
TaskSettings_put_RestartInterval(ITaskSettings
*iface
, BSTR interval
)
976 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
979 TRACE("%p,%s\n", iface
, debugstr_w(interval
));
981 if (interval
&& !(str
= heap_strdupW(interval
))) return E_OUTOFMEMORY
;
982 heap_free(taskset
->restart_interval
);
983 taskset
->restart_interval
= str
;
988 static HRESULT WINAPI
TaskSettings_get_RestartCount(ITaskSettings
*iface
, INT
*count
)
990 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
992 TRACE("%p,%p\n", iface
, count
);
994 if (!count
) return E_POINTER
;
996 *count
= taskset
->restart_count
;
1001 static HRESULT WINAPI
TaskSettings_put_RestartCount(ITaskSettings
*iface
, INT count
)
1003 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1005 TRACE("%p,%d\n", iface
, count
);
1007 taskset
->restart_count
= count
;
1012 static HRESULT WINAPI
TaskSettings_get_MultipleInstances(ITaskSettings
*iface
, TASK_INSTANCES_POLICY
*policy
)
1014 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1016 TRACE("%p,%p\n", iface
, policy
);
1018 if (!policy
) return E_POINTER
;
1020 *policy
= taskset
->policy
;
1025 static HRESULT WINAPI
TaskSettings_put_MultipleInstances(ITaskSettings
*iface
, TASK_INSTANCES_POLICY policy
)
1027 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1029 TRACE("%p,%d\n", iface
, policy
);
1031 taskset
->policy
= policy
;
1036 static HRESULT WINAPI
TaskSettings_get_StopIfGoingOnBatteries(ITaskSettings
*iface
, VARIANT_BOOL
*stop
)
1038 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1040 TRACE("%p,%p\n", iface
, stop
);
1042 if (!stop
) return E_POINTER
;
1044 *stop
= taskset
->stop_if_going_on_batteries
? VARIANT_TRUE
: VARIANT_FALSE
;
1049 static HRESULT WINAPI
TaskSettings_put_StopIfGoingOnBatteries(ITaskSettings
*iface
, VARIANT_BOOL stop
)
1051 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1053 TRACE("%p,%d\n", iface
, stop
);
1055 taskset
->stop_if_going_on_batteries
= stop
? TRUE
: FALSE
;
1060 static HRESULT WINAPI
TaskSettings_get_DisallowStartIfOnBatteries(ITaskSettings
*iface
, VARIANT_BOOL
*disallow
)
1062 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1064 TRACE("%p,%p\n", iface
, disallow
);
1066 if (!disallow
) return E_POINTER
;
1068 *disallow
= taskset
->disallow_start_if_on_batteries
? VARIANT_TRUE
: VARIANT_FALSE
;
1073 static HRESULT WINAPI
TaskSettings_put_DisallowStartIfOnBatteries(ITaskSettings
*iface
, VARIANT_BOOL disallow
)
1075 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1077 TRACE("%p,%d\n", iface
, disallow
);
1079 taskset
->disallow_start_if_on_batteries
= disallow
? TRUE
: FALSE
;
1084 static HRESULT WINAPI
TaskSettings_get_AllowHardTerminate(ITaskSettings
*iface
, VARIANT_BOOL
*allow
)
1086 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1088 TRACE("%p,%p\n", iface
, allow
);
1090 if (!allow
) return E_POINTER
;
1092 *allow
= taskset
->allow_hard_terminate
? VARIANT_TRUE
: VARIANT_FALSE
;
1097 static HRESULT WINAPI
TaskSettings_put_AllowHardTerminate(ITaskSettings
*iface
, VARIANT_BOOL allow
)
1099 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1101 TRACE("%p,%d\n", iface
, allow
);
1103 taskset
->allow_hard_terminate
= allow
? TRUE
: FALSE
;
1108 static HRESULT WINAPI
TaskSettings_get_StartWhenAvailable(ITaskSettings
*iface
, VARIANT_BOOL
*start
)
1110 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1112 TRACE("%p,%p\n", iface
, start
);
1114 if (!start
) return E_POINTER
;
1116 *start
= taskset
->start_when_available
? VARIANT_TRUE
: VARIANT_FALSE
;
1121 static HRESULT WINAPI
TaskSettings_put_StartWhenAvailable(ITaskSettings
*iface
, VARIANT_BOOL start
)
1123 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1125 TRACE("%p,%d\n", iface
, start
);
1127 taskset
->start_when_available
= start
? TRUE
: FALSE
;
1132 static HRESULT WINAPI
TaskSettings_get_XmlText(ITaskSettings
*iface
, BSTR
*xml
)
1134 FIXME("%p,%p: stub\n", iface
, xml
);
1138 static HRESULT WINAPI
TaskSettings_put_XmlText(ITaskSettings
*iface
, BSTR xml
)
1140 FIXME("%p,%s: stub\n", iface
, debugstr_w(xml
));
1144 static HRESULT WINAPI
TaskSettings_get_RunOnlyIfNetworkAvailable(ITaskSettings
*iface
, VARIANT_BOOL
*run
)
1146 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1148 TRACE("%p,%p\n", iface
, run
);
1150 if (!run
) return E_POINTER
;
1152 *run
= taskset
->run_only_if_network_available
? VARIANT_TRUE
: VARIANT_FALSE
;
1157 static HRESULT WINAPI
TaskSettings_put_RunOnlyIfNetworkAvailable(ITaskSettings
*iface
, VARIANT_BOOL run
)
1159 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1161 TRACE("%p,%d\n", iface
, run
);
1163 taskset
->run_only_if_network_available
= run
? TRUE
: FALSE
;
1168 static HRESULT WINAPI
TaskSettings_get_ExecutionTimeLimit(ITaskSettings
*iface
, BSTR
*limit
)
1170 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1172 TRACE("%p,%p\n", iface
, limit
);
1174 if (!limit
) return E_POINTER
;
1176 if (!taskset
->execution_time_limit
)
1182 if (!taskset
->execution_time_limit
) *limit
= NULL
;
1183 else if (!(*limit
= SysAllocString(taskset
->execution_time_limit
))) return E_OUTOFMEMORY
;
1188 static HRESULT WINAPI
TaskSettings_put_ExecutionTimeLimit(ITaskSettings
*iface
, BSTR limit
)
1190 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1193 TRACE("%p,%s\n", iface
, debugstr_w(limit
));
1195 if (limit
&& !(str
= heap_strdupW(limit
))) return E_OUTOFMEMORY
;
1196 heap_free(taskset
->execution_time_limit
);
1197 taskset
->execution_time_limit
= str
;
1202 static HRESULT WINAPI
TaskSettings_get_Enabled(ITaskSettings
*iface
, VARIANT_BOOL
*enabled
)
1204 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1206 TRACE("%p,%p\n", iface
, enabled
);
1208 if (!enabled
) return E_POINTER
;
1210 *enabled
= taskset
->enabled
? VARIANT_TRUE
: VARIANT_FALSE
;
1215 static HRESULT WINAPI
TaskSettings_put_Enabled(ITaskSettings
*iface
, VARIANT_BOOL enabled
)
1217 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1219 TRACE("%p,%d\n", iface
, enabled
);
1221 taskset
->enabled
= enabled
? TRUE
: FALSE
;
1226 static HRESULT WINAPI
TaskSettings_get_DeleteExpiredTaskAfter(ITaskSettings
*iface
, BSTR
*delay
)
1228 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1230 TRACE("%p,%p\n", iface
, delay
);
1232 if (!delay
) return E_POINTER
;
1234 if (!taskset
->delete_expired_task_after
) *delay
= NULL
;
1235 else if (!(*delay
= SysAllocString(taskset
->delete_expired_task_after
))) return E_OUTOFMEMORY
;
1240 static HRESULT WINAPI
TaskSettings_put_DeleteExpiredTaskAfter(ITaskSettings
*iface
, BSTR delay
)
1242 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1245 TRACE("%p,%s\n", iface
, debugstr_w(delay
));
1247 if (delay
&& !(str
= heap_strdupW(delay
))) return E_OUTOFMEMORY
;
1248 heap_free(taskset
->delete_expired_task_after
);
1249 taskset
->delete_expired_task_after
= str
;
1254 static HRESULT WINAPI
TaskSettings_get_Priority(ITaskSettings
*iface
, INT
*priority
)
1256 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1258 TRACE("%p,%p\n", iface
, priority
);
1260 if (!priority
) return E_POINTER
;
1262 *priority
= taskset
->priority
;
1267 static HRESULT WINAPI
TaskSettings_put_Priority(ITaskSettings
*iface
, INT priority
)
1269 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1271 TRACE("%p,%d\n", iface
, priority
);
1273 taskset
->priority
= priority
;
1278 static HRESULT WINAPI
TaskSettings_get_Compatibility(ITaskSettings
*iface
, TASK_COMPATIBILITY
*level
)
1280 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1282 TRACE("%p,%p\n", iface
, level
);
1284 if (!level
) return E_POINTER
;
1286 *level
= taskset
->compatibility
;
1291 static HRESULT WINAPI
TaskSettings_put_Compatibility(ITaskSettings
*iface
, TASK_COMPATIBILITY level
)
1293 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1295 TRACE("%p,%d\n", iface
, level
);
1297 taskset
->compatibility
= level
;
1302 static HRESULT WINAPI
TaskSettings_get_Hidden(ITaskSettings
*iface
, VARIANT_BOOL
*hidden
)
1304 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1306 TRACE("%p,%p\n", iface
, hidden
);
1308 if (!hidden
) return E_POINTER
;
1310 *hidden
= taskset
->hidden
? VARIANT_TRUE
: VARIANT_FALSE
;
1315 static HRESULT WINAPI
TaskSettings_put_Hidden(ITaskSettings
*iface
, VARIANT_BOOL hidden
)
1317 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1319 TRACE("%p,%d\n", iface
, hidden
);
1321 taskset
->hidden
= hidden
? TRUE
: FALSE
;
1326 static HRESULT WINAPI
TaskSettings_get_IdleSettings(ITaskSettings
*iface
, IIdleSettings
**settings
)
1328 FIXME("%p,%p: stub\n", iface
, settings
);
1332 static HRESULT WINAPI
TaskSettings_put_IdleSettings(ITaskSettings
*iface
, IIdleSettings
*settings
)
1334 FIXME("%p,%p: stub\n", iface
, settings
);
1338 static HRESULT WINAPI
TaskSettings_get_RunOnlyIfIdle(ITaskSettings
*iface
, VARIANT_BOOL
*run
)
1340 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1342 TRACE("%p,%p\n", iface
, run
);
1344 if (!run
) return E_POINTER
;
1346 *run
= taskset
->run_only_if_idle
? VARIANT_TRUE
: VARIANT_FALSE
;
1351 static HRESULT WINAPI
TaskSettings_put_RunOnlyIfIdle(ITaskSettings
*iface
, VARIANT_BOOL run
)
1353 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1355 TRACE("%p,%d\n", iface
, run
);
1357 taskset
->run_only_if_idle
= run
? TRUE
: FALSE
;
1362 static HRESULT WINAPI
TaskSettings_get_WakeToRun(ITaskSettings
*iface
, VARIANT_BOOL
*wake
)
1364 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1366 TRACE("%p,%p\n", iface
, wake
);
1368 if (!wake
) return E_POINTER
;
1370 *wake
= taskset
->wake_to_run
? VARIANT_TRUE
: VARIANT_FALSE
;
1375 static HRESULT WINAPI
TaskSettings_put_WakeToRun(ITaskSettings
*iface
, VARIANT_BOOL wake
)
1377 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1379 TRACE("%p,%d\n", iface
, wake
);
1381 taskset
->wake_to_run
= wake
? TRUE
: FALSE
;
1386 static HRESULT WINAPI
TaskSettings_get_NetworkSettings(ITaskSettings
*iface
, INetworkSettings
**settings
)
1388 FIXME("%p,%p: stub\n", iface
, settings
);
1392 static HRESULT WINAPI
TaskSettings_put_NetworkSettings(ITaskSettings
*iface
, INetworkSettings
*settings
)
1394 FIXME("%p,%p: stub\n", iface
, settings
);
1398 static const ITaskSettingsVtbl TaskSettings_vtbl
=
1400 TaskSettings_QueryInterface
,
1401 TaskSettings_AddRef
,
1402 TaskSettings_Release
,
1403 TaskSettings_GetTypeInfoCount
,
1404 TaskSettings_GetTypeInfo
,
1405 TaskSettings_GetIDsOfNames
,
1406 TaskSettings_Invoke
,
1407 TaskSettings_get_AllowDemandStart
,
1408 TaskSettings_put_AllowDemandStart
,
1409 TaskSettings_get_RestartInterval
,
1410 TaskSettings_put_RestartInterval
,
1411 TaskSettings_get_RestartCount
,
1412 TaskSettings_put_RestartCount
,
1413 TaskSettings_get_MultipleInstances
,
1414 TaskSettings_put_MultipleInstances
,
1415 TaskSettings_get_StopIfGoingOnBatteries
,
1416 TaskSettings_put_StopIfGoingOnBatteries
,
1417 TaskSettings_get_DisallowStartIfOnBatteries
,
1418 TaskSettings_put_DisallowStartIfOnBatteries
,
1419 TaskSettings_get_AllowHardTerminate
,
1420 TaskSettings_put_AllowHardTerminate
,
1421 TaskSettings_get_StartWhenAvailable
,
1422 TaskSettings_put_StartWhenAvailable
,
1423 TaskSettings_get_XmlText
,
1424 TaskSettings_put_XmlText
,
1425 TaskSettings_get_RunOnlyIfNetworkAvailable
,
1426 TaskSettings_put_RunOnlyIfNetworkAvailable
,
1427 TaskSettings_get_ExecutionTimeLimit
,
1428 TaskSettings_put_ExecutionTimeLimit
,
1429 TaskSettings_get_Enabled
,
1430 TaskSettings_put_Enabled
,
1431 TaskSettings_get_DeleteExpiredTaskAfter
,
1432 TaskSettings_put_DeleteExpiredTaskAfter
,
1433 TaskSettings_get_Priority
,
1434 TaskSettings_put_Priority
,
1435 TaskSettings_get_Compatibility
,
1436 TaskSettings_put_Compatibility
,
1437 TaskSettings_get_Hidden
,
1438 TaskSettings_put_Hidden
,
1439 TaskSettings_get_IdleSettings
,
1440 TaskSettings_put_IdleSettings
,
1441 TaskSettings_get_RunOnlyIfIdle
,
1442 TaskSettings_put_RunOnlyIfIdle
,
1443 TaskSettings_get_WakeToRun
,
1444 TaskSettings_put_WakeToRun
,
1445 TaskSettings_get_NetworkSettings
,
1446 TaskSettings_put_NetworkSettings
1449 static HRESULT
TaskSettings_create(ITaskSettings
**obj
)
1451 static const WCHAR exec_time_limit
[] = { 'P','T','7','2','H',0 };
1452 TaskSettings
*taskset
;
1454 taskset
= heap_alloc(sizeof(*taskset
));
1455 if (!taskset
) return E_OUTOFMEMORY
;
1457 taskset
->ITaskSettings_iface
.lpVtbl
= &TaskSettings_vtbl
;
1459 /* set the defaults */
1460 taskset
->restart_interval
= NULL
;
1461 taskset
->execution_time_limit
= heap_strdupW(exec_time_limit
);
1462 taskset
->delete_expired_task_after
= NULL
;
1463 taskset
->restart_count
= 0;
1464 taskset
->priority
= 7;
1465 taskset
->policy
= TASK_INSTANCES_IGNORE_NEW
;
1466 taskset
->compatibility
= TASK_COMPATIBILITY_V2
;
1467 taskset
->allow_on_demand_start
= TRUE
;
1468 taskset
->stop_if_going_on_batteries
= TRUE
;
1469 taskset
->disallow_start_if_on_batteries
= TRUE
;
1470 taskset
->allow_hard_terminate
= TRUE
;
1471 taskset
->start_when_available
= FALSE
;
1472 taskset
->run_only_if_network_available
= FALSE
;
1473 taskset
->enabled
= TRUE
;
1474 taskset
->hidden
= FALSE
;
1475 taskset
->run_only_if_idle
= FALSE
;
1476 taskset
->wake_to_run
= FALSE
;
1478 *obj
= &taskset
->ITaskSettings_iface
;
1480 TRACE("created %p\n", *obj
);
1487 IPrincipal IPrincipal_iface
;
1491 static inline Principal
*impl_from_IPrincipal(IPrincipal
*iface
)
1493 return CONTAINING_RECORD(iface
, Principal
, IPrincipal_iface
);
1496 static ULONG WINAPI
Principal_AddRef(IPrincipal
*iface
)
1498 Principal
*principal
= impl_from_IPrincipal(iface
);
1499 return InterlockedIncrement(&principal
->ref
);
1502 static ULONG WINAPI
Principal_Release(IPrincipal
*iface
)
1504 Principal
*principal
= impl_from_IPrincipal(iface
);
1505 LONG ref
= InterlockedDecrement(&principal
->ref
);
1509 TRACE("destroying %p\n", iface
);
1510 heap_free(principal
);
1516 static HRESULT WINAPI
Principal_QueryInterface(IPrincipal
*iface
, REFIID riid
, void **obj
)
1518 if (!riid
|| !obj
) return E_INVALIDARG
;
1520 TRACE("%p,%s,%p\n", iface
, debugstr_guid(riid
), obj
);
1522 if (IsEqualGUID(riid
, &IID_IPrincipal
) ||
1523 IsEqualGUID(riid
, &IID_IDispatch
) ||
1524 IsEqualGUID(riid
, &IID_IUnknown
))
1526 IPrincipal_AddRef(iface
);
1531 FIXME("interface %s is not implemented\n", debugstr_guid(riid
));
1533 return E_NOINTERFACE
;
1536 static HRESULT WINAPI
Principal_GetTypeInfoCount(IPrincipal
*iface
, UINT
*count
)
1538 FIXME("%p,%p: stub\n", iface
, count
);
1542 static HRESULT WINAPI
Principal_GetTypeInfo(IPrincipal
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
1544 FIXME("%p,%u,%u,%p: stub\n", iface
, index
, lcid
, info
);
1548 static HRESULT WINAPI
Principal_GetIDsOfNames(IPrincipal
*iface
, REFIID riid
, LPOLESTR
*names
,
1549 UINT count
, LCID lcid
, DISPID
*dispid
)
1551 FIXME("%p,%s,%p,%u,%u,%p: stub\n", iface
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
1555 static HRESULT WINAPI
Principal_Invoke(IPrincipal
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
1556 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
1558 FIXME("%p,%d,%s,%04x,%04x,%p,%p,%p,%p: stub\n", iface
, dispid
, debugstr_guid(riid
), lcid
, flags
,
1559 params
, result
, excepinfo
, argerr
);
1563 static HRESULT WINAPI
Principal_get_Id(IPrincipal
*iface
, BSTR
*id
)
1565 FIXME("%p,%p: stub\n", iface
, id
);
1569 static HRESULT WINAPI
Principal_put_Id(IPrincipal
*iface
, BSTR id
)
1571 FIXME("%p,%s: stub\n", iface
, debugstr_w(id
));
1575 static HRESULT WINAPI
Principal_get_DisplayName(IPrincipal
*iface
, BSTR
*name
)
1577 FIXME("%p,%p: stub\n", iface
, name
);
1581 static HRESULT WINAPI
Principal_put_DisplayName(IPrincipal
*iface
, BSTR name
)
1583 FIXME("%p,%s: stub\n", iface
, debugstr_w(name
));
1587 static HRESULT WINAPI
Principal_get_UserId(IPrincipal
*iface
, BSTR
*user_id
)
1589 FIXME("%p,%p: stub\n", iface
, user_id
);
1593 static HRESULT WINAPI
Principal_put_UserId(IPrincipal
*iface
, BSTR user_id
)
1595 FIXME("%p,%s: stub\n", iface
, debugstr_w(user_id
));
1599 static HRESULT WINAPI
Principal_get_LogonType(IPrincipal
*iface
, TASK_LOGON_TYPE
*logon_type
)
1601 FIXME("%p,%p: stub\n", iface
, logon_type
);
1605 static HRESULT WINAPI
Principal_put_LogonType(IPrincipal
*iface
, TASK_LOGON_TYPE logon_type
)
1607 FIXME("%p,%u: stub\n", iface
, logon_type
);
1611 static HRESULT WINAPI
Principal_get_GroupId(IPrincipal
*iface
, BSTR
*group_id
)
1613 FIXME("%p,%p: stub\n", iface
, group_id
);
1617 static HRESULT WINAPI
Principal_put_GroupId(IPrincipal
*iface
, BSTR group_id
)
1619 FIXME("%p,%s: stub\n", iface
, debugstr_w(group_id
));
1623 static HRESULT WINAPI
Principal_get_RunLevel(IPrincipal
*iface
, TASK_RUNLEVEL_TYPE
*run_level
)
1625 FIXME("%p,%p: stub\n", iface
, run_level
);
1629 static HRESULT WINAPI
Principal_put_RunLevel(IPrincipal
*iface
, TASK_RUNLEVEL_TYPE run_level
)
1631 FIXME("%p,%u: stub\n", iface
, run_level
);
1635 static const IPrincipalVtbl Principal_vtbl
=
1637 Principal_QueryInterface
,
1640 Principal_GetTypeInfoCount
,
1641 Principal_GetTypeInfo
,
1642 Principal_GetIDsOfNames
,
1646 Principal_get_DisplayName
,
1647 Principal_put_DisplayName
,
1648 Principal_get_UserId
,
1649 Principal_put_UserId
,
1650 Principal_get_LogonType
,
1651 Principal_put_LogonType
,
1652 Principal_get_GroupId
,
1653 Principal_put_GroupId
,
1654 Principal_get_RunLevel
,
1655 Principal_put_RunLevel
1658 static HRESULT
Principal_create(IPrincipal
**obj
)
1660 Principal
*principal
;
1662 principal
= heap_alloc(sizeof(*principal
));
1663 if (!principal
) return E_OUTOFMEMORY
;
1665 principal
->IPrincipal_iface
.lpVtbl
= &Principal_vtbl
;
1668 *obj
= &principal
->IPrincipal_iface
;
1670 TRACE("created %p\n", *obj
);
1677 IExecAction IExecAction_iface
;
1683 static inline ExecAction
*impl_from_IExecAction(IExecAction
*iface
)
1685 return CONTAINING_RECORD(iface
, ExecAction
, IExecAction_iface
);
1688 static ULONG WINAPI
ExecAction_AddRef(IExecAction
*iface
)
1690 ExecAction
*action
= impl_from_IExecAction(iface
);
1691 return InterlockedIncrement(&action
->ref
);
1694 static ULONG WINAPI
ExecAction_Release(IExecAction
*iface
)
1696 ExecAction
*action
= impl_from_IExecAction(iface
);
1697 LONG ref
= InterlockedDecrement(&action
->ref
);
1701 TRACE("destroying %p\n", iface
);
1702 heap_free(action
->path
);
1703 heap_free(action
->directory
);
1710 static HRESULT WINAPI
ExecAction_QueryInterface(IExecAction
*iface
, REFIID riid
, void **obj
)
1712 if (!riid
|| !obj
) return E_INVALIDARG
;
1714 TRACE("%p,%s,%p\n", iface
, debugstr_guid(riid
), obj
);
1716 if (IsEqualGUID(riid
, &IID_IExecAction
) ||
1717 IsEqualGUID(riid
, &IID_IAction
) ||
1718 IsEqualGUID(riid
, &IID_IDispatch
) ||
1719 IsEqualGUID(riid
, &IID_IUnknown
))
1721 IExecAction_AddRef(iface
);
1726 FIXME("interface %s is not implemented\n", debugstr_guid(riid
));
1728 return E_NOINTERFACE
;
1731 static HRESULT WINAPI
ExecAction_GetTypeInfoCount(IExecAction
*iface
, UINT
*count
)
1733 FIXME("%p,%p: stub\n", iface
, count
);
1737 static HRESULT WINAPI
ExecAction_GetTypeInfo(IExecAction
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
1739 FIXME("%p,%u,%u,%p: stub\n", iface
, index
, lcid
, info
);
1743 static HRESULT WINAPI
ExecAction_GetIDsOfNames(IExecAction
*iface
, REFIID riid
, LPOLESTR
*names
,
1744 UINT count
, LCID lcid
, DISPID
*dispid
)
1746 FIXME("%p,%s,%p,%u,%u,%p: stub\n", iface
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
1750 static HRESULT WINAPI
ExecAction_Invoke(IExecAction
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
1751 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
1753 FIXME("%p,%d,%s,%04x,%04x,%p,%p,%p,%p: stub\n", iface
, dispid
, debugstr_guid(riid
), lcid
, flags
,
1754 params
, result
, excepinfo
, argerr
);
1758 static HRESULT WINAPI
ExecAction_get_Id(IExecAction
*iface
, BSTR
*id
)
1760 FIXME("%p,%p: stub\n", iface
, id
);
1764 static HRESULT WINAPI
ExecAction_put_Id(IExecAction
*iface
, BSTR id
)
1766 FIXME("%p,%s: stub\n", iface
, debugstr_w(id
));
1770 static HRESULT WINAPI
ExecAction_get_Type(IExecAction
*iface
, TASK_ACTION_TYPE
*type
)
1772 TRACE("%p,%p\n", iface
, type
);
1774 if (!type
) return E_POINTER
;
1776 *type
= TASK_ACTION_EXEC
;
1781 static HRESULT WINAPI
ExecAction_get_Path(IExecAction
*iface
, BSTR
*path
)
1783 ExecAction
*action
= impl_from_IExecAction(iface
);
1785 TRACE("%p,%p\n", iface
, path
);
1787 if (!path
) return E_POINTER
;
1789 if (!action
->path
) *path
= NULL
;
1790 else if (!(*path
= SysAllocString(action
->path
))) return E_OUTOFMEMORY
;
1795 static HRESULT WINAPI
ExecAction_put_Path(IExecAction
*iface
, BSTR path
)
1797 ExecAction
*action
= impl_from_IExecAction(iface
);
1800 TRACE("%p,%s\n", iface
, debugstr_w(path
));
1802 if (path
&& !(str
= heap_strdupW((path
)))) return E_OUTOFMEMORY
;
1803 heap_free(action
->path
);
1809 static HRESULT WINAPI
ExecAction_get_Arguments(IExecAction
*iface
, BSTR
*arguments
)
1811 FIXME("%p,%p: stub\n", iface
, arguments
);
1815 static HRESULT WINAPI
ExecAction_put_Arguments(IExecAction
*iface
, BSTR arguments
)
1817 FIXME("%p,%s: stub\n", iface
, debugstr_w(arguments
));
1821 static HRESULT WINAPI
ExecAction_get_WorkingDirectory(IExecAction
*iface
, BSTR
*directory
)
1823 ExecAction
*action
= impl_from_IExecAction(iface
);
1825 TRACE("%p,%p\n", iface
, directory
);
1827 if (!directory
) return E_POINTER
;
1829 if (!action
->directory
) *directory
= NULL
;
1830 else if (!(*directory
= SysAllocString(action
->directory
))) return E_OUTOFMEMORY
;
1835 static HRESULT WINAPI
ExecAction_put_WorkingDirectory(IExecAction
*iface
, BSTR directory
)
1837 ExecAction
*action
= impl_from_IExecAction(iface
);
1840 TRACE("%p,%s\n", iface
, debugstr_w(directory
));
1842 if (directory
&& !(str
= heap_strdupW((directory
)))) return E_OUTOFMEMORY
;
1843 heap_free(action
->directory
);
1844 action
->directory
= str
;
1849 static const IExecActionVtbl Action_vtbl
=
1851 ExecAction_QueryInterface
,
1854 ExecAction_GetTypeInfoCount
,
1855 ExecAction_GetTypeInfo
,
1856 ExecAction_GetIDsOfNames
,
1860 ExecAction_get_Type
,
1861 ExecAction_get_Path
,
1862 ExecAction_put_Path
,
1863 ExecAction_get_Arguments
,
1864 ExecAction_put_Arguments
,
1865 ExecAction_get_WorkingDirectory
,
1866 ExecAction_put_WorkingDirectory
1869 static HRESULT
ExecAction_create(IExecAction
**obj
)
1873 action
= heap_alloc(sizeof(*action
));
1874 if (!action
) return E_OUTOFMEMORY
;
1876 action
->IExecAction_iface
.lpVtbl
= &Action_vtbl
;
1878 action
->path
= NULL
;
1879 action
->directory
= NULL
;
1881 *obj
= &action
->IExecAction_iface
;
1883 TRACE("created %p\n", *obj
);
1890 IActionCollection IActionCollection_iface
;
1894 static inline Actions
*impl_from_IActionCollection(IActionCollection
*iface
)
1896 return CONTAINING_RECORD(iface
, Actions
, IActionCollection_iface
);
1899 static ULONG WINAPI
Actions_AddRef(IActionCollection
*iface
)
1901 Actions
*actions
= impl_from_IActionCollection(iface
);
1902 return InterlockedIncrement(&actions
->ref
);
1905 static ULONG WINAPI
Actions_Release(IActionCollection
*iface
)
1907 Actions
*actions
= impl_from_IActionCollection(iface
);
1908 LONG ref
= InterlockedDecrement(&actions
->ref
);
1912 TRACE("destroying %p\n", iface
);
1919 static HRESULT WINAPI
Actions_QueryInterface(IActionCollection
*iface
, REFIID riid
, void **obj
)
1921 if (!riid
|| !obj
) return E_INVALIDARG
;
1923 TRACE("%p,%s,%p\n", iface
, debugstr_guid(riid
), obj
);
1925 if (IsEqualGUID(riid
, &IID_IActionCollection
) ||
1926 IsEqualGUID(riid
, &IID_IDispatch
) ||
1927 IsEqualGUID(riid
, &IID_IUnknown
))
1929 IActionCollection_AddRef(iface
);
1934 FIXME("interface %s is not implemented\n", debugstr_guid(riid
));
1936 return E_NOINTERFACE
;
1939 static HRESULT WINAPI
Actions_GetTypeInfoCount(IActionCollection
*iface
, UINT
*count
)
1941 FIXME("%p,%p: stub\n", iface
, count
);
1945 static HRESULT WINAPI
Actions_GetTypeInfo(IActionCollection
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
1947 FIXME("%p,%u,%u,%p: stub\n", iface
, index
, lcid
, info
);
1951 static HRESULT WINAPI
Actions_GetIDsOfNames(IActionCollection
*iface
, REFIID riid
, LPOLESTR
*names
,
1952 UINT count
, LCID lcid
, DISPID
*dispid
)
1954 FIXME("%p,%s,%p,%u,%u,%p: stub\n", iface
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
1958 static HRESULT WINAPI
Actions_Invoke(IActionCollection
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
1959 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
1961 FIXME("%p,%d,%s,%04x,%04x,%p,%p,%p,%p: stub\n", iface
, dispid
, debugstr_guid(riid
), lcid
, flags
,
1962 params
, result
, excepinfo
, argerr
);
1966 static HRESULT WINAPI
Actions_get_Count(IActionCollection
*iface
, LONG
*count
)
1968 FIXME("%p,%p: stub\n", iface
, count
);
1972 static HRESULT WINAPI
Actions_get_Item(IActionCollection
*iface
, LONG index
, IAction
**action
)
1974 FIXME("%p,%d,%p: stub\n", iface
, index
, action
);
1978 static HRESULT WINAPI
Actions_get__NewEnum(IActionCollection
*iface
, IUnknown
**penum
)
1980 FIXME("%p,%p: stub\n", iface
, penum
);
1984 static HRESULT WINAPI
Actions_get_XmlText(IActionCollection
*iface
, BSTR
*xml
)
1986 FIXME("%p,%p: stub\n", iface
, xml
);
1990 static HRESULT WINAPI
Actions_put_XmlText(IActionCollection
*iface
, BSTR xml
)
1992 FIXME("%p,%s: stub\n", iface
, debugstr_w(xml
));
1996 static HRESULT WINAPI
Actions_Create(IActionCollection
*iface
, TASK_ACTION_TYPE type
, IAction
**action
)
1998 TRACE("%p,%u,%p\n", iface
, type
, action
);
2002 case TASK_ACTION_EXEC
:
2003 return ExecAction_create((IExecAction
**)action
);
2006 FIXME("unimplemented type %u\n", type
);
2011 static HRESULT WINAPI
Actions_Remove(IActionCollection
*iface
, VARIANT index
)
2013 FIXME("%p,%s: stub\n", iface
, debugstr_variant(&index
));
2017 static HRESULT WINAPI
Actions_Clear(IActionCollection
*iface
)
2019 FIXME("%p: stub\n", iface
);
2023 static HRESULT WINAPI
Actions_get_Context(IActionCollection
*iface
, BSTR
*ctx
)
2025 FIXME("%p,%p: stub\n", iface
, ctx
);
2029 static HRESULT WINAPI
Actions_put_Context(IActionCollection
*iface
, BSTR ctx
)
2031 FIXME("%p,%s: stub\n", iface
, debugstr_w(ctx
));
2035 static const IActionCollectionVtbl Actions_vtbl
=
2037 Actions_QueryInterface
,
2040 Actions_GetTypeInfoCount
,
2041 Actions_GetTypeInfo
,
2042 Actions_GetIDsOfNames
,
2046 Actions_get__NewEnum
,
2047 Actions_get_XmlText
,
2048 Actions_put_XmlText
,
2052 Actions_get_Context
,
2056 static HRESULT
Actions_create(IActionCollection
**obj
)
2060 actions
= heap_alloc(sizeof(*actions
));
2061 if (!actions
) return E_OUTOFMEMORY
;
2063 actions
->IActionCollection_iface
.lpVtbl
= &Actions_vtbl
;
2066 *obj
= &actions
->IActionCollection_iface
;
2068 TRACE("created %p\n", *obj
);
2075 ITaskDefinition ITaskDefinition_iface
;
2077 IRegistrationInfo
*reginfo
;
2078 ITaskSettings
*taskset
;
2079 ITriggerCollection
*triggers
;
2080 IPrincipal
*principal
;
2081 IActionCollection
*actions
;
2084 static inline TaskDefinition
*impl_from_ITaskDefinition(ITaskDefinition
*iface
)
2086 return CONTAINING_RECORD(iface
, TaskDefinition
, ITaskDefinition_iface
);
2089 static ULONG WINAPI
TaskDefinition_AddRef(ITaskDefinition
*iface
)
2091 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2092 return InterlockedIncrement(&taskdef
->ref
);
2095 static ULONG WINAPI
TaskDefinition_Release(ITaskDefinition
*iface
)
2097 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2098 LONG ref
= InterlockedDecrement(&taskdef
->ref
);
2102 TRACE("destroying %p\n", iface
);
2104 if (taskdef
->reginfo
)
2105 IRegistrationInfo_Release(taskdef
->reginfo
);
2106 if (taskdef
->taskset
)
2107 ITaskSettings_Release(taskdef
->taskset
);
2108 if (taskdef
->triggers
)
2109 ITriggerCollection_Release(taskdef
->triggers
);
2110 if (taskdef
->principal
)
2111 IPrincipal_Release(taskdef
->principal
);
2112 if (taskdef
->actions
)
2113 IActionCollection_Release(taskdef
->actions
);
2121 static HRESULT WINAPI
TaskDefinition_QueryInterface(ITaskDefinition
*iface
, REFIID riid
, void **obj
)
2123 if (!riid
|| !obj
) return E_INVALIDARG
;
2125 TRACE("%p,%s,%p\n", iface
, debugstr_guid(riid
), obj
);
2127 if (IsEqualGUID(riid
, &IID_ITaskDefinition
) ||
2128 IsEqualGUID(riid
, &IID_IDispatch
) ||
2129 IsEqualGUID(riid
, &IID_IUnknown
))
2131 ITaskDefinition_AddRef(iface
);
2136 FIXME("interface %s is not implemented\n", debugstr_guid(riid
));
2138 return E_NOINTERFACE
;
2141 static HRESULT WINAPI
TaskDefinition_GetTypeInfoCount(ITaskDefinition
*iface
, UINT
*count
)
2143 FIXME("%p,%p: stub\n", iface
, count
);
2147 static HRESULT WINAPI
TaskDefinition_GetTypeInfo(ITaskDefinition
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
2149 FIXME("%p,%u,%u,%p: stub\n", iface
, index
, lcid
, info
);
2153 static HRESULT WINAPI
TaskDefinition_GetIDsOfNames(ITaskDefinition
*iface
, REFIID riid
, LPOLESTR
*names
,
2154 UINT count
, LCID lcid
, DISPID
*dispid
)
2156 FIXME("%p,%s,%p,%u,%u,%p: stub\n", iface
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
2160 static HRESULT WINAPI
TaskDefinition_Invoke(ITaskDefinition
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
2161 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
2163 FIXME("%p,%d,%s,%04x,%04x,%p,%p,%p,%p: stub\n", iface
, dispid
, debugstr_guid(riid
), lcid
, flags
,
2164 params
, result
, excepinfo
, argerr
);
2168 static HRESULT WINAPI
TaskDefinition_get_RegistrationInfo(ITaskDefinition
*iface
, IRegistrationInfo
**info
)
2170 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2173 TRACE("%p,%p\n", iface
, info
);
2175 if (!info
) return E_POINTER
;
2177 if (!taskdef
->reginfo
)
2179 hr
= RegistrationInfo_create(&taskdef
->reginfo
);
2180 if (hr
!= S_OK
) return hr
;
2183 IRegistrationInfo_AddRef(taskdef
->reginfo
);
2184 *info
= taskdef
->reginfo
;
2189 static HRESULT WINAPI
TaskDefinition_put_RegistrationInfo(ITaskDefinition
*iface
, IRegistrationInfo
*info
)
2191 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2193 TRACE("%p,%p\n", iface
, info
);
2195 if (!info
) return E_POINTER
;
2197 if (taskdef
->reginfo
)
2198 IRegistrationInfo_Release(taskdef
->reginfo
);
2200 IRegistrationInfo_AddRef(info
);
2201 taskdef
->reginfo
= info
;
2206 static HRESULT WINAPI
TaskDefinition_get_Triggers(ITaskDefinition
*iface
, ITriggerCollection
**triggers
)
2208 TaskDefinition
*This
= impl_from_ITaskDefinition(iface
);
2210 TRACE("%p,%p\n", This
, triggers
);
2212 if (!This
->triggers
)
2214 trigger_collection
*collection
;
2216 collection
= heap_alloc(sizeof(*collection
));
2217 if (!collection
) return E_OUTOFMEMORY
;
2219 collection
->ITriggerCollection_iface
.lpVtbl
= &TriggerCollection_vtbl
;
2220 collection
->ref
= 1;
2221 This
->triggers
= &collection
->ITriggerCollection_iface
;
2224 ITriggerCollection_AddRef(*triggers
= This
->triggers
);
2228 static HRESULT WINAPI
TaskDefinition_put_Triggers(ITaskDefinition
*iface
, ITriggerCollection
*triggers
)
2230 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2232 TRACE("%p,%p\n", iface
, triggers
);
2234 if (!triggers
) return E_POINTER
;
2236 if (taskdef
->triggers
)
2237 ITriggerCollection_Release(taskdef
->triggers
);
2239 ITriggerCollection_AddRef(triggers
);
2240 taskdef
->triggers
= triggers
;
2245 static HRESULT WINAPI
TaskDefinition_get_Settings(ITaskDefinition
*iface
, ITaskSettings
**settings
)
2247 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2250 TRACE("%p,%p\n", iface
, settings
);
2252 if (!settings
) return E_POINTER
;
2254 if (!taskdef
->taskset
)
2256 hr
= TaskSettings_create(&taskdef
->taskset
);
2257 if (hr
!= S_OK
) return hr
;
2260 ITaskSettings_AddRef(taskdef
->taskset
);
2261 *settings
= taskdef
->taskset
;
2266 static HRESULT WINAPI
TaskDefinition_put_Settings(ITaskDefinition
*iface
, ITaskSettings
*settings
)
2268 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2270 TRACE("%p,%p\n", iface
, settings
);
2272 if (!settings
) return E_POINTER
;
2274 if (taskdef
->taskset
)
2275 ITaskSettings_Release(taskdef
->taskset
);
2277 ITaskSettings_AddRef(settings
);
2278 taskdef
->taskset
= settings
;
2283 static HRESULT WINAPI
TaskDefinition_get_Data(ITaskDefinition
*iface
, BSTR
*data
)
2285 FIXME("%p,%p: stub\n", iface
, data
);
2289 static HRESULT WINAPI
TaskDefinition_put_Data(ITaskDefinition
*iface
, BSTR data
)
2291 FIXME("%p,%p: stub\n", iface
, data
);
2295 static HRESULT WINAPI
TaskDefinition_get_Principal(ITaskDefinition
*iface
, IPrincipal
**principal
)
2297 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2300 TRACE("%p,%p\n", iface
, principal
);
2302 if (!principal
) return E_POINTER
;
2304 if (!taskdef
->principal
)
2306 hr
= Principal_create(&taskdef
->principal
);
2307 if (hr
!= S_OK
) return hr
;
2310 IPrincipal_AddRef(taskdef
->principal
);
2311 *principal
= taskdef
->principal
;
2316 static HRESULT WINAPI
TaskDefinition_put_Principal(ITaskDefinition
*iface
, IPrincipal
*principal
)
2318 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2320 TRACE("%p,%p\n", iface
, principal
);
2322 if (!principal
) return E_POINTER
;
2324 if (taskdef
->principal
)
2325 IPrincipal_Release(taskdef
->principal
);
2327 IPrincipal_AddRef(principal
);
2328 taskdef
->principal
= principal
;
2333 static HRESULT WINAPI
TaskDefinition_get_Actions(ITaskDefinition
*iface
, IActionCollection
**actions
)
2335 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2338 TRACE("%p,%p\n", iface
, actions
);
2340 if (!actions
) return E_POINTER
;
2342 if (!taskdef
->actions
)
2344 hr
= Actions_create(&taskdef
->actions
);
2345 if (hr
!= S_OK
) return hr
;
2348 IActionCollection_AddRef(taskdef
->actions
);
2349 *actions
= taskdef
->actions
;
2354 static HRESULT WINAPI
TaskDefinition_put_Actions(ITaskDefinition
*iface
, IActionCollection
*actions
)
2356 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2358 TRACE("%p,%p\n", iface
, actions
);
2360 if (!actions
) return E_POINTER
;
2362 if (taskdef
->actions
)
2363 IActionCollection_Release(taskdef
->actions
);
2365 IActionCollection_AddRef(actions
);
2366 taskdef
->actions
= actions
;
2371 static const WCHAR Task
[] = {'T','a','s','k',0};
2372 static const WCHAR version
[] = {'v','e','r','s','i','o','n',0};
2373 static const WCHAR v1_0
[] = {'1','.','0',0};
2374 static const WCHAR v1_1
[] = {'1','.','1',0};
2375 static const WCHAR v1_2
[] = {'1','.','2',0};
2376 static const WCHAR v1_3
[] = {'1','.','3',0};
2377 static const WCHAR xmlns
[] = {'x','m','l','n','s',0};
2378 static const WCHAR task_ns
[] = {'h','t','t','p',':','/','/','s','c','h','e','m','a','s','.','m','i','c','r','o','s','o','f','t','.','c','o','m','/','w','i','n','d','o','w','s','/','2','0','0','4','/','0','2','/','m','i','t','/','t','a','s','k',0};
2379 static const WCHAR RegistrationInfo
[] = {'R','e','g','i','s','t','r','a','t','i','o','n','I','n','f','o',0};
2380 static const WCHAR Author
[] = {'A','u','t','h','o','r',0};
2381 static const WCHAR Description
[] = {'D','e','s','c','r','i','p','t','i','o','n',0};
2382 static const WCHAR Source
[] = {'S','o','u','r','c','e',0};
2383 static const WCHAR Date
[] = {'D','a','t','e',0};
2384 static const WCHAR Version
[] = {'V','e','r','s','i','o','n',0};
2385 static const WCHAR Documentation
[] = {'D','o','c','u','m','e','n','t','a','t','i','o','n',0};
2386 static const WCHAR URI
[] = {'U','R','I',0};
2387 static const WCHAR SecurityDescriptor
[] = {'S','e','c','u','r','i','t','y','D','e','s','c','r','i','p','t','o','r',0};
2388 static const WCHAR Settings
[] = {'S','e','t','t','i','n','g','s',0};
2389 static const WCHAR Triggers
[] = {'T','r','i','g','g','e','r','s',0};
2390 static const WCHAR Principals
[] = {'P','r','i','n','c','i','p','a','l','s',0};
2391 static const WCHAR principalW
[] = {'P','r','i','n','c','i','p','a','l',0};
2392 static const WCHAR id
[] = {'i','d',0};
2393 static const WCHAR UserId
[] = {'U','s','e','r','I','d',0};
2394 static const WCHAR LogonType
[] = {'L','o','g','o','n','T','y','p','e',0};
2395 static const WCHAR GroupId
[] = {'G','r','o','u','p','I','d',0};
2396 static const WCHAR DisplayName
[] = {'D','i','s','p','l','a','y','N','a','m','e',0};
2397 static const WCHAR HighestAvailable
[] = {'H','i','g','h','e','s','t','A','v','a','i','l','a','b','l','e',0};
2398 static const WCHAR Password
[] = {'P','a','s','s','w','o','r','d',0};
2399 static const WCHAR S4U
[] = {'S','4','U',0};
2400 static const WCHAR InteractiveToken
[] = {'I','n','t','e','r','a','c','t','i','v','e','T','o','k','e','n',0};
2401 static const WCHAR RunLevel
[] = {'R','u','n','L','e','v','e','l',0};
2402 static const WCHAR LeastPrivilege
[] = {'L','e','a','s','t','P','r','i','v','i','l','e','g','e',0};
2403 static const WCHAR actionsW
[] = {'A','c','t','i','o','n','s',0};
2404 static const WCHAR Exec
[] = {'E','x','e','c',0};
2405 static const WCHAR MultipleInstancesPolicy
[] = {'M','u','l','t','i','p','l','e','I','n','s','t','a','n','c','e','s','P','o','l','i','c','y',0};
2406 static const WCHAR IgnoreNew
[] = {'I','g','n','o','r','e','N','e','w',0};
2407 static const WCHAR DisallowStartIfOnBatteries
[] = {'D','i','s','a','l','l','o','w','S','t','a','r','t','I','f','O','n','B','a','t','t','e','r','i','e','s',0};
2408 static const WCHAR AllowStartOnDemand
[] = {'A','l','l','o','w','S','t','a','r','t','O','n','D','e','m','a','n','d',0};
2409 static const WCHAR StopIfGoingOnBatteries
[] = {'S','t','o','p','I','f','G','o','i','n','g','O','n','B','a','t','t','e','r','i','e','s',0};
2410 static const WCHAR AllowHardTerminate
[] = {'A','l','l','o','w','H','a','r','d','T','e','r','m','i','n','a','t','e',0};
2411 static const WCHAR StartWhenAvailable
[] = {'S','t','a','r','t','W','h','e','n','A','v','a','i','l','a','b','l','e',0};
2412 static const WCHAR RunOnlyIfNetworkAvailable
[] = {'R','u','n','O','n','l','y','I','f','N','e','t','w','o','r','k','A','v','a','i','l','a','b','l','e',0};
2413 static const WCHAR Enabled
[] = {'E','n','a','b','l','e','d',0};
2414 static const WCHAR Hidden
[] = {'H','i','d','d','e','n',0};
2415 static const WCHAR RunOnlyIfIdle
[] = {'R','u','n','O','n','l','y','I','f','I','d','l','e',0};
2416 static const WCHAR WakeToRun
[] = {'W','a','k','e','T','o','R','u','n',0};
2417 static const WCHAR ExecutionTimeLimit
[] = {'E','x','e','c','u','t','i','o','n','T','i','m','e','L','i','m','i','t',0};
2418 static const WCHAR Priority
[] = {'P','r','i','o','r','i','t','y',0};
2419 static const WCHAR IdleSettings
[] = {'I','d','l','e','S','e','t','t','i','n','g','s',0};
2421 static int xml_indent
;
2423 static inline void push_indent(void)
2428 static inline void pop_indent(void)
2433 static inline HRESULT
write_stringW(IStream
*stream
, const WCHAR
*str
)
2435 return IStream_Write(stream
, str
, lstrlenW(str
) * sizeof(WCHAR
), NULL
);
2438 static void write_indent(IStream
*stream
)
2440 static const WCHAR spacesW
[] = {' ',' ',0};
2442 for (i
= 0; i
< xml_indent
; i
+= 2)
2443 write_stringW(stream
, spacesW
);
2446 static const WCHAR start_element
[] = {'<',0};
2447 static const WCHAR start_end_element
[] = {'<','/',0};
2448 static const WCHAR close_element
[] = {'>',0};
2449 static const WCHAR end_empty_element
[] = {'/','>',0};
2450 static const WCHAR eol
[] = {'\n',0};
2451 static const WCHAR spaceW
[] = {' ',0};
2452 static const WCHAR equalW
[] = {'=',0};
2453 static const WCHAR quoteW
[] = {'"',0};
2455 static inline HRESULT
write_empty_element(IStream
*stream
, const WCHAR
*name
)
2457 write_indent(stream
);
2458 write_stringW(stream
, start_element
);
2459 write_stringW(stream
, name
);
2460 write_stringW(stream
, end_empty_element
);
2461 return write_stringW(stream
, eol
);
2464 static inline HRESULT
write_element(IStream
*stream
, const WCHAR
*name
)
2466 write_indent(stream
);
2467 write_stringW(stream
, start_element
);
2468 write_stringW(stream
, name
);
2469 write_stringW(stream
, close_element
);
2470 return write_stringW(stream
, eol
);
2473 static inline HRESULT
write_element_end(IStream
*stream
, const WCHAR
*name
)
2475 write_indent(stream
);
2476 write_stringW(stream
, start_end_element
);
2477 write_stringW(stream
, name
);
2478 write_stringW(stream
, close_element
);
2479 return write_stringW(stream
, eol
);
2482 static inline HRESULT
write_text_value(IStream
*stream
, const WCHAR
*name
, const WCHAR
*value
)
2484 write_indent(stream
);
2485 write_stringW(stream
, start_element
);
2486 write_stringW(stream
, name
);
2487 write_stringW(stream
, close_element
);
2488 write_stringW(stream
, value
);
2489 write_stringW(stream
, start_end_element
);
2490 write_stringW(stream
, name
);
2491 write_stringW(stream
, close_element
);
2492 return write_stringW(stream
, eol
);
2495 static HRESULT
write_task_attributes(IStream
*stream
, ITaskDefinition
*taskdef
)
2498 ITaskSettings
*taskset
;
2499 TASK_COMPATIBILITY level
;
2500 const WCHAR
*compatibility
;
2502 hr
= ITaskDefinition_get_Settings(taskdef
, &taskset
);
2503 if (hr
!= S_OK
) return hr
;
2505 hr
= ITaskSettings_get_Compatibility(taskset
, &level
);
2506 if (hr
!= S_OK
) level
= TASK_COMPATIBILITY_V2_1
;
2508 ITaskSettings_Release(taskset
);
2512 case TASK_COMPATIBILITY_AT
:
2513 compatibility
= v1_0
;
2515 case TASK_COMPATIBILITY_V1
:
2516 compatibility
= v1_1
;
2518 case TASK_COMPATIBILITY_V2
:
2519 compatibility
= v1_2
;
2522 compatibility
= v1_3
;
2526 write_stringW(stream
, start_element
);
2527 write_stringW(stream
, Task
);
2528 write_stringW(stream
, spaceW
);
2529 write_stringW(stream
, version
);
2530 write_stringW(stream
, equalW
);
2531 write_stringW(stream
, quoteW
);
2532 write_stringW(stream
, compatibility
);
2533 write_stringW(stream
, quoteW
);
2534 write_stringW(stream
, spaceW
);
2535 write_stringW(stream
, xmlns
);
2536 write_stringW(stream
, equalW
);
2537 write_stringW(stream
, quoteW
);
2538 write_stringW(stream
, task_ns
);
2539 write_stringW(stream
, quoteW
);
2540 write_stringW(stream
, close_element
);
2541 return write_stringW(stream
, eol
);
2544 static HRESULT
write_registration_info(IStream
*stream
, IRegistrationInfo
*reginfo
)
2551 return write_empty_element(stream
, RegistrationInfo
);
2553 hr
= write_element(stream
, RegistrationInfo
);
2554 if (hr
!= S_OK
) return hr
;
2558 hr
= IRegistrationInfo_get_Source(reginfo
, &bstr
);
2559 if (hr
== S_OK
&& bstr
)
2561 hr
= write_text_value(stream
, Source
, bstr
);
2562 SysFreeString(bstr
);
2563 if (hr
!= S_OK
) return hr
;
2565 hr
= IRegistrationInfo_get_Date(reginfo
, &bstr
);
2566 if (hr
== S_OK
&& bstr
)
2568 hr
= write_text_value(stream
, Date
, bstr
);
2569 SysFreeString(bstr
);
2570 if (hr
!= S_OK
) return hr
;
2572 hr
= IRegistrationInfo_get_Author(reginfo
, &bstr
);
2573 if (hr
== S_OK
&& bstr
)
2575 hr
= write_text_value(stream
, Author
, bstr
);
2576 SysFreeString(bstr
);
2577 if (hr
!= S_OK
) return hr
;
2579 hr
= IRegistrationInfo_get_Version(reginfo
, &bstr
);
2580 if (hr
== S_OK
&& bstr
)
2582 hr
= write_text_value(stream
, Version
, bstr
);
2583 SysFreeString(bstr
);
2584 if (hr
!= S_OK
) return hr
;
2586 hr
= IRegistrationInfo_get_Description(reginfo
, &bstr
);
2587 if (hr
== S_OK
&& bstr
)
2589 hr
= write_text_value(stream
, Description
, bstr
);
2590 SysFreeString(bstr
);
2591 if (hr
!= S_OK
) return hr
;
2593 hr
= IRegistrationInfo_get_Documentation(reginfo
, &bstr
);
2594 if (hr
== S_OK
&& bstr
)
2596 hr
= write_text_value(stream
, Documentation
, bstr
);
2597 SysFreeString(bstr
);
2598 if (hr
!= S_OK
) return hr
;
2600 hr
= IRegistrationInfo_get_URI(reginfo
, &bstr
);
2601 if (hr
== S_OK
&& bstr
)
2603 hr
= write_text_value(stream
, URI
, bstr
);
2604 SysFreeString(bstr
);
2605 if (hr
!= S_OK
) return hr
;
2607 hr
= IRegistrationInfo_get_SecurityDescriptor(reginfo
, &var
);
2610 if (V_VT(&var
) == VT_BSTR
)
2612 hr
= write_text_value(stream
, SecurityDescriptor
, V_BSTR(&var
));
2614 if (hr
!= S_OK
) return hr
;
2617 FIXME("SecurityInfo variant type %d is not supported\n", V_VT(&var
));
2622 return write_element_end(stream
, RegistrationInfo
);
2625 static HRESULT
write_principal(IStream
*stream
, IPrincipal
*principal
)
2629 TASK_LOGON_TYPE logon
;
2630 TASK_RUNLEVEL_TYPE level
;
2633 return write_empty_element(stream
, Principals
);
2635 hr
= write_element(stream
, Principals
);
2636 if (hr
!= S_OK
) return hr
;
2640 hr
= IPrincipal_get_Id(principal
, &bstr
);
2643 write_indent(stream
);
2644 write_stringW(stream
, start_element
);
2645 write_stringW(stream
, principalW
);
2646 write_stringW(stream
, spaceW
);
2647 write_stringW(stream
, id
);
2648 write_stringW(stream
, equalW
);
2649 write_stringW(stream
, quoteW
);
2650 write_stringW(stream
, bstr
);
2651 write_stringW(stream
, quoteW
);
2652 write_stringW(stream
, close_element
);
2653 write_stringW(stream
, eol
);
2654 SysFreeString(bstr
);
2657 write_element(stream
, principalW
);
2661 hr
= IPrincipal_get_GroupId(principal
, &bstr
);
2664 hr
= write_text_value(stream
, GroupId
, bstr
);
2665 SysFreeString(bstr
);
2666 if (hr
!= S_OK
) return hr
;
2668 hr
= IPrincipal_get_DisplayName(principal
, &bstr
);
2671 hr
= write_text_value(stream
, DisplayName
, bstr
);
2672 SysFreeString(bstr
);
2673 if (hr
!= S_OK
) return hr
;
2675 hr
= IPrincipal_get_UserId(principal
, &bstr
);
2676 if (hr
== S_OK
&& lstrlenW(bstr
))
2678 hr
= write_text_value(stream
, UserId
, bstr
);
2679 SysFreeString(bstr
);
2680 if (hr
!= S_OK
) return hr
;
2682 hr
= IPrincipal_get_RunLevel(principal
, &level
);
2685 const WCHAR
*level_str
= NULL
;
2689 case TASK_RUNLEVEL_HIGHEST
:
2690 level_str
= HighestAvailable
;
2692 case TASK_RUNLEVEL_LUA
:
2693 level_str
= LeastPrivilege
;
2696 FIXME("Principal run level %d\n", level
);
2702 hr
= write_text_value(stream
, RunLevel
, level_str
);
2703 if (hr
!= S_OK
) return hr
;
2706 hr
= IPrincipal_get_LogonType(principal
, &logon
);
2709 const WCHAR
*logon_str
= NULL
;
2713 case TASK_LOGON_PASSWORD
:
2714 logon_str
= Password
;
2716 case TASK_LOGON_S4U
:
2719 case TASK_LOGON_INTERACTIVE_TOKEN
:
2720 logon_str
= InteractiveToken
;
2723 FIXME("Principal logon type %d\n", logon
);
2729 hr
= write_text_value(stream
, LogonType
, logon_str
);
2730 if (hr
!= S_OK
) return hr
;
2735 write_element_end(stream
, principalW
);
2738 return write_element_end(stream
, Principals
);
2741 static HRESULT
write_settings(IStream
*stream
, ITaskSettings
*settings
)
2744 return write_empty_element(stream
, Settings
);
2750 static HRESULT
write_triggers(IStream
*stream
, ITriggerCollection
*triggers
)
2753 return write_empty_element(stream
, Triggers
);
2759 static HRESULT
write_actions(IStream
*stream
, IActionCollection
*actions
)
2763 write_element(stream
, actionsW
);
2765 write_empty_element(stream
, Exec
);
2767 return write_element_end(stream
, actionsW
);
2774 static HRESULT WINAPI
TaskDefinition_get_XmlText(ITaskDefinition
*iface
, BSTR
*xml
)
2776 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2782 TRACE("%p,%p\n", iface
, xml
);
2784 hmem
= GlobalAlloc(GMEM_MOVEABLE
| GMEM_NODISCARD
, 16);
2785 if (!hmem
) return E_OUTOFMEMORY
;
2787 hr
= CreateStreamOnHGlobal(hmem
, TRUE
, &stream
);
2794 hr
= write_task_attributes(stream
, &taskdef
->ITaskDefinition_iface
);
2795 if (hr
!= S_OK
) goto failed
;
2799 hr
= write_registration_info(stream
, taskdef
->reginfo
);
2800 if (hr
!= S_OK
) goto failed
;
2802 hr
= write_triggers(stream
, taskdef
->triggers
);
2803 if (hr
!= S_OK
) goto failed
;
2805 hr
= write_principal(stream
, taskdef
->principal
);
2806 if (hr
!= S_OK
) goto failed
;
2808 hr
= write_settings(stream
, taskdef
->taskset
);
2809 if (hr
!= S_OK
) goto failed
;
2811 hr
= write_actions(stream
, taskdef
->actions
);
2812 if (hr
!= S_OK
) goto failed
;
2816 write_element_end(stream
, Task
);
2817 IStream_Write(stream
, "\0\0", 2, NULL
);
2819 p
= GlobalLock(hmem
);
2820 *xml
= SysAllocString(p
);
2823 IStream_Release(stream
);
2825 return *xml
? S_OK
: E_OUTOFMEMORY
;
2828 IStream_Release(stream
);
2832 static HRESULT
read_text_value(IXmlReader
*reader
, WCHAR
**value
)
2837 while (IXmlReader_Read(reader
, &type
) == S_OK
)
2841 case XmlNodeType_Text
:
2842 hr
= IXmlReader_GetValue(reader
, (const WCHAR
**)value
, NULL
);
2843 if (hr
!= S_OK
) return hr
;
2844 TRACE("%s\n", debugstr_w(*value
));
2847 case XmlNodeType_Whitespace
:
2848 case XmlNodeType_Comment
:
2852 FIXME("unexpected node type %d\n", type
);
2860 static HRESULT
read_variantbool_value(IXmlReader
*reader
, VARIANT_BOOL
*vbool
)
2862 static const WCHAR trueW
[] = {'t','r','u','e',0};
2863 static const WCHAR falseW
[] = {'f','a','l','s','e',0};
2867 hr
= read_text_value(reader
, &value
);
2868 if (hr
!= S_OK
) return hr
;
2870 if (!lstrcmpW(value
, trueW
))
2871 *vbool
= VARIANT_TRUE
;
2872 else if (!lstrcmpW(value
, falseW
))
2873 *vbool
= VARIANT_FALSE
;
2876 WARN("unexpected bool value %s\n", debugstr_w(value
));
2877 return SCHED_E_INVALIDVALUE
;
2883 static HRESULT
read_int_value(IXmlReader
*reader
, int *int_val
)
2888 hr
= read_text_value(reader
, &value
);
2889 if (hr
!= S_OK
) return hr
;
2891 *int_val
= strtolW(value
, NULL
, 10);
2896 static HRESULT
read_triggers(IXmlReader
*reader
, ITaskDefinition
*taskdef
)
2902 static HRESULT
read_principal_attributes(IXmlReader
*reader
, IPrincipal
*principal
)
2908 hr
= IXmlReader_MoveToFirstAttribute(reader
);
2912 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
2913 if (hr
!= S_OK
) break;
2915 hr
= IXmlReader_GetValue(reader
, &value
, NULL
);
2916 if (hr
!= S_OK
) break;
2918 TRACE("%s=%s\n", debugstr_w(name
), debugstr_w(value
));
2920 if (!lstrcmpW(name
, id
))
2921 IPrincipal_put_Id(principal
, (BSTR
)value
);
2923 FIXME("unhandled Principal attribute %s\n", debugstr_w(name
));
2925 hr
= IXmlReader_MoveToNextAttribute(reader
);
2931 static HRESULT
read_principal(IXmlReader
*reader
, IPrincipal
*principal
)
2938 if (IXmlReader_IsEmptyElement(reader
))
2940 TRACE("Principal is empty\n");
2944 read_principal_attributes(reader
, principal
);
2946 while (IXmlReader_Read(reader
, &type
) == S_OK
)
2950 case XmlNodeType_EndElement
:
2951 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
2952 if (hr
!= S_OK
) return hr
;
2954 TRACE("/%s\n", debugstr_w(name
));
2956 if (!lstrcmpW(name
, principalW
))
2961 case XmlNodeType_Element
:
2962 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
2963 if (hr
!= S_OK
) return hr
;
2965 TRACE("Element: %s\n", debugstr_w(name
));
2967 if (!lstrcmpW(name
, UserId
))
2969 hr
= read_text_value(reader
, &value
);
2971 IPrincipal_put_UserId(principal
, value
);
2973 else if (!lstrcmpW(name
, LogonType
))
2975 hr
= read_text_value(reader
, &value
);
2978 TASK_LOGON_TYPE logon
= TASK_LOGON_NONE
;
2980 if (!lstrcmpW(value
, InteractiveToken
))
2981 logon
= TASK_LOGON_INTERACTIVE_TOKEN
;
2983 FIXME("unhandled LogonType %s\n", debugstr_w(value
));
2985 IPrincipal_put_LogonType(principal
, logon
);
2988 else if (!lstrcmpW(name
, RunLevel
))
2990 hr
= read_text_value(reader
, &value
);
2993 TASK_RUNLEVEL_TYPE level
= TASK_RUNLEVEL_LUA
;
2995 if (!lstrcmpW(value
, LeastPrivilege
))
2996 level
= TASK_RUNLEVEL_LUA
;
2998 FIXME("unhandled RunLevel %s\n", debugstr_w(value
));
3000 IPrincipal_put_RunLevel(principal
, level
);
3004 FIXME("unhandled Principal element %s\n", debugstr_w(name
));
3008 case XmlNodeType_Whitespace
:
3009 case XmlNodeType_Comment
:
3013 FIXME("unhandled Principal node type %d\n", type
);
3018 WARN("Principal was not terminated\n");
3022 static HRESULT
read_principals(IXmlReader
*reader
, ITaskDefinition
*taskdef
)
3028 if (IXmlReader_IsEmptyElement(reader
))
3030 TRACE("Principals is empty\n");
3034 while (IXmlReader_Read(reader
, &type
) == S_OK
)
3038 case XmlNodeType_EndElement
:
3039 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3040 if (hr
!= S_OK
) return hr
;
3042 TRACE("/%s\n", debugstr_w(name
));
3044 if (!lstrcmpW(name
, Principals
))
3049 case XmlNodeType_Element
:
3050 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3051 if (hr
!= S_OK
) return hr
;
3053 TRACE("Element: %s\n", debugstr_w(name
));
3055 if (!lstrcmpW(name
, principalW
))
3057 IPrincipal
*principal
;
3059 hr
= ITaskDefinition_get_Principal(taskdef
, &principal
);
3060 if (hr
!= S_OK
) return hr
;
3061 hr
= read_principal(reader
, principal
);
3062 IPrincipal_Release(principal
);
3065 FIXME("unhandled Principals element %s\n", debugstr_w(name
));
3069 case XmlNodeType_Whitespace
:
3070 case XmlNodeType_Comment
:
3074 FIXME("unhandled Principals node type %d\n", type
);
3079 WARN("Principals was not terminated\n");
3083 static HRESULT
read_actions(IXmlReader
*reader
, ITaskDefinition
*taskdef
)
3089 static HRESULT
read_idle_settings(IXmlReader
*reader
, ITaskSettings
*taskset
)
3095 static HRESULT
read_settings(IXmlReader
*reader
, ITaskSettings
*taskset
)
3101 VARIANT_BOOL bool_val
;
3104 if (IXmlReader_IsEmptyElement(reader
))
3106 TRACE("Settings is empty\n");
3110 while (IXmlReader_Read(reader
, &type
) == S_OK
)
3114 case XmlNodeType_EndElement
:
3115 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3116 if (hr
!= S_OK
) return hr
;
3118 TRACE("/%s\n", debugstr_w(name
));
3120 if (!lstrcmpW(name
, Settings
))
3125 case XmlNodeType_Element
:
3126 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3127 if (hr
!= S_OK
) return hr
;
3129 TRACE("Element: %s\n", debugstr_w(name
));
3131 if (!lstrcmpW(name
, MultipleInstancesPolicy
))
3133 hr
= read_text_value(reader
, &value
);
3136 int_val
= TASK_INSTANCES_IGNORE_NEW
;
3138 if (!lstrcmpW(value
, IgnoreNew
))
3139 int_val
= TASK_INSTANCES_IGNORE_NEW
;
3141 FIXME("unhandled MultipleInstancesPolicy %s\n", debugstr_w(value
));
3143 ITaskSettings_put_MultipleInstances(taskset
, int_val
);
3146 else if (!lstrcmpW(name
, DisallowStartIfOnBatteries
))
3148 hr
= read_variantbool_value(reader
, &bool_val
);
3149 if (hr
!= S_OK
) return hr
;
3150 ITaskSettings_put_DisallowStartIfOnBatteries(taskset
, bool_val
);
3152 else if (!lstrcmpW(name
, AllowStartOnDemand
))
3154 hr
= read_variantbool_value(reader
, &bool_val
);
3155 if (hr
!= S_OK
) return hr
;
3156 ITaskSettings_put_AllowDemandStart(taskset
, bool_val
);
3158 else if (!lstrcmpW(name
, StopIfGoingOnBatteries
))
3160 hr
= read_variantbool_value(reader
, &bool_val
);
3161 if (hr
!= S_OK
) return hr
;
3162 ITaskSettings_put_StopIfGoingOnBatteries(taskset
, bool_val
);
3164 else if (!lstrcmpW(name
, AllowHardTerminate
))
3166 hr
= read_variantbool_value(reader
, &bool_val
);
3167 if (hr
!= S_OK
) return hr
;
3168 ITaskSettings_put_AllowHardTerminate(taskset
, bool_val
);
3170 else if (!lstrcmpW(name
, StartWhenAvailable
))
3172 hr
= read_variantbool_value(reader
, &bool_val
);
3173 if (hr
!= S_OK
) return hr
;
3174 ITaskSettings_put_StartWhenAvailable(taskset
, bool_val
);
3176 else if (!lstrcmpW(name
, RunOnlyIfNetworkAvailable
))
3178 hr
= read_variantbool_value(reader
, &bool_val
);
3179 if (hr
!= S_OK
) return hr
;
3180 ITaskSettings_put_RunOnlyIfNetworkAvailable(taskset
, bool_val
);
3182 else if (!lstrcmpW(name
, Enabled
))
3184 hr
= read_variantbool_value(reader
, &bool_val
);
3185 if (hr
!= S_OK
) return hr
;
3186 ITaskSettings_put_Enabled(taskset
, bool_val
);
3188 else if (!lstrcmpW(name
, Hidden
))
3190 hr
= read_variantbool_value(reader
, &bool_val
);
3191 if (hr
!= S_OK
) return hr
;
3192 ITaskSettings_put_Hidden(taskset
, bool_val
);
3194 else if (!lstrcmpW(name
, RunOnlyIfIdle
))
3196 hr
= read_variantbool_value(reader
, &bool_val
);
3197 if (hr
!= S_OK
) return hr
;
3198 ITaskSettings_put_RunOnlyIfIdle(taskset
, bool_val
);
3200 else if (!lstrcmpW(name
, WakeToRun
))
3202 hr
= read_variantbool_value(reader
, &bool_val
);
3203 if (hr
!= S_OK
) return hr
;
3204 ITaskSettings_put_WakeToRun(taskset
, bool_val
);
3206 else if (!lstrcmpW(name
, ExecutionTimeLimit
))
3208 hr
= read_text_value(reader
, &value
);
3210 ITaskSettings_put_ExecutionTimeLimit(taskset
, value
);
3212 else if (!lstrcmpW(name
, Priority
))
3214 hr
= read_int_value(reader
, &int_val
);
3216 ITaskSettings_put_Priority(taskset
, int_val
);
3218 else if (!lstrcmpW(name
, IdleSettings
))
3220 hr
= read_idle_settings(reader
, taskset
);
3221 if (hr
!= S_OK
) return hr
;
3224 FIXME("unhandled Settings element %s\n", debugstr_w(name
));
3228 case XmlNodeType_Whitespace
:
3229 case XmlNodeType_Comment
:
3233 FIXME("unhandled Settings node type %d\n", type
);
3238 WARN("Settings was not terminated\n");
3239 return SCHED_E_MALFORMEDXML
;
3242 static HRESULT
read_registration_info(IXmlReader
*reader
, IRegistrationInfo
*info
)
3249 if (IXmlReader_IsEmptyElement(reader
))
3251 TRACE("RegistrationInfo is empty\n");
3255 while (IXmlReader_Read(reader
, &type
) == S_OK
)
3259 case XmlNodeType_EndElement
:
3260 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3261 if (hr
!= S_OK
) return hr
;
3263 TRACE("/%s\n", debugstr_w(name
));
3265 if (!lstrcmpW(name
, RegistrationInfo
))
3270 case XmlNodeType_Element
:
3271 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3272 if (hr
!= S_OK
) return hr
;
3274 TRACE("Element: %s\n", debugstr_w(name
));
3276 if (!lstrcmpW(name
, Author
))
3278 hr
= read_text_value(reader
, &value
);
3280 IRegistrationInfo_put_Author(info
, value
);
3282 else if (!lstrcmpW(name
, Description
))
3284 hr
= read_text_value(reader
, &value
);
3286 IRegistrationInfo_put_Description(info
, value
);
3289 FIXME("unhandled RegistrationInfo element %s\n", debugstr_w(name
));
3293 case XmlNodeType_Whitespace
:
3294 case XmlNodeType_Comment
:
3298 FIXME("unhandled RegistrationInfo node type %d\n", type
);
3303 WARN("RegistrationInfo was not terminated\n");
3304 return SCHED_E_MALFORMEDXML
;
3307 static HRESULT
read_task_attributes(IXmlReader
*reader
, ITaskDefinition
*taskdef
)
3310 ITaskSettings
*taskset
;
3313 BOOL xmlns_ok
= FALSE
;
3317 hr
= ITaskDefinition_get_Settings(taskdef
, &taskset
);
3318 if (hr
!= S_OK
) return hr
;
3320 hr
= IXmlReader_MoveToFirstAttribute(reader
);
3324 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3325 if (hr
!= S_OK
) break;
3327 hr
= IXmlReader_GetValue(reader
, &value
, NULL
);
3328 if (hr
!= S_OK
) break;
3330 TRACE("%s=%s\n", debugstr_w(name
), debugstr_w(value
));
3332 if (!lstrcmpW(name
, version
))
3334 TASK_COMPATIBILITY compatibility
= TASK_COMPATIBILITY_V2
;
3336 if (!lstrcmpW(value
, v1_0
))
3337 compatibility
= TASK_COMPATIBILITY_AT
;
3338 else if (!lstrcmpW(value
, v1_1
))
3339 compatibility
= TASK_COMPATIBILITY_V1
;
3340 else if (!lstrcmpW(value
, v1_2
))
3341 compatibility
= TASK_COMPATIBILITY_V2
;
3342 else if (!lstrcmpW(value
, v1_3
))
3343 compatibility
= TASK_COMPATIBILITY_V2_1
;
3345 FIXME("unknown version %s\n", debugstr_w(value
));
3347 ITaskSettings_put_Compatibility(taskset
, compatibility
);
3349 else if (!lstrcmpW(name
, xmlns
))
3351 if (lstrcmpW(value
, task_ns
))
3353 FIXME("unknown namespace %s\n", debugstr_w(value
));
3359 FIXME("unhandled Task attribute %s\n", debugstr_w(name
));
3361 hr
= IXmlReader_MoveToNextAttribute(reader
);
3364 ITaskSettings_Release(taskset
);
3365 return xmlns_ok
? S_OK
: SCHED_E_NAMESPACE
;
3368 static HRESULT
read_task(IXmlReader
*reader
, ITaskDefinition
*taskdef
)
3374 if (IXmlReader_IsEmptyElement(reader
))
3376 TRACE("Task is empty\n");
3380 while (IXmlReader_Read(reader
, &type
) == S_OK
)
3384 case XmlNodeType_EndElement
:
3385 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3386 if (hr
!= S_OK
) return hr
;
3388 TRACE("/%s\n", debugstr_w(name
));
3390 if (!lstrcmpW(name
, Task
))
3395 case XmlNodeType_Element
:
3396 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3397 if (hr
!= S_OK
) return hr
;
3399 TRACE("Element: %s\n", debugstr_w(name
));
3401 if (!lstrcmpW(name
, RegistrationInfo
))
3403 IRegistrationInfo
*info
;
3405 hr
= ITaskDefinition_get_RegistrationInfo(taskdef
, &info
);
3406 if (hr
!= S_OK
) return hr
;
3407 hr
= read_registration_info(reader
, info
);
3408 IRegistrationInfo_Release(info
);
3410 else if (!lstrcmpW(name
, Settings
))
3412 ITaskSettings
*taskset
;
3414 hr
= ITaskDefinition_get_Settings(taskdef
, &taskset
);
3415 if (hr
!= S_OK
) return hr
;
3416 hr
= read_settings(reader
, taskset
);
3417 ITaskSettings_Release(taskset
);
3419 else if (!lstrcmpW(name
, Triggers
))
3420 hr
= read_triggers(reader
, taskdef
);
3421 else if (!lstrcmpW(name
, Principals
))
3422 hr
= read_principals(reader
, taskdef
);
3423 else if (!lstrcmpW(name
, actionsW
))
3424 hr
= read_actions(reader
, taskdef
);
3426 FIXME("unhandled Task element %s\n", debugstr_w(name
));
3428 if (hr
!= S_OK
) return hr
;
3431 case XmlNodeType_Comment
:
3432 case XmlNodeType_Whitespace
:
3436 FIXME("unhandled Task node type %d\n", type
);
3441 WARN("Task was not terminated\n");
3442 return SCHED_E_MALFORMEDXML
;
3445 static HRESULT
read_xml(IXmlReader
*reader
, ITaskDefinition
*taskdef
)
3451 while (IXmlReader_Read(reader
, &type
) == S_OK
)
3455 case XmlNodeType_XmlDeclaration
:
3456 TRACE("XmlDeclaration\n");
3459 case XmlNodeType_Element
:
3460 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3461 if (hr
!= S_OK
) return hr
;
3463 TRACE("Element: %s\n", debugstr_w(name
));
3465 if (!lstrcmpW(name
, Task
))
3467 hr
= read_task_attributes(reader
, taskdef
);
3468 if (hr
!= S_OK
) return hr
;
3470 return read_task(reader
, taskdef
);
3473 FIXME("unhandled XML element %s\n", debugstr_w(name
));
3477 case XmlNodeType_Comment
:
3478 case XmlNodeType_Whitespace
:
3482 FIXME("unhandled XML node type %d\n", type
);
3487 WARN("Task definition was not found\n");
3488 return SCHED_E_MALFORMEDXML
;
3491 static HRESULT WINAPI
TaskDefinition_put_XmlText(ITaskDefinition
*iface
, BSTR xml
)
3493 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
3500 TRACE("%p,%s\n", iface
, debugstr_w(xml
));
3502 if (!xml
) return E_INVALIDARG
;
3504 hmem
= GlobalAlloc(0, lstrlenW(xml
) * sizeof(WCHAR
));
3505 if (!hmem
) return E_OUTOFMEMORY
;
3507 buf
= GlobalLock(hmem
);
3508 memcpy(buf
, xml
, lstrlenW(xml
) * sizeof(WCHAR
));
3511 hr
= CreateStreamOnHGlobal(hmem
, TRUE
, &stream
);
3518 hr
= CreateXmlReader(&IID_IXmlReader
, (void **)&reader
, NULL
);
3521 IStream_Release(stream
);
3525 hr
= IXmlReader_SetInput(reader
, (IUnknown
*)stream
);
3528 if (taskdef
->reginfo
)
3530 IRegistrationInfo_Release(taskdef
->reginfo
);
3531 taskdef
->reginfo
= NULL
;
3533 if (taskdef
->taskset
)
3535 ITaskSettings_Release(taskdef
->taskset
);
3536 taskdef
->taskset
= NULL
;
3538 if (taskdef
->triggers
)
3540 ITriggerCollection_Release(taskdef
->triggers
);
3541 taskdef
->triggers
= NULL
;
3543 if (taskdef
->principal
)
3545 IPrincipal_Release(taskdef
->principal
);
3546 taskdef
->principal
= NULL
;
3548 if (taskdef
->actions
)
3550 IActionCollection_Release(taskdef
->actions
);
3551 taskdef
->actions
= NULL
;
3554 hr
= read_xml(reader
, iface
);
3557 IXmlReader_Release(reader
);
3558 IStream_Release(stream
);
3563 static const ITaskDefinitionVtbl TaskDefinition_vtbl
=
3565 TaskDefinition_QueryInterface
,
3566 TaskDefinition_AddRef
,
3567 TaskDefinition_Release
,
3568 TaskDefinition_GetTypeInfoCount
,
3569 TaskDefinition_GetTypeInfo
,
3570 TaskDefinition_GetIDsOfNames
,
3571 TaskDefinition_Invoke
,
3572 TaskDefinition_get_RegistrationInfo
,
3573 TaskDefinition_put_RegistrationInfo
,
3574 TaskDefinition_get_Triggers
,
3575 TaskDefinition_put_Triggers
,
3576 TaskDefinition_get_Settings
,
3577 TaskDefinition_put_Settings
,
3578 TaskDefinition_get_Data
,
3579 TaskDefinition_put_Data
,
3580 TaskDefinition_get_Principal
,
3581 TaskDefinition_put_Principal
,
3582 TaskDefinition_get_Actions
,
3583 TaskDefinition_put_Actions
,
3584 TaskDefinition_get_XmlText
,
3585 TaskDefinition_put_XmlText
3588 HRESULT
TaskDefinition_create(ITaskDefinition
**obj
)
3590 TaskDefinition
*taskdef
;
3592 taskdef
= heap_alloc_zero(sizeof(*taskdef
));
3593 if (!taskdef
) return E_OUTOFMEMORY
;
3595 taskdef
->ITaskDefinition_iface
.lpVtbl
= &TaskDefinition_vtbl
;
3597 *obj
= &taskdef
->ITaskDefinition_iface
;
3599 TRACE("created %p\n", *obj
);
3606 ITaskService ITaskService_iface
;
3610 WCHAR comp_name
[MAX_COMPUTERNAME_LENGTH
+ 1];
3613 static inline TaskService
*impl_from_ITaskService(ITaskService
*iface
)
3615 return CONTAINING_RECORD(iface
, TaskService
, ITaskService_iface
);
3618 static ULONG WINAPI
TaskService_AddRef(ITaskService
*iface
)
3620 TaskService
*task_svc
= impl_from_ITaskService(iface
);
3621 return InterlockedIncrement(&task_svc
->ref
);
3624 static ULONG WINAPI
TaskService_Release(ITaskService
*iface
)
3626 TaskService
*task_svc
= impl_from_ITaskService(iface
);
3627 LONG ref
= InterlockedDecrement(&task_svc
->ref
);
3631 TRACE("destroying %p\n", iface
);
3632 heap_free(task_svc
);
3638 static HRESULT WINAPI
TaskService_QueryInterface(ITaskService
*iface
, REFIID riid
, void **obj
)
3640 if (!riid
|| !obj
) return E_INVALIDARG
;
3642 TRACE("%p,%s,%p\n", iface
, debugstr_guid(riid
), obj
);
3644 if (IsEqualGUID(riid
, &IID_ITaskService
) ||
3645 IsEqualGUID(riid
, &IID_IDispatch
) ||
3646 IsEqualGUID(riid
, &IID_IUnknown
))
3648 ITaskService_AddRef(iface
);
3653 FIXME("interface %s is not implemented\n", debugstr_guid(riid
));
3655 return E_NOINTERFACE
;
3658 static HRESULT WINAPI
TaskService_GetTypeInfoCount(ITaskService
*iface
, UINT
*count
)
3660 FIXME("%p,%p: stub\n", iface
, count
);
3664 static HRESULT WINAPI
TaskService_GetTypeInfo(ITaskService
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
3666 FIXME("%p,%u,%u,%p: stub\n", iface
, index
, lcid
, info
);
3670 static HRESULT WINAPI
TaskService_GetIDsOfNames(ITaskService
*iface
, REFIID riid
, LPOLESTR
*names
,
3671 UINT count
, LCID lcid
, DISPID
*dispid
)
3673 FIXME("%p,%s,%p,%u,%u,%p: stub\n", iface
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
3677 static HRESULT WINAPI
TaskService_Invoke(ITaskService
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
3678 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
3680 FIXME("%p,%d,%s,%04x,%04x,%p,%p,%p,%p: stub\n", iface
, dispid
, debugstr_guid(riid
), lcid
, flags
,
3681 params
, result
, excepinfo
, argerr
);
3685 static HRESULT WINAPI
TaskService_GetFolder(ITaskService
*iface
, BSTR path
, ITaskFolder
**folder
)
3687 TaskService
*task_svc
= impl_from_ITaskService(iface
);
3689 TRACE("%p,%s,%p\n", iface
, debugstr_w(path
), folder
);
3691 if (!folder
) return E_POINTER
;
3693 if (!task_svc
->connected
)
3694 return HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED
);
3696 return TaskFolder_create(path
, NULL
, folder
, FALSE
);
3699 static HRESULT WINAPI
TaskService_GetRunningTasks(ITaskService
*iface
, LONG flags
, IRunningTaskCollection
**tasks
)
3701 FIXME("%p,%x,%p: stub\n", iface
, flags
, tasks
);
3705 static HRESULT WINAPI
TaskService_NewTask(ITaskService
*iface
, DWORD flags
, ITaskDefinition
**definition
)
3707 TRACE("%p,%x,%p\n", iface
, flags
, definition
);
3709 if (!definition
) return E_POINTER
;
3712 FIXME("unsupported flags %x\n", flags
);
3714 return TaskDefinition_create(definition
);
3717 static inline BOOL
is_variant_null(const VARIANT
*var
)
3719 return V_VT(var
) == VT_EMPTY
|| V_VT(var
) == VT_NULL
||
3720 (V_VT(var
) == VT_BSTR
&& (V_BSTR(var
) == NULL
|| !*V_BSTR(var
)));
3723 static HRESULT
start_schedsvc(void)
3725 static const WCHAR scheduleW
[] = { 'S','c','h','e','d','u','l','e',0 };
3726 SC_HANDLE scm
, service
;
3727 SERVICE_STATUS_PROCESS status
;
3728 ULONGLONG start_time
;
3729 HRESULT hr
= SCHED_E_SERVICE_NOT_RUNNING
;
3731 TRACE("Trying to start %s service\n", debugstr_w(scheduleW
));
3733 scm
= OpenSCManagerW(NULL
, NULL
, 0);
3734 if (!scm
) return SCHED_E_SERVICE_NOT_INSTALLED
;
3736 service
= OpenServiceW(scm
, scheduleW
, SERVICE_START
| SERVICE_QUERY_STATUS
);
3739 if (StartServiceW(service
, 0, NULL
) || GetLastError() == ERROR_SERVICE_ALREADY_RUNNING
)
3741 start_time
= GetTickCount64();
3746 if (!QueryServiceStatusEx(service
, SC_STATUS_PROCESS_INFO
, (BYTE
*)&status
, sizeof(status
), &dummy
))
3748 WARN("failed to query scheduler status (%u)\n", GetLastError());
3752 if (status
.dwCurrentState
== SERVICE_RUNNING
)
3758 if (GetTickCount64() - start_time
> 30000) break;
3761 } while (status
.dwCurrentState
== SERVICE_START_PENDING
);
3763 if (status
.dwCurrentState
!= SERVICE_RUNNING
)
3764 WARN("scheduler failed to start %u\n", status
.dwCurrentState
);
3767 WARN("failed to start scheduler service (%u)\n", GetLastError());
3769 CloseServiceHandle(service
);
3772 WARN("failed to open scheduler service (%u)\n", GetLastError());
3774 CloseServiceHandle(scm
);
3778 static HRESULT WINAPI
TaskService_Connect(ITaskService
*iface
, VARIANT server
, VARIANT user
, VARIANT domain
, VARIANT password
)
3780 static WCHAR ncalrpc
[] = { 'n','c','a','l','r','p','c',0 };
3781 TaskService
*task_svc
= impl_from_ITaskService(iface
);
3782 WCHAR comp_name
[MAX_COMPUTERNAME_LENGTH
+ 1];
3785 RPC_WSTR binding_str
;
3786 extern handle_t rpc_handle
;
3788 TRACE("%p,%s,%s,%s,%s\n", iface
, debugstr_variant(&server
), debugstr_variant(&user
),
3789 debugstr_variant(&domain
), debugstr_variant(&password
));
3791 if (!is_variant_null(&user
) || !is_variant_null(&domain
) || !is_variant_null(&password
))
3792 FIXME("user/domain/password are ignored\n");
3794 len
= sizeof(comp_name
)/sizeof(comp_name
[0]);
3795 if (!GetComputerNameW(comp_name
, &len
))
3796 return HRESULT_FROM_WIN32(GetLastError());
3798 if (!is_variant_null(&server
))
3800 const WCHAR
*server_name
;
3802 if (V_VT(&server
) != VT_BSTR
)
3804 FIXME("server variant type %d is not supported\n", V_VT(&server
));
3805 return HRESULT_FROM_WIN32(ERROR_BAD_NETPATH
);
3808 /* skip UNC prefix if any */
3809 server_name
= V_BSTR(&server
);
3810 if (server_name
[0] == '\\' && server_name
[1] == '\\')
3813 if (strcmpiW(server_name
, comp_name
))
3815 FIXME("connection to remote server %s is not supported\n", debugstr_w(V_BSTR(&server
)));
3816 return HRESULT_FROM_WIN32(ERROR_BAD_NETPATH
);
3820 hr
= start_schedsvc();
3821 if (hr
!= S_OK
) return hr
;
3823 hr
= RpcStringBindingComposeW(NULL
, ncalrpc
, NULL
, NULL
, NULL
, &binding_str
);
3824 if (hr
!= RPC_S_OK
) return hr
;
3825 hr
= RpcBindingFromStringBindingW(binding_str
, &rpc_handle
);
3826 RpcStringFreeW(&binding_str
);
3827 if (hr
!= RPC_S_OK
) return hr
;
3829 /* Make sure that the connection works */
3830 hr
= SchRpcHighestVersion(&task_svc
->version
);
3831 if (hr
!= S_OK
) return hr
;
3833 TRACE("server version %#x\n", task_svc
->version
);
3835 strcpyW(task_svc
->comp_name
, comp_name
);
3836 task_svc
->connected
= TRUE
;
3841 static HRESULT WINAPI
TaskService_get_Connected(ITaskService
*iface
, VARIANT_BOOL
*connected
)
3843 TaskService
*task_svc
= impl_from_ITaskService(iface
);
3845 TRACE("%p,%p\n", iface
, connected
);
3847 if (!connected
) return E_POINTER
;
3849 *connected
= task_svc
->connected
? VARIANT_TRUE
: VARIANT_FALSE
;
3854 static HRESULT WINAPI
TaskService_get_TargetServer(ITaskService
*iface
, BSTR
*server
)
3856 TaskService
*task_svc
= impl_from_ITaskService(iface
);
3858 TRACE("%p,%p\n", iface
, server
);
3860 if (!server
) return E_POINTER
;
3862 if (!task_svc
->connected
)
3863 return HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED
);
3865 *server
= SysAllocString(task_svc
->comp_name
);
3866 if (!*server
) return E_OUTOFMEMORY
;
3871 static HRESULT WINAPI
TaskService_get_ConnectedUser(ITaskService
*iface
, BSTR
*user
)
3873 FIXME("%p,%p: stub\n", iface
, user
);
3877 static HRESULT WINAPI
TaskService_get_ConnectedDomain(ITaskService
*iface
, BSTR
*domain
)
3879 FIXME("%p,%p: stub\n", iface
, domain
);
3883 static HRESULT WINAPI
TaskService_get_HighestVersion(ITaskService
*iface
, DWORD
*version
)
3885 TaskService
*task_svc
= impl_from_ITaskService(iface
);
3887 TRACE("%p,%p\n", iface
, version
);
3889 if (!version
) return E_POINTER
;
3891 if (!task_svc
->connected
)
3892 return HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED
);
3894 *version
= task_svc
->version
;
3899 static const ITaskServiceVtbl TaskService_vtbl
=
3901 TaskService_QueryInterface
,
3903 TaskService_Release
,
3904 TaskService_GetTypeInfoCount
,
3905 TaskService_GetTypeInfo
,
3906 TaskService_GetIDsOfNames
,
3908 TaskService_GetFolder
,
3909 TaskService_GetRunningTasks
,
3910 TaskService_NewTask
,
3911 TaskService_Connect
,
3912 TaskService_get_Connected
,
3913 TaskService_get_TargetServer
,
3914 TaskService_get_ConnectedUser
,
3915 TaskService_get_ConnectedDomain
,
3916 TaskService_get_HighestVersion
3919 HRESULT
TaskService_create(void **obj
)
3921 TaskService
*task_svc
;
3923 task_svc
= heap_alloc(sizeof(*task_svc
));
3924 if (!task_svc
) return E_OUTOFMEMORY
;
3926 task_svc
->ITaskService_iface
.lpVtbl
= &TaskService_vtbl
;
3928 task_svc
->connected
= FALSE
;
3929 *obj
= &task_svc
->ITaskService_iface
;
3931 TRACE("created %p\n", *obj
);
3936 void __RPC_FAR
*__RPC_USER
MIDL_user_allocate(SIZE_T n
)
3938 return HeapAlloc(GetProcessHeap(), 0, n
);
3941 void __RPC_USER
MIDL_user_free(void __RPC_FAR
*p
)
3943 HeapFree(GetProcessHeap(), 0, p
);