taskschd: Add ITaskSettings stub implementation.
[wine/multimedia.git] / dlls / taskschd / task.c
blob85fa30c71cc4650ca12f1b27cc4133821e46debb
1 /*
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
19 #include <stdarg.h>
21 #define COBJMACROS
23 #include "windef.h"
24 #include "winbase.h"
25 #include "initguid.h"
26 #include "objbase.h"
27 #include "taskschd.h"
28 #include "taskschd_private.h"
30 #include "wine/unicode.h"
31 #include "wine/debug.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(taskschd);
35 typedef struct
37 ITaskSettings ITaskSettings_iface;
38 LONG ref;
39 } TaskSettings;
41 static inline TaskSettings *impl_from_ITaskSettings(ITaskSettings *iface)
43 return CONTAINING_RECORD(iface, TaskSettings, ITaskSettings_iface);
46 static ULONG WINAPI TaskSettings_AddRef(ITaskSettings *iface)
48 TaskSettings *taskset = impl_from_ITaskSettings(iface);
49 return InterlockedIncrement(&taskset->ref);
52 static ULONG WINAPI TaskSettings_Release(ITaskSettings *iface)
54 TaskSettings *taskset = impl_from_ITaskSettings(iface);
55 LONG ref = InterlockedDecrement(&taskset->ref);
57 if (!ref)
59 TRACE("destroying %p\n", iface);
60 heap_free(taskset);
63 return ref;
66 static HRESULT WINAPI TaskSettings_QueryInterface(ITaskSettings *iface, REFIID riid, void **obj)
68 if (!riid || !obj) return E_INVALIDARG;
70 TRACE("%p,%s,%p\n", iface, debugstr_guid(riid), obj);
72 if (IsEqualGUID(riid, &IID_ITaskSettings) ||
73 IsEqualGUID(riid, &IID_IDispatch) ||
74 IsEqualGUID(riid, &IID_IUnknown))
76 ITaskSettings_AddRef(iface);
77 *obj = iface;
78 return S_OK;
81 FIXME("interface %s is not implemented\n", debugstr_guid(riid));
82 *obj = NULL;
83 return E_NOINTERFACE;
86 static HRESULT WINAPI TaskSettings_GetTypeInfoCount(ITaskSettings *iface, UINT *count)
88 FIXME("%p,%p: stub\n", iface, count);
89 return E_NOTIMPL;
92 static HRESULT WINAPI TaskSettings_GetTypeInfo(ITaskSettings *iface, UINT index, LCID lcid, ITypeInfo **info)
94 FIXME("%p,%u,%u,%p: stub\n", iface, index, lcid, info);
95 return E_NOTIMPL;
98 static HRESULT WINAPI TaskSettings_GetIDsOfNames(ITaskSettings *iface, REFIID riid, LPOLESTR *names,
99 UINT count, LCID lcid, DISPID *dispid)
101 FIXME("%p,%s,%p,%u,%u,%p: stub\n", iface, debugstr_guid(riid), names, count, lcid, dispid);
102 return E_NOTIMPL;
105 static HRESULT WINAPI TaskSettings_Invoke(ITaskSettings *iface, DISPID dispid, REFIID riid, LCID lcid, WORD flags,
106 DISPPARAMS *params, VARIANT *result, EXCEPINFO *excepinfo, UINT *argerr)
108 FIXME("%p,%d,%s,%04x,%04x,%p,%p,%p,%p: stub\n", iface, dispid, debugstr_guid(riid), lcid, flags,
109 params, result, excepinfo, argerr);
110 return E_NOTIMPL;
113 static HRESULT WINAPI TaskSettings_get_AllowDemandStart(ITaskSettings *iface, VARIANT_BOOL *allow)
115 FIXME("%p,%p: stub\n", iface, allow);
116 return E_NOTIMPL;
119 static HRESULT WINAPI TaskSettings_put_AllowDemandStart(ITaskSettings *iface, VARIANT_BOOL allow)
121 FIXME("%p,%d: stub\n", iface, allow);
122 return E_NOTIMPL;
125 static HRESULT WINAPI TaskSettings_get_RestartInterval(ITaskSettings *iface, BSTR *interval)
127 FIXME("%p,%p: stub\n", iface, interval);
128 return E_NOTIMPL;
131 static HRESULT WINAPI TaskSettings_put_RestartInterval(ITaskSettings *iface, BSTR interval)
133 TRACE("%p,%s\n", iface, debugstr_w(interval));
134 return E_NOTIMPL;
137 static HRESULT WINAPI TaskSettings_get_RestartCount(ITaskSettings *iface, INT *count)
139 FIXME("%p,%p: stub\n", iface, count);
140 return E_NOTIMPL;
143 static HRESULT WINAPI TaskSettings_put_RestartCount(ITaskSettings *iface, INT count)
145 FIXME("%p,%d: stub\n", iface, count);
146 return E_NOTIMPL;
149 static HRESULT WINAPI TaskSettings_get_MultipleInstances(ITaskSettings *iface, TASK_INSTANCES_POLICY *policy)
151 FIXME("%p,%p: stub\n", iface, policy);
152 return E_NOTIMPL;
155 static HRESULT WINAPI TaskSettings_put_MultipleInstances(ITaskSettings *iface, TASK_INSTANCES_POLICY policy)
157 FIXME("%p,%d: stub\n", iface, policy);
158 return E_NOTIMPL;
161 static HRESULT WINAPI TaskSettings_get_StopIfGoingOnBatteries(ITaskSettings *iface, VARIANT_BOOL *stop)
163 FIXME("%p,%p: stub\n", iface, stop);
164 return E_NOTIMPL;
167 static HRESULT WINAPI TaskSettings_put_StopIfGoingOnBatteries(ITaskSettings *iface, VARIANT_BOOL stop)
169 FIXME("%p,%d: stub\n", iface, stop);
170 return E_NOTIMPL;
173 static HRESULT WINAPI TaskSettings_get_DisallowStartIfOnBatteries(ITaskSettings *iface, VARIANT_BOOL *disallow)
175 FIXME("%p,%p: stub\n", iface, disallow);
176 return E_NOTIMPL;
179 static HRESULT WINAPI TaskSettings_put_DisallowStartIfOnBatteries(ITaskSettings *iface, VARIANT_BOOL disallow)
181 FIXME("%p,%d: stub\n", iface, disallow);
182 return E_NOTIMPL;
185 static HRESULT WINAPI TaskSettings_get_AllowHardTerminate(ITaskSettings *iface, VARIANT_BOOL *allow)
187 FIXME("%p,%p: stub\n", iface, allow);
188 return E_NOTIMPL;
191 static HRESULT WINAPI TaskSettings_put_AllowHardTerminate(ITaskSettings *iface, VARIANT_BOOL allow)
193 FIXME("%p,%d: stub\n", iface, allow);
194 return E_NOTIMPL;
197 static HRESULT WINAPI TaskSettings_get_StartWhenAvailable(ITaskSettings *iface, VARIANT_BOOL *start)
199 FIXME("%p,%p: stub\n", iface, start);
200 return E_NOTIMPL;
203 static HRESULT WINAPI TaskSettings_put_StartWhenAvailable(ITaskSettings *iface, VARIANT_BOOL start)
205 FIXME("%p,%d: stub\n", iface, start);
206 return E_NOTIMPL;
209 static HRESULT WINAPI TaskSettings_get_XmlText(ITaskSettings *iface, BSTR *xml)
211 FIXME("%p,%p: stub\n", iface, xml);
212 return E_NOTIMPL;
215 static HRESULT WINAPI TaskSettings_put_XmlText(ITaskSettings *iface, BSTR xml)
217 TRACE("%p,%s\n", iface, debugstr_w(xml));
218 return E_NOTIMPL;
221 static HRESULT WINAPI TaskSettings_get_RunOnlyIfNetworkAvailable(ITaskSettings *iface, VARIANT_BOOL *run)
223 FIXME("%p,%p: stub\n", iface, run);
224 return E_NOTIMPL;
227 static HRESULT WINAPI TaskSettings_put_RunOnlyIfNetworkAvailable(ITaskSettings *iface, VARIANT_BOOL run)
229 FIXME("%p,%d: stub\n", iface, run);
230 return E_NOTIMPL;
233 static HRESULT WINAPI TaskSettings_get_ExecutionTimeLimit(ITaskSettings *iface, BSTR *limit)
235 FIXME("%p,%p: stub\n", iface, limit);
236 return E_NOTIMPL;
239 static HRESULT WINAPI TaskSettings_put_ExecutionTimeLimit(ITaskSettings *iface, BSTR limit)
241 TRACE("%p,%s\n", iface, debugstr_w(limit));
242 return E_NOTIMPL;
245 static HRESULT WINAPI TaskSettings_get_Enabled(ITaskSettings *iface, VARIANT_BOOL *enabled)
247 FIXME("%p,%p: stub\n", iface, enabled);
248 return E_NOTIMPL;
251 static HRESULT WINAPI TaskSettings_put_Enabled(ITaskSettings *iface, VARIANT_BOOL enabled)
253 FIXME("%p,%d: stub\n", iface, enabled);
254 return E_NOTIMPL;
257 static HRESULT WINAPI TaskSettings_get_DeleteExpiredTaskAfter(ITaskSettings *iface, BSTR *delay)
259 FIXME("%p,%p: stub\n", iface, delay);
260 return E_NOTIMPL;
263 static HRESULT WINAPI TaskSettings_put_DeleteExpiredTaskAfter(ITaskSettings *iface, BSTR delay)
265 TRACE("%p,%s\n", iface, debugstr_w(delay));
266 return E_NOTIMPL;
269 static HRESULT WINAPI TaskSettings_get_Priority(ITaskSettings *iface, INT *priority)
271 FIXME("%p,%p: stub\n", iface, priority);
272 return E_NOTIMPL;
275 static HRESULT WINAPI TaskSettings_put_Priority(ITaskSettings *iface, INT priority)
277 FIXME("%p,%d: stub\n", iface, priority);
278 return E_NOTIMPL;
281 static HRESULT WINAPI TaskSettings_get_Compatibility(ITaskSettings *iface, TASK_COMPATIBILITY *level)
283 FIXME("%p,%p: stub\n", iface, level);
284 return E_NOTIMPL;
287 static HRESULT WINAPI TaskSettings_put_Compatibility(ITaskSettings *iface, TASK_COMPATIBILITY level)
289 FIXME("%p,%d: stub\n", iface, level);
290 return E_NOTIMPL;
293 static HRESULT WINAPI TaskSettings_get_Hidden(ITaskSettings *iface, VARIANT_BOOL *hidden)
295 FIXME("%p,%p: stub\n", iface, hidden);
296 return E_NOTIMPL;
299 static HRESULT WINAPI TaskSettings_put_Hidden(ITaskSettings *iface, VARIANT_BOOL hidden)
301 FIXME("%p,%d: stub\n", iface, hidden);
302 return E_NOTIMPL;
305 static HRESULT WINAPI TaskSettings_get_IdleSettings(ITaskSettings *iface, IIdleSettings **settings)
307 FIXME("%p,%p: stub\n", iface, settings);
308 return E_NOTIMPL;
311 static HRESULT WINAPI TaskSettings_put_IdleSettings(ITaskSettings *iface, IIdleSettings *settings)
313 FIXME("%p,%p: stub\n", iface, settings);
314 return E_NOTIMPL;
317 static HRESULT WINAPI TaskSettings_get_RunOnlyIfIdle(ITaskSettings *iface, VARIANT_BOOL *run)
319 FIXME("%p,%p: stub\n", iface, run);
320 return E_NOTIMPL;
323 static HRESULT WINAPI TaskSettings_put_RunOnlyIfIdle(ITaskSettings *iface, VARIANT_BOOL run)
325 FIXME("%p,%d: stub\n", iface, run);
326 return E_NOTIMPL;
329 static HRESULT WINAPI TaskSettings_get_WakeToRun(ITaskSettings *iface, VARIANT_BOOL *wake)
331 FIXME("%p,%p: stub\n", iface, wake);
332 return E_NOTIMPL;
335 static HRESULT WINAPI TaskSettings_put_WakeToRun(ITaskSettings *iface, VARIANT_BOOL wake)
337 FIXME("%p,%d: stub\n", iface, wake);
338 return E_NOTIMPL;
341 static HRESULT WINAPI TaskSettings_get_NetworkSettings(ITaskSettings *iface, INetworkSettings **settings)
343 FIXME("%p,%p: stub\n", iface, settings);
344 return E_NOTIMPL;
347 static HRESULT WINAPI TaskSettings_put_NetworkSettings(ITaskSettings *iface, INetworkSettings *settings)
349 FIXME("%p,%p: stub\n", iface, settings);
350 return E_NOTIMPL;
353 static const ITaskSettingsVtbl TaskSettings_vtbl =
355 TaskSettings_QueryInterface,
356 TaskSettings_AddRef,
357 TaskSettings_Release,
358 TaskSettings_GetTypeInfoCount,
359 TaskSettings_GetTypeInfo,
360 TaskSettings_GetIDsOfNames,
361 TaskSettings_Invoke,
362 TaskSettings_get_AllowDemandStart,
363 TaskSettings_put_AllowDemandStart,
364 TaskSettings_get_RestartInterval,
365 TaskSettings_put_RestartInterval,
366 TaskSettings_get_RestartCount,
367 TaskSettings_put_RestartCount,
368 TaskSettings_get_MultipleInstances,
369 TaskSettings_put_MultipleInstances,
370 TaskSettings_get_StopIfGoingOnBatteries,
371 TaskSettings_put_StopIfGoingOnBatteries,
372 TaskSettings_get_DisallowStartIfOnBatteries,
373 TaskSettings_put_DisallowStartIfOnBatteries,
374 TaskSettings_get_AllowHardTerminate,
375 TaskSettings_put_AllowHardTerminate,
376 TaskSettings_get_StartWhenAvailable,
377 TaskSettings_put_StartWhenAvailable,
378 TaskSettings_get_XmlText,
379 TaskSettings_put_XmlText,
380 TaskSettings_get_RunOnlyIfNetworkAvailable,
381 TaskSettings_put_RunOnlyIfNetworkAvailable,
382 TaskSettings_get_ExecutionTimeLimit,
383 TaskSettings_put_ExecutionTimeLimit,
384 TaskSettings_get_Enabled,
385 TaskSettings_put_Enabled,
386 TaskSettings_get_DeleteExpiredTaskAfter,
387 TaskSettings_put_DeleteExpiredTaskAfter,
388 TaskSettings_get_Priority,
389 TaskSettings_put_Priority,
390 TaskSettings_get_Compatibility,
391 TaskSettings_put_Compatibility,
392 TaskSettings_get_Hidden,
393 TaskSettings_put_Hidden,
394 TaskSettings_get_IdleSettings,
395 TaskSettings_put_IdleSettings,
396 TaskSettings_get_RunOnlyIfIdle,
397 TaskSettings_put_RunOnlyIfIdle,
398 TaskSettings_get_WakeToRun,
399 TaskSettings_put_WakeToRun,
400 TaskSettings_get_NetworkSettings,
401 TaskSettings_put_NetworkSettings
404 static HRESULT TaskSettings_create(ITaskSettings **obj)
406 TaskSettings *taskset;
408 taskset = heap_alloc(sizeof(*taskset));
409 if (!taskset) return E_OUTOFMEMORY;
411 taskset->ITaskSettings_iface.lpVtbl = &TaskSettings_vtbl;
412 taskset->ref = 1;
413 *obj = &taskset->ITaskSettings_iface;
415 TRACE("created %p\n", *obj);
417 return S_OK;
420 typedef struct
422 ITaskDefinition ITaskDefinition_iface;
423 LONG ref;
424 } TaskDefinition;
426 static inline TaskDefinition *impl_from_ITaskDefinition(ITaskDefinition *iface)
428 return CONTAINING_RECORD(iface, TaskDefinition, ITaskDefinition_iface);
431 static ULONG WINAPI TaskDefinition_AddRef(ITaskDefinition *iface)
433 TaskDefinition *taskdef = impl_from_ITaskDefinition(iface);
434 return InterlockedIncrement(&taskdef->ref);
437 static ULONG WINAPI TaskDefinition_Release(ITaskDefinition *iface)
439 TaskDefinition *taskdef = impl_from_ITaskDefinition(iface);
440 LONG ref = InterlockedDecrement(&taskdef->ref);
442 if (!ref)
444 TRACE("destroying %p\n", iface);
445 heap_free(taskdef);
448 return ref;
451 static HRESULT WINAPI TaskDefinition_QueryInterface(ITaskDefinition *iface, REFIID riid, void **obj)
453 if (!riid || !obj) return E_INVALIDARG;
455 TRACE("%p,%s,%p\n", iface, debugstr_guid(riid), obj);
457 if (IsEqualGUID(riid, &IID_ITaskDefinition) ||
458 IsEqualGUID(riid, &IID_IDispatch) ||
459 IsEqualGUID(riid, &IID_IUnknown))
461 ITaskDefinition_AddRef(iface);
462 *obj = iface;
463 return S_OK;
466 FIXME("interface %s is not implemented\n", debugstr_guid(riid));
467 *obj = NULL;
468 return E_NOINTERFACE;
471 static HRESULT WINAPI TaskDefinition_GetTypeInfoCount(ITaskDefinition *iface, UINT *count)
473 FIXME("%p,%p: stub\n", iface, count);
474 return E_NOTIMPL;
477 static HRESULT WINAPI TaskDefinition_GetTypeInfo(ITaskDefinition *iface, UINT index, LCID lcid, ITypeInfo **info)
479 FIXME("%p,%u,%u,%p: stub\n", iface, index, lcid, info);
480 return E_NOTIMPL;
483 static HRESULT WINAPI TaskDefinition_GetIDsOfNames(ITaskDefinition *iface, REFIID riid, LPOLESTR *names,
484 UINT count, LCID lcid, DISPID *dispid)
486 FIXME("%p,%s,%p,%u,%u,%p: stub\n", iface, debugstr_guid(riid), names, count, lcid, dispid);
487 return E_NOTIMPL;
490 static HRESULT WINAPI TaskDefinition_Invoke(ITaskDefinition *iface, DISPID dispid, REFIID riid, LCID lcid, WORD flags,
491 DISPPARAMS *params, VARIANT *result, EXCEPINFO *excepinfo, UINT *argerr)
493 FIXME("%p,%d,%s,%04x,%04x,%p,%p,%p,%p: stub\n", iface, dispid, debugstr_guid(riid), lcid, flags,
494 params, result, excepinfo, argerr);
495 return E_NOTIMPL;
498 static HRESULT WINAPI TaskDefinition_get_RegistrationInfo(ITaskDefinition *iface, IRegistrationInfo **info)
500 FIXME("%p,%p: stub\n", iface, info);
501 return E_NOTIMPL;
504 static HRESULT WINAPI TaskDefinition_put_RegistrationInfo(ITaskDefinition *iface, IRegistrationInfo *info)
506 FIXME("%p,%p: stub\n", iface, info);
507 return E_NOTIMPL;
510 static HRESULT WINAPI TaskDefinition_get_Triggers(ITaskDefinition *iface, ITriggerCollection **triggers)
512 FIXME("%p,%p: stub\n", iface, triggers);
513 return E_NOTIMPL;
516 static HRESULT WINAPI TaskDefinition_put_Triggers(ITaskDefinition *iface, ITriggerCollection *triggers)
518 FIXME("%p,%p: stub\n", iface, triggers);
519 return E_NOTIMPL;
522 static HRESULT WINAPI TaskDefinition_get_Settings(ITaskDefinition *iface, ITaskSettings **settings)
524 TRACE("%p,%p\n", iface, settings);
526 if (!settings) return E_POINTER;
528 return TaskSettings_create(settings);
531 static HRESULT WINAPI TaskDefinition_put_Settings(ITaskDefinition *iface, ITaskSettings *settings)
533 FIXME("%p,%p: stub\n", iface, settings);
534 return E_NOTIMPL;
537 static HRESULT WINAPI TaskDefinition_get_Data(ITaskDefinition *iface, BSTR *data)
539 FIXME("%p,%p: stub\n", iface, data);
540 return E_NOTIMPL;
543 static HRESULT WINAPI TaskDefinition_put_Data(ITaskDefinition *iface, BSTR data)
545 FIXME("%p,%p: stub\n", iface, data);
546 return E_NOTIMPL;
549 static HRESULT WINAPI TaskDefinition_get_Principal(ITaskDefinition *iface, IPrincipal **principal)
551 FIXME("%p,%p: stub\n", iface, principal);
552 return E_NOTIMPL;
555 static HRESULT WINAPI TaskDefinition_put_Principal(ITaskDefinition *iface, IPrincipal *principal)
557 FIXME("%p,%p: stub\n", iface, principal);
558 return E_NOTIMPL;
561 static HRESULT WINAPI TaskDefinition_get_Actions(ITaskDefinition *iface, IActionCollection **actions)
563 FIXME("%p,%p: stub\n", iface, actions);
564 return E_NOTIMPL;
567 static HRESULT WINAPI TaskDefinition_put_Actions(ITaskDefinition *iface, IActionCollection *actions)
569 FIXME("%p,%p: stub\n", iface, actions);
570 return E_NOTIMPL;
573 static HRESULT WINAPI TaskDefinition_get_XmlText(ITaskDefinition *iface, BSTR *xml)
575 FIXME("%p,%p: stub\n", iface, xml);
576 return E_NOTIMPL;
579 static HRESULT WINAPI TaskDefinition_put_XmlText(ITaskDefinition *iface, BSTR xml)
581 FIXME("%p,%p: stub\n", iface, xml);
582 return E_NOTIMPL;
585 static const ITaskDefinitionVtbl TaskDefinition_vtbl =
587 TaskDefinition_QueryInterface,
588 TaskDefinition_AddRef,
589 TaskDefinition_Release,
590 TaskDefinition_GetTypeInfoCount,
591 TaskDefinition_GetTypeInfo,
592 TaskDefinition_GetIDsOfNames,
593 TaskDefinition_Invoke,
594 TaskDefinition_get_RegistrationInfo,
595 TaskDefinition_put_RegistrationInfo,
596 TaskDefinition_get_Triggers,
597 TaskDefinition_put_Triggers,
598 TaskDefinition_get_Settings,
599 TaskDefinition_put_Settings,
600 TaskDefinition_get_Data,
601 TaskDefinition_put_Data,
602 TaskDefinition_get_Principal,
603 TaskDefinition_put_Principal,
604 TaskDefinition_get_Actions,
605 TaskDefinition_put_Actions,
606 TaskDefinition_get_XmlText,
607 TaskDefinition_put_XmlText
610 static HRESULT TaskDefinition_create(ITaskDefinition **obj)
612 TaskDefinition *taskdef;
614 taskdef = heap_alloc(sizeof(*taskdef));
615 if (!taskdef) return E_OUTOFMEMORY;
617 taskdef->ITaskDefinition_iface.lpVtbl = &TaskDefinition_vtbl;
618 taskdef->ref = 1;
619 *obj = &taskdef->ITaskDefinition_iface;
621 TRACE("created %p\n", *obj);
623 return S_OK;
626 typedef struct
628 ITaskService ITaskService_iface;
629 LONG ref;
630 BOOL connected;
631 WCHAR comp_name[MAX_COMPUTERNAME_LENGTH + 1];
632 } TaskService;
634 static inline TaskService *impl_from_ITaskService(ITaskService *iface)
636 return CONTAINING_RECORD(iface, TaskService, ITaskService_iface);
639 static ULONG WINAPI TaskService_AddRef(ITaskService *iface)
641 TaskService *task_svc = impl_from_ITaskService(iface);
642 return InterlockedIncrement(&task_svc->ref);
645 static ULONG WINAPI TaskService_Release(ITaskService *iface)
647 TaskService *task_svc = impl_from_ITaskService(iface);
648 LONG ref = InterlockedDecrement(&task_svc->ref);
650 if (!ref)
652 TRACE("destroying %p\n", iface);
653 heap_free(task_svc);
656 return ref;
659 static HRESULT WINAPI TaskService_QueryInterface(ITaskService *iface, REFIID riid, void **obj)
661 if (!riid || !obj) return E_INVALIDARG;
663 TRACE("%p,%s,%p\n", iface, debugstr_guid(riid), obj);
665 if (IsEqualGUID(riid, &IID_ITaskService) ||
666 IsEqualGUID(riid, &IID_IDispatch) ||
667 IsEqualGUID(riid, &IID_IUnknown))
669 ITaskService_AddRef(iface);
670 *obj = iface;
671 return S_OK;
674 FIXME("interface %s is not implemented\n", debugstr_guid(riid));
675 *obj = NULL;
676 return E_NOINTERFACE;
679 static HRESULT WINAPI TaskService_GetTypeInfoCount(ITaskService *iface, UINT *count)
681 FIXME("%p,%p: stub\n", iface, count);
682 return E_NOTIMPL;
685 static HRESULT WINAPI TaskService_GetTypeInfo(ITaskService *iface, UINT index, LCID lcid, ITypeInfo **info)
687 FIXME("%p,%u,%u,%p: stub\n", iface, index, lcid, info);
688 return E_NOTIMPL;
691 static HRESULT WINAPI TaskService_GetIDsOfNames(ITaskService *iface, REFIID riid, LPOLESTR *names,
692 UINT count, LCID lcid, DISPID *dispid)
694 FIXME("%p,%s,%p,%u,%u,%p: stub\n", iface, debugstr_guid(riid), names, count, lcid, dispid);
695 return E_NOTIMPL;
698 static HRESULT WINAPI TaskService_Invoke(ITaskService *iface, DISPID dispid, REFIID riid, LCID lcid, WORD flags,
699 DISPPARAMS *params, VARIANT *result, EXCEPINFO *excepinfo, UINT *argerr)
701 FIXME("%p,%d,%s,%04x,%04x,%p,%p,%p,%p: stub\n", iface, dispid, debugstr_guid(riid), lcid, flags,
702 params, result, excepinfo, argerr);
703 return E_NOTIMPL;
706 static HRESULT WINAPI TaskService_GetFolder(ITaskService *iface, BSTR path, ITaskFolder **folder)
708 TaskService *task_svc = impl_from_ITaskService(iface);
710 TRACE("%p,%s,%p\n", iface, debugstr_w(path), folder);
712 if (!folder) return E_POINTER;
714 if (!task_svc->connected)
715 return HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED);
717 return TaskFolder_create(path, NULL, folder, FALSE);
720 static HRESULT WINAPI TaskService_GetRunningTasks(ITaskService *iface, LONG flags, IRunningTaskCollection **tasks)
722 FIXME("%p,%x,%p: stub\n", iface, flags, tasks);
723 return E_NOTIMPL;
726 static HRESULT WINAPI TaskService_NewTask(ITaskService *iface, DWORD flags, ITaskDefinition **definition)
728 TaskService *task_svc = impl_from_ITaskService(iface);
730 TRACE("%p,%x,%p\n", iface, flags, definition);
732 if (!definition) return E_POINTER;
734 if (!task_svc->connected)
735 return HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED);
737 if (flags)
738 FIXME("unsupported flags %x\n", flags);
740 return TaskDefinition_create(definition);
743 static inline BOOL is_variant_null(const VARIANT *var)
745 return V_VT(var) == VT_EMPTY || V_VT(var) == VT_NULL ||
746 (V_VT(var) == VT_BSTR && (V_BSTR(var) == NULL || !*V_BSTR(var)));
749 static HRESULT WINAPI TaskService_Connect(ITaskService *iface, VARIANT server, VARIANT user, VARIANT domain, VARIANT password)
751 TaskService *task_svc = impl_from_ITaskService(iface);
752 WCHAR comp_name[MAX_COMPUTERNAME_LENGTH + 1];
753 DWORD len;
755 TRACE("%p,%s,%s,%s,%s\n", iface, debugstr_variant(&server), debugstr_variant(&user),
756 debugstr_variant(&domain), debugstr_variant(&password));
758 if (!is_variant_null(&user) || !is_variant_null(&domain) || !is_variant_null(&password))
759 FIXME("user/domain/password are ignored\n");
761 len = sizeof(comp_name)/sizeof(comp_name[0]);
762 if (!GetComputerNameW(comp_name, &len))
763 return HRESULT_FROM_WIN32(GetLastError());
765 if (!is_variant_null(&server))
767 const WCHAR *server_name;
769 if (V_VT(&server) != VT_BSTR)
771 FIXME("server variant type %d is not supported\n", V_VT(&server));
772 return HRESULT_FROM_WIN32(ERROR_BAD_NETPATH);
775 /* skip UNC prefix if any */
776 server_name = V_BSTR(&server);
777 if (server_name[0] == '\\' && server_name[1] == '\\')
778 server_name += 2;
780 if (strcmpiW(server_name, comp_name))
782 FIXME("connection to remote server %s is not supported\n", debugstr_w(V_BSTR(&server)));
783 return HRESULT_FROM_WIN32(ERROR_BAD_NETPATH);
787 strcpyW(task_svc->comp_name, comp_name);
788 task_svc->connected = TRUE;
790 return S_OK;
793 static HRESULT WINAPI TaskService_get_Connected(ITaskService *iface, VARIANT_BOOL *connected)
795 TaskService *task_svc = impl_from_ITaskService(iface);
797 TRACE("%p,%p\n", iface, connected);
799 if (!connected) return E_POINTER;
801 *connected = task_svc->connected ? VARIANT_TRUE : VARIANT_FALSE;
803 return S_OK;
806 static HRESULT WINAPI TaskService_get_TargetServer(ITaskService *iface, BSTR *server)
808 TaskService *task_svc = impl_from_ITaskService(iface);
810 TRACE("%p,%p\n", iface, server);
812 if (!server) return E_POINTER;
814 if (!task_svc->connected)
815 return HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED);
817 *server = SysAllocString(task_svc->comp_name);
818 if (!*server) return E_OUTOFMEMORY;
820 return S_OK;
823 static HRESULT WINAPI TaskService_get_ConnectedUser(ITaskService *iface, BSTR *user)
825 FIXME("%p,%p: stub\n", iface, user);
826 return E_NOTIMPL;
829 static HRESULT WINAPI TaskService_get_ConnectedDomain(ITaskService *iface, BSTR *domain)
831 FIXME("%p,%p: stub\n", iface, domain);
832 return E_NOTIMPL;
835 static HRESULT WINAPI TaskService_get_HighestVersion(ITaskService *iface, DWORD *version)
837 FIXME("%p,%p: stub\n", iface, version);
838 return E_NOTIMPL;
841 static const ITaskServiceVtbl TaskService_vtbl =
843 TaskService_QueryInterface,
844 TaskService_AddRef,
845 TaskService_Release,
846 TaskService_GetTypeInfoCount,
847 TaskService_GetTypeInfo,
848 TaskService_GetIDsOfNames,
849 TaskService_Invoke,
850 TaskService_GetFolder,
851 TaskService_GetRunningTasks,
852 TaskService_NewTask,
853 TaskService_Connect,
854 TaskService_get_Connected,
855 TaskService_get_TargetServer,
856 TaskService_get_ConnectedUser,
857 TaskService_get_ConnectedDomain,
858 TaskService_get_HighestVersion
861 HRESULT TaskService_create(void **obj)
863 TaskService *task_svc;
865 task_svc = heap_alloc(sizeof(*task_svc));
866 if (!task_svc) return E_OUTOFMEMORY;
868 task_svc->ITaskService_iface.lpVtbl = &TaskService_vtbl;
869 task_svc->ref = 1;
870 task_svc->connected = FALSE;
871 *obj = &task_svc->ITaskService_iface;
873 TRACE("created %p\n", *obj);
875 return S_OK;