[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