Nikolay Sivov : wshom: Implement Popup() method.

Alexandre Julliard julliard at winehq.org
Mon Dec 11 13:53:38 CST 2017


Module: wine
Branch: master
Commit: 8c68872416a07cdc6b4b837c42f74a27f55aa079
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8c68872416a07cdc6b4b837c42f74a27f55aa079

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Dec 11 10:31:51 2017 +0300

wshom: Implement Popup() method.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wshom.ocx/shell.c       | 78 +++++++++++++++++++++++++++++++++++++++++---
 dlls/wshom.ocx/tests/wshom.c | 49 ++++++++++++++++++++++++++++
 2 files changed, 123 insertions(+), 4 deletions(-)

diff --git a/dlls/wshom.ocx/shell.c b/dlls/wshom.ocx/shell.c
index b00bc10..a023786 100644
--- a/dlls/wshom.ocx/shell.c
+++ b/dlls/wshom.ocx/shell.c
@@ -1275,11 +1275,81 @@ static HRESULT WINAPI WshShell3_Run(IWshShell3 *iface, BSTR cmd, VARIANT *style,
     }
 }
 
-static HRESULT WINAPI WshShell3_Popup(IWshShell3 *iface, BSTR Text, VARIANT* SecondsToWait, VARIANT *Title, VARIANT *Type, int *button)
+struct popup_thread_param
 {
-    FIXME("(%s %s %s %s %p): stub\n", debugstr_w(Text), debugstr_variant(SecondsToWait),
-        debugstr_variant(Title), debugstr_variant(Type), button);
-    return E_NOTIMPL;
+    WCHAR *text;
+    VARIANT title;
+    VARIANT type;
+    INT button;
+};
+
+static DWORD WINAPI popup_thread_proc(void *arg)
+{
+    static const WCHAR defaulttitleW[] = {'W','i','n','d','o','w','s',' ','S','c','r','i','p','t',' ','H','o','s','t',0};
+    struct popup_thread_param *param = (struct popup_thread_param *)arg;
+
+    param->button = MessageBoxW(NULL, param->text, is_optional_argument(&param->title) ?
+            defaulttitleW : V_BSTR(&param->title), V_I4(&param->type));
+    return 0;
+}
+
+static HRESULT WINAPI WshShell3_Popup(IWshShell3 *iface, BSTR text, VARIANT *seconds_to_wait, VARIANT *title,
+        VARIANT *type, int *button)
+{
+    struct popup_thread_param param;
+    DWORD tid, status;
+    VARIANT timeout;
+    HANDLE hthread;
+    HRESULT hr;
+
+    TRACE("(%s %s %s %s %p)\n", debugstr_w(text), debugstr_variant(seconds_to_wait), debugstr_variant(title),
+        debugstr_variant(type), button);
+
+    if (!seconds_to_wait || !title || !type || !button)
+        return E_POINTER;
+
+    VariantInit(&timeout);
+    if (!is_optional_argument(seconds_to_wait))
+    {
+        hr = VariantChangeType(&timeout, seconds_to_wait, 0, VT_I4);
+        if (FAILED(hr))
+            return hr;
+    }
+
+    VariantInit(&param.type);
+    if (!is_optional_argument(type))
+    {
+        hr = VariantChangeType(&param.type, type, 0, VT_I4);
+        if (FAILED(hr))
+            return hr;
+    }
+
+    if (is_optional_argument(title))
+        param.title = *title;
+    else
+    {
+        VariantInit(&param.title);
+        hr = VariantChangeType(&param.title, title, 0, VT_BSTR);
+        if (FAILED(hr))
+            return hr;
+    }
+
+    param.text = text;
+    param.button = -1;
+    hthread = CreateThread(NULL, 0, popup_thread_proc, &param, 0, &tid);
+    status = MsgWaitForMultipleObjects(1, &hthread, FALSE, V_I4(&timeout) ? V_I4(&timeout) * 1000: INFINITE, 0);
+    if (status == WAIT_TIMEOUT)
+    {
+        PostThreadMessageW(tid, WM_QUIT, 0, 0);
+        MsgWaitForMultipleObjects(1, &hthread, FALSE, INFINITE, 0);
+        param.button = -1;
+    }
+    *button = param.button;
+
+    VariantClear(&param.title);
+    CloseHandle(hthread);
+
+    return S_OK;
 }
 
 static HRESULT WINAPI WshShell3_CreateShortcut(IWshShell3 *iface, BSTR PathLink, IDispatch** Shortcut)
diff --git a/dlls/wshom.ocx/tests/wshom.c b/dlls/wshom.ocx/tests/wshom.c
index 7e82f30..18ff4d6 100644
--- a/dlls/wshom.ocx/tests/wshom.c
+++ b/dlls/wshom.ocx/tests/wshom.c
@@ -566,6 +566,54 @@ static void test_registry(void)
     IWshShell3_Release(sh3);
 }
 
+static void test_popup(void)
+{
+    static const WCHAR textW[] = {'T','e','x','t',0};
+    VARIANT timeout, type, title, optional;
+    IWshShell *sh;
+    int button;
+    HRESULT hr;
+    BSTR text;
+
+    hr = CoCreateInstance(&CLSID_WshShell, NULL, CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER,
+            &IID_IWshShell, (void **)&sh);
+    ok(hr == S_OK, "Failed to create WshShell object, hr %#x.\n", hr);
+
+    button = 123;
+    text = SysAllocString(textW);
+
+    hr = IWshShell_Popup(sh, NULL, NULL, NULL, NULL, &button);
+    ok(hr == E_POINTER, "Unexpected retval %#x.\n", hr);
+    ok(button == 123, "Unexpected button id %d.\n", button);
+
+    hr = IWshShell_Popup(sh, text, NULL, NULL, NULL, &button);
+    ok(hr == E_POINTER, "Unexpected retval %#x.\n", hr);
+    ok(button == 123, "Unexpected button id %d.\n", button);
+
+    V_VT(&optional) = VT_ERROR;
+    V_ERROR(&optional) = DISP_E_PARAMNOTFOUND;
+
+    V_VT(&timeout) = VT_I2;
+    V_I2(&timeout) = 1;
+
+    V_VT(&type) = VT_I2;
+    V_I2(&type) = 1;
+
+    V_VT(&title) = VT_BSTR;
+    V_BSTR(&title) = NULL;
+
+    hr = IWshShell_Popup(sh, text, &timeout, &optional, &type, &button);
+    ok(hr == S_OK, "Unexpected retval %#x.\n", hr);
+    ok(button == -1, "Unexpected button id %d.\n", button);
+
+    hr = IWshShell_Popup(sh, text, &timeout, &title, &optional, &button);
+    ok(hr == S_OK, "Unexpected retval %#x.\n", hr);
+    ok(button == -1, "Unexpected button id %d.\n", button);
+
+    SysFreeString(text);
+    IWshShell_Release(sh);
+}
+
 START_TEST(wshom)
 {
     IUnknown *unk;
@@ -583,6 +631,7 @@ START_TEST(wshom)
 
     test_wshshell();
     test_registry();
+    test_popup();
 
     CoUninitialize();
 }




More information about the wine-cvs mailing list