Dmitry Timoshkov : mstask: Implement setting and getting an application name using IExecAction.

Alexandre Julliard julliard at winehq.org
Fri Mar 30 12:32:36 CDT 2018


Module: wine
Branch: master
Commit: b9ebac70a87fb92b3499d22bbcfea6fdb5d6c49d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=b9ebac70a87fb92b3499d22bbcfea6fdb5d6c49d

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Fri Mar 30 16:59:47 2018 +0800

mstask: Implement setting and getting an application name using IExecAction.

Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mstask/task.c | 110 +++++++++++++++++++++++++++++------------------------
 1 file changed, 60 insertions(+), 50 deletions(-)

diff --git a/dlls/mstask/task.c b/dlls/mstask/task.c
index 97d7782..1a079cc 100644
--- a/dlls/mstask/task.c
+++ b/dlls/mstask/task.c
@@ -37,8 +37,8 @@ typedef struct
     IPersistFile IPersistFile_iface;
     LONG ref;
     ITaskDefinition *task;
+    IExecAction *action;
     LPWSTR task_name;
-    LPWSTR applicationName;
     LPWSTR parameters;
     LPWSTR comment;
     DWORD maxRunTime;
@@ -58,6 +58,8 @@ static inline TaskImpl *impl_from_IPersistFile( IPersistFile *iface )
 static void TaskDestructor(TaskImpl *This)
 {
     TRACE("%p\n", This);
+    if (This->action)
+        IExecAction_Release(This->action);
     ITaskDefinition_Release(This->task);
     HeapFree(GetProcessHeap(), 0, This->task_name);
     HeapFree(GetProcessHeap(), 0, This->accountName);
@@ -427,73 +429,68 @@ static HRESULT WINAPI MSTASK_ITask_GetAccountInformation(
     return S_OK;
 }
 
-static HRESULT WINAPI MSTASK_ITask_SetApplicationName(
-        ITask* iface,
-        LPCWSTR pwszApplicationName)
+static HRESULT WINAPI MSTASK_ITask_SetApplicationName(ITask *iface, LPCWSTR appname)
 {
-    DWORD n;
     TaskImpl *This = impl_from_ITask(iface);
-    LPWSTR tmp_name;
+    DWORD len;
 
-    TRACE("(%p, %s)\n", iface, debugstr_w(pwszApplicationName));
+    TRACE("(%p, %s)\n", iface, debugstr_w(appname));
 
     /* Empty application name */
-    if (pwszApplicationName[0] == 0)
-    {
-        HeapFree(GetProcessHeap(), 0, This->applicationName);
-        This->applicationName = NULL;
-        return S_OK;
-    }
+    if (!appname || !appname[0])
+        return IExecAction_put_Path(This->action, NULL);
 
     /* Attempt to set pwszApplicationName to a path resolved application name */
-    n = SearchPathW(NULL, pwszApplicationName, NULL, 0, NULL, NULL);
-    if (n)
+    len = SearchPathW(NULL, appname, NULL, 0, NULL, NULL);
+    if (len)
     {
-        tmp_name = HeapAlloc(GetProcessHeap(), 0, n * sizeof(WCHAR));
+        LPWSTR tmp_name;
+        HRESULT hr;
+
+        tmp_name = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
         if (!tmp_name)
             return E_OUTOFMEMORY;
-        n = SearchPathW(NULL, pwszApplicationName, NULL, n, tmp_name, NULL);
-        if (n)
-        {
-            HeapFree(GetProcessHeap(), 0, This->applicationName);
-            This->applicationName = tmp_name;
-            return S_OK;
-        }
+        len = SearchPathW(NULL, appname, NULL, len, tmp_name, NULL);
+        if (len)
+            hr = IExecAction_put_Path(This->action, tmp_name);
         else
-            HeapFree(GetProcessHeap(), 0, tmp_name);
+            hr = HRESULT_FROM_WIN32(GetLastError());
+
+        HeapFree(GetProcessHeap(), 0, tmp_name);
+        return hr;
     }
 
-    /* If unable to path resolve name, simply set to pwszApplicationName */
-    n = (lstrlenW(pwszApplicationName) + 1);
-    tmp_name = HeapAlloc(GetProcessHeap(), 0, n * sizeof(WCHAR));
-    if (!tmp_name)
-        return E_OUTOFMEMORY;
-    lstrcpyW(tmp_name, pwszApplicationName);
-    HeapFree(GetProcessHeap(), 0, This->applicationName);
-    This->applicationName = tmp_name;
-    return S_OK;
+    /* If unable to path resolve name, simply set to appname */
+    return IExecAction_put_Path(This->action, (BSTR)appname);
 }
 
-static HRESULT WINAPI MSTASK_ITask_GetApplicationName(
-        ITask* iface,
-        LPWSTR *ppwszApplicationName)
+static HRESULT WINAPI MSTASK_ITask_GetApplicationName(ITask *iface, LPWSTR *appname)
 {
-    DWORD n;
     TaskImpl *This = impl_from_ITask(iface);
+    HRESULT hr;
+    BSTR path;
+    DWORD len;
 
-    TRACE("(%p, %p)\n", iface, ppwszApplicationName);
+    TRACE("(%p, %p)\n", iface, appname);
 
-    n = This->applicationName ? lstrlenW(This->applicationName) + 1 : 1;
-    *ppwszApplicationName = CoTaskMemAlloc(n * sizeof(WCHAR));
-    if (!*ppwszApplicationName)
-        return E_OUTOFMEMORY;
+    hr = IExecAction_get_Path(This->action, &path);
+    if (hr != S_OK) return hr;
 
-    if (!This->applicationName)
-        *ppwszApplicationName[0] = 0;
+    len = path ? lstrlenW(path) + 1 : 1;
+    *appname = CoTaskMemAlloc(len * sizeof(WCHAR));
+    if (*appname)
+    {
+        if (!path)
+            *appname[0] = 0;
+        else
+            lstrcpyW(*appname, path);
+        hr = S_OK;
+    }
     else
-        lstrcpyW(*ppwszApplicationName, This->applicationName);
+        hr =  E_OUTOFMEMORY;
 
-    return S_OK;
+    SysFreeString(path);
+    return hr;
 }
 
 static HRESULT WINAPI MSTASK_ITask_SetParameters(
@@ -767,6 +764,7 @@ HRESULT TaskConstructor(ITaskService *service, const WCHAR *task_name, ITask **t
 {
     TaskImpl *This;
     ITaskDefinition *taskdef;
+    IActionCollection *actions;
     HRESULT hr;
 
     TRACE("(%s, %p)\n", debugstr_w(task_name), task);
@@ -786,7 +784,6 @@ HRESULT TaskConstructor(ITaskService *service, const WCHAR *task_name, ITask **t
     This->ref = 1;
     This->task = taskdef;
     This->task_name = heap_strdupW(task_name);
-    This->applicationName = NULL;
     This->parameters = NULL;
     This->comment = NULL;
     This->accountName = NULL;
@@ -794,7 +791,20 @@ HRESULT TaskConstructor(ITaskService *service, const WCHAR *task_name, ITask **t
     /* Default time is 3 days = 259200000 ms */
     This->maxRunTime = 259200000;
 
-    *task = &This->ITask_iface;
-    InterlockedIncrement(&dll_ref);
-    return S_OK;
+    hr = ITaskDefinition_get_Actions(This->task, &actions);
+    if (hr == S_OK)
+    {
+        hr = IActionCollection_Create(actions, TASK_ACTION_EXEC, (IAction **)&This->action);
+        IActionCollection_Release(actions);
+        if (hr == S_OK)
+        {
+            *task = &This->ITask_iface;
+            InterlockedIncrement(&dll_ref);
+            return S_OK;
+        }
+    }
+
+    ITaskDefinition_Release(This->task);
+    ITask_Release(&This->ITask_iface);
+    return hr;
 }




More information about the wine-cvs mailing list