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/debug.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(taskschd
);
38 IDailyTrigger IDailyTrigger_iface
;
41 WCHAR
*start_boundary
;
45 static inline DailyTrigger
*impl_from_IDailyTrigger(IDailyTrigger
*iface
)
47 return CONTAINING_RECORD(iface
, DailyTrigger
, IDailyTrigger_iface
);
50 static HRESULT WINAPI
DailyTrigger_QueryInterface(IDailyTrigger
*iface
, REFIID riid
, void **ppv
)
52 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
54 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
56 if(IsEqualGUID(&IID_IUnknown
, riid
) ||
57 IsEqualGUID(&IID_IDispatch
, riid
) ||
58 IsEqualGUID(&IID_ITrigger
, riid
) ||
59 IsEqualGUID(&IID_IDailyTrigger
, riid
))
61 *ppv
= &This
->IDailyTrigger_iface
;
65 FIXME("unsupported riid %s\n", debugstr_guid(riid
));
70 IUnknown_AddRef((IUnknown
*)*ppv
);
74 static ULONG WINAPI
DailyTrigger_AddRef(IDailyTrigger
*iface
)
76 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
77 LONG ref
= InterlockedIncrement(&This
->ref
);
79 TRACE("(%p) ref=%ld\n", This
, ref
);
84 static ULONG WINAPI
DailyTrigger_Release(IDailyTrigger
*iface
)
86 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
87 LONG ref
= InterlockedDecrement(&This
->ref
);
89 TRACE("(%p) ref=%ld\n", This
, ref
);
93 TRACE("destroying %p\n", iface
);
94 free(This
->start_boundary
);
101 static HRESULT WINAPI
DailyTrigger_GetTypeInfoCount(IDailyTrigger
*iface
, UINT
*count
)
103 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
104 FIXME("(%p)->(%p)\n", This
, count
);
108 static HRESULT WINAPI
DailyTrigger_GetTypeInfo(IDailyTrigger
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
110 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
111 FIXME("(%p)->(%u %lu %p)\n", This
, index
, lcid
, info
);
115 static HRESULT WINAPI
DailyTrigger_GetIDsOfNames(IDailyTrigger
*iface
, REFIID riid
, LPOLESTR
*names
,
116 UINT count
, LCID lcid
, DISPID
*dispid
)
118 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
119 FIXME("(%p)->(%s %p %u %lu %p)\n", This
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
123 static HRESULT WINAPI
DailyTrigger_Invoke(IDailyTrigger
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
124 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
126 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
127 FIXME("(%p)->(%ld %s %lx %x %p %p %p %p)\n", This
, dispid
, debugstr_guid(riid
), lcid
, flags
,
128 params
, result
, excepinfo
, argerr
);
132 static HRESULT WINAPI
DailyTrigger_get_Type(IDailyTrigger
*iface
, TASK_TRIGGER_TYPE2
*type
)
134 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
135 FIXME("(%p)->(%p)\n", This
, type
);
139 static HRESULT WINAPI
DailyTrigger_get_Id(IDailyTrigger
*iface
, BSTR
*id
)
141 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
142 FIXME("(%p)->(%p)\n", This
, id
);
146 static HRESULT WINAPI
DailyTrigger_put_Id(IDailyTrigger
*iface
, BSTR id
)
148 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
149 FIXME("(%p)->(%s)\n", This
, debugstr_w(id
));
153 static HRESULT WINAPI
DailyTrigger_get_Repetition(IDailyTrigger
*iface
, IRepetitionPattern
**repeat
)
155 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
156 FIXME("(%p)->(%p)\n", This
, repeat
);
160 static HRESULT WINAPI
DailyTrigger_put_Repetition(IDailyTrigger
*iface
, IRepetitionPattern
*repeat
)
162 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
163 FIXME("(%p)->(%p)\n", This
, repeat
);
167 static HRESULT WINAPI
DailyTrigger_get_ExecutionTimeLimit(IDailyTrigger
*iface
, BSTR
*limit
)
169 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
170 FIXME("(%p)->(%p)\n", This
, limit
);
174 static HRESULT WINAPI
DailyTrigger_put_ExecutionTimeLimit(IDailyTrigger
*iface
, BSTR limit
)
176 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
177 FIXME("(%p)->(%s)\n", This
, debugstr_w(limit
));
181 static HRESULT WINAPI
DailyTrigger_get_StartBoundary(IDailyTrigger
*iface
, BSTR
*start
)
183 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
185 TRACE("(%p)->(%p)\n", This
, start
);
187 if (!start
) return E_POINTER
;
189 if (!This
->start_boundary
) *start
= NULL
;
190 else if (!(*start
= SysAllocString(This
->start_boundary
))) return E_OUTOFMEMORY
;
195 static HRESULT WINAPI
DailyTrigger_put_StartBoundary(IDailyTrigger
*iface
, BSTR start
)
197 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
200 TRACE("(%p)->(%s)\n", This
, debugstr_w(start
));
202 if (start
&& !(str
= wcsdup(start
))) return E_OUTOFMEMORY
;
203 free(This
->start_boundary
);
204 This
->start_boundary
= str
;
209 static HRESULT WINAPI
DailyTrigger_get_EndBoundary(IDailyTrigger
*iface
, BSTR
*end
)
211 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
212 FIXME("(%p)->(%p)\n", This
, end
);
216 static HRESULT WINAPI
DailyTrigger_put_EndBoundary(IDailyTrigger
*iface
, BSTR end
)
218 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
219 FIXME("(%p)->(%s)\n", This
, debugstr_w(end
));
223 static HRESULT WINAPI
DailyTrigger_get_Enabled(IDailyTrigger
*iface
, VARIANT_BOOL
*enabled
)
225 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
227 TRACE("(%p)->(%p)\n", This
, enabled
);
229 if (!enabled
) return E_POINTER
;
231 *enabled
= This
->enabled
? VARIANT_TRUE
: VARIANT_FALSE
;
235 static HRESULT WINAPI
DailyTrigger_put_Enabled(IDailyTrigger
*iface
, VARIANT_BOOL enabled
)
237 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
239 TRACE("(%p)->(%x)\n", This
, enabled
);
241 This
->enabled
= !!enabled
;
245 static HRESULT WINAPI
DailyTrigger_get_DaysInterval(IDailyTrigger
*iface
, short *days
)
247 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
249 TRACE("(%p)->(%p)\n", This
, days
);
251 *days
= This
->interval
;
255 static HRESULT WINAPI
DailyTrigger_put_DaysInterval(IDailyTrigger
*iface
, short days
)
257 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
259 TRACE("(%p)->(%d)\n", This
, days
);
264 This
->interval
= days
;
268 static HRESULT WINAPI
DailyTrigger_get_RandomDelay(IDailyTrigger
*iface
, BSTR
*pRandomDelay
)
270 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
271 FIXME("(%p)->(%p)\n", This
, pRandomDelay
);
275 static HRESULT WINAPI
DailyTrigger_put_RandomDelay(IDailyTrigger
*iface
, BSTR randomDelay
)
277 DailyTrigger
*This
= impl_from_IDailyTrigger(iface
);
278 FIXME("(%p)->(%s)\n", This
, debugstr_w(randomDelay
));
282 static const IDailyTriggerVtbl DailyTrigger_vtbl
= {
283 DailyTrigger_QueryInterface
,
285 DailyTrigger_Release
,
286 DailyTrigger_GetTypeInfoCount
,
287 DailyTrigger_GetTypeInfo
,
288 DailyTrigger_GetIDsOfNames
,
290 DailyTrigger_get_Type
,
293 DailyTrigger_get_Repetition
,
294 DailyTrigger_put_Repetition
,
295 DailyTrigger_get_ExecutionTimeLimit
,
296 DailyTrigger_put_ExecutionTimeLimit
,
297 DailyTrigger_get_StartBoundary
,
298 DailyTrigger_put_StartBoundary
,
299 DailyTrigger_get_EndBoundary
,
300 DailyTrigger_put_EndBoundary
,
301 DailyTrigger_get_Enabled
,
302 DailyTrigger_put_Enabled
,
303 DailyTrigger_get_DaysInterval
,
304 DailyTrigger_put_DaysInterval
,
305 DailyTrigger_get_RandomDelay
,
306 DailyTrigger_put_RandomDelay
309 static HRESULT
DailyTrigger_create(ITrigger
**trigger
)
311 DailyTrigger
*daily_trigger
;
313 daily_trigger
= malloc(sizeof(*daily_trigger
));
315 return E_OUTOFMEMORY
;
317 daily_trigger
->IDailyTrigger_iface
.lpVtbl
= &DailyTrigger_vtbl
;
318 daily_trigger
->ref
= 1;
319 daily_trigger
->interval
= 1;
320 daily_trigger
->start_boundary
= NULL
;
321 daily_trigger
->enabled
= TRUE
;
323 *trigger
= (ITrigger
*)&daily_trigger
->IDailyTrigger_iface
;
328 IRegistrationTrigger IRegistrationTrigger_iface
;
331 } RegistrationTrigger
;
333 static inline RegistrationTrigger
*impl_from_IRegistrationTrigger(IRegistrationTrigger
*iface
)
335 return CONTAINING_RECORD(iface
, RegistrationTrigger
, IRegistrationTrigger_iface
);
338 static HRESULT WINAPI
RegistrationTrigger_QueryInterface(IRegistrationTrigger
*iface
, REFIID riid
, void **ppv
)
340 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
342 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
344 if(IsEqualGUID(&IID_IUnknown
, riid
) ||
345 IsEqualGUID(&IID_IDispatch
, riid
) ||
346 IsEqualGUID(&IID_ITrigger
, riid
) ||
347 IsEqualGUID(&IID_IRegistrationTrigger
, riid
))
349 *ppv
= &This
->IRegistrationTrigger_iface
;
353 FIXME("unsupported riid %s\n", debugstr_guid(riid
));
355 return E_NOINTERFACE
;
358 IUnknown_AddRef((IUnknown
*)*ppv
);
362 static ULONG WINAPI
RegistrationTrigger_AddRef(IRegistrationTrigger
*iface
)
364 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
365 LONG ref
= InterlockedIncrement(&This
->ref
);
367 TRACE("(%p) ref=%ld\n", This
, ref
);
372 static ULONG WINAPI
RegistrationTrigger_Release(IRegistrationTrigger
*iface
)
374 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
375 LONG ref
= InterlockedDecrement(&This
->ref
);
377 TRACE("(%p) ref=%ld\n", This
, ref
);
381 TRACE("destroying %p\n", iface
);
388 static HRESULT WINAPI
RegistrationTrigger_GetTypeInfoCount(IRegistrationTrigger
*iface
, UINT
*count
)
390 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
391 FIXME("(%p)->(%p)\n", This
, count
);
395 static HRESULT WINAPI
RegistrationTrigger_GetTypeInfo(IRegistrationTrigger
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
397 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
398 FIXME("(%p)->(%u %lu %p)\n", This
, index
, lcid
, info
);
402 static HRESULT WINAPI
RegistrationTrigger_GetIDsOfNames(IRegistrationTrigger
*iface
, REFIID riid
, LPOLESTR
*names
,
403 UINT count
, LCID lcid
, DISPID
*dispid
)
405 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
406 FIXME("(%p)->(%s %p %u %lu %p)\n", This
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
410 static HRESULT WINAPI
RegistrationTrigger_Invoke(IRegistrationTrigger
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
411 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
413 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
414 FIXME("(%p)->(%ld %s %lx %x %p %p %p %p)\n", This
, dispid
, debugstr_guid(riid
), lcid
, flags
,
415 params
, result
, excepinfo
, argerr
);
419 static HRESULT WINAPI
RegistrationTrigger_get_Type(IRegistrationTrigger
*iface
, TASK_TRIGGER_TYPE2
*type
)
421 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
422 FIXME("(%p)->(%p)\n", This
, type
);
426 static HRESULT WINAPI
RegistrationTrigger_get_Id(IRegistrationTrigger
*iface
, BSTR
*id
)
428 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
429 FIXME("(%p)->(%p)\n", This
, id
);
433 static HRESULT WINAPI
RegistrationTrigger_put_Id(IRegistrationTrigger
*iface
, BSTR id
)
435 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
436 FIXME("(%p)->(%s)\n", This
, debugstr_w(id
));
440 static HRESULT WINAPI
RegistrationTrigger_get_Repetition(IRegistrationTrigger
*iface
, IRepetitionPattern
**repeat
)
442 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
443 FIXME("(%p)->(%p)\n", This
, repeat
);
447 static HRESULT WINAPI
RegistrationTrigger_put_Repetition(IRegistrationTrigger
*iface
, IRepetitionPattern
*repeat
)
449 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
450 FIXME("(%p)->(%p)\n", This
, repeat
);
454 static HRESULT WINAPI
RegistrationTrigger_get_ExecutionTimeLimit(IRegistrationTrigger
*iface
, BSTR
*limit
)
456 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
457 FIXME("(%p)->(%p)\n", This
, limit
);
461 static HRESULT WINAPI
RegistrationTrigger_put_ExecutionTimeLimit(IRegistrationTrigger
*iface
, BSTR limit
)
463 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
464 FIXME("(%p)->(%s)\n", This
, debugstr_w(limit
));
468 static HRESULT WINAPI
RegistrationTrigger_get_StartBoundary(IRegistrationTrigger
*iface
, BSTR
*start
)
470 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
471 FIXME("(%p)->(%p)\n", This
, start
);
475 static HRESULT WINAPI
RegistrationTrigger_put_StartBoundary(IRegistrationTrigger
*iface
, BSTR start
)
477 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
478 FIXME("(%p)->(%s)\n", This
, debugstr_w(start
));
482 static HRESULT WINAPI
RegistrationTrigger_get_EndBoundary(IRegistrationTrigger
*iface
, BSTR
*end
)
484 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
485 FIXME("(%p)->(%p)\n", This
, end
);
489 static HRESULT WINAPI
RegistrationTrigger_put_EndBoundary(IRegistrationTrigger
*iface
, BSTR end
)
491 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
492 FIXME("(%p)->(%s)\n", This
, debugstr_w(end
));
496 static HRESULT WINAPI
RegistrationTrigger_get_Enabled(IRegistrationTrigger
*iface
, VARIANT_BOOL
*enabled
)
498 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
500 TRACE("(%p)->(%p)\n", This
, enabled
);
502 if (!enabled
) return E_POINTER
;
504 *enabled
= This
->enabled
? VARIANT_TRUE
: VARIANT_FALSE
;
508 static HRESULT WINAPI
RegistrationTrigger_put_Enabled(IRegistrationTrigger
*iface
, VARIANT_BOOL enabled
)
510 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
512 TRACE("(%p)->(%x)\n", This
, enabled
);
514 This
->enabled
= !!enabled
;
518 static HRESULT WINAPI
RegistrationTrigger_get_Delay(IRegistrationTrigger
*iface
, BSTR
*pDelay
)
520 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
521 FIXME("(%p)->(%p)\n", This
, pDelay
);
525 static HRESULT WINAPI
RegistrationTrigger_put_Delay(IRegistrationTrigger
*iface
, BSTR delay
)
527 RegistrationTrigger
*This
= impl_from_IRegistrationTrigger(iface
);
528 FIXME("(%p)->(%s)\n", This
, debugstr_w(delay
));
532 static const IRegistrationTriggerVtbl RegistrationTrigger_vtbl
= {
533 RegistrationTrigger_QueryInterface
,
534 RegistrationTrigger_AddRef
,
535 RegistrationTrigger_Release
,
536 RegistrationTrigger_GetTypeInfoCount
,
537 RegistrationTrigger_GetTypeInfo
,
538 RegistrationTrigger_GetIDsOfNames
,
539 RegistrationTrigger_Invoke
,
540 RegistrationTrigger_get_Type
,
541 RegistrationTrigger_get_Id
,
542 RegistrationTrigger_put_Id
,
543 RegistrationTrigger_get_Repetition
,
544 RegistrationTrigger_put_Repetition
,
545 RegistrationTrigger_get_ExecutionTimeLimit
,
546 RegistrationTrigger_put_ExecutionTimeLimit
,
547 RegistrationTrigger_get_StartBoundary
,
548 RegistrationTrigger_put_StartBoundary
,
549 RegistrationTrigger_get_EndBoundary
,
550 RegistrationTrigger_put_EndBoundary
,
551 RegistrationTrigger_get_Enabled
,
552 RegistrationTrigger_put_Enabled
,
553 RegistrationTrigger_get_Delay
,
554 RegistrationTrigger_put_Delay
557 static HRESULT
RegistrationTrigger_create(ITrigger
**trigger
)
559 RegistrationTrigger
*registration_trigger
;
561 registration_trigger
= malloc(sizeof(*registration_trigger
));
562 if (!registration_trigger
)
563 return E_OUTOFMEMORY
;
565 registration_trigger
->IRegistrationTrigger_iface
.lpVtbl
= &RegistrationTrigger_vtbl
;
566 registration_trigger
->ref
= 1;
567 registration_trigger
->enabled
= TRUE
;
569 *trigger
= (ITrigger
*)®istration_trigger
->IRegistrationTrigger_iface
;
575 ITriggerCollection ITriggerCollection_iface
;
577 } trigger_collection
;
579 static inline trigger_collection
*impl_from_ITriggerCollection(ITriggerCollection
*iface
)
581 return CONTAINING_RECORD(iface
, trigger_collection
, ITriggerCollection_iface
);
584 static HRESULT WINAPI
TriggerCollection_QueryInterface(ITriggerCollection
*iface
, REFIID riid
, void **ppv
)
586 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
588 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
590 if(IsEqualGUID(&IID_IUnknown
, riid
) ||
591 IsEqualGUID(&IID_IDispatch
, riid
) ||
592 IsEqualGUID(&IID_ITriggerCollection
, riid
)) {
593 *ppv
= &This
->ITriggerCollection_iface
;
595 FIXME("unimplemented interface %s\n", debugstr_guid(riid
));
597 return E_NOINTERFACE
;
600 IUnknown_AddRef((IUnknown
*)*ppv
);
604 static ULONG WINAPI
TriggerCollection_AddRef(ITriggerCollection
*iface
)
606 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
607 LONG ref
= InterlockedIncrement(&This
->ref
);
609 TRACE("(%p) ref=%ld\n", This
, ref
);
614 static ULONG WINAPI
TriggerCollection_Release(ITriggerCollection
*iface
)
616 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
617 LONG ref
= InterlockedDecrement(&This
->ref
);
619 TRACE("(%p) ref=%ld\n", This
, ref
);
627 static HRESULT WINAPI
TriggerCollection_GetTypeInfoCount(ITriggerCollection
*iface
, UINT
*count
)
629 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
630 FIXME("(%p)->(%p)\n", This
, count
);
634 static HRESULT WINAPI
TriggerCollection_GetTypeInfo(ITriggerCollection
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
636 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
637 FIXME("(%p)->(%u %lu %p)\n", This
, index
, lcid
, info
);
641 static HRESULT WINAPI
TriggerCollection_GetIDsOfNames(ITriggerCollection
*iface
, REFIID riid
, LPOLESTR
*names
,
642 UINT count
, LCID lcid
, DISPID
*dispid
)
644 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
645 FIXME("(%p)->(%s %p %u %lu %p)\n", This
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
649 static HRESULT WINAPI
TriggerCollection_Invoke(ITriggerCollection
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
650 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
652 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
653 FIXME("(%p)->(%ld %s %lx %x %p %p %p %p)\n", This
, dispid
, debugstr_guid(riid
), lcid
, flags
,
654 params
, result
, excepinfo
, argerr
);
658 static HRESULT WINAPI
TriggerCollection_get_Count(ITriggerCollection
*iface
, LONG
*count
)
660 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
661 FIXME("(%p)->(%p)\n", This
, count
);
665 static HRESULT WINAPI
TriggerCollection_get_Item(ITriggerCollection
*iface
, LONG index
, ITrigger
**trigger
)
667 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
668 FIXME("(%p)->(%ld %p)\n", This
, index
, trigger
);
672 static HRESULT WINAPI
TriggerCollection_get__NewEnum(ITriggerCollection
*iface
, IUnknown
**penum
)
674 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
675 FIXME("(%p)->(%p)\n", This
, penum
);
679 static HRESULT WINAPI
TriggerCollection_Create(ITriggerCollection
*iface
, TASK_TRIGGER_TYPE2 type
, ITrigger
**trigger
)
681 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
683 TRACE("(%p)->(%d %p)\n", This
, type
, trigger
);
686 case TASK_TRIGGER_DAILY
:
687 return DailyTrigger_create(trigger
);
688 case TASK_TRIGGER_REGISTRATION
:
689 return RegistrationTrigger_create(trigger
);
691 FIXME("Unimplemented type %d\n", type
);
698 static HRESULT WINAPI
TriggerCollection_Remove(ITriggerCollection
*iface
, VARIANT index
)
700 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
701 FIXME("(%p)->(%s)\n", This
, debugstr_variant(&index
));
705 static HRESULT WINAPI
TriggerCollection_Clear(ITriggerCollection
*iface
)
707 trigger_collection
*This
= impl_from_ITriggerCollection(iface
);
708 FIXME("(%p)\n", This
);
712 static const ITriggerCollectionVtbl TriggerCollection_vtbl
= {
713 TriggerCollection_QueryInterface
,
714 TriggerCollection_AddRef
,
715 TriggerCollection_Release
,
716 TriggerCollection_GetTypeInfoCount
,
717 TriggerCollection_GetTypeInfo
,
718 TriggerCollection_GetIDsOfNames
,
719 TriggerCollection_Invoke
,
720 TriggerCollection_get_Count
,
721 TriggerCollection_get_Item
,
722 TriggerCollection_get__NewEnum
,
723 TriggerCollection_Create
,
724 TriggerCollection_Remove
,
725 TriggerCollection_Clear
730 IRegistrationInfo IRegistrationInfo_iface
;
732 WCHAR
*description
, *author
, *version
, *date
, *documentation
, *uri
, *source
;
735 static inline registration_info
*impl_from_IRegistrationInfo(IRegistrationInfo
*iface
)
737 return CONTAINING_RECORD(iface
, registration_info
, IRegistrationInfo_iface
);
740 static ULONG WINAPI
RegistrationInfo_AddRef(IRegistrationInfo
*iface
)
742 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
743 return InterlockedIncrement(®info
->ref
);
746 static ULONG WINAPI
RegistrationInfo_Release(IRegistrationInfo
*iface
)
748 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
749 LONG ref
= InterlockedDecrement(®info
->ref
);
753 TRACE("destroying %p\n", iface
);
754 free(reginfo
->description
);
755 free(reginfo
->author
);
756 free(reginfo
->version
);
758 free(reginfo
->documentation
);
760 free(reginfo
->source
);
767 static HRESULT WINAPI
RegistrationInfo_QueryInterface(IRegistrationInfo
*iface
, REFIID riid
, void **obj
)
769 if (!riid
|| !obj
) return E_INVALIDARG
;
771 TRACE("%p,%s,%p\n", iface
, debugstr_guid(riid
), obj
);
773 if (IsEqualGUID(riid
, &IID_IRegistrationInfo
) ||
774 IsEqualGUID(riid
, &IID_IDispatch
) ||
775 IsEqualGUID(riid
, &IID_IUnknown
))
777 IRegistrationInfo_AddRef(iface
);
782 FIXME("interface %s is not implemented\n", debugstr_guid(riid
));
784 return E_NOINTERFACE
;
787 static HRESULT WINAPI
RegistrationInfo_GetTypeInfoCount(IRegistrationInfo
*iface
, UINT
*count
)
789 FIXME("%p,%p: stub\n", iface
, count
);
793 static HRESULT WINAPI
RegistrationInfo_GetTypeInfo(IRegistrationInfo
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
795 FIXME("%p,%u,%lu,%p: stub\n", iface
, index
, lcid
, info
);
799 static HRESULT WINAPI
RegistrationInfo_GetIDsOfNames(IRegistrationInfo
*iface
, REFIID riid
, LPOLESTR
*names
,
800 UINT count
, LCID lcid
, DISPID
*dispid
)
802 FIXME("%p,%s,%p,%u,%lu,%p: stub\n", iface
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
806 static HRESULT WINAPI
RegistrationInfo_Invoke(IRegistrationInfo
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
807 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
809 FIXME("%p,%ld,%s,%04lx,%04x,%p,%p,%p,%p: stub\n", iface
, dispid
, debugstr_guid(riid
), lcid
, flags
,
810 params
, result
, excepinfo
, argerr
);
814 static HRESULT WINAPI
RegistrationInfo_get_Description(IRegistrationInfo
*iface
, BSTR
*description
)
816 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
818 TRACE("%p,%p\n", iface
, description
);
820 if (!description
) return E_POINTER
;
822 if (!reginfo
->description
) *description
= NULL
;
823 else if (!(*description
= SysAllocString(reginfo
->description
))) return E_OUTOFMEMORY
;
828 static HRESULT WINAPI
RegistrationInfo_put_Description(IRegistrationInfo
*iface
, BSTR description
)
830 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
833 TRACE("%p,%s\n", iface
, debugstr_w(description
));
835 if (description
&& !(str
= wcsdup(description
))) return E_OUTOFMEMORY
;
836 free(reginfo
->description
);
837 reginfo
->description
= str
;
841 static HRESULT WINAPI
RegistrationInfo_get_Author(IRegistrationInfo
*iface
, BSTR
*author
)
843 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
845 TRACE("%p,%p\n", iface
, author
);
847 if (!author
) return E_POINTER
;
849 if (!reginfo
->author
) *author
= NULL
;
850 else if (!(*author
= SysAllocString(reginfo
->author
))) return E_OUTOFMEMORY
;
855 static HRESULT WINAPI
RegistrationInfo_put_Author(IRegistrationInfo
*iface
, BSTR author
)
857 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
860 TRACE("%p,%s\n", iface
, debugstr_w(author
));
862 if (author
&& !(str
= wcsdup(author
))) return E_OUTOFMEMORY
;
863 free(reginfo
->author
);
864 reginfo
->author
= str
;
868 static HRESULT WINAPI
RegistrationInfo_get_Version(IRegistrationInfo
*iface
, BSTR
*version
)
870 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
872 TRACE("%p,%p\n", iface
, version
);
874 if (!version
) return E_POINTER
;
876 if (!reginfo
->version
) *version
= NULL
;
877 else if (!(*version
= SysAllocString(reginfo
->version
))) return E_OUTOFMEMORY
;
882 static HRESULT WINAPI
RegistrationInfo_put_Version(IRegistrationInfo
*iface
, BSTR version
)
884 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
887 TRACE("%p,%s\n", iface
, debugstr_w(version
));
889 if (version
&& !(str
= wcsdup(version
))) return E_OUTOFMEMORY
;
890 free(reginfo
->version
);
891 reginfo
->version
= str
;
895 static HRESULT WINAPI
RegistrationInfo_get_Date(IRegistrationInfo
*iface
, BSTR
*date
)
897 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
899 TRACE("%p,%p\n", iface
, date
);
901 if (!date
) return E_POINTER
;
903 if (!reginfo
->date
) *date
= NULL
;
904 else if (!(*date
= SysAllocString(reginfo
->date
))) return E_OUTOFMEMORY
;
909 static HRESULT WINAPI
RegistrationInfo_put_Date(IRegistrationInfo
*iface
, BSTR date
)
911 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
914 TRACE("%p,%s\n", iface
, debugstr_w(date
));
916 if (date
&& !(str
= wcsdup(date
))) return E_OUTOFMEMORY
;
922 static HRESULT WINAPI
RegistrationInfo_get_Documentation(IRegistrationInfo
*iface
, BSTR
*doc
)
924 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
926 TRACE("%p,%p\n", iface
, doc
);
928 if (!doc
) return E_POINTER
;
930 if (!reginfo
->documentation
) *doc
= NULL
;
931 else if (!(*doc
= SysAllocString(reginfo
->documentation
))) return E_OUTOFMEMORY
;
936 static HRESULT WINAPI
RegistrationInfo_put_Documentation(IRegistrationInfo
*iface
, BSTR doc
)
938 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
941 TRACE("%p,%s\n", iface
, debugstr_w(doc
));
943 if (doc
&& !(str
= wcsdup(doc
))) return E_OUTOFMEMORY
;
944 free(reginfo
->documentation
);
945 reginfo
->documentation
= str
;
949 static HRESULT WINAPI
RegistrationInfo_get_XmlText(IRegistrationInfo
*iface
, BSTR
*xml
)
951 FIXME("%p,%p: stub\n", iface
, xml
);
955 static HRESULT WINAPI
RegistrationInfo_put_XmlText(IRegistrationInfo
*iface
, BSTR xml
)
957 FIXME("%p,%s: stub\n", iface
, debugstr_w(xml
));
961 static HRESULT WINAPI
RegistrationInfo_get_URI(IRegistrationInfo
*iface
, BSTR
*uri
)
963 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
965 TRACE("%p,%p\n", iface
, uri
);
967 if (!uri
) return E_POINTER
;
969 if (!reginfo
->uri
) *uri
= NULL
;
970 else if (!(*uri
= SysAllocString(reginfo
->uri
))) return E_OUTOFMEMORY
;
975 static HRESULT WINAPI
RegistrationInfo_put_URI(IRegistrationInfo
*iface
, BSTR uri
)
977 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
980 TRACE("%p,%s\n", iface
, debugstr_w(uri
));
982 if (uri
&& !(str
= wcsdup(uri
))) return E_OUTOFMEMORY
;
988 static HRESULT WINAPI
RegistrationInfo_get_SecurityDescriptor(IRegistrationInfo
*iface
, VARIANT
*sddl
)
990 FIXME("%p,%p: stub\n", iface
, sddl
);
994 static HRESULT WINAPI
RegistrationInfo_put_SecurityDescriptor(IRegistrationInfo
*iface
, VARIANT sddl
)
996 FIXME("%p,%s: stub\n", iface
, debugstr_variant(&sddl
));
1000 static HRESULT WINAPI
RegistrationInfo_get_Source(IRegistrationInfo
*iface
, BSTR
*source
)
1002 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
1004 TRACE("%p,%p\n", iface
, source
);
1006 if (!source
) return E_POINTER
;
1008 if (!reginfo
->source
) *source
= NULL
;
1009 else if (!(*source
= SysAllocString(reginfo
->source
))) return E_OUTOFMEMORY
;
1014 static HRESULT WINAPI
RegistrationInfo_put_Source(IRegistrationInfo
*iface
, BSTR source
)
1016 registration_info
*reginfo
= impl_from_IRegistrationInfo(iface
);
1019 TRACE("%p,%s\n", iface
, debugstr_w(source
));
1021 if (source
&& !(str
= wcsdup(source
))) return E_OUTOFMEMORY
;
1022 free(reginfo
->source
);
1023 reginfo
->source
= str
;
1027 static const IRegistrationInfoVtbl RegistrationInfo_vtbl
=
1029 RegistrationInfo_QueryInterface
,
1030 RegistrationInfo_AddRef
,
1031 RegistrationInfo_Release
,
1032 RegistrationInfo_GetTypeInfoCount
,
1033 RegistrationInfo_GetTypeInfo
,
1034 RegistrationInfo_GetIDsOfNames
,
1035 RegistrationInfo_Invoke
,
1036 RegistrationInfo_get_Description
,
1037 RegistrationInfo_put_Description
,
1038 RegistrationInfo_get_Author
,
1039 RegistrationInfo_put_Author
,
1040 RegistrationInfo_get_Version
,
1041 RegistrationInfo_put_Version
,
1042 RegistrationInfo_get_Date
,
1043 RegistrationInfo_put_Date
,
1044 RegistrationInfo_get_Documentation
,
1045 RegistrationInfo_put_Documentation
,
1046 RegistrationInfo_get_XmlText
,
1047 RegistrationInfo_put_XmlText
,
1048 RegistrationInfo_get_URI
,
1049 RegistrationInfo_put_URI
,
1050 RegistrationInfo_get_SecurityDescriptor
,
1051 RegistrationInfo_put_SecurityDescriptor
,
1052 RegistrationInfo_get_Source
,
1053 RegistrationInfo_put_Source
1056 static HRESULT
RegistrationInfo_create(IRegistrationInfo
**obj
)
1058 registration_info
*reginfo
;
1060 reginfo
= calloc(1, sizeof(*reginfo
));
1061 if (!reginfo
) return E_OUTOFMEMORY
;
1063 reginfo
->IRegistrationInfo_iface
.lpVtbl
= &RegistrationInfo_vtbl
;
1065 *obj
= ®info
->IRegistrationInfo_iface
;
1067 TRACE("created %p\n", *obj
);
1074 ITaskSettings ITaskSettings_iface
;
1076 WCHAR
*restart_interval
;
1077 WCHAR
*execution_time_limit
;
1078 WCHAR
*delete_expired_task_after
;
1081 TASK_INSTANCES_POLICY policy
;
1082 TASK_COMPATIBILITY compatibility
;
1083 BOOL allow_on_demand_start
;
1084 BOOL stop_if_going_on_batteries
;
1085 BOOL disallow_start_if_on_batteries
;
1086 BOOL allow_hard_terminate
;
1087 BOOL start_when_available
;
1088 BOOL run_only_if_network_available
;
1091 BOOL run_only_if_idle
;
1095 static inline TaskSettings
*impl_from_ITaskSettings(ITaskSettings
*iface
)
1097 return CONTAINING_RECORD(iface
, TaskSettings
, ITaskSettings_iface
);
1100 static ULONG WINAPI
TaskSettings_AddRef(ITaskSettings
*iface
)
1102 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1103 return InterlockedIncrement(&taskset
->ref
);
1106 static ULONG WINAPI
TaskSettings_Release(ITaskSettings
*iface
)
1108 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1109 LONG ref
= InterlockedDecrement(&taskset
->ref
);
1113 TRACE("destroying %p\n", iface
);
1114 free(taskset
->restart_interval
);
1115 free(taskset
->execution_time_limit
);
1116 free(taskset
->delete_expired_task_after
);
1123 static HRESULT WINAPI
TaskSettings_QueryInterface(ITaskSettings
*iface
, REFIID riid
, void **obj
)
1125 if (!riid
|| !obj
) return E_INVALIDARG
;
1127 TRACE("%p,%s,%p\n", iface
, debugstr_guid(riid
), obj
);
1129 if (IsEqualGUID(riid
, &IID_ITaskSettings
) ||
1130 IsEqualGUID(riid
, &IID_IDispatch
) ||
1131 IsEqualGUID(riid
, &IID_IUnknown
))
1133 ITaskSettings_AddRef(iface
);
1138 FIXME("interface %s is not implemented\n", debugstr_guid(riid
));
1140 return E_NOINTERFACE
;
1143 static HRESULT WINAPI
TaskSettings_GetTypeInfoCount(ITaskSettings
*iface
, UINT
*count
)
1145 FIXME("%p,%p: stub\n", iface
, count
);
1149 static HRESULT WINAPI
TaskSettings_GetTypeInfo(ITaskSettings
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
1151 FIXME("%p,%u,%lu,%p: stub\n", iface
, index
, lcid
, info
);
1155 static HRESULT WINAPI
TaskSettings_GetIDsOfNames(ITaskSettings
*iface
, REFIID riid
, LPOLESTR
*names
,
1156 UINT count
, LCID lcid
, DISPID
*dispid
)
1158 FIXME("%p,%s,%p,%u,%lu,%p: stub\n", iface
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
1162 static HRESULT WINAPI
TaskSettings_Invoke(ITaskSettings
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
1163 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
1165 FIXME("%p,%ld,%s,%04lx,%04x,%p,%p,%p,%p: stub\n", iface
, dispid
, debugstr_guid(riid
), lcid
, flags
,
1166 params
, result
, excepinfo
, argerr
);
1170 static HRESULT WINAPI
TaskSettings_get_AllowDemandStart(ITaskSettings
*iface
, VARIANT_BOOL
*allow
)
1172 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1174 TRACE("%p,%p\n", iface
, allow
);
1176 if (!allow
) return E_POINTER
;
1178 *allow
= taskset
->allow_on_demand_start
? VARIANT_TRUE
: VARIANT_FALSE
;
1183 static HRESULT WINAPI
TaskSettings_put_AllowDemandStart(ITaskSettings
*iface
, VARIANT_BOOL allow
)
1185 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1187 TRACE("%p,%d\n", iface
, allow
);
1189 taskset
->allow_on_demand_start
= !!allow
;
1194 static HRESULT WINAPI
TaskSettings_get_RestartInterval(ITaskSettings
*iface
, BSTR
*interval
)
1196 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1198 TRACE("%p,%p\n", iface
, interval
);
1200 if (!interval
) return E_POINTER
;
1202 if (!taskset
->restart_interval
)
1208 if (!taskset
->restart_interval
) *interval
= NULL
;
1209 else if (!(*interval
= SysAllocString(taskset
->restart_interval
))) return E_OUTOFMEMORY
;
1214 static HRESULT WINAPI
TaskSettings_put_RestartInterval(ITaskSettings
*iface
, BSTR interval
)
1216 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1219 TRACE("%p,%s\n", iface
, debugstr_w(interval
));
1221 if (interval
&& !(str
= wcsdup(interval
))) return E_OUTOFMEMORY
;
1222 free(taskset
->restart_interval
);
1223 taskset
->restart_interval
= str
;
1228 static HRESULT WINAPI
TaskSettings_get_RestartCount(ITaskSettings
*iface
, INT
*count
)
1230 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1232 TRACE("%p,%p\n", iface
, count
);
1234 if (!count
) return E_POINTER
;
1236 *count
= taskset
->restart_count
;
1241 static HRESULT WINAPI
TaskSettings_put_RestartCount(ITaskSettings
*iface
, INT count
)
1243 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1245 TRACE("%p,%d\n", iface
, count
);
1247 taskset
->restart_count
= count
;
1252 static HRESULT WINAPI
TaskSettings_get_MultipleInstances(ITaskSettings
*iface
, TASK_INSTANCES_POLICY
*policy
)
1254 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1256 TRACE("%p,%p\n", iface
, policy
);
1258 if (!policy
) return E_POINTER
;
1260 *policy
= taskset
->policy
;
1265 static HRESULT WINAPI
TaskSettings_put_MultipleInstances(ITaskSettings
*iface
, TASK_INSTANCES_POLICY policy
)
1267 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1269 TRACE("%p,%d\n", iface
, policy
);
1271 taskset
->policy
= policy
;
1276 static HRESULT WINAPI
TaskSettings_get_StopIfGoingOnBatteries(ITaskSettings
*iface
, VARIANT_BOOL
*stop
)
1278 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1280 TRACE("%p,%p\n", iface
, stop
);
1282 if (!stop
) return E_POINTER
;
1284 *stop
= taskset
->stop_if_going_on_batteries
? VARIANT_TRUE
: VARIANT_FALSE
;
1289 static HRESULT WINAPI
TaskSettings_put_StopIfGoingOnBatteries(ITaskSettings
*iface
, VARIANT_BOOL stop
)
1291 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1293 TRACE("%p,%d\n", iface
, stop
);
1295 taskset
->stop_if_going_on_batteries
= !!stop
;
1300 static HRESULT WINAPI
TaskSettings_get_DisallowStartIfOnBatteries(ITaskSettings
*iface
, VARIANT_BOOL
*disallow
)
1302 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1304 TRACE("%p,%p\n", iface
, disallow
);
1306 if (!disallow
) return E_POINTER
;
1308 *disallow
= taskset
->disallow_start_if_on_batteries
? VARIANT_TRUE
: VARIANT_FALSE
;
1313 static HRESULT WINAPI
TaskSettings_put_DisallowStartIfOnBatteries(ITaskSettings
*iface
, VARIANT_BOOL disallow
)
1315 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1317 TRACE("%p,%d\n", iface
, disallow
);
1319 taskset
->disallow_start_if_on_batteries
= !!disallow
;
1324 static HRESULT WINAPI
TaskSettings_get_AllowHardTerminate(ITaskSettings
*iface
, VARIANT_BOOL
*allow
)
1326 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1328 TRACE("%p,%p\n", iface
, allow
);
1330 if (!allow
) return E_POINTER
;
1332 *allow
= taskset
->allow_hard_terminate
? VARIANT_TRUE
: VARIANT_FALSE
;
1337 static HRESULT WINAPI
TaskSettings_put_AllowHardTerminate(ITaskSettings
*iface
, VARIANT_BOOL allow
)
1339 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1341 TRACE("%p,%d\n", iface
, allow
);
1343 taskset
->allow_hard_terminate
= !!allow
;
1348 static HRESULT WINAPI
TaskSettings_get_StartWhenAvailable(ITaskSettings
*iface
, VARIANT_BOOL
*start
)
1350 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1352 TRACE("%p,%p\n", iface
, start
);
1354 if (!start
) return E_POINTER
;
1356 *start
= taskset
->start_when_available
? VARIANT_TRUE
: VARIANT_FALSE
;
1361 static HRESULT WINAPI
TaskSettings_put_StartWhenAvailable(ITaskSettings
*iface
, VARIANT_BOOL start
)
1363 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1365 TRACE("%p,%d\n", iface
, start
);
1367 taskset
->start_when_available
= !!start
;
1372 static HRESULT WINAPI
TaskSettings_get_XmlText(ITaskSettings
*iface
, BSTR
*xml
)
1374 FIXME("%p,%p: stub\n", iface
, xml
);
1378 static HRESULT WINAPI
TaskSettings_put_XmlText(ITaskSettings
*iface
, BSTR xml
)
1380 FIXME("%p,%s: stub\n", iface
, debugstr_w(xml
));
1384 static HRESULT WINAPI
TaskSettings_get_RunOnlyIfNetworkAvailable(ITaskSettings
*iface
, VARIANT_BOOL
*run
)
1386 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1388 TRACE("%p,%p\n", iface
, run
);
1390 if (!run
) return E_POINTER
;
1392 *run
= taskset
->run_only_if_network_available
? VARIANT_TRUE
: VARIANT_FALSE
;
1397 static HRESULT WINAPI
TaskSettings_put_RunOnlyIfNetworkAvailable(ITaskSettings
*iface
, VARIANT_BOOL run
)
1399 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1401 TRACE("%p,%d\n", iface
, run
);
1403 taskset
->run_only_if_network_available
= !!run
;
1408 static HRESULT WINAPI
TaskSettings_get_ExecutionTimeLimit(ITaskSettings
*iface
, BSTR
*limit
)
1410 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1412 TRACE("%p,%p\n", iface
, limit
);
1414 if (!limit
) return E_POINTER
;
1416 if (!taskset
->execution_time_limit
)
1422 if (!taskset
->execution_time_limit
) *limit
= NULL
;
1423 else if (!(*limit
= SysAllocString(taskset
->execution_time_limit
))) return E_OUTOFMEMORY
;
1428 static HRESULT WINAPI
TaskSettings_put_ExecutionTimeLimit(ITaskSettings
*iface
, BSTR limit
)
1430 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1433 TRACE("%p,%s\n", iface
, debugstr_w(limit
));
1435 if (limit
&& !(str
= wcsdup(limit
))) return E_OUTOFMEMORY
;
1436 free(taskset
->execution_time_limit
);
1437 taskset
->execution_time_limit
= str
;
1442 static HRESULT WINAPI
TaskSettings_get_Enabled(ITaskSettings
*iface
, VARIANT_BOOL
*enabled
)
1444 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1446 TRACE("%p,%p\n", iface
, enabled
);
1448 if (!enabled
) return E_POINTER
;
1450 *enabled
= taskset
->enabled
? VARIANT_TRUE
: VARIANT_FALSE
;
1455 static HRESULT WINAPI
TaskSettings_put_Enabled(ITaskSettings
*iface
, VARIANT_BOOL enabled
)
1457 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1459 TRACE("%p,%d\n", iface
, enabled
);
1461 taskset
->enabled
= !!enabled
;
1466 static HRESULT WINAPI
TaskSettings_get_DeleteExpiredTaskAfter(ITaskSettings
*iface
, BSTR
*delay
)
1468 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1470 TRACE("%p,%p\n", iface
, delay
);
1472 if (!delay
) return E_POINTER
;
1474 if (!taskset
->delete_expired_task_after
) *delay
= NULL
;
1475 else if (!(*delay
= SysAllocString(taskset
->delete_expired_task_after
))) return E_OUTOFMEMORY
;
1480 static HRESULT WINAPI
TaskSettings_put_DeleteExpiredTaskAfter(ITaskSettings
*iface
, BSTR delay
)
1482 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1485 TRACE("%p,%s\n", iface
, debugstr_w(delay
));
1487 if (delay
&& !(str
= wcsdup(delay
))) return E_OUTOFMEMORY
;
1488 free(taskset
->delete_expired_task_after
);
1489 taskset
->delete_expired_task_after
= str
;
1494 static HRESULT WINAPI
TaskSettings_get_Priority(ITaskSettings
*iface
, INT
*priority
)
1496 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1498 TRACE("%p,%p\n", iface
, priority
);
1500 if (!priority
) return E_POINTER
;
1502 *priority
= taskset
->priority
;
1507 static HRESULT WINAPI
TaskSettings_put_Priority(ITaskSettings
*iface
, INT priority
)
1509 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1511 TRACE("%p,%d\n", iface
, priority
);
1513 taskset
->priority
= priority
;
1518 static HRESULT WINAPI
TaskSettings_get_Compatibility(ITaskSettings
*iface
, TASK_COMPATIBILITY
*level
)
1520 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1522 TRACE("%p,%p\n", iface
, level
);
1524 if (!level
) return E_POINTER
;
1526 *level
= taskset
->compatibility
;
1531 static HRESULT WINAPI
TaskSettings_put_Compatibility(ITaskSettings
*iface
, TASK_COMPATIBILITY level
)
1533 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1535 TRACE("%p,%d\n", iface
, level
);
1537 taskset
->compatibility
= level
;
1542 static HRESULT WINAPI
TaskSettings_get_Hidden(ITaskSettings
*iface
, VARIANT_BOOL
*hidden
)
1544 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1546 TRACE("%p,%p\n", iface
, hidden
);
1548 if (!hidden
) return E_POINTER
;
1550 *hidden
= taskset
->hidden
? VARIANT_TRUE
: VARIANT_FALSE
;
1555 static HRESULT WINAPI
TaskSettings_put_Hidden(ITaskSettings
*iface
, VARIANT_BOOL hidden
)
1557 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1559 TRACE("%p,%d\n", iface
, hidden
);
1561 taskset
->hidden
= !!hidden
;
1566 static HRESULT WINAPI
TaskSettings_get_IdleSettings(ITaskSettings
*iface
, IIdleSettings
**settings
)
1568 FIXME("%p,%p: stub\n", iface
, settings
);
1572 static HRESULT WINAPI
TaskSettings_put_IdleSettings(ITaskSettings
*iface
, IIdleSettings
*settings
)
1574 FIXME("%p,%p: stub\n", iface
, settings
);
1578 static HRESULT WINAPI
TaskSettings_get_RunOnlyIfIdle(ITaskSettings
*iface
, VARIANT_BOOL
*run
)
1580 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1582 TRACE("%p,%p\n", iface
, run
);
1584 if (!run
) return E_POINTER
;
1586 *run
= taskset
->run_only_if_idle
? VARIANT_TRUE
: VARIANT_FALSE
;
1591 static HRESULT WINAPI
TaskSettings_put_RunOnlyIfIdle(ITaskSettings
*iface
, VARIANT_BOOL run
)
1593 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1595 TRACE("%p,%d\n", iface
, run
);
1597 taskset
->run_only_if_idle
= !!run
;
1602 static HRESULT WINAPI
TaskSettings_get_WakeToRun(ITaskSettings
*iface
, VARIANT_BOOL
*wake
)
1604 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1606 TRACE("%p,%p\n", iface
, wake
);
1608 if (!wake
) return E_POINTER
;
1610 *wake
= taskset
->wake_to_run
? VARIANT_TRUE
: VARIANT_FALSE
;
1615 static HRESULT WINAPI
TaskSettings_put_WakeToRun(ITaskSettings
*iface
, VARIANT_BOOL wake
)
1617 TaskSettings
*taskset
= impl_from_ITaskSettings(iface
);
1619 TRACE("%p,%d\n", iface
, wake
);
1621 taskset
->wake_to_run
= !!wake
;
1626 static HRESULT WINAPI
TaskSettings_get_NetworkSettings(ITaskSettings
*iface
, INetworkSettings
**settings
)
1628 FIXME("%p,%p: stub\n", iface
, settings
);
1632 static HRESULT WINAPI
TaskSettings_put_NetworkSettings(ITaskSettings
*iface
, INetworkSettings
*settings
)
1634 FIXME("%p,%p: stub\n", iface
, settings
);
1638 static const ITaskSettingsVtbl TaskSettings_vtbl
=
1640 TaskSettings_QueryInterface
,
1641 TaskSettings_AddRef
,
1642 TaskSettings_Release
,
1643 TaskSettings_GetTypeInfoCount
,
1644 TaskSettings_GetTypeInfo
,
1645 TaskSettings_GetIDsOfNames
,
1646 TaskSettings_Invoke
,
1647 TaskSettings_get_AllowDemandStart
,
1648 TaskSettings_put_AllowDemandStart
,
1649 TaskSettings_get_RestartInterval
,
1650 TaskSettings_put_RestartInterval
,
1651 TaskSettings_get_RestartCount
,
1652 TaskSettings_put_RestartCount
,
1653 TaskSettings_get_MultipleInstances
,
1654 TaskSettings_put_MultipleInstances
,
1655 TaskSettings_get_StopIfGoingOnBatteries
,
1656 TaskSettings_put_StopIfGoingOnBatteries
,
1657 TaskSettings_get_DisallowStartIfOnBatteries
,
1658 TaskSettings_put_DisallowStartIfOnBatteries
,
1659 TaskSettings_get_AllowHardTerminate
,
1660 TaskSettings_put_AllowHardTerminate
,
1661 TaskSettings_get_StartWhenAvailable
,
1662 TaskSettings_put_StartWhenAvailable
,
1663 TaskSettings_get_XmlText
,
1664 TaskSettings_put_XmlText
,
1665 TaskSettings_get_RunOnlyIfNetworkAvailable
,
1666 TaskSettings_put_RunOnlyIfNetworkAvailable
,
1667 TaskSettings_get_ExecutionTimeLimit
,
1668 TaskSettings_put_ExecutionTimeLimit
,
1669 TaskSettings_get_Enabled
,
1670 TaskSettings_put_Enabled
,
1671 TaskSettings_get_DeleteExpiredTaskAfter
,
1672 TaskSettings_put_DeleteExpiredTaskAfter
,
1673 TaskSettings_get_Priority
,
1674 TaskSettings_put_Priority
,
1675 TaskSettings_get_Compatibility
,
1676 TaskSettings_put_Compatibility
,
1677 TaskSettings_get_Hidden
,
1678 TaskSettings_put_Hidden
,
1679 TaskSettings_get_IdleSettings
,
1680 TaskSettings_put_IdleSettings
,
1681 TaskSettings_get_RunOnlyIfIdle
,
1682 TaskSettings_put_RunOnlyIfIdle
,
1683 TaskSettings_get_WakeToRun
,
1684 TaskSettings_put_WakeToRun
,
1685 TaskSettings_get_NetworkSettings
,
1686 TaskSettings_put_NetworkSettings
1689 static HRESULT
TaskSettings_create(ITaskSettings
**obj
)
1691 TaskSettings
*taskset
;
1693 taskset
= malloc(sizeof(*taskset
));
1694 if (!taskset
) return E_OUTOFMEMORY
;
1696 taskset
->ITaskSettings_iface
.lpVtbl
= &TaskSettings_vtbl
;
1698 /* set the defaults */
1699 taskset
->restart_interval
= NULL
;
1700 taskset
->execution_time_limit
= wcsdup(L
"PT72H");
1701 taskset
->delete_expired_task_after
= NULL
;
1702 taskset
->restart_count
= 0;
1703 taskset
->priority
= 7;
1704 taskset
->policy
= TASK_INSTANCES_IGNORE_NEW
;
1705 taskset
->compatibility
= TASK_COMPATIBILITY_V2
;
1706 taskset
->allow_on_demand_start
= TRUE
;
1707 taskset
->stop_if_going_on_batteries
= TRUE
;
1708 taskset
->disallow_start_if_on_batteries
= TRUE
;
1709 taskset
->allow_hard_terminate
= TRUE
;
1710 taskset
->start_when_available
= FALSE
;
1711 taskset
->run_only_if_network_available
= FALSE
;
1712 taskset
->enabled
= TRUE
;
1713 taskset
->hidden
= FALSE
;
1714 taskset
->run_only_if_idle
= FALSE
;
1715 taskset
->wake_to_run
= FALSE
;
1717 *obj
= &taskset
->ITaskSettings_iface
;
1719 TRACE("created %p\n", *obj
);
1726 IPrincipal IPrincipal_iface
;
1730 static inline Principal
*impl_from_IPrincipal(IPrincipal
*iface
)
1732 return CONTAINING_RECORD(iface
, Principal
, IPrincipal_iface
);
1735 static ULONG WINAPI
Principal_AddRef(IPrincipal
*iface
)
1737 Principal
*principal
= impl_from_IPrincipal(iface
);
1738 return InterlockedIncrement(&principal
->ref
);
1741 static ULONG WINAPI
Principal_Release(IPrincipal
*iface
)
1743 Principal
*principal
= impl_from_IPrincipal(iface
);
1744 LONG ref
= InterlockedDecrement(&principal
->ref
);
1748 TRACE("destroying %p\n", iface
);
1755 static HRESULT WINAPI
Principal_QueryInterface(IPrincipal
*iface
, REFIID riid
, void **obj
)
1757 if (!riid
|| !obj
) return E_INVALIDARG
;
1759 TRACE("%p,%s,%p\n", iface
, debugstr_guid(riid
), obj
);
1761 if (IsEqualGUID(riid
, &IID_IPrincipal
) ||
1762 IsEqualGUID(riid
, &IID_IDispatch
) ||
1763 IsEqualGUID(riid
, &IID_IUnknown
))
1765 IPrincipal_AddRef(iface
);
1770 FIXME("interface %s is not implemented\n", debugstr_guid(riid
));
1772 return E_NOINTERFACE
;
1775 static HRESULT WINAPI
Principal_GetTypeInfoCount(IPrincipal
*iface
, UINT
*count
)
1777 FIXME("%p,%p: stub\n", iface
, count
);
1781 static HRESULT WINAPI
Principal_GetTypeInfo(IPrincipal
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
1783 FIXME("%p,%u,%lu,%p: stub\n", iface
, index
, lcid
, info
);
1787 static HRESULT WINAPI
Principal_GetIDsOfNames(IPrincipal
*iface
, REFIID riid
, LPOLESTR
*names
,
1788 UINT count
, LCID lcid
, DISPID
*dispid
)
1790 FIXME("%p,%s,%p,%u,%lu,%p: stub\n", iface
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
1794 static HRESULT WINAPI
Principal_Invoke(IPrincipal
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
1795 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
1797 FIXME("%p,%ld,%s,%04lx,%04x,%p,%p,%p,%p: stub\n", iface
, dispid
, debugstr_guid(riid
), lcid
, flags
,
1798 params
, result
, excepinfo
, argerr
);
1802 static HRESULT WINAPI
Principal_get_Id(IPrincipal
*iface
, BSTR
*id
)
1804 FIXME("%p,%p: stub\n", iface
, id
);
1808 static HRESULT WINAPI
Principal_put_Id(IPrincipal
*iface
, BSTR id
)
1810 FIXME("%p,%s: stub\n", iface
, debugstr_w(id
));
1814 static HRESULT WINAPI
Principal_get_DisplayName(IPrincipal
*iface
, BSTR
*name
)
1816 FIXME("%p,%p: stub\n", iface
, name
);
1820 static HRESULT WINAPI
Principal_put_DisplayName(IPrincipal
*iface
, BSTR name
)
1822 FIXME("%p,%s: stub\n", iface
, debugstr_w(name
));
1826 static HRESULT WINAPI
Principal_get_UserId(IPrincipal
*iface
, BSTR
*user_id
)
1828 FIXME("%p,%p: stub\n", iface
, user_id
);
1832 static HRESULT WINAPI
Principal_put_UserId(IPrincipal
*iface
, BSTR user_id
)
1834 FIXME("%p,%s: stub\n", iface
, debugstr_w(user_id
));
1838 static HRESULT WINAPI
Principal_get_LogonType(IPrincipal
*iface
, TASK_LOGON_TYPE
*logon_type
)
1840 FIXME("%p,%p: stub\n", iface
, logon_type
);
1844 static HRESULT WINAPI
Principal_put_LogonType(IPrincipal
*iface
, TASK_LOGON_TYPE logon_type
)
1846 FIXME("%p,%u: stub\n", iface
, logon_type
);
1850 static HRESULT WINAPI
Principal_get_GroupId(IPrincipal
*iface
, BSTR
*group_id
)
1852 FIXME("%p,%p: stub\n", iface
, group_id
);
1856 static HRESULT WINAPI
Principal_put_GroupId(IPrincipal
*iface
, BSTR group_id
)
1858 FIXME("%p,%s: stub\n", iface
, debugstr_w(group_id
));
1862 static HRESULT WINAPI
Principal_get_RunLevel(IPrincipal
*iface
, TASK_RUNLEVEL_TYPE
*run_level
)
1864 FIXME("%p,%p: stub\n", iface
, run_level
);
1868 static HRESULT WINAPI
Principal_put_RunLevel(IPrincipal
*iface
, TASK_RUNLEVEL_TYPE run_level
)
1870 FIXME("%p,%u: stub\n", iface
, run_level
);
1874 static const IPrincipalVtbl Principal_vtbl
=
1876 Principal_QueryInterface
,
1879 Principal_GetTypeInfoCount
,
1880 Principal_GetTypeInfo
,
1881 Principal_GetIDsOfNames
,
1885 Principal_get_DisplayName
,
1886 Principal_put_DisplayName
,
1887 Principal_get_UserId
,
1888 Principal_put_UserId
,
1889 Principal_get_LogonType
,
1890 Principal_put_LogonType
,
1891 Principal_get_GroupId
,
1892 Principal_put_GroupId
,
1893 Principal_get_RunLevel
,
1894 Principal_put_RunLevel
1897 static HRESULT
Principal_create(IPrincipal
**obj
)
1899 Principal
*principal
;
1901 principal
= malloc(sizeof(*principal
));
1902 if (!principal
) return E_OUTOFMEMORY
;
1904 principal
->IPrincipal_iface
.lpVtbl
= &Principal_vtbl
;
1907 *obj
= &principal
->IPrincipal_iface
;
1909 TRACE("created %p\n", *obj
);
1916 IExecAction IExecAction_iface
;
1924 static inline ExecAction
*impl_from_IExecAction(IExecAction
*iface
)
1926 return CONTAINING_RECORD(iface
, ExecAction
, IExecAction_iface
);
1929 static ULONG WINAPI
ExecAction_AddRef(IExecAction
*iface
)
1931 ExecAction
*action
= impl_from_IExecAction(iface
);
1932 return InterlockedIncrement(&action
->ref
);
1935 static ULONG WINAPI
ExecAction_Release(IExecAction
*iface
)
1937 ExecAction
*action
= impl_from_IExecAction(iface
);
1938 LONG ref
= InterlockedDecrement(&action
->ref
);
1942 TRACE("destroying %p\n", iface
);
1944 free(action
->directory
);
1953 static HRESULT WINAPI
ExecAction_QueryInterface(IExecAction
*iface
, REFIID riid
, void **obj
)
1955 if (!riid
|| !obj
) return E_INVALIDARG
;
1957 TRACE("%p,%s,%p\n", iface
, debugstr_guid(riid
), obj
);
1959 if (IsEqualGUID(riid
, &IID_IExecAction
) ||
1960 IsEqualGUID(riid
, &IID_IAction
) ||
1961 IsEqualGUID(riid
, &IID_IDispatch
) ||
1962 IsEqualGUID(riid
, &IID_IUnknown
))
1964 IExecAction_AddRef(iface
);
1969 FIXME("interface %s is not implemented\n", debugstr_guid(riid
));
1971 return E_NOINTERFACE
;
1974 static HRESULT WINAPI
ExecAction_GetTypeInfoCount(IExecAction
*iface
, UINT
*count
)
1976 FIXME("%p,%p: stub\n", iface
, count
);
1980 static HRESULT WINAPI
ExecAction_GetTypeInfo(IExecAction
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
1982 FIXME("%p,%u,%lu,%p: stub\n", iface
, index
, lcid
, info
);
1986 static HRESULT WINAPI
ExecAction_GetIDsOfNames(IExecAction
*iface
, REFIID riid
, LPOLESTR
*names
,
1987 UINT count
, LCID lcid
, DISPID
*dispid
)
1989 FIXME("%p,%s,%p,%u,%lu,%p: stub\n", iface
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
1993 static HRESULT WINAPI
ExecAction_Invoke(IExecAction
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
1994 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
1996 FIXME("%p,%ld,%s,%04lx,%04x,%p,%p,%p,%p: stub\n", iface
, dispid
, debugstr_guid(riid
), lcid
, flags
,
1997 params
, result
, excepinfo
, argerr
);
2001 static HRESULT WINAPI
ExecAction_get_Id(IExecAction
*iface
, BSTR
*id
)
2003 ExecAction
*action
= impl_from_IExecAction(iface
);
2005 TRACE("%p,%p\n", iface
, id
);
2007 if (!id
) return E_POINTER
;
2009 if (!action
->id
) *id
= NULL
;
2010 else if (!(*id
= SysAllocString(action
->id
))) return E_OUTOFMEMORY
;
2015 static HRESULT WINAPI
ExecAction_put_Id(IExecAction
*iface
, BSTR id
)
2017 ExecAction
*action
= impl_from_IExecAction(iface
);
2020 TRACE("%p,%s\n", iface
, debugstr_w(id
));
2022 if (id
&& !(str
= wcsdup((id
)))) return E_OUTOFMEMORY
;
2029 static HRESULT WINAPI
ExecAction_get_Type(IExecAction
*iface
, TASK_ACTION_TYPE
*type
)
2031 TRACE("%p,%p\n", iface
, type
);
2033 if (!type
) return E_POINTER
;
2035 *type
= TASK_ACTION_EXEC
;
2040 static HRESULT WINAPI
ExecAction_get_Path(IExecAction
*iface
, BSTR
*path
)
2042 ExecAction
*action
= impl_from_IExecAction(iface
);
2044 TRACE("%p,%p\n", iface
, path
);
2046 if (!path
) return E_POINTER
;
2048 if (!action
->path
) *path
= NULL
;
2049 else if (!(*path
= SysAllocString(action
->path
))) return E_OUTOFMEMORY
;
2054 static HRESULT WINAPI
ExecAction_put_Path(IExecAction
*iface
, BSTR path
)
2056 ExecAction
*action
= impl_from_IExecAction(iface
);
2059 TRACE("%p,%s\n", iface
, debugstr_w(path
));
2061 if (path
&& !(str
= wcsdup((path
)))) return E_OUTOFMEMORY
;
2068 static HRESULT WINAPI
ExecAction_get_Arguments(IExecAction
*iface
, BSTR
*arguments
)
2070 ExecAction
*action
= impl_from_IExecAction(iface
);
2072 TRACE("%p,%p\n", iface
, arguments
);
2074 if (!arguments
) return E_POINTER
;
2076 if (!action
->args
) *arguments
= NULL
;
2077 else if (!(*arguments
= SysAllocString(action
->args
))) return E_OUTOFMEMORY
;
2082 static HRESULT WINAPI
ExecAction_put_Arguments(IExecAction
*iface
, BSTR arguments
)
2084 ExecAction
*action
= impl_from_IExecAction(iface
);
2087 TRACE("%p,%s\n", iface
, debugstr_w(arguments
));
2089 if (arguments
&& !(str
= wcsdup((arguments
)))) return E_OUTOFMEMORY
;
2096 static HRESULT WINAPI
ExecAction_get_WorkingDirectory(IExecAction
*iface
, BSTR
*directory
)
2098 ExecAction
*action
= impl_from_IExecAction(iface
);
2100 TRACE("%p,%p\n", iface
, directory
);
2102 if (!directory
) return E_POINTER
;
2104 if (!action
->directory
) *directory
= NULL
;
2105 else if (!(*directory
= SysAllocString(action
->directory
))) return E_OUTOFMEMORY
;
2110 static HRESULT WINAPI
ExecAction_put_WorkingDirectory(IExecAction
*iface
, BSTR directory
)
2112 ExecAction
*action
= impl_from_IExecAction(iface
);
2115 TRACE("%p,%s\n", iface
, debugstr_w(directory
));
2117 if (directory
&& !(str
= wcsdup((directory
)))) return E_OUTOFMEMORY
;
2118 free(action
->directory
);
2119 action
->directory
= str
;
2124 static const IExecActionVtbl Action_vtbl
=
2126 ExecAction_QueryInterface
,
2129 ExecAction_GetTypeInfoCount
,
2130 ExecAction_GetTypeInfo
,
2131 ExecAction_GetIDsOfNames
,
2135 ExecAction_get_Type
,
2136 ExecAction_get_Path
,
2137 ExecAction_put_Path
,
2138 ExecAction_get_Arguments
,
2139 ExecAction_put_Arguments
,
2140 ExecAction_get_WorkingDirectory
,
2141 ExecAction_put_WorkingDirectory
2144 static HRESULT
ExecAction_create(IExecAction
**obj
)
2148 action
= malloc(sizeof(*action
));
2149 if (!action
) return E_OUTOFMEMORY
;
2151 action
->IExecAction_iface
.lpVtbl
= &Action_vtbl
;
2153 action
->path
= NULL
;
2154 action
->directory
= NULL
;
2155 action
->args
= NULL
;
2158 *obj
= &action
->IExecAction_iface
;
2160 TRACE("created %p\n", *obj
);
2167 IActionCollection IActionCollection_iface
;
2171 static inline Actions
*impl_from_IActionCollection(IActionCollection
*iface
)
2173 return CONTAINING_RECORD(iface
, Actions
, IActionCollection_iface
);
2176 static ULONG WINAPI
Actions_AddRef(IActionCollection
*iface
)
2178 Actions
*actions
= impl_from_IActionCollection(iface
);
2179 return InterlockedIncrement(&actions
->ref
);
2182 static ULONG WINAPI
Actions_Release(IActionCollection
*iface
)
2184 Actions
*actions
= impl_from_IActionCollection(iface
);
2185 LONG ref
= InterlockedDecrement(&actions
->ref
);
2189 TRACE("destroying %p\n", iface
);
2196 static HRESULT WINAPI
Actions_QueryInterface(IActionCollection
*iface
, REFIID riid
, void **obj
)
2198 if (!riid
|| !obj
) return E_INVALIDARG
;
2200 TRACE("%p,%s,%p\n", iface
, debugstr_guid(riid
), obj
);
2202 if (IsEqualGUID(riid
, &IID_IActionCollection
) ||
2203 IsEqualGUID(riid
, &IID_IDispatch
) ||
2204 IsEqualGUID(riid
, &IID_IUnknown
))
2206 IActionCollection_AddRef(iface
);
2211 FIXME("interface %s is not implemented\n", debugstr_guid(riid
));
2213 return E_NOINTERFACE
;
2216 static HRESULT WINAPI
Actions_GetTypeInfoCount(IActionCollection
*iface
, UINT
*count
)
2218 FIXME("%p,%p: stub\n", iface
, count
);
2222 static HRESULT WINAPI
Actions_GetTypeInfo(IActionCollection
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
2224 FIXME("%p,%u,%lu,%p: stub\n", iface
, index
, lcid
, info
);
2228 static HRESULT WINAPI
Actions_GetIDsOfNames(IActionCollection
*iface
, REFIID riid
, LPOLESTR
*names
,
2229 UINT count
, LCID lcid
, DISPID
*dispid
)
2231 FIXME("%p,%s,%p,%u,%lu,%p: stub\n", iface
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
2235 static HRESULT WINAPI
Actions_Invoke(IActionCollection
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
2236 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
2238 FIXME("%p,%ld,%s,%04lx,%04x,%p,%p,%p,%p: stub\n", iface
, dispid
, debugstr_guid(riid
), lcid
, flags
,
2239 params
, result
, excepinfo
, argerr
);
2243 static HRESULT WINAPI
Actions_get_Count(IActionCollection
*iface
, LONG
*count
)
2245 FIXME("%p,%p: stub\n", iface
, count
);
2249 static HRESULT WINAPI
Actions_get_Item(IActionCollection
*iface
, LONG index
, IAction
**action
)
2251 FIXME("%p,%ld,%p: stub\n", iface
, index
, action
);
2255 static HRESULT WINAPI
Actions_get__NewEnum(IActionCollection
*iface
, IUnknown
**penum
)
2257 FIXME("%p,%p: stub\n", iface
, penum
);
2261 static HRESULT WINAPI
Actions_get_XmlText(IActionCollection
*iface
, BSTR
*xml
)
2263 FIXME("%p,%p: stub\n", iface
, xml
);
2267 static HRESULT WINAPI
Actions_put_XmlText(IActionCollection
*iface
, BSTR xml
)
2269 FIXME("%p,%s: stub\n", iface
, debugstr_w(xml
));
2273 static HRESULT WINAPI
Actions_Create(IActionCollection
*iface
, TASK_ACTION_TYPE type
, IAction
**action
)
2275 TRACE("%p,%u,%p\n", iface
, type
, action
);
2279 case TASK_ACTION_EXEC
:
2280 return ExecAction_create((IExecAction
**)action
);
2283 FIXME("unimplemented type %u\n", type
);
2288 static HRESULT WINAPI
Actions_Remove(IActionCollection
*iface
, VARIANT index
)
2290 FIXME("%p,%s: stub\n", iface
, debugstr_variant(&index
));
2294 static HRESULT WINAPI
Actions_Clear(IActionCollection
*iface
)
2296 FIXME("%p: stub\n", iface
);
2300 static HRESULT WINAPI
Actions_get_Context(IActionCollection
*iface
, BSTR
*ctx
)
2302 FIXME("%p,%p: stub\n", iface
, ctx
);
2306 static HRESULT WINAPI
Actions_put_Context(IActionCollection
*iface
, BSTR ctx
)
2308 FIXME("%p,%s: stub\n", iface
, debugstr_w(ctx
));
2312 static const IActionCollectionVtbl Actions_vtbl
=
2314 Actions_QueryInterface
,
2317 Actions_GetTypeInfoCount
,
2318 Actions_GetTypeInfo
,
2319 Actions_GetIDsOfNames
,
2323 Actions_get__NewEnum
,
2324 Actions_get_XmlText
,
2325 Actions_put_XmlText
,
2329 Actions_get_Context
,
2333 static HRESULT
Actions_create(IActionCollection
**obj
)
2337 actions
= malloc(sizeof(*actions
));
2338 if (!actions
) return E_OUTOFMEMORY
;
2340 actions
->IActionCollection_iface
.lpVtbl
= &Actions_vtbl
;
2343 *obj
= &actions
->IActionCollection_iface
;
2345 TRACE("created %p\n", *obj
);
2352 ITaskDefinition ITaskDefinition_iface
;
2354 IRegistrationInfo
*reginfo
;
2355 ITaskSettings
*taskset
;
2356 ITriggerCollection
*triggers
;
2357 IPrincipal
*principal
;
2358 IActionCollection
*actions
;
2361 static inline TaskDefinition
*impl_from_ITaskDefinition(ITaskDefinition
*iface
)
2363 return CONTAINING_RECORD(iface
, TaskDefinition
, ITaskDefinition_iface
);
2366 static ULONG WINAPI
TaskDefinition_AddRef(ITaskDefinition
*iface
)
2368 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2369 return InterlockedIncrement(&taskdef
->ref
);
2372 static ULONG WINAPI
TaskDefinition_Release(ITaskDefinition
*iface
)
2374 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2375 LONG ref
= InterlockedDecrement(&taskdef
->ref
);
2379 TRACE("destroying %p\n", iface
);
2381 if (taskdef
->reginfo
)
2382 IRegistrationInfo_Release(taskdef
->reginfo
);
2383 if (taskdef
->taskset
)
2384 ITaskSettings_Release(taskdef
->taskset
);
2385 if (taskdef
->triggers
)
2386 ITriggerCollection_Release(taskdef
->triggers
);
2387 if (taskdef
->principal
)
2388 IPrincipal_Release(taskdef
->principal
);
2389 if (taskdef
->actions
)
2390 IActionCollection_Release(taskdef
->actions
);
2398 static HRESULT WINAPI
TaskDefinition_QueryInterface(ITaskDefinition
*iface
, REFIID riid
, void **obj
)
2400 if (!riid
|| !obj
) return E_INVALIDARG
;
2402 TRACE("%p,%s,%p\n", iface
, debugstr_guid(riid
), obj
);
2404 if (IsEqualGUID(riid
, &IID_ITaskDefinition
) ||
2405 IsEqualGUID(riid
, &IID_IDispatch
) ||
2406 IsEqualGUID(riid
, &IID_IUnknown
))
2408 ITaskDefinition_AddRef(iface
);
2413 FIXME("interface %s is not implemented\n", debugstr_guid(riid
));
2415 return E_NOINTERFACE
;
2418 static HRESULT WINAPI
TaskDefinition_GetTypeInfoCount(ITaskDefinition
*iface
, UINT
*count
)
2420 FIXME("%p,%p: stub\n", iface
, count
);
2424 static HRESULT WINAPI
TaskDefinition_GetTypeInfo(ITaskDefinition
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
2426 FIXME("%p,%u,%lu,%p: stub\n", iface
, index
, lcid
, info
);
2430 static HRESULT WINAPI
TaskDefinition_GetIDsOfNames(ITaskDefinition
*iface
, REFIID riid
, LPOLESTR
*names
,
2431 UINT count
, LCID lcid
, DISPID
*dispid
)
2433 FIXME("%p,%s,%p,%u,%lu,%p: stub\n", iface
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
2437 static HRESULT WINAPI
TaskDefinition_Invoke(ITaskDefinition
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
2438 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
2440 FIXME("%p,%ld,%s,%04lx,%04x,%p,%p,%p,%p: stub\n", iface
, dispid
, debugstr_guid(riid
), lcid
, flags
,
2441 params
, result
, excepinfo
, argerr
);
2445 static HRESULT WINAPI
TaskDefinition_get_RegistrationInfo(ITaskDefinition
*iface
, IRegistrationInfo
**info
)
2447 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2450 TRACE("%p,%p\n", iface
, info
);
2452 if (!info
) return E_POINTER
;
2454 if (!taskdef
->reginfo
)
2456 hr
= RegistrationInfo_create(&taskdef
->reginfo
);
2457 if (hr
!= S_OK
) return hr
;
2460 IRegistrationInfo_AddRef(taskdef
->reginfo
);
2461 *info
= taskdef
->reginfo
;
2466 static HRESULT WINAPI
TaskDefinition_put_RegistrationInfo(ITaskDefinition
*iface
, IRegistrationInfo
*info
)
2468 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2470 TRACE("%p,%p\n", iface
, info
);
2472 if (!info
) return E_POINTER
;
2474 if (taskdef
->reginfo
)
2475 IRegistrationInfo_Release(taskdef
->reginfo
);
2477 IRegistrationInfo_AddRef(info
);
2478 taskdef
->reginfo
= info
;
2483 static HRESULT WINAPI
TaskDefinition_get_Triggers(ITaskDefinition
*iface
, ITriggerCollection
**triggers
)
2485 TaskDefinition
*This
= impl_from_ITaskDefinition(iface
);
2487 TRACE("%p,%p\n", This
, triggers
);
2489 if (!This
->triggers
)
2491 trigger_collection
*collection
;
2493 collection
= malloc(sizeof(*collection
));
2494 if (!collection
) return E_OUTOFMEMORY
;
2496 collection
->ITriggerCollection_iface
.lpVtbl
= &TriggerCollection_vtbl
;
2497 collection
->ref
= 1;
2498 This
->triggers
= &collection
->ITriggerCollection_iface
;
2501 ITriggerCollection_AddRef(*triggers
= This
->triggers
);
2505 static HRESULT WINAPI
TaskDefinition_put_Triggers(ITaskDefinition
*iface
, ITriggerCollection
*triggers
)
2507 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2509 TRACE("%p,%p\n", iface
, triggers
);
2511 if (!triggers
) return E_POINTER
;
2513 if (taskdef
->triggers
)
2514 ITriggerCollection_Release(taskdef
->triggers
);
2516 ITriggerCollection_AddRef(triggers
);
2517 taskdef
->triggers
= triggers
;
2522 static HRESULT WINAPI
TaskDefinition_get_Settings(ITaskDefinition
*iface
, ITaskSettings
**settings
)
2524 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2527 TRACE("%p,%p\n", iface
, settings
);
2529 if (!settings
) return E_POINTER
;
2531 if (!taskdef
->taskset
)
2533 hr
= TaskSettings_create(&taskdef
->taskset
);
2534 if (hr
!= S_OK
) return hr
;
2537 ITaskSettings_AddRef(taskdef
->taskset
);
2538 *settings
= taskdef
->taskset
;
2543 static HRESULT WINAPI
TaskDefinition_put_Settings(ITaskDefinition
*iface
, ITaskSettings
*settings
)
2545 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2547 TRACE("%p,%p\n", iface
, settings
);
2549 if (!settings
) return E_POINTER
;
2551 if (taskdef
->taskset
)
2552 ITaskSettings_Release(taskdef
->taskset
);
2554 ITaskSettings_AddRef(settings
);
2555 taskdef
->taskset
= settings
;
2560 static HRESULT WINAPI
TaskDefinition_get_Data(ITaskDefinition
*iface
, BSTR
*data
)
2562 FIXME("%p,%p: stub\n", iface
, data
);
2566 static HRESULT WINAPI
TaskDefinition_put_Data(ITaskDefinition
*iface
, BSTR data
)
2568 FIXME("%p,%p: stub\n", iface
, data
);
2572 static HRESULT WINAPI
TaskDefinition_get_Principal(ITaskDefinition
*iface
, IPrincipal
**principal
)
2574 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2577 TRACE("%p,%p\n", iface
, principal
);
2579 if (!principal
) return E_POINTER
;
2581 if (!taskdef
->principal
)
2583 hr
= Principal_create(&taskdef
->principal
);
2584 if (hr
!= S_OK
) return hr
;
2587 IPrincipal_AddRef(taskdef
->principal
);
2588 *principal
= taskdef
->principal
;
2593 static HRESULT WINAPI
TaskDefinition_put_Principal(ITaskDefinition
*iface
, IPrincipal
*principal
)
2595 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2597 TRACE("%p,%p\n", iface
, principal
);
2599 if (!principal
) return E_POINTER
;
2601 if (taskdef
->principal
)
2602 IPrincipal_Release(taskdef
->principal
);
2604 IPrincipal_AddRef(principal
);
2605 taskdef
->principal
= principal
;
2610 static HRESULT WINAPI
TaskDefinition_get_Actions(ITaskDefinition
*iface
, IActionCollection
**actions
)
2612 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2615 TRACE("%p,%p\n", iface
, actions
);
2617 if (!actions
) return E_POINTER
;
2619 if (!taskdef
->actions
)
2621 hr
= Actions_create(&taskdef
->actions
);
2622 if (hr
!= S_OK
) return hr
;
2625 IActionCollection_AddRef(taskdef
->actions
);
2626 *actions
= taskdef
->actions
;
2631 static HRESULT WINAPI
TaskDefinition_put_Actions(ITaskDefinition
*iface
, IActionCollection
*actions
)
2633 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
2635 TRACE("%p,%p\n", iface
, actions
);
2637 if (!actions
) return E_POINTER
;
2639 if (taskdef
->actions
)
2640 IActionCollection_Release(taskdef
->actions
);
2642 IActionCollection_AddRef(actions
);
2643 taskdef
->actions
= actions
;
2648 static int xml_indent
;
2650 static inline void push_indent(void)
2655 static inline void pop_indent(void)
2660 static inline HRESULT
write_stringW(IStream
*stream
, const WCHAR
*str
)
2662 return IStream_Write(stream
, str
, lstrlenW(str
) * sizeof(WCHAR
), NULL
);
2665 static void write_indent(IStream
*stream
)
2668 for (i
= 0; i
< xml_indent
; i
+= 2)
2669 write_stringW(stream
, L
" ");
2672 static inline HRESULT
write_empty_element(IStream
*stream
, const WCHAR
*name
)
2674 write_indent(stream
);
2675 write_stringW(stream
, L
"<");
2676 write_stringW(stream
, name
);
2677 return write_stringW(stream
, L
"/>\n");
2680 static inline HRESULT
write_element(IStream
*stream
, const WCHAR
*name
)
2682 write_indent(stream
);
2683 write_stringW(stream
, L
"<");
2684 write_stringW(stream
, name
);
2685 return write_stringW(stream
, L
">\n");
2688 static inline HRESULT
write_element_end(IStream
*stream
, const WCHAR
*name
)
2690 write_indent(stream
);
2691 write_stringW(stream
, L
"</");
2692 write_stringW(stream
, name
);
2693 return write_stringW(stream
, L
">\n");
2696 static inline HRESULT
write_text_value(IStream
*stream
, const WCHAR
*name
, const WCHAR
*value
)
2698 write_indent(stream
);
2699 write_stringW(stream
, L
"<");
2700 write_stringW(stream
, name
);
2701 write_stringW(stream
, L
">");
2702 write_stringW(stream
, value
);
2703 write_stringW(stream
, L
"</");
2704 write_stringW(stream
, name
);
2705 return write_stringW(stream
, L
">\n");
2708 static HRESULT
write_bool_value(IStream
*stream
, const WCHAR
*name
, VARIANT_BOOL value
)
2710 return write_text_value(stream
, name
, value
? L
"true" : L
"false");
2713 static HRESULT
write_int_value(IStream
*stream
, const WCHAR
*name
, int val
)
2717 swprintf(s
, ARRAY_SIZE(s
), L
"%d", val
);
2718 return write_text_value(stream
, name
, s
);
2721 static HRESULT
write_task_attributes(IStream
*stream
, ITaskDefinition
*taskdef
)
2724 ITaskSettings
*taskset
;
2725 TASK_COMPATIBILITY level
;
2726 const WCHAR
*compatibility
;
2728 hr
= ITaskDefinition_get_Settings(taskdef
, &taskset
);
2729 if (hr
!= S_OK
) return hr
;
2731 hr
= ITaskSettings_get_Compatibility(taskset
, &level
);
2732 if (hr
!= S_OK
) level
= TASK_COMPATIBILITY_V2_1
;
2734 ITaskSettings_Release(taskset
);
2738 case TASK_COMPATIBILITY_AT
:
2739 compatibility
= L
"1.0";
2741 case TASK_COMPATIBILITY_V1
:
2742 compatibility
= L
"1.1";
2744 case TASK_COMPATIBILITY_V2
:
2745 compatibility
= L
"1.2";
2748 compatibility
= L
"1.3";
2752 write_stringW(stream
, L
"<Task version=\"");
2753 write_stringW(stream
, compatibility
);
2754 write_stringW(stream
, L
"\" xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">");
2755 return write_stringW(stream
, L
"\n");
2758 static HRESULT
write_registration_info(IStream
*stream
, IRegistrationInfo
*reginfo
)
2765 return write_empty_element(stream
, L
"RegistrationInfo");
2767 hr
= write_element(stream
, L
"RegistrationInfo");
2768 if (hr
!= S_OK
) return hr
;
2772 hr
= IRegistrationInfo_get_Source(reginfo
, &bstr
);
2773 if (hr
== S_OK
&& bstr
)
2775 hr
= write_text_value(stream
, L
"Source", bstr
);
2776 SysFreeString(bstr
);
2777 if (hr
!= S_OK
) return hr
;
2779 hr
= IRegistrationInfo_get_Date(reginfo
, &bstr
);
2780 if (hr
== S_OK
&& bstr
)
2782 hr
= write_text_value(stream
, L
"Date", bstr
);
2783 SysFreeString(bstr
);
2784 if (hr
!= S_OK
) return hr
;
2786 hr
= IRegistrationInfo_get_Author(reginfo
, &bstr
);
2787 if (hr
== S_OK
&& bstr
)
2789 hr
= write_text_value(stream
, L
"Author", bstr
);
2790 SysFreeString(bstr
);
2791 if (hr
!= S_OK
) return hr
;
2793 hr
= IRegistrationInfo_get_Version(reginfo
, &bstr
);
2794 if (hr
== S_OK
&& bstr
)
2796 hr
= write_text_value(stream
, L
"Version", bstr
);
2797 SysFreeString(bstr
);
2798 if (hr
!= S_OK
) return hr
;
2800 hr
= IRegistrationInfo_get_Description(reginfo
, &bstr
);
2801 if (hr
== S_OK
&& bstr
)
2803 hr
= write_text_value(stream
, L
"Description", bstr
);
2804 SysFreeString(bstr
);
2805 if (hr
!= S_OK
) return hr
;
2807 hr
= IRegistrationInfo_get_Documentation(reginfo
, &bstr
);
2808 if (hr
== S_OK
&& bstr
)
2810 hr
= write_text_value(stream
, L
"Documentation", bstr
);
2811 SysFreeString(bstr
);
2812 if (hr
!= S_OK
) return hr
;
2814 hr
= IRegistrationInfo_get_URI(reginfo
, &bstr
);
2815 if (hr
== S_OK
&& bstr
)
2817 hr
= write_text_value(stream
, L
"URI", bstr
);
2818 SysFreeString(bstr
);
2819 if (hr
!= S_OK
) return hr
;
2821 hr
= IRegistrationInfo_get_SecurityDescriptor(reginfo
, &var
);
2824 if (V_VT(&var
) == VT_BSTR
)
2826 hr
= write_text_value(stream
, L
"SecurityDescriptor", V_BSTR(&var
));
2828 if (hr
!= S_OK
) return hr
;
2831 FIXME("SecurityInfo variant type %d is not supported\n", V_VT(&var
));
2836 return write_element_end(stream
, L
"RegistrationInfo");
2839 static HRESULT
write_principal(IStream
*stream
, IPrincipal
*principal
)
2843 TASK_LOGON_TYPE logon
;
2844 TASK_RUNLEVEL_TYPE level
;
2847 return write_empty_element(stream
, L
"Principals");
2849 hr
= write_element(stream
, L
"Principals");
2850 if (hr
!= S_OK
) return hr
;
2854 hr
= IPrincipal_get_Id(principal
, &bstr
);
2857 write_indent(stream
);
2858 write_stringW(stream
, L
"<Principal id=\"");
2859 write_stringW(stream
, bstr
);
2860 write_stringW(stream
, L
"\">\n");
2861 SysFreeString(bstr
);
2864 write_element(stream
, L
"Principal");
2868 hr
= IPrincipal_get_GroupId(principal
, &bstr
);
2871 hr
= write_text_value(stream
, L
"GroupId", bstr
);
2872 SysFreeString(bstr
);
2873 if (hr
!= S_OK
) return hr
;
2875 hr
= IPrincipal_get_DisplayName(principal
, &bstr
);
2878 hr
= write_text_value(stream
, L
"DisplayName", bstr
);
2879 SysFreeString(bstr
);
2880 if (hr
!= S_OK
) return hr
;
2882 hr
= IPrincipal_get_UserId(principal
, &bstr
);
2883 if (hr
== S_OK
&& lstrlenW(bstr
))
2885 hr
= write_text_value(stream
, L
"UserId", bstr
);
2886 SysFreeString(bstr
);
2887 if (hr
!= S_OK
) return hr
;
2889 hr
= IPrincipal_get_RunLevel(principal
, &level
);
2892 const WCHAR
*level_str
= NULL
;
2896 case TASK_RUNLEVEL_HIGHEST
:
2897 level_str
= L
"HighestAvailable";
2899 case TASK_RUNLEVEL_LUA
:
2900 level_str
= L
"LeastPrivilege";
2903 FIXME("Principal run level %d\n", level
);
2909 hr
= write_text_value(stream
, L
"RunLevel", level_str
);
2910 if (hr
!= S_OK
) return hr
;
2913 hr
= IPrincipal_get_LogonType(principal
, &logon
);
2916 const WCHAR
*logon_str
= NULL
;
2920 case TASK_LOGON_PASSWORD
:
2921 logon_str
= L
"Password";
2923 case TASK_LOGON_S4U
:
2926 case TASK_LOGON_INTERACTIVE_TOKEN
:
2927 logon_str
= L
"InteractiveToken";
2930 FIXME("Principal logon type %d\n", logon
);
2936 hr
= write_text_value(stream
, L
"LogonType", logon_str
);
2937 if (hr
!= S_OK
) return hr
;
2942 write_element_end(stream
, L
"Principal");
2945 return write_element_end(stream
, L
"Principals");
2948 const WCHAR
*string_from_instances_policy(TASK_INSTANCES_POLICY policy
)
2952 case TASK_INSTANCES_PARALLEL
: return L
"Parallel";
2953 case TASK_INSTANCES_QUEUE
: return L
"Queue";
2954 case TASK_INSTANCES_IGNORE_NEW
: return L
"IgnoreNew";
2955 case TASK_INSTANCES_STOP_EXISTING
: return L
"StopExisting";
2960 static HRESULT
write_settings(IStream
*stream
, ITaskSettings
*settings
)
2962 INetworkSettings
*network_settings
;
2963 TASK_INSTANCES_POLICY policy
;
2964 IIdleSettings
*idle_settings
;
2971 return write_empty_element(stream
, L
"Settings");
2973 if (FAILED(hr
= write_element(stream
, L
"Settings")))
2978 #define WRITE_BOOL_OPTION(name) \
2980 if (FAILED(hr = ITaskSettings_get_##name(settings, &bval))) \
2982 if (FAILED(hr = write_bool_value(stream, L ## #name, bval))) \
2987 if (FAILED(hr
= ITaskSettings_get_AllowDemandStart(settings
, &bval
)))
2989 if (FAILED(hr
= write_bool_value(stream
, L
"AllowStartOnDemand", bval
)))
2992 if (SUCCEEDED(hr
= TaskSettings_get_RestartInterval(settings
, &s
)) && s
)
2994 FIXME("RestartInterval not handled.\n");
2997 if (FAILED(hr
= ITaskSettings_get_MultipleInstances(settings
, &policy
)))
2999 if (FAILED(hr
= write_text_value(stream
, L
"MultipleInstancesPolicy", string_from_instances_policy(policy
))))
3002 WRITE_BOOL_OPTION(DisallowStartIfOnBatteries
);
3003 WRITE_BOOL_OPTION(StopIfGoingOnBatteries
);
3004 WRITE_BOOL_OPTION(AllowHardTerminate
);
3005 WRITE_BOOL_OPTION(StartWhenAvailable
);
3006 WRITE_BOOL_OPTION(RunOnlyIfNetworkAvailable
);
3007 WRITE_BOOL_OPTION(WakeToRun
);
3008 WRITE_BOOL_OPTION(Enabled
);
3009 WRITE_BOOL_OPTION(Hidden
);
3011 if (SUCCEEDED(hr
= TaskSettings_get_DeleteExpiredTaskAfter(settings
, &s
)) && s
)
3013 hr
= write_text_value(stream
, L
"DeleteExpiredTaskAfter", s
);
3018 if (SUCCEEDED(hr
= TaskSettings_get_IdleSettings(settings
, &idle_settings
)))
3020 FIXME("IdleSettings not handled.\n");
3021 IIdleSettings_Release(idle_settings
);
3023 if (SUCCEEDED(hr
= TaskSettings_get_NetworkSettings(settings
, &network_settings
)))
3025 FIXME("NetworkSettings not handled.\n");
3026 INetworkSettings_Release(network_settings
);
3028 if (SUCCEEDED(hr
= TaskSettings_get_ExecutionTimeLimit(settings
, &s
)) && s
)
3030 hr
= write_text_value(stream
, L
"ExecutionTimeLimit", s
);
3035 if (FAILED(hr
= ITaskSettings_get_Priority(settings
, &ival
)))
3037 if (FAILED(hr
= write_int_value(stream
, L
"Priority", ival
)))
3040 WRITE_BOOL_OPTION(RunOnlyIfIdle
);
3041 #undef WRITE_BOOL_OPTION
3044 write_element_end(stream
, L
"Settings");
3049 static HRESULT
write_triggers(IStream
*stream
, ITriggerCollection
*triggers
)
3052 return write_empty_element(stream
, L
"Triggers");
3058 static HRESULT
write_actions(IStream
*stream
, IActionCollection
*actions
)
3062 write_element(stream
, L
"Actions");
3064 write_empty_element(stream
, L
"Exec");
3066 return write_element_end(stream
, L
"Actions");
3073 static HRESULT WINAPI
TaskDefinition_get_XmlText(ITaskDefinition
*iface
, BSTR
*xml
)
3075 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
3081 TRACE("%p,%p\n", iface
, xml
);
3083 hmem
= GlobalAlloc(GMEM_MOVEABLE
| GMEM_NODISCARD
, 16);
3084 if (!hmem
) return E_OUTOFMEMORY
;
3086 hr
= CreateStreamOnHGlobal(hmem
, TRUE
, &stream
);
3093 hr
= write_task_attributes(stream
, &taskdef
->ITaskDefinition_iface
);
3094 if (hr
!= S_OK
) goto failed
;
3098 hr
= write_registration_info(stream
, taskdef
->reginfo
);
3099 if (hr
!= S_OK
) goto failed
;
3101 hr
= write_triggers(stream
, taskdef
->triggers
);
3102 if (hr
!= S_OK
) goto failed
;
3104 hr
= write_principal(stream
, taskdef
->principal
);
3105 if (hr
!= S_OK
) goto failed
;
3107 hr
= write_settings(stream
, taskdef
->taskset
);
3108 if (hr
!= S_OK
) goto failed
;
3110 hr
= write_actions(stream
, taskdef
->actions
);
3111 if (hr
!= S_OK
) goto failed
;
3115 write_element_end(stream
, L
"Task");
3116 IStream_Write(stream
, "\0\0", 2, NULL
);
3118 p
= GlobalLock(hmem
);
3119 *xml
= SysAllocString(p
);
3122 IStream_Release(stream
);
3124 return *xml
? S_OK
: E_OUTOFMEMORY
;
3127 IStream_Release(stream
);
3131 static HRESULT
read_text_value(IXmlReader
*reader
, WCHAR
**value
)
3136 while (IXmlReader_Read(reader
, &type
) == S_OK
)
3140 case XmlNodeType_Text
:
3141 hr
= IXmlReader_GetValue(reader
, (const WCHAR
**)value
, NULL
);
3142 if (hr
!= S_OK
) return hr
;
3143 TRACE("%s\n", debugstr_w(*value
));
3146 case XmlNodeType_Whitespace
:
3147 case XmlNodeType_Comment
:
3151 FIXME("unexpected node type %d\n", type
);
3159 static HRESULT
read_variantbool_value(IXmlReader
*reader
, VARIANT_BOOL
*vbool
)
3164 hr
= read_text_value(reader
, &value
);
3165 if (hr
!= S_OK
) return hr
;
3167 if (!lstrcmpW(value
, L
"true"))
3168 *vbool
= VARIANT_TRUE
;
3169 else if (!lstrcmpW(value
, L
"false"))
3170 *vbool
= VARIANT_FALSE
;
3173 WARN("unexpected bool value %s\n", debugstr_w(value
));
3174 return SCHED_E_INVALIDVALUE
;
3180 static HRESULT
read_int_value(IXmlReader
*reader
, int *int_val
)
3185 hr
= read_text_value(reader
, &value
);
3186 if (hr
!= S_OK
) return hr
;
3188 *int_val
= wcstol(value
, NULL
, 10);
3193 static HRESULT
read_triggers(IXmlReader
*reader
, ITaskDefinition
*taskdef
)
3199 static HRESULT
read_principal_attributes(IXmlReader
*reader
, IPrincipal
*principal
)
3205 hr
= IXmlReader_MoveToFirstAttribute(reader
);
3209 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3210 if (hr
!= S_OK
) break;
3212 hr
= IXmlReader_GetValue(reader
, &value
, NULL
);
3213 if (hr
!= S_OK
) break;
3215 TRACE("%s=%s\n", debugstr_w(name
), debugstr_w(value
));
3217 if (!lstrcmpW(name
, L
"id"))
3218 IPrincipal_put_Id(principal
, (BSTR
)value
);
3220 FIXME("unhandled Principal attribute %s\n", debugstr_w(name
));
3222 hr
= IXmlReader_MoveToNextAttribute(reader
);
3228 static HRESULT
read_principal(IXmlReader
*reader
, IPrincipal
*principal
)
3235 if (IXmlReader_IsEmptyElement(reader
))
3237 TRACE("Principal is empty\n");
3241 read_principal_attributes(reader
, principal
);
3243 while (IXmlReader_Read(reader
, &type
) == S_OK
)
3247 case XmlNodeType_EndElement
:
3248 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3249 if (hr
!= S_OK
) return hr
;
3251 TRACE("/%s\n", debugstr_w(name
));
3253 if (!lstrcmpW(name
, L
"Principal"))
3258 case XmlNodeType_Element
:
3259 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3260 if (hr
!= S_OK
) return hr
;
3262 TRACE("Element: %s\n", debugstr_w(name
));
3264 if (!lstrcmpW(name
, L
"UserId"))
3266 hr
= read_text_value(reader
, &value
);
3268 IPrincipal_put_UserId(principal
, value
);
3270 else if (!lstrcmpW(name
, L
"LogonType"))
3272 hr
= read_text_value(reader
, &value
);
3275 TASK_LOGON_TYPE logon
= TASK_LOGON_NONE
;
3277 if (!lstrcmpW(value
, L
"InteractiveToken"))
3278 logon
= TASK_LOGON_INTERACTIVE_TOKEN
;
3280 FIXME("unhandled LogonType %s\n", debugstr_w(value
));
3282 IPrincipal_put_LogonType(principal
, logon
);
3285 else if (!lstrcmpW(name
, L
"RunLevel"))
3287 hr
= read_text_value(reader
, &value
);
3290 TASK_RUNLEVEL_TYPE level
= TASK_RUNLEVEL_LUA
;
3292 if (!lstrcmpW(value
, L
"LeastPrivilege"))
3293 level
= TASK_RUNLEVEL_LUA
;
3295 FIXME("unhandled RunLevel %s\n", debugstr_w(value
));
3297 IPrincipal_put_RunLevel(principal
, level
);
3301 FIXME("unhandled Principal element %s\n", debugstr_w(name
));
3305 case XmlNodeType_Whitespace
:
3306 case XmlNodeType_Comment
:
3310 FIXME("unhandled Principal node type %d\n", type
);
3315 WARN("Principal was not terminated\n");
3319 static HRESULT
read_principals(IXmlReader
*reader
, ITaskDefinition
*taskdef
)
3325 if (IXmlReader_IsEmptyElement(reader
))
3327 TRACE("Principals is empty\n");
3331 while (IXmlReader_Read(reader
, &type
) == S_OK
)
3335 case XmlNodeType_EndElement
:
3336 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3337 if (hr
!= S_OK
) return hr
;
3339 TRACE("/%s\n", debugstr_w(name
));
3341 if (!lstrcmpW(name
, L
"Principals"))
3346 case XmlNodeType_Element
:
3347 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3348 if (hr
!= S_OK
) return hr
;
3350 TRACE("Element: %s\n", debugstr_w(name
));
3352 if (!lstrcmpW(name
, L
"Principal"))
3354 IPrincipal
*principal
;
3356 hr
= ITaskDefinition_get_Principal(taskdef
, &principal
);
3357 if (hr
!= S_OK
) return hr
;
3358 hr
= read_principal(reader
, principal
);
3359 IPrincipal_Release(principal
);
3362 FIXME("unhandled Principals element %s\n", debugstr_w(name
));
3366 case XmlNodeType_Whitespace
:
3367 case XmlNodeType_Comment
:
3371 FIXME("unhandled Principals node type %d\n", type
);
3376 WARN("Principals was not terminated\n");
3380 static HRESULT
read_actions(IXmlReader
*reader
, ITaskDefinition
*taskdef
)
3386 static HRESULT
read_idle_settings(IXmlReader
*reader
, ITaskSettings
*taskset
)
3392 static HRESULT
read_settings(IXmlReader
*reader
, ITaskSettings
*taskset
)
3398 VARIANT_BOOL bool_val
;
3401 if (IXmlReader_IsEmptyElement(reader
))
3403 TRACE("Settings is empty\n");
3407 while (IXmlReader_Read(reader
, &type
) == S_OK
)
3411 case XmlNodeType_EndElement
:
3412 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3413 if (hr
!= S_OK
) return hr
;
3415 TRACE("/%s\n", debugstr_w(name
));
3417 if (!lstrcmpW(name
, L
"Settings"))
3422 case XmlNodeType_Element
:
3423 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3424 if (hr
!= S_OK
) return hr
;
3426 TRACE("Element: %s\n", debugstr_w(name
));
3428 if (!lstrcmpW(name
, L
"MultipleInstancesPolicy"))
3430 hr
= read_text_value(reader
, &value
);
3433 int_val
= TASK_INSTANCES_IGNORE_NEW
;
3435 if (!lstrcmpW(value
, L
"IgnoreNew"))
3436 int_val
= TASK_INSTANCES_IGNORE_NEW
;
3438 FIXME("unhandled MultipleInstancesPolicy %s\n", debugstr_w(value
));
3440 ITaskSettings_put_MultipleInstances(taskset
, int_val
);
3443 else if (!lstrcmpW(name
, L
"DisallowStartIfOnBatteries"))
3445 hr
= read_variantbool_value(reader
, &bool_val
);
3446 if (hr
!= S_OK
) return hr
;
3447 ITaskSettings_put_DisallowStartIfOnBatteries(taskset
, bool_val
);
3449 else if (!lstrcmpW(name
, L
"AllowStartOnDemand"))
3451 hr
= read_variantbool_value(reader
, &bool_val
);
3452 if (hr
!= S_OK
) return hr
;
3453 ITaskSettings_put_AllowDemandStart(taskset
, bool_val
);
3455 else if (!lstrcmpW(name
, L
"StopIfGoingOnBatteries"))
3457 hr
= read_variantbool_value(reader
, &bool_val
);
3458 if (hr
!= S_OK
) return hr
;
3459 ITaskSettings_put_StopIfGoingOnBatteries(taskset
, bool_val
);
3461 else if (!lstrcmpW(name
, L
"AllowHardTerminate"))
3463 hr
= read_variantbool_value(reader
, &bool_val
);
3464 if (hr
!= S_OK
) return hr
;
3465 ITaskSettings_put_AllowHardTerminate(taskset
, bool_val
);
3467 else if (!lstrcmpW(name
, L
"StartWhenAvailable"))
3469 hr
= read_variantbool_value(reader
, &bool_val
);
3470 if (hr
!= S_OK
) return hr
;
3471 ITaskSettings_put_StartWhenAvailable(taskset
, bool_val
);
3473 else if (!lstrcmpW(name
, L
"RunOnlyIfNetworkAvailable"))
3475 hr
= read_variantbool_value(reader
, &bool_val
);
3476 if (hr
!= S_OK
) return hr
;
3477 ITaskSettings_put_RunOnlyIfNetworkAvailable(taskset
, bool_val
);
3479 else if (!lstrcmpW(name
, L
"Enabled"))
3481 hr
= read_variantbool_value(reader
, &bool_val
);
3482 if (hr
!= S_OK
) return hr
;
3483 ITaskSettings_put_Enabled(taskset
, bool_val
);
3485 else if (!lstrcmpW(name
, L
"Hidden"))
3487 hr
= read_variantbool_value(reader
, &bool_val
);
3488 if (hr
!= S_OK
) return hr
;
3489 ITaskSettings_put_Hidden(taskset
, bool_val
);
3491 else if (!lstrcmpW(name
, L
"RunOnlyIfIdle"))
3493 hr
= read_variantbool_value(reader
, &bool_val
);
3494 if (hr
!= S_OK
) return hr
;
3495 ITaskSettings_put_RunOnlyIfIdle(taskset
, bool_val
);
3497 else if (!lstrcmpW(name
, L
"WakeToRun"))
3499 hr
= read_variantbool_value(reader
, &bool_val
);
3500 if (hr
!= S_OK
) return hr
;
3501 ITaskSettings_put_WakeToRun(taskset
, bool_val
);
3503 else if (!lstrcmpW(name
, L
"ExecutionTimeLimit"))
3505 hr
= read_text_value(reader
, &value
);
3507 ITaskSettings_put_ExecutionTimeLimit(taskset
, value
);
3509 else if (!lstrcmpW(name
, L
"Priority"))
3511 hr
= read_int_value(reader
, &int_val
);
3513 ITaskSettings_put_Priority(taskset
, int_val
);
3515 else if (!lstrcmpW(name
, L
"IdleSettings"))
3517 hr
= read_idle_settings(reader
, taskset
);
3518 if (hr
!= S_OK
) return hr
;
3521 FIXME("unhandled Settings element %s\n", debugstr_w(name
));
3525 case XmlNodeType_Whitespace
:
3526 case XmlNodeType_Comment
:
3530 FIXME("unhandled Settings node type %d\n", type
);
3535 WARN("Settings was not terminated\n");
3536 return SCHED_E_MALFORMEDXML
;
3539 static HRESULT
read_registration_info(IXmlReader
*reader
, IRegistrationInfo
*info
)
3546 if (IXmlReader_IsEmptyElement(reader
))
3548 TRACE("RegistrationInfo is empty\n");
3552 while (IXmlReader_Read(reader
, &type
) == S_OK
)
3556 case XmlNodeType_EndElement
:
3557 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3558 if (hr
!= S_OK
) return hr
;
3560 TRACE("/%s\n", debugstr_w(name
));
3562 if (!lstrcmpW(name
, L
"RegistrationInfo"))
3567 case XmlNodeType_Element
:
3568 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3569 if (hr
!= S_OK
) return hr
;
3571 TRACE("Element: %s\n", debugstr_w(name
));
3573 if (!lstrcmpW(name
, L
"Author"))
3575 hr
= read_text_value(reader
, &value
);
3577 IRegistrationInfo_put_Author(info
, value
);
3579 else if (!lstrcmpW(name
, L
"Description"))
3581 hr
= read_text_value(reader
, &value
);
3583 IRegistrationInfo_put_Description(info
, value
);
3585 else if (!lstrcmpW(name
, L
"Version"))
3587 hr
= read_text_value(reader
, &value
);
3589 IRegistrationInfo_put_Version(info
, value
);
3591 else if (!lstrcmpW(name
, L
"Date"))
3593 hr
= read_text_value(reader
, &value
);
3595 IRegistrationInfo_put_Date(info
, value
);
3597 else if (!lstrcmpW(name
, L
"Documentation"))
3599 hr
= read_text_value(reader
, &value
);
3601 IRegistrationInfo_put_Documentation(info
, value
);
3603 else if (!lstrcmpW(name
, L
"URI"))
3605 hr
= read_text_value(reader
, &value
);
3607 IRegistrationInfo_put_URI(info
, value
);
3609 else if (!lstrcmpW(name
, L
"Source"))
3611 hr
= read_text_value(reader
, &value
);
3613 IRegistrationInfo_put_Source(info
, value
);
3616 FIXME("unhandled RegistrationInfo element %s\n", debugstr_w(name
));
3620 case XmlNodeType_Whitespace
:
3621 case XmlNodeType_Comment
:
3625 FIXME("unhandled RegistrationInfo node type %d\n", type
);
3630 WARN("RegistrationInfo was not terminated\n");
3631 return SCHED_E_MALFORMEDXML
;
3634 static HRESULT
read_task_attributes(IXmlReader
*reader
, ITaskDefinition
*taskdef
)
3637 ITaskSettings
*taskset
;
3640 BOOL xmlns_ok
= FALSE
;
3644 hr
= ITaskDefinition_get_Settings(taskdef
, &taskset
);
3645 if (hr
!= S_OK
) return hr
;
3647 hr
= IXmlReader_MoveToFirstAttribute(reader
);
3651 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3652 if (hr
!= S_OK
) break;
3654 hr
= IXmlReader_GetValue(reader
, &value
, NULL
);
3655 if (hr
!= S_OK
) break;
3657 TRACE("%s=%s\n", debugstr_w(name
), debugstr_w(value
));
3659 if (!lstrcmpW(name
, L
"version"))
3661 TASK_COMPATIBILITY compatibility
= TASK_COMPATIBILITY_V2
;
3663 if (!lstrcmpW(value
, L
"1.0"))
3664 compatibility
= TASK_COMPATIBILITY_AT
;
3665 else if (!lstrcmpW(value
, L
"1.1"))
3666 compatibility
= TASK_COMPATIBILITY_V1
;
3667 else if (!lstrcmpW(value
, L
"1.2"))
3668 compatibility
= TASK_COMPATIBILITY_V2
;
3669 else if (!lstrcmpW(value
, L
"1.3"))
3670 compatibility
= TASK_COMPATIBILITY_V2_1
;
3672 FIXME("unknown version %s\n", debugstr_w(value
));
3674 ITaskSettings_put_Compatibility(taskset
, compatibility
);
3676 else if (!lstrcmpW(name
, L
"xmlns"))
3678 if (lstrcmpW(value
, L
"http://schemas.microsoft.com/windows/2004/02/mit/task"))
3680 FIXME("unknown namespace %s\n", debugstr_w(value
));
3686 FIXME("unhandled Task attribute %s\n", debugstr_w(name
));
3688 hr
= IXmlReader_MoveToNextAttribute(reader
);
3691 ITaskSettings_Release(taskset
);
3692 return xmlns_ok
? S_OK
: SCHED_E_NAMESPACE
;
3695 static HRESULT
read_task(IXmlReader
*reader
, ITaskDefinition
*taskdef
)
3701 if (IXmlReader_IsEmptyElement(reader
))
3703 TRACE("Task is empty\n");
3707 while (IXmlReader_Read(reader
, &type
) == S_OK
)
3711 case XmlNodeType_EndElement
:
3712 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3713 if (hr
!= S_OK
) return hr
;
3715 TRACE("/%s\n", debugstr_w(name
));
3717 if (!lstrcmpW(name
, L
"Task"))
3722 case XmlNodeType_Element
:
3723 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3724 if (hr
!= S_OK
) return hr
;
3726 TRACE("Element: %s\n", debugstr_w(name
));
3728 if (!lstrcmpW(name
, L
"RegistrationInfo"))
3730 IRegistrationInfo
*info
;
3732 hr
= ITaskDefinition_get_RegistrationInfo(taskdef
, &info
);
3733 if (hr
!= S_OK
) return hr
;
3734 hr
= read_registration_info(reader
, info
);
3735 IRegistrationInfo_Release(info
);
3737 else if (!lstrcmpW(name
, L
"Settings"))
3739 ITaskSettings
*taskset
;
3741 hr
= ITaskDefinition_get_Settings(taskdef
, &taskset
);
3742 if (hr
!= S_OK
) return hr
;
3743 hr
= read_settings(reader
, taskset
);
3744 ITaskSettings_Release(taskset
);
3746 else if (!lstrcmpW(name
, L
"Triggers"))
3747 hr
= read_triggers(reader
, taskdef
);
3748 else if (!lstrcmpW(name
, L
"Principals"))
3749 hr
= read_principals(reader
, taskdef
);
3750 else if (!lstrcmpW(name
, L
"Actions"))
3751 hr
= read_actions(reader
, taskdef
);
3753 FIXME("unhandled Task element %s\n", debugstr_w(name
));
3755 if (hr
!= S_OK
) return hr
;
3758 case XmlNodeType_Comment
:
3759 case XmlNodeType_Whitespace
:
3763 FIXME("unhandled Task node type %d\n", type
);
3768 WARN("Task was not terminated\n");
3769 return SCHED_E_MALFORMEDXML
;
3772 static HRESULT
read_xml(IXmlReader
*reader
, ITaskDefinition
*taskdef
)
3778 while (IXmlReader_Read(reader
, &type
) == S_OK
)
3782 case XmlNodeType_XmlDeclaration
:
3783 TRACE("XmlDeclaration\n");
3786 case XmlNodeType_Element
:
3787 hr
= IXmlReader_GetLocalName(reader
, &name
, NULL
);
3788 if (hr
!= S_OK
) return hr
;
3790 TRACE("Element: %s\n", debugstr_w(name
));
3792 if (!lstrcmpW(name
, L
"Task"))
3794 hr
= read_task_attributes(reader
, taskdef
);
3795 if (hr
!= S_OK
) return hr
;
3797 return read_task(reader
, taskdef
);
3800 FIXME("unhandled XML element %s\n", debugstr_w(name
));
3804 case XmlNodeType_Comment
:
3805 case XmlNodeType_Whitespace
:
3809 FIXME("unhandled XML node type %d\n", type
);
3814 WARN("Task definition was not found\n");
3815 return SCHED_E_MALFORMEDXML
;
3818 static HRESULT WINAPI
TaskDefinition_put_XmlText(ITaskDefinition
*iface
, BSTR xml
)
3820 TaskDefinition
*taskdef
= impl_from_ITaskDefinition(iface
);
3827 TRACE("%p,%s\n", iface
, debugstr_w(xml
));
3829 if (!xml
) return E_INVALIDARG
;
3831 hmem
= GlobalAlloc(0, lstrlenW(xml
) * sizeof(WCHAR
));
3832 if (!hmem
) return E_OUTOFMEMORY
;
3834 buf
= GlobalLock(hmem
);
3835 memcpy(buf
, xml
, lstrlenW(xml
) * sizeof(WCHAR
));
3838 hr
= CreateStreamOnHGlobal(hmem
, TRUE
, &stream
);
3845 hr
= CreateXmlReader(&IID_IXmlReader
, (void **)&reader
, NULL
);
3848 IStream_Release(stream
);
3852 hr
= IXmlReader_SetInput(reader
, (IUnknown
*)stream
);
3855 if (taskdef
->reginfo
)
3857 IRegistrationInfo_Release(taskdef
->reginfo
);
3858 taskdef
->reginfo
= NULL
;
3860 if (taskdef
->taskset
)
3862 ITaskSettings_Release(taskdef
->taskset
);
3863 taskdef
->taskset
= NULL
;
3865 if (taskdef
->triggers
)
3867 ITriggerCollection_Release(taskdef
->triggers
);
3868 taskdef
->triggers
= NULL
;
3870 if (taskdef
->principal
)
3872 IPrincipal_Release(taskdef
->principal
);
3873 taskdef
->principal
= NULL
;
3875 if (taskdef
->actions
)
3877 IActionCollection_Release(taskdef
->actions
);
3878 taskdef
->actions
= NULL
;
3881 hr
= read_xml(reader
, iface
);
3884 IXmlReader_Release(reader
);
3885 IStream_Release(stream
);
3890 static const ITaskDefinitionVtbl TaskDefinition_vtbl
=
3892 TaskDefinition_QueryInterface
,
3893 TaskDefinition_AddRef
,
3894 TaskDefinition_Release
,
3895 TaskDefinition_GetTypeInfoCount
,
3896 TaskDefinition_GetTypeInfo
,
3897 TaskDefinition_GetIDsOfNames
,
3898 TaskDefinition_Invoke
,
3899 TaskDefinition_get_RegistrationInfo
,
3900 TaskDefinition_put_RegistrationInfo
,
3901 TaskDefinition_get_Triggers
,
3902 TaskDefinition_put_Triggers
,
3903 TaskDefinition_get_Settings
,
3904 TaskDefinition_put_Settings
,
3905 TaskDefinition_get_Data
,
3906 TaskDefinition_put_Data
,
3907 TaskDefinition_get_Principal
,
3908 TaskDefinition_put_Principal
,
3909 TaskDefinition_get_Actions
,
3910 TaskDefinition_put_Actions
,
3911 TaskDefinition_get_XmlText
,
3912 TaskDefinition_put_XmlText
3915 HRESULT
TaskDefinition_create(ITaskDefinition
**obj
)
3917 TaskDefinition
*taskdef
;
3919 taskdef
= calloc(1, sizeof(*taskdef
));
3920 if (!taskdef
) return E_OUTOFMEMORY
;
3922 taskdef
->ITaskDefinition_iface
.lpVtbl
= &TaskDefinition_vtbl
;
3924 *obj
= &taskdef
->ITaskDefinition_iface
;
3926 TRACE("created %p\n", *obj
);
3933 ITaskService ITaskService_iface
;
3937 WCHAR comp_name
[MAX_COMPUTERNAME_LENGTH
+ 1];
3938 WCHAR user_name
[256];
3939 WCHAR domain_name
[256];
3942 static inline TaskService
*impl_from_ITaskService(ITaskService
*iface
)
3944 return CONTAINING_RECORD(iface
, TaskService
, ITaskService_iface
);
3947 static ULONG WINAPI
TaskService_AddRef(ITaskService
*iface
)
3949 TaskService
*task_svc
= impl_from_ITaskService(iface
);
3950 return InterlockedIncrement(&task_svc
->ref
);
3953 static ULONG WINAPI
TaskService_Release(ITaskService
*iface
)
3955 TaskService
*task_svc
= impl_from_ITaskService(iface
);
3956 LONG ref
= InterlockedDecrement(&task_svc
->ref
);
3960 TRACE("destroying %p\n", iface
);
3967 static HRESULT WINAPI
TaskService_QueryInterface(ITaskService
*iface
, REFIID riid
, void **obj
)
3969 if (!riid
|| !obj
) return E_INVALIDARG
;
3971 TRACE("%p,%s,%p\n", iface
, debugstr_guid(riid
), obj
);
3973 if (IsEqualGUID(riid
, &IID_ITaskService
) ||
3974 IsEqualGUID(riid
, &IID_IDispatch
) ||
3975 IsEqualGUID(riid
, &IID_IUnknown
))
3977 ITaskService_AddRef(iface
);
3982 FIXME("interface %s is not implemented\n", debugstr_guid(riid
));
3984 return E_NOINTERFACE
;
3987 static HRESULT WINAPI
TaskService_GetTypeInfoCount(ITaskService
*iface
, UINT
*count
)
3989 FIXME("%p,%p: stub\n", iface
, count
);
3993 static HRESULT WINAPI
TaskService_GetTypeInfo(ITaskService
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
3995 FIXME("%p,%u,%lu,%p: stub\n", iface
, index
, lcid
, info
);
3999 static HRESULT WINAPI
TaskService_GetIDsOfNames(ITaskService
*iface
, REFIID riid
, LPOLESTR
*names
,
4000 UINT count
, LCID lcid
, DISPID
*dispid
)
4002 FIXME("%p,%s,%p,%u,%lu,%p: stub\n", iface
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
4006 static HRESULT WINAPI
TaskService_Invoke(ITaskService
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
4007 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
4009 FIXME("%p,%ld,%s,%04lx,%04x,%p,%p,%p,%p: stub\n", iface
, dispid
, debugstr_guid(riid
), lcid
, flags
,
4010 params
, result
, excepinfo
, argerr
);
4014 static HRESULT WINAPI
TaskService_GetFolder(ITaskService
*iface
, BSTR path
, ITaskFolder
**folder
)
4016 TaskService
*task_svc
= impl_from_ITaskService(iface
);
4018 TRACE("%p,%s,%p\n", iface
, debugstr_w(path
), folder
);
4020 if (!folder
) return E_POINTER
;
4022 if (!task_svc
->connected
)
4023 return HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED
);
4025 return TaskFolder_create(path
, NULL
, folder
, FALSE
);
4028 static HRESULT WINAPI
TaskService_GetRunningTasks(ITaskService
*iface
, LONG flags
, IRunningTaskCollection
**tasks
)
4030 FIXME("%p,%lx,%p: stub\n", iface
, flags
, tasks
);
4034 static HRESULT WINAPI
TaskService_NewTask(ITaskService
*iface
, DWORD flags
, ITaskDefinition
**definition
)
4036 TRACE("%p,%lx,%p\n", iface
, flags
, definition
);
4038 if (!definition
) return E_POINTER
;
4041 FIXME("unsupported flags %lx\n", flags
);
4043 return TaskDefinition_create(definition
);
4046 static inline BOOL
is_variant_null(const VARIANT
*var
)
4048 return V_VT(var
) == VT_EMPTY
|| V_VT(var
) == VT_NULL
||
4049 (V_VT(var
) == VT_BSTR
&& (V_BSTR(var
) == NULL
|| !*V_BSTR(var
)));
4052 static HRESULT
start_schedsvc(void)
4054 SC_HANDLE scm
, service
;
4055 SERVICE_STATUS_PROCESS status
;
4056 ULONGLONG start_time
;
4057 HRESULT hr
= SCHED_E_SERVICE_NOT_RUNNING
;
4059 TRACE("Trying to start Schedule service\n");
4061 scm
= OpenSCManagerW(NULL
, NULL
, 0);
4062 if (!scm
) return SCHED_E_SERVICE_NOT_INSTALLED
;
4064 service
= OpenServiceW(scm
, L
"Schedule", SERVICE_START
| SERVICE_QUERY_STATUS
);
4067 if (StartServiceW(service
, 0, NULL
) || GetLastError() == ERROR_SERVICE_ALREADY_RUNNING
)
4069 start_time
= GetTickCount64();
4074 if (!QueryServiceStatusEx(service
, SC_STATUS_PROCESS_INFO
, (BYTE
*)&status
, sizeof(status
), &dummy
))
4076 WARN("failed to query scheduler status (%lu)\n", GetLastError());
4080 if (status
.dwCurrentState
== SERVICE_RUNNING
)
4086 if (GetTickCount64() - start_time
> 30000) break;
4089 } while (status
.dwCurrentState
== SERVICE_START_PENDING
);
4091 if (status
.dwCurrentState
!= SERVICE_RUNNING
)
4092 WARN("scheduler failed to start %lu\n", status
.dwCurrentState
);
4095 WARN("failed to start scheduler service (%lu)\n", GetLastError());
4097 CloseServiceHandle(service
);
4100 WARN("failed to open scheduler service (%lu)\n", GetLastError());
4102 CloseServiceHandle(scm
);
4106 static HRESULT WINAPI
TaskService_Connect(ITaskService
*iface
, VARIANT server
, VARIANT user
, VARIANT domain
, VARIANT password
)
4108 static WCHAR ncalrpc
[] = L
"ncalrpc";
4109 TaskService
*task_svc
= impl_from_ITaskService(iface
);
4110 WCHAR comp_name
[MAX_COMPUTERNAME_LENGTH
+ 1];
4111 WCHAR user_name
[256];
4112 WCHAR domain_name
[256];
4115 RPC_WSTR binding_str
;
4116 extern handle_t schrpc_handle
;
4118 TRACE("%p,%s,%s,%s,%s\n", iface
, debugstr_variant(&server
), debugstr_variant(&user
),
4119 debugstr_variant(&domain
), debugstr_variant(&password
));
4121 if (!is_variant_null(&user
) || !is_variant_null(&domain
) || !is_variant_null(&password
))
4122 FIXME("user/domain/password are ignored\n");
4124 len
= ARRAY_SIZE(comp_name
);
4125 if (!GetComputerNameW(comp_name
, &len
))
4126 return HRESULT_FROM_WIN32(GetLastError());
4128 len
= ARRAY_SIZE(user_name
);
4129 if (!GetUserNameW(user_name
, &len
))
4130 return HRESULT_FROM_WIN32(GetLastError());
4132 len
= ARRAY_SIZE(domain_name
);
4133 if(!GetEnvironmentVariableW(L
"USERDOMAIN", domain_name
, len
))
4135 if (!GetComputerNameExW(ComputerNameDnsHostname
, domain_name
, &len
))
4136 return HRESULT_FROM_WIN32(GetLastError());
4137 wcsupr(domain_name
);
4140 if (!is_variant_null(&server
))
4142 const WCHAR
*server_name
;
4144 if (V_VT(&server
) != VT_BSTR
)
4146 FIXME("server variant type %d is not supported\n", V_VT(&server
));
4147 return HRESULT_FROM_WIN32(ERROR_BAD_NETPATH
);
4150 /* skip UNC prefix if any */
4151 server_name
= V_BSTR(&server
);
4152 if (server_name
[0] == '\\' && server_name
[1] == '\\')
4155 if (wcsicmp(server_name
, comp_name
))
4157 FIXME("connection to remote server %s is not supported\n", debugstr_w(V_BSTR(&server
)));
4158 return HRESULT_FROM_WIN32(ERROR_BAD_NETPATH
);
4162 hr
= start_schedsvc();
4163 if (hr
!= S_OK
) return hr
;
4165 hr
= RpcStringBindingComposeW(NULL
, ncalrpc
, NULL
, NULL
, NULL
, &binding_str
);
4166 if (hr
!= RPC_S_OK
) return hr
;
4167 hr
= RpcBindingFromStringBindingW(binding_str
, &schrpc_handle
);
4168 RpcStringFreeW(&binding_str
);
4169 if (hr
!= RPC_S_OK
) return hr
;
4171 /* Make sure that the connection works */
4172 hr
= SchRpcHighestVersion(&task_svc
->version
);
4173 if (hr
!= S_OK
) return hr
;
4175 TRACE("server version %#lx\n", task_svc
->version
);
4177 lstrcpyW(task_svc
->comp_name
, comp_name
);
4178 lstrcpyW(task_svc
->user_name
, user_name
);
4179 lstrcpyW(task_svc
->domain_name
, domain_name
);
4180 task_svc
->connected
= TRUE
;
4185 static HRESULT WINAPI
TaskService_get_Connected(ITaskService
*iface
, VARIANT_BOOL
*connected
)
4187 TaskService
*task_svc
= impl_from_ITaskService(iface
);
4189 TRACE("%p,%p\n", iface
, connected
);
4191 if (!connected
) return E_POINTER
;
4193 *connected
= task_svc
->connected
? VARIANT_TRUE
: VARIANT_FALSE
;
4198 static HRESULT WINAPI
TaskService_get_TargetServer(ITaskService
*iface
, BSTR
*server
)
4200 TaskService
*task_svc
= impl_from_ITaskService(iface
);
4202 TRACE("%p,%p\n", iface
, server
);
4204 if (!server
) return E_POINTER
;
4206 if (!task_svc
->connected
)
4207 return HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED
);
4209 *server
= SysAllocString(task_svc
->comp_name
);
4210 if (!*server
) return E_OUTOFMEMORY
;
4215 static HRESULT WINAPI
TaskService_get_ConnectedUser(ITaskService
*iface
, BSTR
*user
)
4217 TaskService
*task_svc
= impl_from_ITaskService(iface
);
4219 TRACE("%p,%p\n", iface
, user
);
4221 if (!user
) return E_POINTER
;
4223 if (!task_svc
->connected
)
4224 return HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED
);
4226 *user
= SysAllocString(task_svc
->user_name
);
4227 if (!*user
) return E_OUTOFMEMORY
;
4232 static HRESULT WINAPI
TaskService_get_ConnectedDomain(ITaskService
*iface
, BSTR
*domain
)
4234 TaskService
*task_svc
= impl_from_ITaskService(iface
);
4236 TRACE("%p,%p\n", iface
, domain
);
4238 if (!domain
) return E_POINTER
;
4240 if (!task_svc
->connected
)
4241 return HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED
);
4243 *domain
= SysAllocString(task_svc
->domain_name
);
4244 if (!*domain
) return E_OUTOFMEMORY
;
4249 static HRESULT WINAPI
TaskService_get_HighestVersion(ITaskService
*iface
, DWORD
*version
)
4251 TaskService
*task_svc
= impl_from_ITaskService(iface
);
4253 TRACE("%p,%p\n", iface
, version
);
4255 if (!version
) return E_POINTER
;
4257 if (!task_svc
->connected
)
4258 return HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED
);
4260 *version
= task_svc
->version
;
4265 static const ITaskServiceVtbl TaskService_vtbl
=
4267 TaskService_QueryInterface
,
4269 TaskService_Release
,
4270 TaskService_GetTypeInfoCount
,
4271 TaskService_GetTypeInfo
,
4272 TaskService_GetIDsOfNames
,
4274 TaskService_GetFolder
,
4275 TaskService_GetRunningTasks
,
4276 TaskService_NewTask
,
4277 TaskService_Connect
,
4278 TaskService_get_Connected
,
4279 TaskService_get_TargetServer
,
4280 TaskService_get_ConnectedUser
,
4281 TaskService_get_ConnectedDomain
,
4282 TaskService_get_HighestVersion
4285 HRESULT
TaskService_create(void **obj
)
4287 TaskService
*task_svc
;
4289 task_svc
= malloc(sizeof(*task_svc
));
4290 if (!task_svc
) return E_OUTOFMEMORY
;
4292 task_svc
->ITaskService_iface
.lpVtbl
= &TaskService_vtbl
;
4294 task_svc
->connected
= FALSE
;
4295 *obj
= &task_svc
->ITaskService_iface
;
4297 TRACE("created %p\n", *obj
);
4302 void __RPC_FAR
*__RPC_USER
MIDL_user_allocate(SIZE_T n
)
4307 void __RPC_USER
MIDL_user_free(void __RPC_FAR
*p
)