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
28 #include "taskschd_private.h"
30 #include "wine/unicode.h"
31 #include "wine/debug.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(taskschd
);
37 ITaskService ITaskService_iface
;
40 WCHAR comp_name
[MAX_COMPUTERNAME_LENGTH
+ 1];
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
);
61 TRACE("destroying %p\n", iface
);
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
);
83 FIXME("interface %s is not implemented\n", debugstr_guid(riid
));
87 static HRESULT WINAPI
TaskService_GetTypeInfoCount(ITaskService
*iface
, UINT
*count
)
89 FIXME("%p,%p: stub\n", iface
, count
);
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
);
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
);
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
);
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
);
129 static HRESULT WINAPI
TaskService_NewTask(ITaskService
*iface
, DWORD flags
, ITaskDefinition
**definition
)
131 FIXME("%p,%x,%p: stub\n", iface
, flags
, definition
);
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];
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] == '\\')
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
;
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
;
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
;
215 static HRESULT WINAPI
TaskService_get_ConnectedUser(ITaskService
*iface
, BSTR
*user
)
217 FIXME("%p,%p: stub\n", iface
, user
);
221 static HRESULT WINAPI
TaskService_get_ConnectedDomain(ITaskService
*iface
, BSTR
*domain
)
223 FIXME("%p,%p: stub\n", iface
, domain
);
227 static HRESULT WINAPI
TaskService_get_HighestVersion(ITaskService
*iface
, DWORD
*version
)
229 FIXME("%p,%p: stub\n", iface
, version
);
233 static const ITaskServiceVtbl TaskService_vtbl
=
235 TaskService_QueryInterface
,
238 TaskService_GetTypeInfoCount
,
239 TaskService_GetTypeInfo
,
240 TaskService_GetIDsOfNames
,
242 TaskService_GetFolder
,
243 TaskService_GetRunningTasks
,
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
;
262 task_svc
->connected
= FALSE
;
263 *obj
= &task_svc
->ITaskService_iface
;
265 TRACE("created %p\n", *obj
);