2 * Copyright 2014 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
28 #include "taskschd_private.h"
30 #include "wine/unicode.h"
31 #include "wine/debug.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(taskschd
);
37 IRegisteredTask IRegisteredTask_iface
;
40 ITaskDefinition
*taskdef
;
43 static inline RegisteredTask
*impl_from_IRegisteredTask(IRegisteredTask
*iface
)
45 return CONTAINING_RECORD(iface
, RegisteredTask
, IRegisteredTask_iface
);
48 static ULONG WINAPI
regtask_AddRef(IRegisteredTask
*iface
)
50 RegisteredTask
*regtask
= impl_from_IRegisteredTask(iface
);
51 return InterlockedIncrement(®task
->ref
);
54 static ULONG WINAPI
regtask_Release(IRegisteredTask
*iface
)
56 RegisteredTask
*regtask
= impl_from_IRegisteredTask(iface
);
57 LONG ref
= InterlockedDecrement(®task
->ref
);
61 TRACE("destroying %p\n", iface
);
62 ITaskDefinition_Release(regtask
->taskdef
);
63 heap_free(regtask
->path
);
70 static HRESULT WINAPI
regtask_QueryInterface(IRegisteredTask
*iface
, REFIID riid
, void **obj
)
72 if (!riid
|| !obj
) return E_INVALIDARG
;
74 TRACE("%p,%s,%p\n", iface
, debugstr_guid(riid
), obj
);
76 if (IsEqualGUID(riid
, &IID_IRegisteredTask
) ||
77 IsEqualGUID(riid
, &IID_IDispatch
) ||
78 IsEqualGUID(riid
, &IID_IUnknown
))
80 IRegisteredTask_AddRef(iface
);
85 FIXME("interface %s is not implemented\n", debugstr_guid(riid
));
90 static HRESULT WINAPI
regtask_GetTypeInfoCount(IRegisteredTask
*iface
, UINT
*count
)
92 FIXME("%p,%p: stub\n", iface
, count
);
96 static HRESULT WINAPI
regtask_GetTypeInfo(IRegisteredTask
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
98 FIXME("%p,%u,%u,%p: stub\n", iface
, index
, lcid
, info
);
102 static HRESULT WINAPI
regtask_GetIDsOfNames(IRegisteredTask
*iface
, REFIID riid
, LPOLESTR
*names
,
103 UINT count
, LCID lcid
, DISPID
*dispid
)
105 FIXME("%p,%s,%p,%u,%u,%p: stub\n", iface
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
109 static HRESULT WINAPI
regtask_Invoke(IRegisteredTask
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
110 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
112 FIXME("%p,%d,%s,%04x,%04x,%p,%p,%p,%p: stub\n", iface
, dispid
, debugstr_guid(riid
), lcid
, flags
,
113 params
, result
, excepinfo
, argerr
);
117 static HRESULT WINAPI
regtask_get_Name(IRegisteredTask
*iface
, BSTR
*name
)
119 FIXME("%p,%p: stub\n", iface
, name
);
123 static HRESULT WINAPI
regtask_get_Path(IRegisteredTask
*iface
, BSTR
*path
)
125 FIXME("%p,%p: stub\n", iface
, path
);
129 static HRESULT WINAPI
regtask_get_State(IRegisteredTask
*iface
, TASK_STATE
*state
)
131 FIXME("%p,%p: stub\n", iface
, state
);
135 static HRESULT WINAPI
regtask_get_Enabled(IRegisteredTask
*iface
, VARIANT_BOOL
*enabled
)
137 FIXME("%p,%p: stub\n", iface
, enabled
);
141 static HRESULT WINAPI
regtask_put_Enabled(IRegisteredTask
*iface
, VARIANT_BOOL enabled
)
143 FIXME("%p,%d: stub\n", iface
, enabled
);
147 static HRESULT WINAPI
regtask_Run(IRegisteredTask
*iface
, VARIANT params
, IRunningTask
**task
)
149 FIXME("%p,%s,%p: stub\n", iface
, debugstr_variant(¶ms
), task
);
153 static HRESULT WINAPI
regtask_RunEx(IRegisteredTask
*iface
, VARIANT params
, LONG flags
,
154 LONG session_id
, BSTR user
, IRunningTask
**task
)
156 FIXME("%p,%s,%x,%x,%s,%p: stub\n", iface
, debugstr_variant(¶ms
), flags
, session_id
, debugstr_w(user
), task
);
160 static HRESULT WINAPI
regtask_GetInstances(IRegisteredTask
*iface
, LONG flags
, IRunningTaskCollection
**tasks
)
162 FIXME("%p,%x,%p: stub\n", iface
, flags
, tasks
);
166 static HRESULT WINAPI
regtask_get_LastRunTime(IRegisteredTask
*iface
, DATE
*date
)
168 FIXME("%p,%p: stub\n", iface
, date
);
172 static HRESULT WINAPI
regtask_get_LastTaskResult(IRegisteredTask
*iface
, LONG
*result
)
174 FIXME("%p,%p: stub\n", iface
, result
);
178 static HRESULT WINAPI
regtask_get_NumberOfMissedRuns(IRegisteredTask
*iface
, LONG
*runs
)
180 FIXME("%p,%p: stub\n", iface
, runs
);
184 static HRESULT WINAPI
regtask_get_NextRunTime(IRegisteredTask
*iface
, DATE
*date
)
186 FIXME("%p,%p: stub\n", iface
, date
);
190 static HRESULT WINAPI
regtask_get_Definition(IRegisteredTask
*iface
, ITaskDefinition
**task
)
192 RegisteredTask
*regtask
= impl_from_IRegisteredTask(iface
);
194 TRACE("%p,%p\n", iface
, task
);
196 if (!task
) return E_POINTER
;
198 ITaskDefinition_AddRef(regtask
->taskdef
);
199 *task
= regtask
->taskdef
;
204 static HRESULT WINAPI
regtask_get_Xml(IRegisteredTask
*iface
, BSTR
*xml
)
206 RegisteredTask
*regtask
= impl_from_IRegisteredTask(iface
);
208 TRACE("%p,%p\n", iface
, xml
);
210 if (!xml
) return E_POINTER
;
212 return ITaskDefinition_get_XmlText(regtask
->taskdef
, xml
);
215 static HRESULT WINAPI
regtask_GetSecurityDescriptor(IRegisteredTask
*iface
, LONG info
, BSTR
*sddl
)
217 FIXME("%p,%x,%p: stub\n", iface
, info
, sddl
);
221 static HRESULT WINAPI
regtask_SetSecurityDescriptor(IRegisteredTask
*iface
, BSTR sddl
, LONG flags
)
223 FIXME("%p,%s,%x: stub\n", iface
, debugstr_w(sddl
), flags
);
227 static HRESULT WINAPI
regtask_Stop(IRegisteredTask
*iface
, LONG flags
)
229 FIXME("%p,%x: stub\n", iface
, flags
);
233 static HRESULT WINAPI
regtask_GetRunTimes(IRegisteredTask
*iface
, const LPSYSTEMTIME start
, const LPSYSTEMTIME end
,
234 DWORD
*count
, LPSYSTEMTIME
*time
)
236 FIXME("%p,%p.%p,%p,%p: stub\n", iface
, start
, end
, count
, time
);
240 static const IRegisteredTaskVtbl RegisteredTask_vtbl
=
242 regtask_QueryInterface
,
245 regtask_GetTypeInfoCount
,
247 regtask_GetIDsOfNames
,
256 regtask_GetInstances
,
257 regtask_get_LastRunTime
,
258 regtask_get_LastTaskResult
,
259 regtask_get_NumberOfMissedRuns
,
260 regtask_get_NextRunTime
,
261 regtask_get_Definition
,
263 regtask_GetSecurityDescriptor
,
264 regtask_SetSecurityDescriptor
,
269 HRESULT
RegisteredTask_create(const WCHAR
*path
, const WCHAR
*name
, ITaskDefinition
*definition
,
270 TASK_LOGON_TYPE logon
, IRegisteredTask
**obj
, BOOL create
)
272 RegisteredTask
*regtask
;
274 regtask
= heap_alloc(sizeof(*regtask
));
275 if (!regtask
) return E_OUTOFMEMORY
;
277 regtask
->IRegisteredTask_iface
.lpVtbl
= &RegisteredTask_vtbl
;
278 regtask
->path
= heap_strdupW(path
);
280 ITaskDefinition_AddRef(definition
);
281 regtask
->taskdef
= definition
;
282 *obj
= ®task
->IRegisteredTask_iface
;
284 TRACE("created %p\n", *obj
);
291 IRegisteredTaskCollection IRegisteredTaskCollection_iface
;
294 } RegisteredTaskCollection
;
296 static inline RegisteredTaskCollection
*impl_from_IRegisteredTaskCollection(IRegisteredTaskCollection
*iface
)
298 return CONTAINING_RECORD(iface
, RegisteredTaskCollection
, IRegisteredTaskCollection_iface
);
301 static ULONG WINAPI
regtasks_AddRef(IRegisteredTaskCollection
*iface
)
303 RegisteredTaskCollection
*regtasks
= impl_from_IRegisteredTaskCollection(iface
);
304 return InterlockedIncrement(®tasks
->ref
);
307 static ULONG WINAPI
regtasks_Release(IRegisteredTaskCollection
*iface
)
309 RegisteredTaskCollection
*regtasks
= impl_from_IRegisteredTaskCollection(iface
);
310 LONG ref
= InterlockedDecrement(®tasks
->ref
);
314 TRACE("destroying %p\n", iface
);
315 heap_free(regtasks
->path
);
322 static HRESULT WINAPI
regtasks_QueryInterface(IRegisteredTaskCollection
*iface
, REFIID riid
, void **obj
)
324 if (!riid
|| !obj
) return E_INVALIDARG
;
326 TRACE("%p,%s,%p\n", iface
, debugstr_guid(riid
), obj
);
328 if (IsEqualGUID(riid
, &IID_IRegisteredTaskCollection
) ||
329 IsEqualGUID(riid
, &IID_IDispatch
) ||
330 IsEqualGUID(riid
, &IID_IUnknown
))
332 IRegisteredTaskCollection_AddRef(iface
);
337 FIXME("interface %s is not implemented\n", debugstr_guid(riid
));
339 return E_NOINTERFACE
;
342 static HRESULT WINAPI
regtasks_GetTypeInfoCount(IRegisteredTaskCollection
*iface
, UINT
*count
)
344 FIXME("%p,%p: stub\n", iface
, count
);
348 static HRESULT WINAPI
regtasks_GetTypeInfo(IRegisteredTaskCollection
*iface
, UINT index
, LCID lcid
, ITypeInfo
**info
)
350 FIXME("%p,%u,%u,%p: stub\n", iface
, index
, lcid
, info
);
354 static HRESULT WINAPI
regtasks_GetIDsOfNames(IRegisteredTaskCollection
*iface
, REFIID riid
, LPOLESTR
*names
,
355 UINT count
, LCID lcid
, DISPID
*dispid
)
357 FIXME("%p,%s,%p,%u,%u,%p: stub\n", iface
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
361 static HRESULT WINAPI
regtasks_Invoke(IRegisteredTaskCollection
*iface
, DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
,
362 DISPPARAMS
*params
, VARIANT
*result
, EXCEPINFO
*excepinfo
, UINT
*argerr
)
364 FIXME("%p,%d,%s,%04x,%04x,%p,%p,%p,%p: stub\n", iface
, dispid
, debugstr_guid(riid
), lcid
, flags
,
365 params
, result
, excepinfo
, argerr
);
369 static HRESULT WINAPI
regtasks_get_Count(IRegisteredTaskCollection
*iface
, LONG
*count
)
371 FIXME("%p,%p: stub\n", iface
, count
);
375 static HRESULT WINAPI
regtasks_get_Item(IRegisteredTaskCollection
*iface
, VARIANT index
, IRegisteredTask
**regtask
)
377 FIXME("%p,%s,%p: stub\n", iface
, debugstr_variant(&index
), regtask
);
381 static HRESULT WINAPI
regtasks_get__NewEnum(IRegisteredTaskCollection
*iface
, IUnknown
**penum
)
383 FIXME("%p,%p: stub\n", iface
, penum
);
387 static const IRegisteredTaskCollectionVtbl RegisteredTaskCollection_vtbl
=
389 regtasks_QueryInterface
,
392 regtasks_GetTypeInfoCount
,
393 regtasks_GetTypeInfo
,
394 regtasks_GetIDsOfNames
,
398 regtasks_get__NewEnum
401 HRESULT
RegisteredTaskCollection_create(const WCHAR
*path
, IRegisteredTaskCollection
**obj
)
403 RegisteredTaskCollection
*regtasks
;
405 regtasks
= heap_alloc(sizeof(*regtasks
));
406 if (!regtasks
) return E_OUTOFMEMORY
;
408 regtasks
->IRegisteredTaskCollection_iface
.lpVtbl
= &RegisteredTaskCollection_vtbl
;
410 regtasks
->path
= heap_strdupW(path
);
411 *obj
= ®tasks
->IRegisteredTaskCollection_iface
;
413 TRACE("created %p\n", *obj
);