Jacek Caban : inetcomm: Added MimeOleObjectFromMoniker semi-stub implementation.

Alexandre Julliard julliard at winehq.org
Wed Feb 1 15:26:06 CST 2017


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Feb  1 11:22:27 2017 +0100

inetcomm: Added MimeOleObjectFromMoniker semi-stub implementation.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/inetcomm/Makefile.in       |  2 +-
 dlls/inetcomm/mimeole.c         | 65 ++++++++++++++++++++++++++++++++++++--
 dlls/inetcomm/tests/Makefile.in |  2 +-
 dlls/inetcomm/tests/mimeole.c   | 69 +++++++++++++++++++++++++++++++++++++++++
 4 files changed, 134 insertions(+), 4 deletions(-)

diff --git a/dlls/inetcomm/Makefile.in b/dlls/inetcomm/Makefile.in
index 596eabb..690e302 100644
--- a/dlls/inetcomm/Makefile.in
+++ b/dlls/inetcomm/Makefile.in
@@ -1,6 +1,6 @@
 MODULE    = inetcomm.dll
 IMPORTLIB = inetcomm
-IMPORTS   = uuid propsys oleaut32 ole32 ws2_32 user32 advapi32
+IMPORTS   = uuid urlmon propsys oleaut32 ole32 ws2_32 user32 advapi32
 
 C_SRCS = \
 	imaptransport.c \
diff --git a/dlls/inetcomm/mimeole.c b/dlls/inetcomm/mimeole.c
index de37f09..c55be72 100644
--- a/dlls/inetcomm/mimeole.c
+++ b/dlls/inetcomm/mimeole.c
@@ -35,6 +35,7 @@
 
 #include "wine/list.h"
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 #include "inetcomm_private.h"
 
@@ -3562,10 +3563,70 @@ HRESULT WINAPI MimeGetAddressFormatW(REFIID riid, void *object, DWORD addr_type,
     return E_NOTIMPL;
 }
 
+static HRESULT WINAPI mime_obj_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
+{
+    FIXME("(%s %p)\n", debugstr_guid(riid), ppv);
+    *ppv = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI mime_obj_AddRef(IUnknown *iface)
+{
+    TRACE("\n");
+    return 2;
+}
+
+static ULONG WINAPI mime_obj_Release(IUnknown *iface)
+{
+    TRACE("\n");
+    return 1;
+}
+
+static const IUnknownVtbl mime_obj_vtbl = {
+    mime_obj_QueryInterface,
+    mime_obj_AddRef,
+    mime_obj_Release
+};
+
+static IUnknown mime_obj = { &mime_obj_vtbl };
+
 HRESULT WINAPI MimeOleObjectFromMoniker(BINDF bindf, IMoniker *moniker, IBindCtx *binding,
        REFIID riid, void **out, IMoniker **moniker_new)
 {
-    FIXME("(0x%08x, %p, %p, %s, %p, %p) stub\n", bindf, moniker, binding, debugstr_guid(riid), out, moniker_new);
+    WCHAR *display_name, *mhtml_url;
+    size_t len;
+    HRESULT hres;
 
-    return E_NOTIMPL;
+    static const WCHAR mhtml_prefixW[] = {'m','h','t','m','l',':'};
+
+    WARN("(0x%08x, %p, %p, %s, %p, %p) semi-stub\n", bindf, moniker, binding, debugstr_guid(riid), out, moniker_new);
+
+    if(!IsEqualGUID(&IID_IUnknown, riid)) {
+        FIXME("Unsupported riid %s\n", debugstr_guid(riid));
+        return E_NOINTERFACE;
+    }
+
+    hres = IMoniker_GetDisplayName(moniker, NULL, NULL, &display_name);
+    if(FAILED(hres))
+        return hres;
+
+    TRACE("display name %s\n", debugstr_w(display_name));
+
+    len = strlenW(display_name);
+    mhtml_url = heap_alloc((len+1)*sizeof(WCHAR) + sizeof(mhtml_prefixW));
+    if(!mhtml_url)
+        return E_OUTOFMEMORY;
+
+    memcpy(mhtml_url, mhtml_prefixW, sizeof(mhtml_prefixW));
+    strcpyW(mhtml_url + sizeof(mhtml_prefixW)/sizeof(WCHAR), display_name);
+    HeapFree(GetProcessHeap(), 0, display_name);
+
+    hres = CreateURLMoniker(NULL, mhtml_url, moniker_new);
+    heap_free(mhtml_url);
+    if(FAILED(hres))
+        return hres;
+
+    /* FIXME: We most likely should start binding here and return something more meaningful as mime object. */
+    *out = &mime_obj;
+    return S_OK;
 }
diff --git a/dlls/inetcomm/tests/Makefile.in b/dlls/inetcomm/tests/Makefile.in
index 4bd83cb..5a5b16d 100644
--- a/dlls/inetcomm/tests/Makefile.in
+++ b/dlls/inetcomm/tests/Makefile.in
@@ -1,5 +1,5 @@
 TESTDLL   = inetcomm.dll
-IMPORTS   = inetcomm oleaut32 ole32
+IMPORTS   = inetcomm urlmon oleaut32 ole32
 
 C_SRCS = \
 	mimeintl.c \
diff --git a/dlls/inetcomm/tests/mimeole.c b/dlls/inetcomm/tests/mimeole.c
index 15b267f..fe19893 100644
--- a/dlls/inetcomm/tests/mimeole.c
+++ b/dlls/inetcomm/tests/mimeole.c
@@ -106,6 +106,27 @@ static const char mhtml_page1[] =
     "\r\n\t\t\t\tVGVzdA==\r\n\r\n"
     "------=_NextPart_000_00--";
 
+static WCHAR *a2w(const char *str)
+{
+    WCHAR *ret;
+    int len;
+
+    if(!str)
+        return NULL;
+
+    len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
+    ret = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
+    MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
+    return ret;
+}
+
+static int strcmp_wa(const WCHAR *strw, const char *stra)
+{
+    WCHAR buf[512];
+    MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, sizeof(buf)/sizeof(WCHAR));
+    return lstrcmpW(strw, buf);
+}
+
 static void test_CreateVirtualStream(void)
 {
     HRESULT hr;
@@ -1207,6 +1228,53 @@ static void test_mhtml_protocol(void)
     test_mhtml_protocol_info();
 }
 
+static void test_MimeOleObjectFromMoniker(void)
+{
+    IMoniker *mon, *new_mon;
+    WCHAR *mhtml_url, *url;
+    IBindCtx *bind_ctx;
+    IUnknown *unk;
+    unsigned i;
+    HRESULT hres;
+
+    static const struct {
+        const char *url;
+        const char *mhtml_url;
+    } tests[] = {
+        {"file:///x:\\dir\\file.mht", "mhtml:file://x:\\dir\\file.mht"},
+        {"file:///x:/dir/file.mht", "mhtml:file://x:\\dir\\file.mht"},
+        {"http://www.winehq.org/index.html?query#hash", "mhtml:http://www.winehq.org/index.html?query#hash"},
+        {"../test.mht", "mhtml:../test.mht"}
+    };
+
+    for(i = 0; i < sizeof(tests)/sizeof(*tests); i++) {
+        url = a2w(tests[i].url);
+        hres = CreateURLMoniker(NULL, url, &mon);
+        ok(hres == S_OK, "CreateURLMoniker failed: %08x\n", hres);
+        HeapFree(GetProcessHeap(), 0, url);
+
+        hres = CreateBindCtx(0, &bind_ctx);
+        ok(hres == S_OK, "CreateBindCtx failed: %08x\n", hres);
+
+        hres = MimeOleObjectFromMoniker(0, mon, bind_ctx, &IID_IUnknown, (void**)&unk, &new_mon);
+        ok(hres == S_OK || broken(!i && hres == INET_E_RESOURCE_NOT_FOUND), "MimeOleObjectFromMoniker failed: %08x\n", hres);
+        IBindCtx_Release(bind_ctx);
+        if(hres == INET_E_RESOURCE_NOT_FOUND) { /* winxp */
+            win_skip("Broken MHTML behaviour found. Skipping some tests.\n");
+            return;
+        }
+
+        hres = IMoniker_GetDisplayName(new_mon, NULL, NULL, &mhtml_url);
+        ok(hres == S_OK, "GetDisplayName failed: %08x\n", hres);
+        ok(!strcmp_wa(mhtml_url, tests[i].mhtml_url), "[%d] unexpected mhtml URL: %s\n", i, wine_dbgstr_w(mhtml_url));
+        CoTaskMemFree(mhtml_url);
+
+        IUnknown_Release(unk);
+        IMoniker_Release(new_mon);
+        IMoniker_Release(mon);
+    }
+}
+
 START_TEST(mimeole)
 {
     OleInitialize(NULL);
@@ -1223,6 +1291,7 @@ START_TEST(mimeole)
     test_BodyDeleteProp();
     test_MimeOleGetPropertySchema();
     test_mhtml_message();
+    test_MimeOleObjectFromMoniker();
     test_mhtml_protocol();
     OleUninitialize();
 }




More information about the wine-cvs mailing list