mstask: Implement GetTargetComputer.
[wine] / dlls / mstask / task_scheduler.c
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
23 WINE_DEFAULT_DEBUG_CHANNEL(mstask);
24
25 typedef struct
26 {
27     ITaskScheduler ITaskScheduler_iface;
28     LONG ref;
29 } TaskSchedulerImpl;
30
31 static inline TaskSchedulerImpl *impl_from_ITaskScheduler(ITaskScheduler *iface)
32 {
33     return CONTAINING_RECORD(iface, TaskSchedulerImpl, ITaskScheduler_iface);
34 }
35
36 static void TaskSchedulerDestructor(TaskSchedulerImpl *This)
37 {
38     TRACE("%p\n", This);
39     HeapFree(GetProcessHeap(), 0, This);
40     InterlockedDecrement(&dll_ref);
41 }
42
43 static HRESULT WINAPI MSTASK_ITaskScheduler_QueryInterface(
44         ITaskScheduler* iface,
45         REFIID riid,
46         void **ppvObject)
47 {
48     TaskSchedulerImpl * This = impl_from_ITaskScheduler(iface);
49
50     TRACE("IID: %s\n", debugstr_guid(riid));
51
52     if (IsEqualGUID(riid, &IID_IUnknown) ||
53             IsEqualGUID(riid, &IID_ITaskScheduler))
54     {
55         *ppvObject = &This->ITaskScheduler_iface;
56         ITaskScheduler_AddRef(iface);
57         return S_OK;
58     }
59
60     *ppvObject = NULL;
61     return E_NOINTERFACE;
62 }
63
64 static ULONG WINAPI MSTASK_ITaskScheduler_AddRef(
65         ITaskScheduler* iface)
66 {
67     TaskSchedulerImpl *This = impl_from_ITaskScheduler(iface);
68     TRACE("\n");
69     return InterlockedIncrement(&This->ref);
70 }
71
72 static ULONG WINAPI MSTASK_ITaskScheduler_Release(
73         ITaskScheduler* iface)
74 {
75     TaskSchedulerImpl * This = impl_from_ITaskScheduler(iface);
76     ULONG ref;
77     TRACE("\n");
78     ref = InterlockedDecrement(&This->ref);
79     if (ref == 0)
80         TaskSchedulerDestructor(This);
81     return ref;
82 }
83
84 static HRESULT WINAPI MSTASK_ITaskScheduler_SetTargetComputer(
85         ITaskScheduler* iface,
86         LPCWSTR pwszComputer)
87 {
88     FIXME("%p, %s: stub\n", iface, debugstr_w(pwszComputer));
89     return E_NOTIMPL;
90 }
91
92 static HRESULT WINAPI MSTASK_ITaskScheduler_GetTargetComputer(
93         ITaskScheduler* iface,
94         LPWSTR *ppwszComputer)
95 {
96     TaskSchedulerImpl *This = impl_from_ITaskScheduler(iface);
97     LPWSTR buffer;
98     DWORD len = MAX_COMPUTERNAME_LENGTH + 1; /* extra space for the zero */
99
100     TRACE("(%p)->(%p)\n", This, ppwszComputer);
101
102     if (!ppwszComputer)
103         return E_INVALIDARG;
104
105     /* extra space for two '\' and a zero */
106     buffer = CoTaskMemAlloc((MAX_COMPUTERNAME_LENGTH + 3) * sizeof(WCHAR));
107     if (buffer)
108     {
109         buffer[0] = '\\';
110         buffer[1] = '\\';
111         if (GetComputerNameW(buffer + 2, &len))
112         {
113             *ppwszComputer = buffer;
114             return S_OK;
115         }
116         CoTaskMemFree(buffer);
117     }
118     *ppwszComputer = NULL;
119     return HRESULT_FROM_WIN32(GetLastError());
120 }
121
122 static HRESULT WINAPI MSTASK_ITaskScheduler_Enum(
123         ITaskScheduler* iface,
124         IEnumWorkItems **ppEnumTasks)
125 {
126     FIXME("%p, %p: stub\n", iface, ppEnumTasks);
127     return E_NOTIMPL;
128 }
129
130 static HRESULT WINAPI MSTASK_ITaskScheduler_Activate(
131         ITaskScheduler* iface,
132         LPCWSTR pwszName,
133         REFIID riid,
134         IUnknown **ppunk)
135 {
136     TRACE("%p, %s, %s, %p: stub\n", iface, debugstr_w(pwszName),
137             debugstr_guid(riid), ppunk);
138     FIXME("Partial stub always returning COR_E_FILENOTFOUND\n");
139     return COR_E_FILENOTFOUND;
140 }
141
142 static HRESULT WINAPI MSTASK_ITaskScheduler_Delete(
143         ITaskScheduler* iface,
144         LPCWSTR pwszName)
145 {
146     FIXME("%p, %s: stub\n", iface, debugstr_w(pwszName));
147     return E_NOTIMPL;
148 }
149
150 static HRESULT WINAPI MSTASK_ITaskScheduler_NewWorkItem(
151         ITaskScheduler* iface,
152         LPCWSTR pwszTaskName,
153         REFCLSID rclsid,
154         REFIID riid,
155         IUnknown **ppunk)
156 {
157     HRESULT hr;
158     TRACE("(%p, %s, %s, %s, %p)\n", iface, debugstr_w(pwszTaskName),
159             debugstr_guid(rclsid) ,debugstr_guid(riid),  ppunk);
160
161     if (!IsEqualGUID(rclsid, &CLSID_CTask))
162         return CLASS_E_CLASSNOTAVAILABLE;
163
164     if (!IsEqualGUID(riid, &IID_ITask))
165         return E_NOINTERFACE;
166
167     hr = TaskConstructor(pwszTaskName, (LPVOID *)ppunk);
168     return hr;
169 }
170
171 static HRESULT WINAPI MSTASK_ITaskScheduler_AddWorkItem(
172         ITaskScheduler* iface,
173         LPCWSTR pwszTaskName,
174         IScheduledWorkItem *pWorkItem)
175 {
176     FIXME("%p, %s, %p: stub\n", iface, debugstr_w(pwszTaskName), pWorkItem);
177     return E_NOTIMPL;
178 }
179
180 static HRESULT WINAPI MSTASK_ITaskScheduler_IsOfType(
181         ITaskScheduler* iface,
182         LPCWSTR pwszName,
183         REFIID riid)
184 {
185     FIXME("%p, %s, %s: stub\n", iface, debugstr_w(pwszName),
186             debugstr_guid(riid));
187     return E_NOTIMPL;
188 }
189
190 static const ITaskSchedulerVtbl MSTASK_ITaskSchedulerVtbl =
191 {
192     MSTASK_ITaskScheduler_QueryInterface,
193     MSTASK_ITaskScheduler_AddRef,
194     MSTASK_ITaskScheduler_Release,
195     MSTASK_ITaskScheduler_SetTargetComputer,
196     MSTASK_ITaskScheduler_GetTargetComputer,
197     MSTASK_ITaskScheduler_Enum,
198     MSTASK_ITaskScheduler_Activate,
199     MSTASK_ITaskScheduler_Delete,
200     MSTASK_ITaskScheduler_NewWorkItem,
201     MSTASK_ITaskScheduler_AddWorkItem,
202     MSTASK_ITaskScheduler_IsOfType
203 };
204
205 HRESULT TaskSchedulerConstructor(LPVOID *ppObj)
206 {
207     TaskSchedulerImpl *This;
208     TRACE("(%p)\n", ppObj);
209
210     This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
211     if (!This)
212         return E_OUTOFMEMORY;
213
214     This->ITaskScheduler_iface.lpVtbl = &MSTASK_ITaskSchedulerVtbl;
215     This->ref = 1;
216
217     *ppObj = &This->ITaskScheduler_iface;
218     InterlockedIncrement(&dll_ref);
219     return S_OK;
220 }