From: Oleg Nikulin <owl2@etersoft.ru> --- dlls/taskschd/task.c | 37 ++++++++++++++++++++++++++--- dlls/taskschd/tests/scheduler.c | 41 +++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 3 deletions(-) diff --git a/dlls/taskschd/task.c b/dlls/taskschd/task.c index c22fc6be983..6dcec44e8dc 100644 --- a/dlls/taskschd/task.c +++ b/dlls/taskschd/task.c @@ -2401,6 +2401,7 @@ typedef struct { IPrincipal IPrincipal_iface; LONG ref; + BSTR user_id; } Principal; static inline Principal *impl_from_IPrincipal(IPrincipal *iface) @@ -2422,6 +2423,8 @@ static ULONG WINAPI Principal_Release(IPrincipal *iface) if (!ref) { TRACE("destroying %p\n", iface); + if (principal->user_id) + SysFreeString(principal->user_id); free(principal); } @@ -2501,13 +2504,40 @@ static HRESULT WINAPI Principal_put_DisplayName(IPrincipal *iface, BSTR name) static HRESULT WINAPI Principal_get_UserId(IPrincipal *iface, BSTR *user_id) { - FIXME("%p,%p: stub\n", iface, user_id); - return E_NOTIMPL; + Principal *principal = impl_from_IPrincipal(iface); + + TRACE("%p,%p\n", iface, user_id); + + if (!user_id) return E_POINTER; + + if (!principal->user_id) + *user_id = NULL; + else + { + *user_id = SysAllocString(principal->user_id); + if (!*user_id) return E_OUTOFMEMORY; + } + + return S_OK; } static HRESULT WINAPI Principal_put_UserId(IPrincipal *iface, BSTR user_id) { - FIXME("%p,%s: stub\n", iface, debugstr_w(user_id)); + Principal *principal = impl_from_IPrincipal(iface); + BSTR copy = NULL; + + TRACE("%p,%s\n", iface, debugstr_w(user_id)); + + if (user_id) + { + copy = SysAllocString(user_id); + if (!copy) return E_OUTOFMEMORY; + } + + if (principal->user_id) + SysFreeString(principal->user_id); + + principal->user_id = copy; return S_OK; } @@ -2579,6 +2609,7 @@ static HRESULT Principal_create(IPrincipal **obj) principal->IPrincipal_iface.lpVtbl = &Principal_vtbl; principal->ref = 1; + principal->user_id = NULL; *obj = &principal->IPrincipal_iface; diff --git a/dlls/taskschd/tests/scheduler.c b/dlls/taskschd/tests/scheduler.c index 888215526f2..705ba478471 100644 --- a/dlls/taskschd/tests/scheduler.c +++ b/dlls/taskschd/tests/scheduler.c @@ -1766,6 +1766,40 @@ static void test_action_collection(IActionCollection *actions_col) ok(hr == E_FAIL, "expected E_FAIL, got %#lx\n", hr); } +static void test_principal(IPrincipal *principal) +{ + static const BSTR userid = (BSTR)L"TestUser"; + TASK_LOGON_TYPE logon_type; + HRESULT hr; + BSTR bstr; + + hr = IPrincipal_get_UserId(principal, NULL); + ok(hr == E_POINTER, "expected E_POINTER, got %#lx\n", hr); + + bstr = (BSTR)0xdeadbeef; + hr = IPrincipal_get_UserId(principal, &bstr); + ok(hr == S_OK, "get_UserId failed: %08lx\n", hr); + ok(bstr == NULL, "expected NULL, got %s\n", wine_dbgstr_w(bstr)); + + hr = IPrincipal_put_UserId(principal, userid); + ok(hr == S_OK, "put_UserId failed: %08lx\n", hr); + + bstr = NULL; + hr = IPrincipal_get_UserId(principal, &bstr); + ok(hr == S_OK, "get_UserId failed: %08lx\n", hr); + ok(bstr != NULL, "UserId not set\n"); + ok(!lstrcmpW(bstr, userid), "expected %s, got %s\n", wine_dbgstr_w(userid), wine_dbgstr_w(bstr)); + SysFreeString(bstr); + + hr = IPrincipal_put_UserId(principal, NULL); + ok(hr == S_OK, "put_UserId failed: %08lx\n", hr); + + bstr = (BSTR)0xdeadbeef; + hr = IPrincipal_get_UserId(principal, &bstr); + ok(hr == S_OK, "get_UserId failed: %08lx\n", hr); + ok(bstr == NULL, "expected NULL, got %s\n", wine_dbgstr_w(bstr)); +} + static void test_TaskDefinition(void) { static WCHAR xml0[] = L""; @@ -1869,6 +1903,7 @@ static void test_TaskDefinition(void) VARIANT_TRUE, VARIANT_TRUE }; ITriggerCollection *trigger_col, *trigger_col2; IActionCollection *actions_col; + IPrincipal *principal; HRESULT hr; ITaskService *service; ITaskDefinition *taskdef; @@ -2095,6 +2130,12 @@ static void test_TaskDefinition(void) test_action_collection(actions_col); IActionCollection_Release(actions_col); + hr = ITaskDefinition_get_Principal(taskdef, &principal); + ok(hr == S_OK, "get_Principal failed: %08lx\n", hr); + ok(principal != NULL, "Principal = NULL\n"); + test_principal(principal); + IPrincipal_Release(principal); + IRegistrationInfo_Release(reginfo); ITaskDefinition_Release(taskdef); ITaskService_Release(service); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11065