Module: wine Branch: master Commit: 6ec977aa004409e17e1df5a2fdee850044ddf1ca URL: https://gitlab.winehq.org/wine/wine/-/commit/6ec977aa004409e17e1df5a2fdee850...
Author: Vijay Kiran Kamuju infyquest@gmail.com Date: Sun Feb 25 22:25:00 2024 +0100
taskschd: Implement ITaskService_get_ConnectedUser.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48110
---
dlls/taskschd/task.c | 22 ++++++++++++++++++++-- dlls/taskschd/tests/scheduler.c | 15 +++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/dlls/taskschd/task.c b/dlls/taskschd/task.c index d9ddf9d12b8..26cfeb950b0 100644 --- a/dlls/taskschd/task.c +++ b/dlls/taskschd/task.c @@ -3687,6 +3687,7 @@ typedef struct BOOL connected; DWORD version; WCHAR comp_name[MAX_COMPUTERNAME_LENGTH + 1]; + WCHAR user_name[256]; } TaskService;
static inline TaskService *impl_from_ITaskService(ITaskService *iface) @@ -3858,6 +3859,7 @@ static HRESULT WINAPI TaskService_Connect(ITaskService *iface, VARIANT server, V static WCHAR ncalrpc[] = L"ncalrpc"; TaskService *task_svc = impl_from_ITaskService(iface); WCHAR comp_name[MAX_COMPUTERNAME_LENGTH + 1]; + WCHAR user_name[256]; DWORD len; HRESULT hr; RPC_WSTR binding_str; @@ -3873,6 +3875,10 @@ static HRESULT WINAPI TaskService_Connect(ITaskService *iface, VARIANT server, V if (!GetComputerNameW(comp_name, &len)) return HRESULT_FROM_WIN32(GetLastError());
+ len = ARRAY_SIZE(user_name); + if (!GetUserNameW(user_name, &len)) + return HRESULT_FROM_WIN32(GetLastError()); + if (!is_variant_null(&server)) { const WCHAR *server_name; @@ -3911,6 +3917,7 @@ static HRESULT WINAPI TaskService_Connect(ITaskService *iface, VARIANT server, V TRACE("server version %#lx\n", task_svc->version);
lstrcpyW(task_svc->comp_name, comp_name); + lstrcpyW(task_svc->user_name, user_name); task_svc->connected = TRUE;
return S_OK; @@ -3948,8 +3955,19 @@ static HRESULT WINAPI TaskService_get_TargetServer(ITaskService *iface, BSTR *se
static HRESULT WINAPI TaskService_get_ConnectedUser(ITaskService *iface, BSTR *user) { - FIXME("%p,%p: stub\n", iface, user); - return E_NOTIMPL; + TaskService *task_svc = impl_from_ITaskService(iface); + + TRACE("%p,%p\n", iface, user); + + if (!user) return E_POINTER; + + if (!task_svc->connected) + return HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED); + + *user = SysAllocString(task_svc->user_name); + if (!*user) return E_OUTOFMEMORY; + + return S_OK; }
static HRESULT WINAPI TaskService_get_ConnectedDomain(ITaskService *iface, BSTR *domain) diff --git a/dlls/taskschd/tests/scheduler.c b/dlls/taskschd/tests/scheduler.c index bf6e13be98b..2829ba98ff2 100644 --- a/dlls/taskschd/tests/scheduler.c +++ b/dlls/taskschd/tests/scheduler.c @@ -64,6 +64,7 @@ static BOOL check_win_version(int min_major, int min_minor) static void test_Connect(void) { WCHAR comp_name[MAX_COMPUTERNAME_LENGTH + 1]; + WCHAR user_name[256]; DWORD len; HRESULT hr; BSTR bstr; @@ -93,6 +94,12 @@ static void test_Connect(void) hr = ITaskService_get_TargetServer(service, &bstr); ok(hr == HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED), "expected ERROR_ONLY_IF_CONNECTED, got %#lx\n", hr);
+ hr = ITaskService_get_ConnectedUser(service, NULL); + ok(hr == E_POINTER, "expected E_POINTER, got %#lx\n", hr); + + hr = ITaskService_get_ConnectedUser(service, &bstr); + ok(hr == HRESULT_FROM_WIN32(ERROR_ONLY_IF_CONNECTED), "expected ERROR_ONLY_IF_CONNECTED, got %#lx\n", hr); + /* Win7 doesn't support UNC \ prefix, but according to a user * comment on MSDN Win8 supports both ways. */ @@ -144,6 +151,14 @@ static void test_Connect(void) ok(!lstrcmpW(comp_name, bstr), "compname %s != server name %s\n", wine_dbgstr_w(comp_name), wine_dbgstr_w(bstr)); SysFreeString(bstr);
+ len = ARRAY_SIZE(user_name); + GetUserNameW(user_name, &len); + + hr = ITaskService_get_ConnectedUser(service, &bstr); + ok(hr == S_OK, "get_ConnectedUser error %#lx\n", hr); + ok(!lstrcmpW(user_name, bstr), "username %s != user name %s\n", wine_dbgstr_w(user_name), wine_dbgstr_w(bstr)); + SysFreeString(bstr); + ITaskService_Release(service); }