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