diff --git a/dlls/urlmon/http.c b/dlls/urlmon/http.c index fd69d6bf55c..4f33572c62c 100644 --- a/dlls/urlmon/http.c +++ b/dlls/urlmon/http.c @@ -32,13 +32,18 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon); typedef struct { - const IInternetProtocolVtbl *lpInternetProtocolVtbl; + const IInternetProtocolVtbl *lpInternetProtocolVtbl; + const IInternetPriorityVtbl *lpInternetPriorityVtbl; + + LONG priority; + LONG ref; } HttpProtocol; -#define PROTOCOL_THIS(iface) DEFINE_THIS(HttpProtocol, InternetProtocol, iface) - #define PROTOCOL(x) ((IInternetProtocol*) &(x)->lpInternetProtocolVtbl) +#define PRIORITY(x) ((IInternetPriority*) &(x)->lpInternetPriorityVtbl) + +#define PROTOCOL_THIS(iface) DEFINE_THIS(HttpProtocol, InternetProtocol, iface) static HRESULT WINAPI HttpProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv) { @@ -54,6 +59,9 @@ static HRESULT WINAPI HttpProtocol_QueryInterface(IInternetProtocol *iface, REFI }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) { TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv); *ppv = PROTOCOL(This); + }else if(IsEqualGUID(&IID_IInternetPriority, riid)) { + TRACE("(%p)->(IID_IInternetPriority %p)\n", This, ppv); + *ppv = PRIORITY(This); } if(*ppv) { @@ -167,6 +175,56 @@ static HRESULT WINAPI HttpProtocol_UnlockRequest(IInternetProtocol *iface) #undef PROTOCOL_THIS +#define PRIORITY_THIS(iface) DEFINE_THIS(HttpProtocol, InternetPriority, iface) + +static HRESULT WINAPI HttpPriority_QueryInterface(IInternetPriority *iface, REFIID riid, void **ppv) +{ + HttpProtocol *This = PRIORITY_THIS(iface); + return IInternetProtocol_QueryInterface(PROTOCOL(This), riid, ppv); +} + +static ULONG WINAPI HttpPriority_AddRef(IInternetPriority *iface) +{ + HttpProtocol *This = PRIORITY_THIS(iface); + return IInternetProtocol_AddRef(PROTOCOL(This)); +} + +static ULONG WINAPI HttpPriority_Release(IInternetPriority *iface) +{ + HttpProtocol *This = PRIORITY_THIS(iface); + return IInternetProtocol_Release(PROTOCOL(This)); +} + +static HRESULT WINAPI HttpPriority_SetPriority(IInternetPriority *iface, LONG nPriority) +{ + HttpProtocol *This = PRIORITY_THIS(iface); + + TRACE("(%p)->(%ld)\n", This, nPriority); + + This->priority = nPriority; + return S_OK; +} + +static HRESULT WINAPI HttpPriority_GetPriority(IInternetPriority *iface, LONG *pnPriority) +{ + HttpProtocol *This = PRIORITY_THIS(iface); + + TRACE("(%p)->(%p)\n", This, pnPriority); + + *pnPriority = This->priority; + return S_OK; +} + +#undef PRIORITY_THIS + +static const IInternetPriorityVtbl HttpPriorityVtbl = { + HttpPriority_QueryInterface, + HttpPriority_AddRef, + HttpPriority_Release, + HttpPriority_SetPriority, + HttpPriority_GetPriority +}; + static const IInternetProtocolVtbl HttpProtocolVtbl = { HttpProtocol_QueryInterface, HttpProtocol_AddRef, @@ -194,8 +252,12 @@ HRESULT HttpProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj) ret = HeapAlloc(GetProcessHeap(), 0, sizeof(HttpProtocol)); ret->lpInternetProtocolVtbl = &HttpProtocolVtbl; + ret->lpInternetPriorityVtbl = &HttpPriorityVtbl; + ret->ref = 1; + ret->priority = 0; + *ppobj = PROTOCOL(ret); return S_OK; diff --git a/dlls/urlmon/tests/protocol.c b/dlls/urlmon/tests/protocol.c index 0e4c4ce1a17..42b5e5610ce 100644 --- a/dlls/urlmon/tests/protocol.c +++ b/dlls/urlmon/tests/protocol.c @@ -206,6 +206,31 @@ static IInternetBindInfoVtbl bind_info_vtbl = { static IInternetBindInfo bind_info = { &bind_info_vtbl }; +static void test_priority(IInternetProtocol *protocol) +{ + IInternetPriority *priority; + LONG pr; + HRESULT hres; + + hres = IInternetProtocol_QueryInterface(protocol, &IID_IInternetPriority, (void**)&priority); + ok(hres == S_OK, "QueryInterface(IID_IInternetPriority) failed: %08lx\n", hres); + if(FAILED(hres)) + return; + + hres = IInternetPriority_GetPriority(priority, &pr); + ok(hres == S_OK, "GetPriority failed: %08lx\n", hres); + ok(pr == 0, "pr=%ld, expected 0\n", pr); + + hres = IInternetPriority_SetPriority(priority, 1); + ok(hres == S_OK, "SetPriority failed: %08lx\n", hres); + + hres = IInternetPriority_GetPriority(priority, &pr); + ok(hres == S_OK, "GetPriority failed: %08lx\n", hres); + ok(pr == 1, "pr=%ld, expected 1\n", pr); + + IInternetPriority_Release(priority); +} + static void file_protocol_start(IInternetProtocol *protocol, LPCWSTR url, BOOL is_first) { HRESULT hres; @@ -414,11 +439,45 @@ static void test_file_protocol(void) { IInternetProtocol_Release(protocol); } +static void test_http_protocol(void) +{ + IInternetProtocol *protocol; + IInternetProtocolInfo *protocol_info; + IClassFactory *factory; + IUnknown *unk; + HRESULT hres; + + hres = CoGetClassObject(&CLSID_HttpProtocol, CLSCTX_INPROC_SERVER, NULL, + &IID_IUnknown, (void**)&unk); + ok(hres == S_OK, "CoGetClassObject failed: %08lx\n", hres); + if(!SUCCEEDED(hres)) + return; + + hres = IUnknown_QueryInterface(unk, &IID_IInternetProtocolInfo, (void**)&protocol_info); + ok(hres == E_NOINTERFACE, + "Could not get IInternetProtocolInfo interface: %08lx, expected E_NOINTERFACE\n", hres); + + hres = IUnknown_QueryInterface(unk, &IID_IClassFactory, (void**)&factory); + ok(hres == S_OK, "Could not get IClassFactory interface\n"); + IUnknown_Release(unk); + if(FAILED(hres)) + return; + + hres = IClassFactory_CreateInstance(factory, NULL, &IID_IInternetProtocol, + (void**)&protocol); + ok(hres == S_OK, "Could not get IInternetProtocol: %08lx\n", hres); + + test_priority(protocol); + + IInternetProtocol_Release(protocol); +} + START_TEST(protocol) { OleInitialize(NULL); test_file_protocol(); + test_http_protocol(); OleUninitialize(); }