ReactOS  0.4.15-dev-1070-ge1a01de
task_scheduler.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2008 Google (Roy Shea)
3  *
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.
8  *
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.
13  *
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
17  */
18 
19 #include "corerror.h"
20 #include "mstask_private.h"
21 #include "wine/debug.h"
22 
24 
25 typedef struct
26 {
30 
31 typedef struct
32 {
36 
38 {
39  return CONTAINING_RECORD(iface, TaskSchedulerImpl, ITaskScheduler_iface);
40 }
41 
43 {
44  return CONTAINING_RECORD(iface, EnumWorkItemsImpl, IEnumWorkItems_iface);
45 }
46 
48 {
49  TRACE("%p\n", This);
52 }
53 
55 {
57 
58  TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
59 
60  if (IsEqualGUID(riid, &IID_IEnumWorkItems) || IsEqualGUID(riid, &IID_IUnknown))
61  {
62  *obj = &This->IEnumWorkItems_iface;
63  IEnumWorkItems_AddRef(iface);
64  return S_OK;
65  }
66 
67  *obj = NULL;
68  return E_NOINTERFACE;
69 }
70 
72 {
75  TRACE("(%p)->(%u)\n", This, ref);
76  return ref;
77 }
78 
80 {
83 
84  TRACE("(%p)->(%u)\n", This, ref);
85 
86  if (ref == 0)
87  {
90  }
91 
92  return ref;
93 }
94 
96 {
98  FIXME("(%p)->(%u %p %p): stub\n", This, count, names, fetched);
99  return E_NOTIMPL;
100 }
101 
103 {
105  FIXME("(%p)->(%u): stub\n", This, count);
106  return E_NOTIMPL;
107 }
108 
110 {
112  FIXME("(%p): stub\n", This);
113  return E_NOTIMPL;
114 }
115 
117 {
119  FIXME("(%p)->(%p): stub\n", This, cloned);
120  return E_NOTIMPL;
121 }
122 
123 static const IEnumWorkItemsVtbl EnumWorkItemsVtbl = {
131 };
132 
134 {
135  EnumWorkItemsImpl *tasks;
136 
137  *ret = NULL;
138 
139  tasks = HeapAlloc(GetProcessHeap(), 0, sizeof(*tasks));
140  if (!tasks)
141  return E_OUTOFMEMORY;
142 
143  tasks->IEnumWorkItems_iface.lpVtbl = &EnumWorkItemsVtbl;
144  tasks->ref = 1;
145 
146  *ret = &tasks->IEnumWorkItems_iface;
148  return S_OK;
149 }
150 
152  ITaskScheduler* iface,
153  REFIID riid,
154  void **ppvObject)
155 {
157 
158  TRACE("IID: %s\n", debugstr_guid(riid));
159 
160  if (IsEqualGUID(riid, &IID_IUnknown) ||
161  IsEqualGUID(riid, &IID_ITaskScheduler))
162  {
163  *ppvObject = &This->ITaskScheduler_iface;
164  ITaskScheduler_AddRef(iface);
165  return S_OK;
166  }
167 
168  *ppvObject = NULL;
169  return E_NOINTERFACE;
170 }
171 
173  ITaskScheduler* iface)
174 {
176  TRACE("\n");
177  return InterlockedIncrement(&This->ref);
178 }
179 
181  ITaskScheduler* iface)
182 {
184  ULONG ref;
185  TRACE("\n");
186  ref = InterlockedDecrement(&This->ref);
187  if (ref == 0)
189  return ref;
190 }
191 
193  ITaskScheduler* iface,
194  LPCWSTR pwszComputer)
195 {
197  WCHAR buffer[MAX_COMPUTERNAME_LENGTH + 3]; /* extra space for two '\' and a zero */
198  DWORD len = MAX_COMPUTERNAME_LENGTH + 1; /* extra space for a zero */
199 
200  TRACE("(%p)->(%s)\n", This, debugstr_w(pwszComputer));
201 
202  /* NULL is an alias for the local computer */
203  if (!pwszComputer)
204  return S_OK;
205 
206  buffer[0] = '\\';
207  buffer[1] = '\\';
208  if (GetComputerNameW(buffer + 2, &len))
209  {
210  if (!lstrcmpiW(buffer, pwszComputer) || /* full unc name */
211  !lstrcmpiW(buffer + 2, pwszComputer)) /* name without backslash */
212  return S_OK;
213  }
214 
215  FIXME("remote computer %s not supported\n", debugstr_w(pwszComputer));
217 }
218 
220  ITaskScheduler* iface,
221  LPWSTR *ppwszComputer)
222 {
224  LPWSTR buffer;
225  DWORD len = MAX_COMPUTERNAME_LENGTH + 1; /* extra space for the zero */
226 
227  TRACE("(%p)->(%p)\n", This, ppwszComputer);
228 
229  if (!ppwszComputer)
230  return E_INVALIDARG;
231 
232  /* extra space for two '\' and a zero */
234  if (buffer)
235  {
236  buffer[0] = '\\';
237  buffer[1] = '\\';
238  if (GetComputerNameW(buffer + 2, &len))
239  {
240  *ppwszComputer = buffer;
241  return S_OK;
242  }
244  }
245  *ppwszComputer = NULL;
247 }
248 
250  ITaskScheduler* iface,
251  IEnumWorkItems **tasks)
252 {
254 
255  TRACE("(%p)->(%p)\n", This, tasks);
256 
257  if (!tasks)
258  return E_INVALIDARG;
259 
260  return create_task_enum(tasks);
261 }
262 
264  ITaskScheduler* iface,
265  LPCWSTR pwszName,
266  REFIID riid,
267  IUnknown **ppunk)
268 {
269  TRACE("%p, %s, %s, %p: stub\n", iface, debugstr_w(pwszName),
270  debugstr_guid(riid), ppunk);
271  FIXME("Partial stub always returning COR_E_FILENOTFOUND\n");
272  return COR_E_FILENOTFOUND;
273 }
274 
276  ITaskScheduler* iface,
277  LPCWSTR pwszName)
278 {
279  FIXME("%p, %s: stub\n", iface, debugstr_w(pwszName));
280  return E_NOTIMPL;
281 }
282 
284  ITaskScheduler* iface,
285  LPCWSTR pwszTaskName,
286  REFCLSID rclsid,
287  REFIID riid,
288  IUnknown **ppunk)
289 {
290  HRESULT hr;
291  TRACE("(%p, %s, %s, %s, %p)\n", iface, debugstr_w(pwszTaskName),
292  debugstr_guid(rclsid) ,debugstr_guid(riid), ppunk);
293 
294  if (!IsEqualGUID(rclsid, &CLSID_CTask))
296 
297  if (!IsEqualGUID(riid, &IID_ITask))
298  return E_NOINTERFACE;
299 
300  hr = TaskConstructor(pwszTaskName, (LPVOID *)ppunk);
301  return hr;
302 }
303 
305  ITaskScheduler* iface,
306  LPCWSTR pwszTaskName,
307  IScheduledWorkItem *pWorkItem)
308 {
309  FIXME("%p, %s, %p: stub\n", iface, debugstr_w(pwszTaskName), pWorkItem);
310  return E_NOTIMPL;
311 }
312 
314  ITaskScheduler* iface,
315  LPCWSTR pwszName,
316  REFIID riid)
317 {
318  FIXME("%p, %s, %s: stub\n", iface, debugstr_w(pwszName),
320  return E_NOTIMPL;
321 }
322 
323 static const ITaskSchedulerVtbl MSTASK_ITaskSchedulerVtbl =
324 {
336 };
337 
339 {
341  TRACE("(%p)\n", ppObj);
342 
343  This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
344  if (!This)
345  return E_OUTOFMEMORY;
346 
347  This->ITaskScheduler_iface.lpVtbl = &MSTASK_ITaskSchedulerVtbl;
348  This->ref = 1;
349 
350  *ppObj = &This->ITaskScheduler_iface;
352  return S_OK;
353 }
static const ITaskSchedulerVtbl MSTASK_ITaskSchedulerVtbl
#define COR_E_FILENOTFOUND
Definition: corerror.h:42
#define REFIID
Definition: guiddef.h:118
#define E_NOINTERFACE
Definition: winerror.h:2364
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
static ULONG WINAPI EnumWorkItems_AddRef(IEnumWorkItems *iface)
HRESULT hr
Definition: shlfolder.c:183
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
REFIID riid
Definition: precomp.h:44
#define REFCLSID
Definition: guiddef.h:117
GLuint GLuint GLsizei count
Definition: gl.h:1545
static HRESULT WINAPI MSTASK_ITaskScheduler_Enum(ITaskScheduler *iface, IEnumWorkItems **tasks)
static HRESULT WINAPI MSTASK_ITaskScheduler_Delete(ITaskScheduler *iface, LPCWSTR pwszName)
static HRESULT WINAPI EnumWorkItems_Next(IEnumWorkItems *iface, ULONG count, LPWSTR **names, ULONG *fetched)
static EnumWorkItemsImpl * impl_from_IEnumWorkItems(IEnumWorkItems *iface)
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1044
GLuint buffer
Definition: glext.h:5915
static HRESULT WINAPI MSTASK_ITaskScheduler_AddWorkItem(ITaskScheduler *iface, LPCWSTR pwszTaskName, IScheduledWorkItem *pWorkItem)
ITaskScheduler ITaskScheduler_iface
BOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD lpnSize)
Definition: compname.c:446
static HRESULT WINAPI MSTASK_ITaskScheduler_IsOfType(ITaskScheduler *iface, LPCWSTR pwszName, REFIID riid)
static HRESULT WINAPI MSTASK_ITaskScheduler_QueryInterface(ITaskScheduler *iface, REFIID riid, void **ppvObject)
#define CLASS_E_CLASSNOTAVAILABLE
Definition: winerror.h:2663
Definition: send.c:48
#define ERROR_BAD_NETPATH
Definition: winerror.h:145
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
static HRESULT WINAPI MSTASK_ITaskScheduler_Activate(ITaskScheduler *iface, LPCWSTR pwszName, REFIID riid, IUnknown **ppunk)
GLuint GLuint * names
Definition: glext.h:11545
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
long LONG
Definition: pedump.c:60
#define debugstr_w
Definition: kernel32.h:32
GLenum GLint ref
Definition: glext.h:6028
#define FIXME(fmt,...)
Definition: debug.h:111
static void TaskSchedulerDestructor(TaskSchedulerImpl *This)
static HRESULT WINAPI EnumWorkItems_Clone(IEnumWorkItems *iface, IEnumWorkItems **cloned)
#define E_INVALIDARG
Definition: ddrawi.h:101
smooth NULL
Definition: ftsmooth.c:416
#define debugstr_guid
Definition: kernel32.h:35
static HRESULT WINAPI MSTASK_ITaskScheduler_NewWorkItem(ITaskScheduler *iface, LPCWSTR pwszTaskName, REFCLSID rclsid, REFIID riid, IUnknown **ppunk)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:484
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
static const IEnumWorkItemsVtbl EnumWorkItemsVtbl
const GUID IID_IUnknown
static HRESULT create_task_enum(IEnumWorkItems **ret)
#define WINAPI
Definition: msvc.h:6
LONG dll_ref
Definition: mstask_main.c:31
unsigned long DWORD
Definition: ntddk_ex.h:95
HRESULT TaskSchedulerConstructor(LPVOID *ppObj)
static ULONG WINAPI EnumWorkItems_Release(IEnumWorkItems *iface)
IEnumWorkItems IEnumWorkItems_iface
int ret
static TaskSchedulerImpl * impl_from_ITaskScheduler(ITaskScheduler *iface)
#define InterlockedDecrement
Definition: armddk.h:52
static HRESULT WINAPI MSTASK_ITaskScheduler_SetTargetComputer(ITaskScheduler *iface, LPCWSTR pwszComputer)
GLenum GLsizei len
Definition: glext.h:6722
REFIID LPVOID * ppvObject
Definition: precomp.h:44
HRESULT TaskConstructor(LPCWSTR pwszTaskName, LPVOID *ppObj) DECLSPEC_HIDDEN
Definition: task.c:756
#define MAX_COMPUTERNAME_LENGTH
Definition: winbase.h:240
#define S_OK
Definition: intsafe.h:51
#define InterlockedIncrement
Definition: armddk.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
static HRESULT WINAPI MSTASK_ITaskScheduler_GetTargetComputer(ITaskScheduler *iface, LPWSTR *ppwszComputer)
unsigned int ULONG
Definition: retypes.h:1
static ULONG WINAPI MSTASK_ITaskScheduler_AddRef(ITaskScheduler *iface)
WCHAR * LPWSTR
Definition: xmlstorage.h:184
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
WINE_DEFAULT_DEBUG_CHANNEL(mstask)
#define HeapFree(x, y, z)
Definition: compat.h:483
static HRESULT WINAPI EnumWorkItems_Reset(IEnumWorkItems *iface)
static ULONG WINAPI MSTASK_ITaskScheduler_Release(ITaskScheduler *iface)
static HRESULT WINAPI EnumWorkItems_Skip(IEnumWorkItems *iface, ULONG count)
static HRESULT WINAPI EnumWorkItems_QueryInterface(IEnumWorkItems *iface, REFIID riid, void **obj)