msi: Use boolean return value in boolean function.
[wine/multimedia.git] / dlls / taskschd / task.c
blobc4247000127d36758a895f575cf0a3e572cde237
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 ITaskService ITaskService_iface;
38 LONG ref;
39 BOOL connected;
40 WCHAR comp_name[MAX_COMPUTERNAME_LENGTH + 1];
41 } TaskService;
43 static inline TaskService *impl_from_ITaskService(ITaskService *iface)
45 return CONTAINING_RECORD(iface, TaskService, ITaskService_iface);
48 static ULONG WINAPI TaskService_AddRef(ITaskService *iface)
50 TaskService *task_svc = impl_from_ITaskService(iface);
51 return InterlockedIncrement(&task_svc->ref);
54 static ULONG WINAPI TaskService_Release(ITaskService *iface)
56 TaskService *task_svc = impl_from_ITaskService(iface);
57 LONG ref = InterlockedDecrement(&task_svc->ref);
59 if (!ref)
61 TRACE("destroying %p\n", iface);
62 heap_free(task_svc);
65 return ref;
68 static HRESULT WINAPI TaskService_QueryInterface(ITaskService *iface, REFIID riid, void **obj)
70 if (!riid || !obj) return E_INVALIDARG;
72 TRACE("%p,%s,%p\n", iface, debugstr_guid(riid), obj);
74 if (IsEqualGUID(riid, &IID_ITaskService) ||
75 IsEqualGUID(riid, &IID_IDispatch) ||
76 IsEqualGUID(riid, &IID_IUnknown))
78 ITaskService_AddRef(iface);
79 *obj = iface;
80 return S_OK;
83 FIXME("interface %s is not implemented\n", debugstr_guid(riid));
84 return E_NOINTERFACE;
87 static HRESULT WINAPI TaskService_GetTypeInfoCount(ITaskService *iface, UINT *count)
89 FIXME("%p,%p: stub\n", iface, count);
90 return E_NOTIMPL;
93 static HRESULT WINAPI TaskService_GetTypeInfo(ITaskService *iface, UINT index, LCID lcid, ITypeInfo **info)
95 FIXME("%p,%u,%u,%p: stub\n", iface, index, lcid, info);
96 return E_NOTIMPL;
99 static HRESULT WINAPI TaskService_GetIDsOfNames(ITaskService *iface, REFIID riid, LPOLESTR *names,
100 UINT count, LCID lcid, DISPID *dispid)
102 FIXME("%p,%s,%p,%u,%u,%p: stub\n", iface, debugstr_guid(riid), names, count, lcid, dispid);
103 return E_NOTIMPL;
106 static HRESULT WINAPI TaskService_Invoke(ITaskService *iface, DISPID dispid, REFIID riid, LCID lcid, WORD flags,
107 DISPPARAMS *params, VARIANT *result, EXCEPINFO *excepinfo, UINT *argerr)
109 FIXME("%p,%d,%s,%04x,%04x,%p,%p,%p,%p: stub\n", iface, dispid, debugstr_guid(riid), lcid, flags,
110 params, result, excepinfo, argerr);
111 return E_NOTIMPL;
114 static HRESULT WINAPI TaskService_GetFolder(ITaskService *iface, BSTR path, ITaskFolder **folder)
116 TRACE("%p,%s,%p\n", iface, debugstr_w(path), folder);
118 if (!folder) return E_POINTER;
120 return TaskFolder_create(path, NULL, folder, FALSE);
123 static HRESULT WINAPI TaskService_GetRunningTasks(ITaskService *iface, LONG flags, IRunningTaskCollection **tasks)
125 FIXME("%p,%x,%p: stub\n", iface, flags, tasks);
126 return E_NOTIMPL;
129 static HRESULT WINAPI TaskService_NewTask(ITaskService *iface, DWORD flags, ITaskDefinition **definition)
131 FIXME("%p,%x,%p: stub\n", iface, flags, definition);
132 return E_NOTIMPL;
135 static inline BOOL is_variant_null(const VARIANT *var)
137 return V_VT(var) == VT_EMPTY || V_VT(var) == VT_NULL ||
138 (V_VT(var) == VT_BSTR && (V_BSTR(var) == NULL || !*V_BSTR(var)));
141 static HRESULT WINAPI TaskService_Connect(ITaskService *iface, VARIANT server, VARIANT user, VARIANT domain, VARIANT password)
143 TaskService *task_svc = impl_from_ITaskService(iface);
144 WCHAR comp_name[MAX_COMPUTERNAME_LENGTH + 1];
145 DWORD len;
147 TRACE("%p,%s,%s,%s,%s\n", iface, debugstr_variant(&server), debugstr_variant(&user),
148 debugstr_variant(&domain), debugstr_variant(&password));
150 if (!is_variant_null(&user) || !is_variant_null(&domain) || !is_variant_null(&password))
151 FIXME("user/domain/password are ignored\n");
153 len = sizeof(comp_name)/sizeof(comp_name[0]);
154 if (!GetComputerNameW(comp_name, &len))
155 return HRESULT_FROM_WIN32(GetLastError());
157 if (!is_variant_null(&server))
159 const WCHAR *server_name;
161 if (V_VT(&server) != VT_BSTR)
163 FIXME("server variant type %d is not supported\n", V_VT(&server));
164 return HRESULT_FROM_WIN32(ERROR_BAD_NETPATH);
167 /* skip UNC prefix if any */
168 server_name = V_BSTR(&server);
169 if (server_name[0] == '\\' && server_name[1] == '\\')
170 server_name += 2;
172 if (strcmpiW(server_name, comp_name))
174 FIXME("connection to remote server %s is not supported\n", debugstr_w(V_BSTR(&server)));
175 return HRESULT_FROM_WIN32(ERROR_BAD_NETPATH);
179 strcpyW(task_svc->comp_name, comp_name);
180 task_svc->connected = TRUE;
182 return S_OK;
185 static HRESULT WINAPI TaskService_get_Connected(ITaskService *iface, VARIANT_BOOL *connected)
187 TaskService *task_svc = impl_from_ITaskService(iface);
189 TRACE("%p,%p\n", iface, connected);
191 if (!connected) return E_POINTER;
193 *connected = task_svc->connected ? VARIANT_TRUE : VARIANT_FALSE;
195 return S_OK;
198 static HRESULT WINAPI TaskService_get_TargetServer(ITaskService *iface, BSTR *server)
200 TaskService *task_svc = impl_from_ITaskService(iface);
202 TRACE("%p,%p\n", iface, server);
204 if (!server) return E_POINTER;
206 if (!task_svc->connected)
207 return HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED);
209 *server = SysAllocString(task_svc->comp_name);
210 if (!*server) return E_OUTOFMEMORY;
212 return S_OK;
215 static HRESULT WINAPI TaskService_get_ConnectedUser(ITaskService *iface, BSTR *user)
217 FIXME("%p,%p: stub\n", iface, user);
218 return E_NOTIMPL;
221 static HRESULT WINAPI TaskService_get_ConnectedDomain(ITaskService *iface, BSTR *domain)
223 FIXME("%p,%p: stub\n", iface, domain);
224 return E_NOTIMPL;
227 static HRESULT WINAPI TaskService_get_HighestVersion(ITaskService *iface, DWORD *version)
229 FIXME("%p,%p: stub\n", iface, version);
230 return E_NOTIMPL;
233 static const ITaskServiceVtbl TaskService_vtbl =
235 TaskService_QueryInterface,
236 TaskService_AddRef,
237 TaskService_Release,
238 TaskService_GetTypeInfoCount,
239 TaskService_GetTypeInfo,
240 TaskService_GetIDsOfNames,
241 TaskService_Invoke,
242 TaskService_GetFolder,
243 TaskService_GetRunningTasks,
244 TaskService_NewTask,
245 TaskService_Connect,
246 TaskService_get_Connected,
247 TaskService_get_TargetServer,
248 TaskService_get_ConnectedUser,
249 TaskService_get_ConnectedDomain,
250 TaskService_get_HighestVersion
253 HRESULT TaskService_create(void **obj)
255 TaskService *task_svc;
257 task_svc = heap_alloc(sizeof(*task_svc));
258 if (!task_svc) return E_OUTOFMEMORY;
260 task_svc->ITaskService_iface.lpVtbl = &TaskService_vtbl;
261 task_svc->ref = 1;
262 task_svc->connected = FALSE;
263 *obj = &task_svc->ITaskService_iface;
265 TRACE("created %p\n", *obj);
267 return S_OK;