[PATCH 2/3] mstask: Reimplement SetTargetComputer/GetTargetComputer using ITaskService methods.
Dmitry Timoshkov
dmitry at baikal.ru
Tue Mar 13 03:04:03 CDT 2018
Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
dlls/mstask/Makefile.in | 2 +-
dlls/mstask/task_scheduler.c | 89 +++++++++++++++++++++++++++-----------------
2 files changed, 55 insertions(+), 36 deletions(-)
diff --git a/dlls/mstask/Makefile.in b/dlls/mstask/Makefile.in
index 72a6db3eb7..d914666eed 100644
--- a/dlls/mstask/Makefile.in
+++ b/dlls/mstask/Makefile.in
@@ -1,5 +1,5 @@
MODULE = mstask.dll
-IMPORTS = ole32
+IMPORTS = ole32 oleaut32
C_SRCS = \
factory.c \
diff --git a/dlls/mstask/task_scheduler.c b/dlls/mstask/task_scheduler.c
index 1c2d227ddb..1ace4dd7a2 100644
--- a/dlls/mstask/task_scheduler.c
+++ b/dlls/mstask/task_scheduler.c
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2008 Google (Roy Shea)
+ * Copyright (C) 2018 Dmitry Timoshkov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,6 +25,7 @@
#include "winbase.h"
#include "initguid.h"
#include "objbase.h"
+#include "taskschd.h"
#include "mstask.h"
#include "mstask_private.h"
#include "wine/debug.h"
@@ -34,6 +36,7 @@ typedef struct
{
ITaskScheduler ITaskScheduler_iface;
LONG ref;
+ ITaskService *service;
} TaskSchedulerImpl;
typedef struct
@@ -55,6 +58,7 @@ static inline EnumWorkItemsImpl *impl_from_IEnumWorkItems(IEnumWorkItems *iface)
static void TaskSchedulerDestructor(TaskSchedulerImpl *This)
{
TRACE("%p\n", This);
+ ITaskService_Release(This->service);
HeapFree(GetProcessHeap(), 0, This);
InterlockedDecrement(&dll_ref);
}
@@ -198,60 +202,56 @@ static ULONG WINAPI MSTASK_ITaskScheduler_Release(
}
static HRESULT WINAPI MSTASK_ITaskScheduler_SetTargetComputer(
- ITaskScheduler* iface,
- LPCWSTR pwszComputer)
+ ITaskScheduler *iface, LPCWSTR comp_name)
{
TaskSchedulerImpl *This = impl_from_ITaskScheduler(iface);
- WCHAR buffer[MAX_COMPUTERNAME_LENGTH + 3]; /* extra space for two '\' and a zero */
- DWORD len = MAX_COMPUTERNAME_LENGTH + 1; /* extra space for a zero */
-
- TRACE("(%p)->(%s)\n", This, debugstr_w(pwszComputer));
-
- /* NULL is an alias for the local computer */
- if (!pwszComputer)
- return S_OK;
+ VARIANT v_null, v_comp;
+ HRESULT hr;
- buffer[0] = '\\';
- buffer[1] = '\\';
- if (GetComputerNameW(buffer + 2, &len))
- {
- if (!lstrcmpiW(buffer, pwszComputer) || /* full unc name */
- !lstrcmpiW(buffer + 2, pwszComputer)) /* name without backslash */
- return S_OK;
- }
+ TRACE("(%p)->(%s)\n", This, debugstr_w(comp_name));
- FIXME("remote computer %s not supported\n", debugstr_w(pwszComputer));
- return HRESULT_FROM_WIN32(ERROR_BAD_NETPATH);
+ V_VT(&v_null) = VT_NULL;
+ V_VT(&v_comp) = VT_BSTR;
+ V_BSTR(&v_comp) = SysAllocString(comp_name);
+ hr = ITaskService_Connect(This->service, v_comp, v_null, v_null, v_null);
+ SysFreeString(V_BSTR(&v_comp));
+ return hr;
}
static HRESULT WINAPI MSTASK_ITaskScheduler_GetTargetComputer(
- ITaskScheduler* iface,
- LPWSTR *ppwszComputer)
+ ITaskScheduler *iface, LPWSTR *comp_name)
{
TaskSchedulerImpl *This = impl_from_ITaskScheduler(iface);
- LPWSTR buffer;
- DWORD len = MAX_COMPUTERNAME_LENGTH + 1; /* extra space for the zero */
+ BSTR bstr;
+ WCHAR *buffer;
+ HRESULT hr;
- TRACE("(%p)->(%p)\n", This, ppwszComputer);
+ TRACE("(%p)->(%p)\n", This, comp_name);
- if (!ppwszComputer)
+ if (!comp_name)
return E_INVALIDARG;
+ hr = ITaskService_get_TargetServer(This->service, &bstr);
+ if (hr != S_OK) return hr;
+
/* extra space for two '\' and a zero */
- buffer = CoTaskMemAlloc((MAX_COMPUTERNAME_LENGTH + 3) * sizeof(WCHAR));
+ buffer = CoTaskMemAlloc((SysStringLen(bstr) + 3) * sizeof(WCHAR));
if (buffer)
{
buffer[0] = '\\';
buffer[1] = '\\';
- if (GetComputerNameW(buffer + 2, &len))
- {
- *ppwszComputer = buffer;
- return S_OK;
- }
- CoTaskMemFree(buffer);
+ lstrcpyW(buffer + 2, bstr);
+ *comp_name = buffer;
+ hr = S_OK;
}
- *ppwszComputer = NULL;
- return HRESULT_FROM_WIN32(GetLastError());
+ else
+ {
+ *comp_name = NULL;
+ hr = E_OUTOFMEMORY;
+ }
+
+ SysFreeString(bstr);
+ return hr;
}
static HRESULT WINAPI MSTASK_ITaskScheduler_Enum(
@@ -346,13 +346,32 @@ static const ITaskSchedulerVtbl MSTASK_ITaskSchedulerVtbl =
HRESULT TaskSchedulerConstructor(LPVOID *ppObj)
{
TaskSchedulerImpl *This;
+ ITaskService *service;
+ VARIANT v_null;
+ HRESULT hr;
+
TRACE("(%p)\n", ppObj);
+ hr = CoCreateInstance(&CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, &IID_ITaskService, (void **)&service);
+ if (hr != S_OK) return hr;
+
+ V_VT(&v_null) = VT_NULL;
+ hr = ITaskService_Connect(service, v_null, v_null, v_null, v_null);
+ if (hr != S_OK)
+ {
+ ITaskService_Release(service);
+ return hr;
+ }
+
This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
if (!This)
+ {
+ ITaskService_Release(service);
return E_OUTOFMEMORY;
+ }
This->ITaskScheduler_iface.lpVtbl = &MSTASK_ITaskSchedulerVtbl;
+ This->service = service;
This->ref = 1;
*ppObj = &This->ITaskScheduler_iface;
--
2.16.2
More information about the wine-devel
mailing list