mirror of
git://source.winehq.org/git/wine.git
synced 2024-11-01 09:50:52 +00:00
inetcomm: Added MimeOleObjectFromMoniker semi-stub implementation.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
6fadcca527
commit
37792a266d
4 changed files with 134 additions and 4 deletions
|
@ -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 \
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
TESTDLL = inetcomm.dll
|
||||
IMPORTS = inetcomm oleaut32 ole32
|
||||
IMPORTS = inetcomm urlmon oleaut32 ole32
|
||||
|
||||
C_SRCS = \
|
||||
mimeintl.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();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue