- Sync to Wine 1.3.9

svn path=/trunk/; revision=50074
This commit is contained in:
Cameron Gutman
2010-12-20 21:29:55 +00:00
parent 72fa05f13b
commit 6c76be5e63
17 changed files with 2546 additions and 902 deletions
+40 -14
View File
@@ -460,9 +460,30 @@ static const IAuthenticateVtbl BSCAuthenticateVtbl = {
BSCAuthenticate_Authenticate
};
static IBindStatusCallback *create_bsc(IBindStatusCallback *bsc)
static void set_callback(BindStatusCallback *This, IBindStatusCallback *bsc)
{
BindStatusCallback *ret = heap_alloc_zero(sizeof(BindStatusCallback));
IServiceProvider *serv_prov;
HRESULT hres;
if(This->callback)
IBindStatusCallback_Release(This->callback);
if(This->serv_prov)
IServiceProvider_Release(This->serv_prov);
IBindStatusCallback_AddRef(bsc);
This->callback = bsc;
hres = IBindStatusCallback_QueryInterface(bsc, &IID_IServiceProvider, (void**)&serv_prov);
This->serv_prov = hres == S_OK ? serv_prov : NULL;
}
HRESULT wrap_callback(IBindStatusCallback *bsc, IBindStatusCallback **ret_iface)
{
BindStatusCallback *ret;
ret = heap_alloc_zero(sizeof(BindStatusCallback));
if(!ret)
return E_OUTOFMEMORY;
ret->lpBindStatusCallbackExVtbl = &BindStatusCallbackExVtbl;
ret->lpServiceProviderVtbl = &BSCServiceProviderVtbl;
@@ -470,13 +491,10 @@ static IBindStatusCallback *create_bsc(IBindStatusCallback *bsc)
ret->lpAuthenticateVtbl = &BSCAuthenticateVtbl;
ret->ref = 1;
set_callback(ret, bsc);
IBindStatusCallback_AddRef(bsc);
ret->callback = bsc;
IBindStatusCallback_QueryInterface(bsc, &IID_IServiceProvider, (void**)&ret->serv_prov);
return STATUSCLB(ret);
*ret_iface = STATUSCLB(ret);
return S_OK;
}
/***********************************************************************
@@ -511,25 +529,33 @@ HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pb
hres = IBindCtx_GetObjectParam(pbc, BSCBHolder, &unk);
if(SUCCEEDED(hres)) {
hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)&bsc);
IUnknown_Release(unk);
if(SUCCEEDED(hres)) {
hres = IBindStatusCallback_QueryInterface(bsc, &IID_IBindStatusCallbackHolder, (void**)&holder);
if(SUCCEEDED(hres)) {
prev = holder->callback;
IBindStatusCallback_AddRef(prev);
if(ppbscPrevious) {
IBindStatusCallback_AddRef(holder->callback);
*ppbscPrevious = holder->callback;
}
set_callback(holder, pbsc);
IBindStatusCallback_Release(bsc);
IBindStatusCallback_Release(STATUSCLB(holder));
return S_OK;
}else {
prev = bsc;
}
}
IUnknown_Release(unk);
IBindCtx_RevokeObjectParam(pbc, BSCBHolder);
}
bsc = create_bsc(pbsc);
hres = IBindCtx_RegisterObjectParam(pbc, BSCBHolder, (IUnknown*)bsc);
IBindStatusCallback_Release(bsc);
hres = wrap_callback(pbsc, &bsc);
if(SUCCEEDED(hres)) {
hres = IBindCtx_RegisterObjectParam(pbc, BSCBHolder, (IUnknown*)bsc);
IBindStatusCallback_Release(bsc);
}
if(FAILED(hres)) {
if(prev)
IBindStatusCallback_Release(prev);
+91 -56
View File
@@ -18,6 +18,7 @@
#include "urlmon_main.h"
#include "winreg.h"
#include "shlwapi.h"
#include "wine/debug.h"
@@ -42,7 +43,7 @@ typedef struct {
LONG ref;
IInternetProtocol *protocol;
IInternetProtocolEx *protocol;
BYTE buf[1024*8];
DWORD size;
@@ -76,6 +77,7 @@ typedef enum {
#define BINDING_LOCKED 0x0001
#define BINDING_STOPPED 0x0002
#define BINDING_OBJAVAIL 0x0004
#define BINDING_ABORTED 0x0008
struct Binding {
const IBindingVtbl *lpBindingVtbl;
@@ -87,7 +89,7 @@ struct Binding {
LONG ref;
IBindStatusCallback *callback;
IInternetProtocol *protocol;
IInternetProtocolEx *protocol;
IServiceProvider *service_provider;
stgmed_buf_t *stgmed_buf;
@@ -426,7 +428,7 @@ static const IUnknownVtbl StgMedUnkVtbl = {
StgMedUnk_Release
};
static stgmed_buf_t *create_stgmed_buf(IInternetProtocol *protocol)
static stgmed_buf_t *create_stgmed_buf(IInternetProtocolEx *protocol)
{
stgmed_buf_t *ret = heap_alloc(sizeof(*ret));
@@ -631,8 +633,30 @@ static HRESULT WINAPI ProtocolStream_Stat(IStream *iface, STATSTG *pstatstg,
DWORD dwStatFlag)
{
ProtocolStream *This = STREAM_THIS(iface);
FIXME("(%p)->(%p %08x)\n", This, pstatstg, dwStatFlag);
return E_NOTIMPL;
TRACE("(%p)->(%p %08x)\n", This, pstatstg, dwStatFlag);
if(!pstatstg)
return E_FAIL;
memset(pstatstg, 0, sizeof(STATSTG));
if(!(dwStatFlag&STATFLAG_NONAME) && This->buf->cache_file) {
pstatstg->pwcsName = CoTaskMemAlloc((lstrlenW(This->buf->cache_file)+1)*sizeof(WCHAR));
if(!pstatstg->pwcsName)
return STG_E_INSUFFICIENTMEMORY;
lstrcpyW(pstatstg->pwcsName, This->buf->cache_file);
}
pstatstg->type = STGTY_STREAM;
if(This->buf->file != INVALID_HANDLE_VALUE) {
GetFileSizeEx(This->buf->file, (PLARGE_INTEGER)&pstatstg->cbSize);
GetFileTime(This->buf->file, &pstatstg->ctime, &pstatstg->atime, &pstatstg->mtime);
if(pstatstg->cbSize.QuadPart)
pstatstg->grfMode = GENERIC_READ;
}
return S_OK;
}
static HRESULT WINAPI ProtocolStream_Clone(IStream *iface, IStream **ppstm)
@@ -682,6 +706,10 @@ static HRESULT stgmed_stream_get_result(stgmed_obj_t *obj, DWORD bindf, void **r
{
ProtocolStream *stream = (ProtocolStream*)obj;
if(!(bindf & BINDF_ASYNCHRONOUS) && stream->buf->file == INVALID_HANDLE_VALUE
&& (stream->buf->hres != S_FALSE || stream->buf->size))
return INET_E_DATA_NOT_AVAILABLE;
IStream_AddRef(STREAM(stream));
*result = STREAM(stream);
return S_OK;
@@ -862,10 +890,9 @@ static ULONG WINAPI Binding_Release(IBinding *iface)
ReleaseBindInfo(&This->bindinfo);
This->section.DebugInfo->Spare[0] = 0;
DeleteCriticalSection(&This->section);
SysFreeString(This->url);
heap_free(This->mime);
heap_free(This->redirect_url);
heap_free(This->url);
heap_free(This);
URLMON_UnlockModule();
@@ -877,8 +904,19 @@ static ULONG WINAPI Binding_Release(IBinding *iface)
static HRESULT WINAPI Binding_Abort(IBinding *iface)
{
Binding *This = BINDING_THIS(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
HRESULT hres;
TRACE("(%p)\n", This);
if(This->state & BINDING_ABORTED)
return E_FAIL;
hres = IInternetProtocol_Abort(This->protocol, E_ABORT, ERROR_SUCCESS);
if(FAILED(hres))
return hres;
This->state |= BINDING_ABORTED;
return S_OK;
}
static HRESULT WINAPI Binding_Suspend(IBinding *iface)
@@ -1048,7 +1086,7 @@ static void report_data(Binding *This, DWORD bscf, ULONG progress, ULONG progres
TRACE("(%p)->(%d %u %u)\n", This, bscf, progress, progress_max);
if(This->download_state == END_DOWNLOAD || (This->state & BINDING_STOPPED))
if(This->download_state == END_DOWNLOAD || (This->state & (BINDING_STOPPED|BINDING_ABORTED)))
return;
if(This->stgmed_buf->file != INVALID_HANDLE_VALUE)
@@ -1076,6 +1114,9 @@ static void report_data(Binding *This, DWORD bscf, ULONG progress, ULONG progres
BINDSTATUS_DOWNLOADINGDATA, This->url);
}
if(This->state & (BINDING_STOPPED|BINDING_ABORTED))
return;
if(This->to_object) {
if(!(This->state & BINDING_OBJAVAIL)) {
IBinding_AddRef(BINDING(This));
@@ -1223,7 +1264,7 @@ static HRESULT WINAPI InternetBindInfo_GetBindString(IInternetBindInfo *iface,
return hres;
}
case BINDSTRING_URL: {
DWORD size = (strlenW(This->url)+1) * sizeof(WCHAR);
DWORD size = (SysStringLen(This->url)+1) * sizeof(WCHAR);
if(!ppwzStr || !pcElFetched)
return E_INVALIDARG;
@@ -1350,50 +1391,37 @@ static HRESULT get_callback(IBindCtx *pbc, IBindStatusCallback **callback)
HRESULT hres;
hres = IBindCtx_GetObjectParam(pbc, bscb_holderW, &unk);
if(SUCCEEDED(hres)) {
hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)callback);
IUnknown_Release(unk);
}
if(FAILED(hres))
return create_default_callback(callback);
return SUCCEEDED(hres) ? S_OK : INET_E_DATA_NOT_AVAILABLE;
hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)callback);
IUnknown_Release(unk);
return hres;
}
static BOOL is_urlmon_protocol(LPCWSTR url)
static BOOL is_urlmon_protocol(IUri *uri)
{
static const WCHAR wszCdl[] = {'c','d','l'};
static const WCHAR wszFile[] = {'f','i','l','e'};
static const WCHAR wszFtp[] = {'f','t','p'};
static const WCHAR wszGopher[] = {'g','o','p','h','e','r'};
static const WCHAR wszHttp[] = {'h','t','t','p'};
static const WCHAR wszHttps[] = {'h','t','t','p','s'};
static const WCHAR wszMk[] = {'m','k'};
DWORD scheme;
HRESULT hres;
static const struct {
LPCWSTR scheme;
int len;
} protocol_list[] = {
{wszCdl, sizeof(wszCdl) /sizeof(WCHAR)},
{wszFile, sizeof(wszFile) /sizeof(WCHAR)},
{wszFtp, sizeof(wszFtp) /sizeof(WCHAR)},
{wszGopher, sizeof(wszGopher)/sizeof(WCHAR)},
{wszHttp, sizeof(wszHttp) /sizeof(WCHAR)},
{wszHttps, sizeof(wszHttps) /sizeof(WCHAR)},
{wszMk, sizeof(wszMk) /sizeof(WCHAR)}
};
hres = IUri_GetScheme(uri, &scheme);
if(FAILED(hres))
return FALSE;
unsigned int i;
int len = lstrlenW(url);
for(i=0; i < sizeof(protocol_list)/sizeof(protocol_list[0]); i++) {
if(len >= protocol_list[i].len
&& !memcmp(url, protocol_list[i].scheme, protocol_list[i].len*sizeof(WCHAR)))
return TRUE;
switch(scheme) {
case URL_SCHEME_FILE:
case URL_SCHEME_FTP:
case URL_SCHEME_GOPHER:
case URL_SCHEME_HTTP:
case URL_SCHEME_HTTPS:
case URL_SCHEME_MK:
return TRUE;
}
return FALSE;
}
static HRESULT Binding_Create(IMoniker *mon, Binding *binding_ctx, LPCWSTR url, IBindCtx *pbc,
static HRESULT Binding_Create(IMoniker *mon, Binding *binding_ctx, IUri *uri, IBindCtx *pbc,
BOOL to_obj, REFIID riid, Binding **binding)
{
Binding *ret;
@@ -1446,7 +1474,7 @@ static HRESULT Binding_Create(IMoniker *mon, Binding *binding_ctx, LPCWSTR url,
ret->protocol = binding_ctx->protocol;
IInternetProtocol_AddRef(ret->protocol);
}else {
hres = create_binding_protocol(url, TRUE, &ret->protocol);
hres = create_binding_protocol(TRUE, &ret->protocol);
if(FAILED(hres)) {
WARN("Could not get protocol handler\n");
IBinding_Release(BINDING(ret));
@@ -1471,11 +1499,15 @@ static HRESULT Binding_Create(IMoniker *mon, Binding *binding_ctx, LPCWSTR url,
if(!(ret->bindf & BINDF_ASYNCHRONOUS)) {
ret->bindf |= BINDF_NEEDFILE;
ret->use_cache_file = TRUE;
}else if(!is_urlmon_protocol(url)) {
}else if(!is_urlmon_protocol(uri)) {
ret->bindf |= BINDF_NEEDFILE;
}
ret->url = heap_strdupW(url);
hres = IUri_GetDisplayUri(uri, &ret->url);
if(FAILED(hres)) {
IBinding_Release(BINDING(ret));
return hres;
}
if(binding_ctx) {
ret->stgmed_buf = binding_ctx->stgmed_buf;
@@ -1502,14 +1534,14 @@ static HRESULT Binding_Create(IMoniker *mon, Binding *binding_ctx, LPCWSTR url,
return S_OK;
}
static HRESULT start_binding(IMoniker *mon, Binding *binding_ctx, LPCWSTR url, IBindCtx *pbc,
static HRESULT start_binding(IMoniker *mon, Binding *binding_ctx, IUri *uri, IBindCtx *pbc,
BOOL to_obj, REFIID riid, Binding **ret)
{
Binding *binding = NULL;
HRESULT hres;
MSG msg;
hres = Binding_Create(mon, binding_ctx, url, pbc, to_obj, riid, &binding);
hres = Binding_Create(mon, binding_ctx, uri, pbc, to_obj, riid, &binding);
if(FAILED(hres))
return hres;
@@ -1525,9 +1557,10 @@ static HRESULT start_binding(IMoniker *mon, Binding *binding_ctx, LPCWSTR url, I
set_binding_sink(binding->protocol, PROTSINK(binding), BINDINF(binding));
if(binding_ctx->redirect_url)
IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_REDIRECTING, binding_ctx->redirect_url);
report_data(binding, 0, 0, 0);
report_data(binding, BSCF_FIRSTDATANOTIFICATION | (binding_ctx->download_state == END_DOWNLOAD ? BSCF_LASTDATANOTIFICATION : 0),
0, 0);
}else {
hres = IInternetProtocol_Start(binding->protocol, url, PROTSINK(binding),
hres = IInternetProtocolEx_StartEx(binding->protocol, uri, PROTSINK(binding),
BINDINF(binding), PI_APARTMENTTHREADED|PI_MIMEVERIFICATION, 0);
TRACE("start ret %08x\n", hres);
@@ -1553,7 +1586,7 @@ static HRESULT start_binding(IMoniker *mon, Binding *binding_ctx, LPCWSTR url, I
return S_OK;
}
HRESULT bind_to_storage(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv)
HRESULT bind_to_storage(IUri *uri, IBindCtx *pbc, REFIID riid, void **ppv)
{
Binding *binding = NULL, *binding_ctx;
HRESULT hres;
@@ -1562,7 +1595,7 @@ HRESULT bind_to_storage(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv)
binding_ctx = get_bctx_binding(pbc);
hres = start_binding(NULL, binding_ctx, url, pbc, FALSE, riid, &binding);
hres = start_binding(NULL, binding_ctx, uri, pbc, FALSE, riid, &binding);
if(binding_ctx)
IBinding_Release(BINDING(binding_ctx));
if(FAILED(hres))
@@ -1573,8 +1606,10 @@ HRESULT bind_to_storage(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv)
IInternetProtocol_UnlockRequest(binding->protocol);
hres = binding->stgmed_obj->vtbl->get_result(binding->stgmed_obj, binding->bindf, ppv);
}else {
}else if(binding->bindf & BINDF_ASYNCHRONOUS) {
hres = MK_S_ASYNCHRONOUS;
}else {
hres = FAILED(binding->hres) ? binding->hres : S_OK;
}
IBinding_Release(BINDING(binding));
@@ -1582,14 +1617,14 @@ HRESULT bind_to_storage(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv)
return hres;
}
HRESULT bind_to_object(IMoniker *mon, LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv)
HRESULT bind_to_object(IMoniker *mon, IUri *uri, IBindCtx *pbc, REFIID riid, void **ppv)
{
Binding *binding;
HRESULT hres;
*ppv = NULL;
hres = start_binding(mon, NULL, url, pbc, TRUE, riid, &binding);
hres = start_binding(mon, NULL, uri, pbc, TRUE, riid, &binding);
if(FAILED(hres))
return hres;
+206 -147
View File
@@ -33,24 +33,26 @@ typedef struct _task_header_t {
} task_header_t;
struct BindProtocol {
const IInternetProtocolVtbl *lpIInternetProtocolVtbl;
const IInternetProtocolExVtbl *lpIInternetProtocolExVtbl;
const IInternetBindInfoVtbl *lpInternetBindInfoVtbl;
const IInternetPriorityVtbl *lpInternetPriorityVtbl;
const IServiceProviderVtbl *lpServiceProviderVtbl;
const IInternetProtocolSinkVtbl *lpIInternetProtocolSinkVtbl;
const IWinInetHttpInfoVtbl *lpIWinInetHttpInfoVtbl;
const IInternetProtocolVtbl *lpIInternetProtocolHandlerVtbl;
LONG ref;
IInternetProtocol *protocol;
IInternetProtocol *protocol_handler;
IInternetBindInfo *bind_info;
IInternetProtocolSink *protocol_sink;
IServiceProvider *service_provider;
IWinInetInfo *wininet_info;
struct {
IInternetProtocol IInternetProtocol_iface;
} default_protocol_handler;
IInternetProtocol *protocol_handler;
LONG priority;
BOOL reported_result;
@@ -68,7 +70,7 @@ struct BindProtocol {
BYTE *buf;
DWORD buf_size;
LPWSTR mime;
LPWSTR url;
IUri *uri;
ProtocolProxy *filter_proxy;
};
@@ -76,6 +78,7 @@ struct BindProtocol {
#define PRIORITY(x) ((IInternetPriority*) &(x)->lpInternetPriorityVtbl)
#define HTTPINFO(x) ((IWinInetHttpInfo*) &(x)->lpIWinInetHttpInfoVtbl)
#define SERVPROV(x) ((IServiceProvider*) &(x)->lpServiceProviderVtbl)
#define PROTOCOLEX(x) ((IInternetProtocolEx*) &(x)->lpIInternetProtocolExVtbl)
#define PROTOCOLHANDLER(x) ((IInternetProtocol*) &(x)->lpIInternetProtocolHandlerVtbl)
@@ -112,7 +115,7 @@ static LRESULT WINAPI notif_wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
This->continue_call--;
}
IInternetProtocol_Release(PROTOCOL(This));
IInternetProtocolEx_Release(PROTOCOLEX(This));
return 0;
}
case WM_MK_RELEASE: {
@@ -211,7 +214,7 @@ static void push_task(BindProtocol *This, task_header_t *task, task_proc_t proc)
LeaveCriticalSection(&This->section);
if(do_post) {
IInternetProtocol_AddRef(PROTOCOL(This));
IInternetProtocolEx_AddRef(PROTOCOLEX(This));
PostMessageW(This->notif_hwnd, WM_MK_CONTINUE, 0, (LPARAM)This);
}
}
@@ -232,7 +235,7 @@ static HRESULT handle_mime_filter(BindProtocol *This, IInternetProtocol *mime_fi
if(FAILED(hres))
return hres;
hres = create_protocol_proxy(PROTOCOLHANDLER(This), This->protocol_sink, &filter_proxy);
hres = create_protocol_proxy(&This->default_protocol_handler.IInternetProtocol_iface, This->protocol_sink, &filter_proxy);
if(FAILED(hres)) {
IInternetProtocolSink_Release(protocol_sink);
return hres;
@@ -288,22 +291,25 @@ static void mime_available(BindProtocol *This, LPCWSTR mime, BOOL verified)
}
}
#define PROTOCOL_THIS(iface) DEFINE_THIS(BindProtocol, IInternetProtocol, iface)
#define PROTOCOL_THIS(iface) DEFINE_THIS(BindProtocol, IInternetProtocolEx, iface)
static HRESULT WINAPI BindProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv)
static HRESULT WINAPI BindProtocol_QueryInterface(IInternetProtocolEx *iface, REFIID riid, void **ppv)
{
BindProtocol *This = PROTOCOL_THIS(iface);
*ppv = NULL;
if(IsEqualGUID(&IID_IUnknown, riid)) {
TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
*ppv = PROTOCOL(This);
*ppv = PROTOCOLEX(This);
}else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) {
TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv);
*ppv = PROTOCOL(This);
*ppv = PROTOCOLEX(This);
}else if(IsEqualGUID(&IID_IInternetProtocol, riid)) {
TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv);
*ppv = PROTOCOL(This);
*ppv = PROTOCOLEX(This);
}else if(IsEqualGUID(&IID_IInternetProtocolEx, riid)) {
TRACE("(%p)->(IID_IInternetProtocolEx %p)\n", This, ppv);
*ppv = PROTOCOLEX(This);
}else if(IsEqualGUID(&IID_IInternetBindInfo, riid)) {
TRACE("(%p)->(IID_IInternetBindInfo %p)\n", This, ppv);
*ppv = BINDINFO(This);
@@ -355,7 +361,7 @@ static HRESULT WINAPI BindProtocol_QueryInterface(IInternetProtocol *iface, REFI
return S_OK;
}
static ULONG WINAPI BindProtocol_AddRef(IInternetProtocol *iface)
static ULONG WINAPI BindProtocol_AddRef(IInternetProtocolEx *iface)
{
BindProtocol *This = PROTOCOL_THIS(iface);
LONG ref = InterlockedIncrement(&This->ref);
@@ -363,7 +369,7 @@ static ULONG WINAPI BindProtocol_AddRef(IInternetProtocol *iface)
return ref;
}
static ULONG WINAPI BindProtocol_Release(IInternetProtocol *iface)
static ULONG WINAPI BindProtocol_Release(IInternetProtocolEx *iface)
{
BindProtocol *This = PROTOCOL_THIS(iface);
LONG ref = InterlockedDecrement(&This->ref);
@@ -377,19 +383,20 @@ static ULONG WINAPI BindProtocol_Release(IInternetProtocol *iface)
IInternetProtocol_Release(This->protocol);
if(This->bind_info)
IInternetBindInfo_Release(This->bind_info);
if(This->protocol_handler && This->protocol_handler != PROTOCOLHANDLER(This))
if(This->protocol_handler && This->protocol_handler != &This->default_protocol_handler.IInternetProtocol_iface)
IInternetProtocol_Release(This->protocol_handler);
if(This->filter_proxy)
IInternetProtocol_Release(PROTOCOL(This->filter_proxy));
if(This->uri)
IUri_Release(This->uri);
set_binding_sink(PROTOCOL(This), NULL, NULL);
set_binding_sink(PROTOCOLEX(This), NULL, NULL);
if(This->notif_hwnd)
release_notif_hwnd(This->notif_hwnd);
DeleteCriticalSection(&This->section);
heap_free(This->mime);
heap_free(This->url);
heap_free(This);
URLMON_UnlockModule();
@@ -398,19 +405,29 @@ static ULONG WINAPI BindProtocol_Release(IInternetProtocol *iface)
return ref;
}
static HRESULT WINAPI BindProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl,
static HRESULT WINAPI BindProtocol_Start(IInternetProtocolEx *iface, LPCWSTR szUrl,
IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
DWORD grfPI, HANDLE_PTR dwReserved)
{
BindProtocol *This = PROTOCOL_THIS(iface);
IUri *uri;
HRESULT hres;
TRACE("(%p)->(%s %p %p %08x %lx)\n", This, debugstr_w(szUrl), pOIProtSink,
pOIBindInfo, grfPI, dwReserved);
return IInternetProtocol_Start(This->protocol_handler, szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved);
hres = CreateUri(szUrl, Uri_CREATE_FILE_USE_DOS_PATH, 0, &uri);
if(FAILED(hres))
return hres;
hres = IInternetProtocolEx_StartEx(PROTOCOLEX(This), uri, pOIProtSink, pOIBindInfo,
grfPI, (HANDLE*)dwReserved);
IUri_Release(uri);
return hres;
}
static HRESULT WINAPI BindProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData)
static HRESULT WINAPI BindProtocol_Continue(IInternetProtocolEx *iface, PROTOCOLDATA *pProtocolData)
{
BindProtocol *This = PROTOCOL_THIS(iface);
@@ -419,15 +436,17 @@ static HRESULT WINAPI BindProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA
return IInternetProtocol_Continue(This->protocol_handler, pProtocolData);
}
static HRESULT WINAPI BindProtocol_Abort(IInternetProtocol *iface, HRESULT hrReason,
static HRESULT WINAPI BindProtocol_Abort(IInternetProtocolEx *iface, HRESULT hrReason,
DWORD dwOptions)
{
BindProtocol *This = PROTOCOL_THIS(iface);
FIXME("(%p)->(%08x %08x)\n", This, hrReason, dwOptions);
return E_NOTIMPL;
TRACE("(%p)->(%08x %08x)\n", This, hrReason, dwOptions);
return IInternetProtocol_Abort(This->protocol_handler, hrReason, dwOptions);
}
static HRESULT WINAPI BindProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions)
static HRESULT WINAPI BindProtocol_Terminate(IInternetProtocolEx *iface, DWORD dwOptions)
{
BindProtocol *This = PROTOCOL_THIS(iface);
@@ -436,21 +455,21 @@ static HRESULT WINAPI BindProtocol_Terminate(IInternetProtocol *iface, DWORD dwO
return IInternetProtocol_Terminate(This->protocol_handler, dwOptions);
}
static HRESULT WINAPI BindProtocol_Suspend(IInternetProtocol *iface)
static HRESULT WINAPI BindProtocol_Suspend(IInternetProtocolEx *iface)
{
BindProtocol *This = PROTOCOL_THIS(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI BindProtocol_Resume(IInternetProtocol *iface)
static HRESULT WINAPI BindProtocol_Resume(IInternetProtocolEx *iface)
{
BindProtocol *This = PROTOCOL_THIS(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI BindProtocol_Read(IInternetProtocol *iface, void *pv,
static HRESULT WINAPI BindProtocol_Read(IInternetProtocolEx *iface, void *pv,
ULONG cb, ULONG *pcbRead)
{
BindProtocol *This = PROTOCOL_THIS(iface);
@@ -462,7 +481,7 @@ static HRESULT WINAPI BindProtocol_Read(IInternetProtocol *iface, void *pv,
return IInternetProtocol_Read(This->protocol_handler, pv, cb, pcbRead);
}
static HRESULT WINAPI BindProtocol_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove,
static HRESULT WINAPI BindProtocol_Seek(IInternetProtocolEx *iface, LARGE_INTEGER dlibMove,
DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
{
BindProtocol *This = PROTOCOL_THIS(iface);
@@ -470,7 +489,7 @@ static HRESULT WINAPI BindProtocol_Seek(IInternetProtocol *iface, LARGE_INTEGER
return E_NOTIMPL;
}
static HRESULT WINAPI BindProtocol_LockRequest(IInternetProtocol *iface, DWORD dwOptions)
static HRESULT WINAPI BindProtocol_LockRequest(IInternetProtocolEx *iface, DWORD dwOptions)
{
BindProtocol *This = PROTOCOL_THIS(iface);
@@ -479,7 +498,7 @@ static HRESULT WINAPI BindProtocol_LockRequest(IInternetProtocol *iface, DWORD d
return IInternetProtocol_LockRequest(This->protocol_handler, dwOptions);
}
static HRESULT WINAPI BindProtocol_UnlockRequest(IInternetProtocol *iface)
static HRESULT WINAPI BindProtocol_UnlockRequest(IInternetProtocolEx *iface)
{
BindProtocol *This = PROTOCOL_THIS(iface);
@@ -488,82 +507,13 @@ static HRESULT WINAPI BindProtocol_UnlockRequest(IInternetProtocol *iface)
return IInternetProtocol_UnlockRequest(This->protocol_handler);
}
void set_binding_sink(IInternetProtocol *bind_protocol, IInternetProtocolSink *sink, IInternetBindInfo *bind_info)
{
BindProtocol *This = PROTOCOL_THIS(bind_protocol);
IInternetProtocolSink *prev_sink;
IServiceProvider *service_provider = NULL;
if(sink)
IInternetProtocolSink_AddRef(sink);
prev_sink = InterlockedExchangePointer((void**)&This->protocol_sink, sink);
if(prev_sink)
IInternetProtocolSink_Release(prev_sink);
if(sink)
IInternetProtocolSink_QueryInterface(sink, &IID_IServiceProvider, (void**)&service_provider);
service_provider = InterlockedExchangePointer((void**)&This->service_provider, service_provider);
if(service_provider)
IServiceProvider_Release(service_provider);
if(bind_info)
IInternetBindInfo_AddRef(bind_info);
bind_info = InterlockedExchangePointer((void**)&This->bind_info, bind_info);
if(bind_info)
IInternetBindInfo_Release(bind_info);
}
IWinInetInfo *get_wininet_info(IInternetProtocol *bind_protocol)
{
BindProtocol *This = PROTOCOL_THIS(bind_protocol);
return This->wininet_info;
}
#undef PROTOCOL_THIS
static const IInternetProtocolVtbl BindProtocolVtbl = {
BindProtocol_QueryInterface,
BindProtocol_AddRef,
BindProtocol_Release,
BindProtocol_Start,
BindProtocol_Continue,
BindProtocol_Abort,
BindProtocol_Terminate,
BindProtocol_Suspend,
BindProtocol_Resume,
BindProtocol_Read,
BindProtocol_Seek,
BindProtocol_LockRequest,
BindProtocol_UnlockRequest
};
#define PROTOCOLHANDLER_THIS(iface) DEFINE_THIS(BindProtocol, IInternetProtocolHandler, iface)
static HRESULT WINAPI ProtocolHandler_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv)
{
ERR("should not be called\n");
return E_NOINTERFACE;
}
static ULONG WINAPI ProtocolHandler_AddRef(IInternetProtocol *iface)
{
BindProtocol *This = PROTOCOLHANDLER_THIS(iface);
return IInternetProtocol_AddRef(PROTOCOL(This));
}
static ULONG WINAPI ProtocolHandler_Release(IInternetProtocol *iface)
{
BindProtocol *This = PROTOCOLHANDLER_THIS(iface);
return IInternetProtocol_Release(PROTOCOL(This));
}
static HRESULT WINAPI ProtocolHandler_Start(IInternetProtocol *iface, LPCWSTR szUrl,
static HRESULT WINAPI BindProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUri,
IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
DWORD grfPI, HANDLE_PTR dwReserved)
DWORD grfPI, HANDLE *dwReserved)
{
BindProtocol *This = PROTOCOLHANDLER_THIS(iface);
BindProtocol *This = PROTOCOL_THIS(iface);
IInternetProtocol *protocol = NULL;
IInternetProtocolEx *protocolex;
IInternetPriority *priority;
IServiceProvider *service_provider;
BOOL urlmon_protocol = FALSE;
@@ -571,21 +521,22 @@ static HRESULT WINAPI ProtocolHandler_Start(IInternetProtocol *iface, LPCWSTR sz
LPOLESTR clsid_str;
HRESULT hres;
TRACE("(%p)->(%s %p %p %08x %lx)\n", This, debugstr_w(szUrl), pOIProtSink,
pOIBindInfo, grfPI, dwReserved);
TRACE("(%p)->(%p %p %p %08x %p)\n", This, pUri, pOIProtSink, pOIBindInfo, grfPI, dwReserved);
if(!szUrl || !pOIProtSink || !pOIBindInfo)
if(!pUri || !pOIProtSink || !pOIBindInfo)
return E_INVALIDARG;
This->pi = grfPI;
This->url = heap_strdupW(szUrl);
IUri_AddRef(pUri);
This->uri = pUri;
hres = IInternetProtocolSink_QueryInterface(pOIProtSink, &IID_IServiceProvider,
(void**)&service_provider);
if(SUCCEEDED(hres)) {
/* FIXME: What's protocol CLSID here? */
IServiceProvider_QueryService(service_provider, &IID_IInternetProtocol,
&IID_IInternetProtocol, (void**)&protocol);
&IID_IInternetProtocol, (void**)&protocol);
IServiceProvider_Release(service_provider);
}
@@ -593,7 +544,7 @@ static HRESULT WINAPI ProtocolHandler_Start(IInternetProtocol *iface, LPCWSTR sz
IClassFactory *cf;
IUnknown *unk;
hres = get_protocol_handler(szUrl, &clsid, &urlmon_protocol, &cf);
hres = get_protocol_handler(pUri, &clsid, &urlmon_protocol, &cf);
if(FAILED(hres))
return hres;
@@ -625,7 +576,7 @@ static HRESULT WINAPI ProtocolHandler_Start(IInternetProtocol *iface, LPCWSTR sz
if(urlmon_protocol)
IInternetProtocol_QueryInterface(protocol, &IID_IWinInetInfo, (void**)&This->wininet_info);
set_binding_sink(PROTOCOL(This), pOIProtSink, pOIBindInfo);
set_binding_sink(PROTOCOLEX(This), pOIProtSink, pOIBindInfo);
hres = IInternetProtocol_QueryInterface(protocol, &IID_IInternetPriority, (void**)&priority);
if(SUCCEEDED(hres)) {
@@ -633,12 +584,109 @@ static HRESULT WINAPI ProtocolHandler_Start(IInternetProtocol *iface, LPCWSTR sz
IInternetPriority_Release(priority);
}
return IInternetProtocol_Start(protocol, szUrl, PROTSINK(This), BINDINFO(This), 0, 0);
hres = IInternetProtocol_QueryInterface(protocol, &IID_IInternetProtocolEx, (void**)&protocolex);
if(SUCCEEDED(hres)) {
hres = IInternetProtocolEx_StartEx(protocolex, pUri, PROTSINK(This), BINDINFO(This), 0, NULL);
IInternetProtocolEx_Release(protocolex);
}else {
BSTR display_uri;
hres = IUri_GetDisplayUri(pUri, &display_uri);
if(FAILED(hres))
return hres;
hres = IInternetProtocol_Start(protocol, display_uri, PROTSINK(This), BINDINFO(This), 0, 0);
SysFreeString(display_uri);
}
return hres;
}
void set_binding_sink(IInternetProtocolEx *bind_protocol, IInternetProtocolSink *sink, IInternetBindInfo *bind_info)
{
BindProtocol *This = PROTOCOL_THIS(bind_protocol);
IInternetProtocolSink *prev_sink;
IServiceProvider *service_provider = NULL;
if(sink)
IInternetProtocolSink_AddRef(sink);
prev_sink = InterlockedExchangePointer((void**)&This->protocol_sink, sink);
if(prev_sink)
IInternetProtocolSink_Release(prev_sink);
if(sink)
IInternetProtocolSink_QueryInterface(sink, &IID_IServiceProvider, (void**)&service_provider);
service_provider = InterlockedExchangePointer((void**)&This->service_provider, service_provider);
if(service_provider)
IServiceProvider_Release(service_provider);
if(bind_info)
IInternetBindInfo_AddRef(bind_info);
bind_info = InterlockedExchangePointer((void**)&This->bind_info, bind_info);
if(bind_info)
IInternetBindInfo_Release(bind_info);
}
IWinInetInfo *get_wininet_info(IInternetProtocolEx *bind_protocol)
{
BindProtocol *This = PROTOCOL_THIS(bind_protocol);
return This->wininet_info;
}
#undef PROTOCOL_THIS
static const IInternetProtocolExVtbl BindProtocolVtbl = {
BindProtocol_QueryInterface,
BindProtocol_AddRef,
BindProtocol_Release,
BindProtocol_Start,
BindProtocol_Continue,
BindProtocol_Abort,
BindProtocol_Terminate,
BindProtocol_Suspend,
BindProtocol_Resume,
BindProtocol_Read,
BindProtocol_Seek,
BindProtocol_LockRequest,
BindProtocol_UnlockRequest,
BindProtocol_StartEx
};
static inline BindProtocol *impl_from_IInternetProtocol(IInternetProtocol *iface)
{
return CONTAINING_RECORD(iface, BindProtocol, default_protocol_handler.IInternetProtocol_iface);
}
static HRESULT WINAPI ProtocolHandler_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv)
{
ERR("should not be called\n");
return E_NOINTERFACE;
}
static ULONG WINAPI ProtocolHandler_AddRef(IInternetProtocol *iface)
{
BindProtocol *This = impl_from_IInternetProtocol(iface);
return IInternetProtocolEx_AddRef(PROTOCOLEX(This));
}
static ULONG WINAPI ProtocolHandler_Release(IInternetProtocol *iface)
{
BindProtocol *This = impl_from_IInternetProtocol(iface);
return IInternetProtocolEx_Release(PROTOCOLEX(This));
}
static HRESULT WINAPI ProtocolHandler_Start(IInternetProtocol *iface, LPCWSTR szUrl,
IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
DWORD grfPI, HANDLE_PTR dwReserved)
{
ERR("Should not be called\n");
return E_NOTIMPL;
}
static HRESULT WINAPI ProtocolHandler_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData)
{
BindProtocol *This = PROTOCOLHANDLER_THIS(iface);
BindProtocol *This = impl_from_IInternetProtocol(iface);
HRESULT hres;
TRACE("(%p)->(%p)\n", This, pProtocolData);
@@ -652,14 +700,19 @@ static HRESULT WINAPI ProtocolHandler_Continue(IInternetProtocol *iface, PROTOCO
static HRESULT WINAPI ProtocolHandler_Abort(IInternetProtocol *iface, HRESULT hrReason,
DWORD dwOptions)
{
BindProtocol *This = PROTOCOLHANDLER_THIS(iface);
FIXME("(%p)->(%08x %08x)\n", This, hrReason, dwOptions);
return E_NOTIMPL;
BindProtocol *This = impl_from_IInternetProtocol(iface);
TRACE("(%p)->(%08x %08x)\n", This, hrReason, dwOptions);
if(This->protocol && !This->reported_result)
return IInternetProtocol_Abort(This->protocol, hrReason, dwOptions);
return S_OK;
}
static HRESULT WINAPI ProtocolHandler_Terminate(IInternetProtocol *iface, DWORD dwOptions)
{
BindProtocol *This = PROTOCOLHANDLER_THIS(iface);
BindProtocol *This = impl_from_IInternetProtocol(iface);
TRACE("(%p)->(%08x)\n", This, dwOptions);
@@ -673,7 +726,7 @@ static HRESULT WINAPI ProtocolHandler_Terminate(IInternetProtocol *iface, DWORD
This->filter_proxy = NULL;
}
set_binding_sink(PROTOCOL(This), NULL, NULL);
set_binding_sink(PROTOCOLEX(This), NULL, NULL);
if(This->bind_info) {
IInternetBindInfo_Release(This->bind_info);
@@ -685,14 +738,14 @@ static HRESULT WINAPI ProtocolHandler_Terminate(IInternetProtocol *iface, DWORD
static HRESULT WINAPI ProtocolHandler_Suspend(IInternetProtocol *iface)
{
BindProtocol *This = PROTOCOLHANDLER_THIS(iface);
BindProtocol *This = impl_from_IInternetProtocol(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI ProtocolHandler_Resume(IInternetProtocol *iface)
{
BindProtocol *This = PROTOCOLHANDLER_THIS(iface);
BindProtocol *This = impl_from_IInternetProtocol(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
@@ -700,7 +753,7 @@ static HRESULT WINAPI ProtocolHandler_Resume(IInternetProtocol *iface)
static HRESULT WINAPI ProtocolHandler_Read(IInternetProtocol *iface, void *pv,
ULONG cb, ULONG *pcbRead)
{
BindProtocol *This = PROTOCOLHANDLER_THIS(iface);
BindProtocol *This = impl_from_IInternetProtocol(iface);
ULONG read = 0;
HRESULT hres = S_OK;
@@ -734,14 +787,14 @@ static HRESULT WINAPI ProtocolHandler_Read(IInternetProtocol *iface, void *pv,
static HRESULT WINAPI ProtocolHandler_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove,
DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
{
BindProtocol *This = PROTOCOLHANDLER_THIS(iface);
BindProtocol *This = impl_from_IInternetProtocol(iface);
FIXME("(%p)->(%d %d %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition);
return E_NOTIMPL;
}
static HRESULT WINAPI ProtocolHandler_LockRequest(IInternetProtocol *iface, DWORD dwOptions)
{
BindProtocol *This = PROTOCOLHANDLER_THIS(iface);
BindProtocol *This = impl_from_IInternetProtocol(iface);
TRACE("(%p)->(%08x)\n", This, dwOptions);
@@ -750,15 +803,13 @@ static HRESULT WINAPI ProtocolHandler_LockRequest(IInternetProtocol *iface, DWOR
static HRESULT WINAPI ProtocolHandler_UnlockRequest(IInternetProtocol *iface)
{
BindProtocol *This = PROTOCOLHANDLER_THIS(iface);
BindProtocol *This = impl_from_IInternetProtocol(iface);
TRACE("(%p)\n", This);
return IInternetProtocol_UnlockRequest(This->protocol);
}
#undef PROTOCOL_THIS
static const IInternetProtocolVtbl InternetProtocolHandlerVtbl = {
ProtocolHandler_QueryInterface,
ProtocolHandler_AddRef,
@@ -781,19 +832,19 @@ static HRESULT WINAPI BindInfo_QueryInterface(IInternetBindInfo *iface,
REFIID riid, void **ppv)
{
BindProtocol *This = BINDINFO_THIS(iface);
return IInternetProtocol_QueryInterface(PROTOCOL(This), riid, ppv);
return IInternetProtocolEx_QueryInterface(PROTOCOLEX(This), riid, ppv);
}
static ULONG WINAPI BindInfo_AddRef(IInternetBindInfo *iface)
{
BindProtocol *This = BINDINFO_THIS(iface);
return IBinding_AddRef(PROTOCOL(This));
return IInternetProtocolEx_AddRef(PROTOCOLEX(This));
}
static ULONG WINAPI BindInfo_Release(IInternetBindInfo *iface)
{
BindProtocol *This = BINDINFO_THIS(iface);
return IBinding_Release(PROTOCOL(This));
return IInternetProtocolEx_Release(PROTOCOLEX(This));
}
static HRESULT WINAPI BindInfo_GetBindInfo(IInternetBindInfo *iface,
@@ -840,19 +891,19 @@ static HRESULT WINAPI InternetPriority_QueryInterface(IInternetPriority *iface,
REFIID riid, void **ppv)
{
BindProtocol *This = PRIORITY_THIS(iface);
return IInternetProtocol_QueryInterface(PROTOCOL(This), riid, ppv);
return IInternetProtocolEx_QueryInterface(PROTOCOLEX(This), riid, ppv);
}
static ULONG WINAPI InternetPriority_AddRef(IInternetPriority *iface)
{
BindProtocol *This = PRIORITY_THIS(iface);
return IInternetProtocol_AddRef(PROTOCOL(This));
return IInternetProtocolEx_AddRef(PROTOCOLEX(This));
}
static ULONG WINAPI InternetPriority_Release(IInternetPriority *iface)
{
BindProtocol *This = PRIORITY_THIS(iface);
return IInternetProtocol_Release(PROTOCOL(This));
return IInternetProtocolEx_Release(PROTOCOLEX(This));
}
static HRESULT WINAPI InternetPriority_SetPriority(IInternetPriority *iface, LONG nPriority)
@@ -892,19 +943,19 @@ static HRESULT WINAPI BPInternetProtocolSink_QueryInterface(IInternetProtocolSin
REFIID riid, void **ppv)
{
BindProtocol *This = PROTSINK_THIS(iface);
return IInternetProtocol_QueryInterface(PROTOCOL(This), riid, ppv);
return IInternetProtocolEx_QueryInterface(PROTOCOLEX(This), riid, ppv);
}
static ULONG WINAPI BPInternetProtocolSink_AddRef(IInternetProtocolSink *iface)
{
BindProtocol *This = PROTSINK_THIS(iface);
return IInternetProtocol_AddRef(PROTOCOL(This));
return IInternetProtocolEx_AddRef(PROTOCOLEX(This));
}
static ULONG WINAPI BPInternetProtocolSink_Release(IInternetProtocolSink *iface)
{
BindProtocol *This = PROTSINK_THIS(iface);
return IInternetProtocol_Release(PROTOCOL(This));
return IInternetProtocolEx_Release(PROTOCOLEX(This));
}
typedef struct {
@@ -1069,8 +1120,15 @@ static HRESULT report_data(BindProtocol *This, DWORD bscf, ULONG progress, ULONG
bscf |= BSCF_LASTDATANOTIFICATION|BSCF_DATAFULLYAVAILABLE;
if(!This->reported_mime) {
hres = FindMimeFromData(NULL, This->url, This->buf, min(This->buf_size, MIME_TEST_SIZE),
BSTR raw_uri;
hres = IUri_GetRawUri(This->uri, &raw_uri);
if(FAILED(hres))
return hres;
hres = FindMimeFromData(NULL, raw_uri, This->buf, min(This->buf_size, MIME_TEST_SIZE),
This->mime, 0, &mime, 0);
SysFreeString(raw_uri);
if(FAILED(hres))
return hres;
@@ -1194,19 +1252,19 @@ static const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl = {
static HRESULT WINAPI WinInetHttpInfo_QueryInterface(IWinInetHttpInfo *iface, REFIID riid, void **ppv)
{
BindProtocol *This = INETINFO_THIS(iface);
return IInternetProtocol_QueryInterface(PROTOCOL(This), riid, ppv);
return IInternetProtocolEx_QueryInterface(PROTOCOLEX(This), riid, ppv);
}
static ULONG WINAPI WinInetHttpInfo_AddRef(IWinInetHttpInfo *iface)
{
BindProtocol *This = INETINFO_THIS(iface);
return IInternetProtocol_AddRef(PROTOCOL(This));
return IInternetProtocolEx_AddRef(PROTOCOLEX(This));
}
static ULONG WINAPI WinInetHttpInfo_Release(IWinInetHttpInfo *iface)
{
BindProtocol *This = INETINFO_THIS(iface);
return IInternetProtocol_Release(PROTOCOL(This));
return IInternetProtocolEx_Release(PROTOCOLEX(This));
}
static HRESULT WINAPI WinInetHttpInfo_QueryOption(IWinInetHttpInfo *iface, DWORD dwOption,
@@ -1241,19 +1299,19 @@ static HRESULT WINAPI BPServiceProvider_QueryInterface(IServiceProvider *iface,
REFIID riid, void **ppv)
{
BindProtocol *This = SERVPROV_THIS(iface);
return IInternetProtocol_QueryInterface(PROTOCOL(This), riid, ppv);
return IInternetProtocolEx_QueryInterface(PROTOCOLEX(This), riid, ppv);
}
static ULONG WINAPI BPServiceProvider_AddRef(IServiceProvider *iface)
{
BindProtocol *This = SERVPROV_THIS(iface);
return IInternetProtocol_AddRef(PROTOCOL(This));
return IInternetProtocolEx_AddRef(PROTOCOLEX(This));
}
static ULONG WINAPI BPServiceProvider_Release(IServiceProvider *iface)
{
BindProtocol *This = SERVPROV_THIS(iface);
return IInternetProtocol_Release(PROTOCOL(This));
return IInternetProtocolEx_Release(PROTOCOLEX(This));
}
static HRESULT WINAPI BPServiceProvider_QueryService(IServiceProvider *iface,
@@ -1278,27 +1336,28 @@ static const IServiceProviderVtbl ServiceProviderVtbl = {
BPServiceProvider_QueryService
};
HRESULT create_binding_protocol(LPCWSTR url, BOOL from_urlmon, IInternetProtocol **protocol)
HRESULT create_binding_protocol(BOOL from_urlmon, IInternetProtocolEx **protocol)
{
BindProtocol *ret = heap_alloc_zero(sizeof(BindProtocol));
ret->lpIInternetProtocolVtbl = &BindProtocolVtbl;
ret->lpIInternetProtocolExVtbl = &BindProtocolVtbl;
ret->lpInternetBindInfoVtbl = &InternetBindInfoVtbl;
ret->lpInternetPriorityVtbl = &InternetPriorityVtbl;
ret->lpServiceProviderVtbl = &ServiceProviderVtbl;
ret->lpIInternetProtocolSinkVtbl = &InternetProtocolSinkVtbl;
ret->lpIInternetProtocolHandlerVtbl = &InternetProtocolHandlerVtbl;
ret->lpIWinInetHttpInfoVtbl = &WinInetHttpInfoVtbl;
ret->default_protocol_handler.IInternetProtocol_iface.lpVtbl = &InternetProtocolHandlerVtbl;
ret->ref = 1;
ret->from_urlmon = from_urlmon;
ret->apartment_thread = GetCurrentThreadId();
ret->notif_hwnd = get_notif_hwnd();
ret->protocol_handler = PROTOCOLHANDLER(ret);
ret->protocol_handler = &ret->default_protocol_handler.IInternetProtocol_iface;
InitializeCriticalSection(&ret->section);
URLMON_LockModule();
*protocol = PROTOCOL(ret);
*protocol = PROTOCOLEX(ret);
return S_OK;
}
+63 -44
View File
@@ -22,8 +22,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
typedef struct {
const IBindStatusCallbackVtbl *lpBindStatusCallbackVtbl;
const IServiceProviderVtbl *lpServiceProviderVtbl;
IBindStatusCallback IBindStatusCallback_iface;
IServiceProvider IServiceProvider_iface;
LONG ref;
@@ -32,27 +32,32 @@ typedef struct {
LPWSTR cache_file;
} DownloadBSC;
#define STATUSCLB(x) ((IBindStatusCallback*) &(x)->lpBindStatusCallbackVtbl)
#define SERVPROV(x) ((IServiceProvider*) &(x)->lpServiceProviderVtbl)
static inline DownloadBSC *impl_from_IBindStatusCallback(IBindStatusCallback *iface)
{
return CONTAINING_RECORD(iface, DownloadBSC, IBindStatusCallback_iface);
}
#define STATUSCLB_THIS(iface) DEFINE_THIS(DownloadBSC, BindStatusCallback, iface)
static inline DownloadBSC *impl_from_IServiceProvider(IServiceProvider *iface)
{
return CONTAINING_RECORD(iface, DownloadBSC, IServiceProvider_iface);
}
static HRESULT WINAPI DownloadBSC_QueryInterface(IBindStatusCallback *iface,
REFIID riid, void **ppv)
{
DownloadBSC *This = STATUSCLB_THIS(iface);
DownloadBSC *This = impl_from_IBindStatusCallback(iface);
*ppv = NULL;
if(IsEqualGUID(&IID_IUnknown, riid)) {
TRACE("(%p)->(IID_IUnknown, %p)\n", This, ppv);
*ppv = STATUSCLB(This);
*ppv = &This->IBindStatusCallback_iface;
}else if(IsEqualGUID(&IID_IBindStatusCallback, riid)) {
TRACE("(%p)->(IID_IBindStatusCallback, %p)\n", This, ppv);
*ppv = STATUSCLB(This);
*ppv = &This->IBindStatusCallback_iface;
}else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
TRACE("(%p)->(IID_IServiceProvider, %p)\n", This, ppv);
*ppv = SERVPROV(This);
*ppv = &This->IServiceProvider_iface;
}
if(*ppv) {
@@ -66,7 +71,7 @@ static HRESULT WINAPI DownloadBSC_QueryInterface(IBindStatusCallback *iface,
static ULONG WINAPI DownloadBSC_AddRef(IBindStatusCallback *iface)
{
DownloadBSC *This = STATUSCLB_THIS(iface);
DownloadBSC *This = impl_from_IBindStatusCallback(iface);
LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref = %d\n", This, ref);
@@ -76,7 +81,7 @@ static ULONG WINAPI DownloadBSC_AddRef(IBindStatusCallback *iface)
static ULONG WINAPI DownloadBSC_Release(IBindStatusCallback *iface)
{
DownloadBSC *This = STATUSCLB_THIS(iface);
DownloadBSC *This = impl_from_IBindStatusCallback(iface);
LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref = %d\n", This, ref);
@@ -95,7 +100,7 @@ static ULONG WINAPI DownloadBSC_Release(IBindStatusCallback *iface)
static HRESULT WINAPI DownloadBSC_OnStartBinding(IBindStatusCallback *iface,
DWORD dwReserved, IBinding *pbind)
{
DownloadBSC *This = STATUSCLB_THIS(iface);
DownloadBSC *This = impl_from_IBindStatusCallback(iface);
TRACE("(%p)->(%d %p)\n", This, dwReserved, pbind);
@@ -107,14 +112,14 @@ static HRESULT WINAPI DownloadBSC_OnStartBinding(IBindStatusCallback *iface,
static HRESULT WINAPI DownloadBSC_GetPriority(IBindStatusCallback *iface, LONG *pnPriority)
{
DownloadBSC *This = STATUSCLB_THIS(iface);
DownloadBSC *This = impl_from_IBindStatusCallback(iface);
FIXME("(%p)->(%p)\n", This, pnPriority);
return E_NOTIMPL;
}
static HRESULT WINAPI DownloadBSC_OnLowResource(IBindStatusCallback *iface, DWORD reserved)
{
DownloadBSC *This = STATUSCLB_THIS(iface);
DownloadBSC *This = impl_from_IBindStatusCallback(iface);
FIXME("(%p)->(%d)\n", This, reserved);
return E_NOTIMPL;
}
@@ -133,7 +138,7 @@ static HRESULT on_progress(DownloadBSC *This, ULONG progress, ULONG progress_max
static HRESULT WINAPI DownloadBSC_OnProgress(IBindStatusCallback *iface, ULONG ulProgress,
ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
{
DownloadBSC *This = STATUSCLB_THIS(iface);
DownloadBSC *This = impl_from_IBindStatusCallback(iface);
HRESULT hres = S_OK;
TRACE("%p)->(%u %u %u %s)\n", This, ulProgress, ulProgressMax, ulStatusCode,
@@ -167,18 +172,20 @@ static HRESULT WINAPI DownloadBSC_OnProgress(IBindStatusCallback *iface, ULONG u
static HRESULT WINAPI DownloadBSC_OnStopBinding(IBindStatusCallback *iface,
HRESULT hresult, LPCWSTR szError)
{
DownloadBSC *This = STATUSCLB_THIS(iface);
DownloadBSC *This = impl_from_IBindStatusCallback(iface);
TRACE("(%p)->(%08x %s)\n", This, hresult, debugstr_w(szError));
if(This->cache_file) {
BOOL b;
if(This->file_name) {
if(This->cache_file) {
BOOL b;
b = CopyFileW(This->cache_file, This->file_name, FALSE);
if(!b)
FIXME("CopyFile failed: %u\n", GetLastError());
}else {
FIXME("No cache file\n");
b = CopyFileW(This->cache_file, This->file_name, FALSE);
if(!b)
FIXME("CopyFile failed: %u\n", GetLastError());
}else {
FIXME("No cache file\n");
}
}
if(This->callback)
@@ -190,7 +197,7 @@ static HRESULT WINAPI DownloadBSC_OnStopBinding(IBindStatusCallback *iface,
static HRESULT WINAPI DownloadBSC_GetBindInfo(IBindStatusCallback *iface,
DWORD *grfBINDF, BINDINFO *pbindinfo)
{
DownloadBSC *This = STATUSCLB_THIS(iface);
DownloadBSC *This = impl_from_IBindStatusCallback(iface);
DWORD bindf = 0;
TRACE("(%p)->(%p %p)\n", This, grfBINDF, pbindinfo);
@@ -214,7 +221,7 @@ static HRESULT WINAPI DownloadBSC_GetBindInfo(IBindStatusCallback *iface,
static HRESULT WINAPI DownloadBSC_OnDataAvailable(IBindStatusCallback *iface,
DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed)
{
DownloadBSC *This = STATUSCLB_THIS(iface);
DownloadBSC *This = impl_from_IBindStatusCallback(iface);
TRACE("(%p)->(%08x %d %p %p)\n", This, grfBSCF, dwSize, pformatetc, pstgmed);
@@ -224,13 +231,11 @@ static HRESULT WINAPI DownloadBSC_OnDataAvailable(IBindStatusCallback *iface,
static HRESULT WINAPI DownloadBSC_OnObjectAvailable(IBindStatusCallback *iface,
REFIID riid, IUnknown *punk)
{
DownloadBSC *This = STATUSCLB_THIS(iface);
DownloadBSC *This = impl_from_IBindStatusCallback(iface);
FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), punk);
return E_NOTIMPL;
}
#undef STATUSCLB_THIS
static const IBindStatusCallbackVtbl BindStatusCallbackVtbl = {
DownloadBSC_QueryInterface,
DownloadBSC_AddRef,
@@ -245,31 +250,29 @@ static const IBindStatusCallbackVtbl BindStatusCallbackVtbl = {
DownloadBSC_OnObjectAvailable
};
#define SERVPROV_THIS(iface) DEFINE_THIS(DownloadBSC, ServiceProvider, iface)
static HRESULT WINAPI DwlServiceProvider_QueryInterface(IServiceProvider *iface,
REFIID riid, void **ppv)
{
DownloadBSC *This = SERVPROV_THIS(iface);
return IBindStatusCallback_QueryInterface(STATUSCLB(This), riid, ppv);
DownloadBSC *This = impl_from_IServiceProvider(iface);
return IBindStatusCallback_QueryInterface(&This->IBindStatusCallback_iface, riid, ppv);
}
static ULONG WINAPI DwlServiceProvider_AddRef(IServiceProvider *iface)
{
DownloadBSC *This = SERVPROV_THIS(iface);
return IBindStatusCallback_AddRef(STATUSCLB(This));
DownloadBSC *This = impl_from_IServiceProvider(iface);
return IBindStatusCallback_AddRef(&This->IBindStatusCallback_iface);
}
static ULONG WINAPI DwlServiceProvider_Release(IServiceProvider *iface)
{
DownloadBSC *This = SERVPROV_THIS(iface);
return IBindStatusCallback_Release(STATUSCLB(This));
DownloadBSC *This = impl_from_IServiceProvider(iface);
return IBindStatusCallback_Release(&This->IBindStatusCallback_iface);
}
static HRESULT WINAPI DwlServiceProvider_QueryService(IServiceProvider *iface,
REFGUID guidService, REFIID riid, void **ppv)
{
DownloadBSC *This = SERVPROV_THIS(iface);
DownloadBSC *This = impl_from_IServiceProvider(iface);
IServiceProvider *serv_prov;
HRESULT hres;
@@ -292,8 +295,6 @@ static HRESULT WINAPI DwlServiceProvider_QueryService(IServiceProvider *iface,
return E_NOINTERFACE;
}
#undef SERVPROV_THIS
static const IServiceProviderVtbl ServiceProviderVtbl = {
DwlServiceProvider_QueryInterface,
DwlServiceProvider_AddRef,
@@ -301,12 +302,12 @@ static const IServiceProviderVtbl ServiceProviderVtbl = {
DwlServiceProvider_QueryService
};
static IBindStatusCallback *DownloadBSC_Create(IBindStatusCallback *callback, LPCWSTR file_name)
static HRESULT DownloadBSC_Create(IBindStatusCallback *callback, LPCWSTR file_name, IBindStatusCallback **ret_callback)
{
DownloadBSC *ret = heap_alloc(sizeof(*ret));
ret->lpBindStatusCallbackVtbl = &BindStatusCallbackVtbl;
ret->lpServiceProviderVtbl = &ServiceProviderVtbl;
ret->IBindStatusCallback_iface.lpVtbl = &BindStatusCallbackVtbl;
ret->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
ret->ref = 1;
ret->file_name = heap_strdupW(file_name);
ret->cache_file = NULL;
@@ -315,7 +316,22 @@ static IBindStatusCallback *DownloadBSC_Create(IBindStatusCallback *callback, LP
IBindStatusCallback_AddRef(callback);
ret->callback = callback;
return STATUSCLB(ret);
*ret_callback = &ret->IBindStatusCallback_iface;
return S_OK;
}
HRESULT create_default_callback(IBindStatusCallback **ret)
{
IBindStatusCallback *callback;
HRESULT hres;
hres = DownloadBSC_Create(NULL, NULL, &callback);
if(FAILED(hres))
return hres;
hres = wrap_callback(callback, ret);
IBindStatusCallback_Release(callback);
return hres;
}
/***********************************************************************
@@ -348,7 +364,10 @@ HRESULT WINAPI URLDownloadToFileW(LPUNKNOWN pCaller, LPCWSTR szURL, LPCWSTR szFi
if(pCaller)
FIXME("pCaller not supported\n");
callback = DownloadBSC_Create(lpfnCB, szFileName);
hres = DownloadBSC_Create(lpfnCB, szFileName, &callback);
if(FAILED(hres))
return hres;
hres = CreateAsyncBindCtx(0, callback, NULL, &bindctx);
IBindStatusCallback_Release(callback);
if(FAILED(hres))
+42 -43
View File
@@ -25,8 +25,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
typedef struct {
const IInternetProtocolExVtbl *lpIInternetProtocolExVtbl;
const IInternetPriorityVtbl *lpInternetPriorityVtbl;
IInternetProtocolEx IInternetProtocolEx_iface;
IInternetPriority IInternetPriority_iface;
HANDLE file;
ULONG size;
@@ -35,31 +35,36 @@ typedef struct {
LONG ref;
} FileProtocol;
#define PRIORITY(x) ((IInternetPriority*) &(x)->lpInternetPriorityVtbl)
#define PROTOCOLEX(x) ((IInternetProtocolEx*) &(x)->lpIInternetProtocolExVtbl)
static inline FileProtocol *impl_from_IInternetProtocolEx(IInternetProtocolEx *iface)
{
return CONTAINING_RECORD(iface, FileProtocol, IInternetProtocolEx_iface);
}
#define PROTOCOL_THIS(iface) DEFINE_THIS(FileProtocol, IInternetProtocolEx, iface)
static inline FileProtocol *impl_from_IInternetPriority(IInternetPriority *iface)
{
return CONTAINING_RECORD(iface, FileProtocol, IInternetPriority_iface);
}
static HRESULT WINAPI FileProtocol_QueryInterface(IInternetProtocolEx *iface, REFIID riid, void **ppv)
{
FileProtocol *This = PROTOCOL_THIS(iface);
FileProtocol *This = impl_from_IInternetProtocolEx(iface);
*ppv = NULL;
if(IsEqualGUID(&IID_IUnknown, riid)) {
TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
*ppv = PROTOCOLEX(This);
*ppv = &This->IInternetProtocolEx_iface;
}else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) {
TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv);
*ppv = PROTOCOLEX(This);
*ppv = &This->IInternetProtocolEx_iface;
}else if(IsEqualGUID(&IID_IInternetProtocol, riid)) {
TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv);
*ppv = PROTOCOLEX(This);
*ppv = &This->IInternetProtocolEx_iface;
}else if(IsEqualGUID(&IID_IInternetProtocolEx, riid)) {
TRACE("(%p)->(IID_IInternetProtocolEx %p)\n", This, ppv);
*ppv = PROTOCOLEX(This);
*ppv = &This->IInternetProtocolEx_iface;
}else if(IsEqualGUID(&IID_IInternetPriority, riid)) {
TRACE("(%p)->(IID_IInternetPriority %p)\n", This, ppv);
*ppv = PRIORITY(This);
*ppv = &This->IInternetPriority_iface;
}
if(*ppv) {
@@ -73,7 +78,7 @@ static HRESULT WINAPI FileProtocol_QueryInterface(IInternetProtocolEx *iface, RE
static ULONG WINAPI FileProtocol_AddRef(IInternetProtocolEx *iface)
{
FileProtocol *This = PROTOCOL_THIS(iface);
FileProtocol *This = impl_from_IInternetProtocolEx(iface);
LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
return ref;
@@ -81,7 +86,7 @@ static ULONG WINAPI FileProtocol_AddRef(IInternetProtocolEx *iface)
static ULONG WINAPI FileProtocol_Release(IInternetProtocolEx *iface)
{
FileProtocol *This = PROTOCOL_THIS(iface);
FileProtocol *This = impl_from_IInternetProtocolEx(iface);
LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
@@ -101,7 +106,7 @@ static HRESULT WINAPI FileProtocol_Start(IInternetProtocolEx *iface, LPCWSTR szU
IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
DWORD grfPI, HANDLE_PTR dwReserved)
{
FileProtocol *This = PROTOCOL_THIS(iface);
FileProtocol *This = impl_from_IInternetProtocolEx(iface);
IUri *uri;
HRESULT hres;
@@ -112,8 +117,8 @@ static HRESULT WINAPI FileProtocol_Start(IInternetProtocolEx *iface, LPCWSTR szU
if(FAILED(hres))
return hres;
hres = IInternetProtocolEx_StartEx(PROTOCOLEX(This), uri, pOIProtSink, pOIBindInfo,
grfPI, (HANDLE*)dwReserved);
hres = IInternetProtocolEx_StartEx(&This->IInternetProtocolEx_iface, uri, pOIProtSink,
pOIBindInfo, grfPI, (HANDLE*)dwReserved);
IUri_Release(uri);
return hres;
@@ -121,7 +126,7 @@ static HRESULT WINAPI FileProtocol_Start(IInternetProtocolEx *iface, LPCWSTR szU
static HRESULT WINAPI FileProtocol_Continue(IInternetProtocolEx *iface, PROTOCOLDATA *pProtocolData)
{
FileProtocol *This = PROTOCOL_THIS(iface);
FileProtocol *This = impl_from_IInternetProtocolEx(iface);
FIXME("(%p)->(%p)\n", This, pProtocolData);
return E_NOTIMPL;
}
@@ -129,14 +134,14 @@ static HRESULT WINAPI FileProtocol_Continue(IInternetProtocolEx *iface, PROTOCOL
static HRESULT WINAPI FileProtocol_Abort(IInternetProtocolEx *iface, HRESULT hrReason,
DWORD dwOptions)
{
FileProtocol *This = PROTOCOL_THIS(iface);
FileProtocol *This = impl_from_IInternetProtocolEx(iface);
FIXME("(%p)->(%08x %08x)\n", This, hrReason, dwOptions);
return E_NOTIMPL;
}
static HRESULT WINAPI FileProtocol_Terminate(IInternetProtocolEx *iface, DWORD dwOptions)
{
FileProtocol *This = PROTOCOL_THIS(iface);
FileProtocol *This = impl_from_IInternetProtocolEx(iface);
TRACE("(%p)->(%08x)\n", This, dwOptions);
@@ -145,14 +150,14 @@ static HRESULT WINAPI FileProtocol_Terminate(IInternetProtocolEx *iface, DWORD d
static HRESULT WINAPI FileProtocol_Suspend(IInternetProtocolEx *iface)
{
FileProtocol *This = PROTOCOL_THIS(iface);
FileProtocol *This = impl_from_IInternetProtocolEx(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI FileProtocol_Resume(IInternetProtocolEx *iface)
{
FileProtocol *This = PROTOCOL_THIS(iface);
FileProtocol *This = impl_from_IInternetProtocolEx(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
@@ -160,7 +165,7 @@ static HRESULT WINAPI FileProtocol_Resume(IInternetProtocolEx *iface)
static HRESULT WINAPI FileProtocol_Read(IInternetProtocolEx *iface, void *pv,
ULONG cb, ULONG *pcbRead)
{
FileProtocol *This = PROTOCOL_THIS(iface);
FileProtocol *This = impl_from_IInternetProtocolEx(iface);
DWORD read = 0;
TRACE("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead);
@@ -183,14 +188,14 @@ static HRESULT WINAPI FileProtocol_Read(IInternetProtocolEx *iface, void *pv,
static HRESULT WINAPI FileProtocol_Seek(IInternetProtocolEx *iface, LARGE_INTEGER dlibMove,
DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
{
FileProtocol *This = PROTOCOL_THIS(iface);
FileProtocol *This = impl_from_IInternetProtocolEx(iface);
FIXME("(%p)->(%d %d %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition);
return E_NOTIMPL;
}
static HRESULT WINAPI FileProtocol_LockRequest(IInternetProtocolEx *iface, DWORD dwOptions)
{
FileProtocol *This = PROTOCOL_THIS(iface);
FileProtocol *This = impl_from_IInternetProtocolEx(iface);
TRACE("(%p)->(%08x)\n", This, dwOptions);
@@ -199,7 +204,7 @@ static HRESULT WINAPI FileProtocol_LockRequest(IInternetProtocolEx *iface, DWORD
static HRESULT WINAPI FileProtocol_UnlockRequest(IInternetProtocolEx *iface)
{
FileProtocol *This = PROTOCOL_THIS(iface);
FileProtocol *This = impl_from_IInternetProtocolEx(iface);
TRACE("(%p)\n", This);
@@ -239,7 +244,7 @@ static HRESULT WINAPI FileProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUr
IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
DWORD grfPI, HANDLE *dwReserved)
{
FileProtocol *This = PROTOCOL_THIS(iface);
FileProtocol *This = impl_from_IInternetProtocolEx(iface);
BINDINFO bindinfo;
DWORD grfBINDF = 0;
DWORD scheme;
@@ -314,8 +319,6 @@ static HRESULT WINAPI FileProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUr
return report_result(pOIProtSink, S_OK, 0);
}
#undef PROTOCOL_THIS
static const IInternetProtocolExVtbl FileProtocolExVtbl = {
FileProtocol_QueryInterface,
FileProtocol_AddRef,
@@ -333,30 +336,28 @@ static const IInternetProtocolExVtbl FileProtocolExVtbl = {
FileProtocol_StartEx
};
#define PRIORITY_THIS(iface) DEFINE_THIS(FileProtocol, InternetPriority, iface)
static HRESULT WINAPI FilePriority_QueryInterface(IInternetPriority *iface,
REFIID riid, void **ppv)
{
FileProtocol *This = PRIORITY_THIS(iface);
return IInternetProtocolEx_QueryInterface(PROTOCOLEX(This), riid, ppv);
FileProtocol *This = impl_from_IInternetPriority(iface);
return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
}
static ULONG WINAPI FilePriority_AddRef(IInternetPriority *iface)
{
FileProtocol *This = PRIORITY_THIS(iface);
return IInternetProtocolEx_AddRef(PROTOCOLEX(This));
FileProtocol *This = impl_from_IInternetPriority(iface);
return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
}
static ULONG WINAPI FilePriority_Release(IInternetPriority *iface)
{
FileProtocol *This = PRIORITY_THIS(iface);
return IInternetProtocolEx_Release(PROTOCOLEX(This));
FileProtocol *This = impl_from_IInternetPriority(iface);
return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
}
static HRESULT WINAPI FilePriority_SetPriority(IInternetPriority *iface, LONG nPriority)
{
FileProtocol *This = PRIORITY_THIS(iface);
FileProtocol *This = impl_from_IInternetPriority(iface);
TRACE("(%p)->(%d)\n", This, nPriority);
@@ -366,7 +367,7 @@ static HRESULT WINAPI FilePriority_SetPriority(IInternetPriority *iface, LONG nP
static HRESULT WINAPI FilePriority_GetPriority(IInternetPriority *iface, LONG *pnPriority)
{
FileProtocol *This = PRIORITY_THIS(iface);
FileProtocol *This = impl_from_IInternetPriority(iface);
TRACE("(%p)->(%p)\n", This, pnPriority);
@@ -374,8 +375,6 @@ static HRESULT WINAPI FilePriority_GetPriority(IInternetPriority *iface, LONG *p
return S_OK;
}
#undef PRIORITY_THIS
static const IInternetPriorityVtbl FilePriorityVtbl = {
FilePriority_QueryInterface,
FilePriority_AddRef,
@@ -394,12 +393,12 @@ HRESULT FileProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj)
ret = heap_alloc(sizeof(FileProtocol));
ret->lpIInternetProtocolExVtbl = &FileProtocolExVtbl;
ret->lpInternetPriorityVtbl = &FilePriorityVtbl;
ret->IInternetProtocolEx_iface.lpVtbl = &FileProtocolExVtbl;
ret->IInternetPriority_iface.lpVtbl = &FilePriorityVtbl;
ret->file = INVALID_HANDLE_VALUE;
ret->priority = 0;
ret->ref = 1;
*ppobj = PROTOCOLEX(ret);
*ppobj = &ret->IInternetProtocolEx_iface;
return S_OK;
}
+15 -12
View File
@@ -24,7 +24,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
static WCHAR wszEnumFORMATETC[] = {'_','E','n','u','m','F','O','R','M','A','T','E','T','C','_',0};
typedef struct {
const IEnumFORMATETCVtbl *lpEnumFORMATETCVtbl;
IEnumFORMATETC IEnumFORMATETC_iface;
FORMATETC *fetc;
UINT fetc_cnt;
@@ -33,13 +33,16 @@ typedef struct {
LONG ref;
} EnumFORMATETC;
static IEnumFORMATETC *EnumFORMATETC_Create(UINT cfmtetc, const FORMATETC *rgfmtetc, UINT it);
static inline EnumFORMATETC *impl_from_IEnumFORMATETC(IEnumFORMATETC *iface)
{
return CONTAINING_RECORD(iface, EnumFORMATETC, IEnumFORMATETC_iface);
}
#define ENUMF_THIS(iface) DEFINE_THIS(EnumFORMATETC, EnumFORMATETC, iface)
static IEnumFORMATETC *EnumFORMATETC_Create(UINT cfmtetc, const FORMATETC *rgfmtetc, UINT it);
static HRESULT WINAPI EnumFORMATETC_QueryInterface(IEnumFORMATETC *iface, REFIID riid, void **ppv)
{
EnumFORMATETC *This = ENUMF_THIS(iface);
EnumFORMATETC *This = impl_from_IEnumFORMATETC(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
@@ -57,7 +60,7 @@ static HRESULT WINAPI EnumFORMATETC_QueryInterface(IEnumFORMATETC *iface, REFIID
static ULONG WINAPI EnumFORMATETC_AddRef(IEnumFORMATETC *iface)
{
EnumFORMATETC *This = ENUMF_THIS(iface);
EnumFORMATETC *This = impl_from_IEnumFORMATETC(iface);
LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
return ref;
@@ -65,7 +68,7 @@ static ULONG WINAPI EnumFORMATETC_AddRef(IEnumFORMATETC *iface)
static ULONG WINAPI EnumFORMATETC_Release(IEnumFORMATETC *iface)
{
EnumFORMATETC *This = ENUMF_THIS(iface);
EnumFORMATETC *This = impl_from_IEnumFORMATETC(iface);
LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
@@ -83,7 +86,7 @@ static ULONG WINAPI EnumFORMATETC_Release(IEnumFORMATETC *iface)
static HRESULT WINAPI EnumFORMATETC_Next(IEnumFORMATETC *iface, ULONG celt,
FORMATETC *rgelt, ULONG *pceltFetched)
{
EnumFORMATETC *This = ENUMF_THIS(iface);
EnumFORMATETC *This = impl_from_IEnumFORMATETC(iface);
ULONG cnt;
TRACE("(%p)->(%d %p %p)\n", This, celt, rgelt, pceltFetched);
@@ -110,7 +113,7 @@ static HRESULT WINAPI EnumFORMATETC_Next(IEnumFORMATETC *iface, ULONG celt,
static HRESULT WINAPI EnumFORMATETC_Skip(IEnumFORMATETC *iface, ULONG celt)
{
EnumFORMATETC *This = ENUMF_THIS(iface);
EnumFORMATETC *This = impl_from_IEnumFORMATETC(iface);
TRACE("(%p)->(%d)\n", This, celt);
@@ -120,7 +123,7 @@ static HRESULT WINAPI EnumFORMATETC_Skip(IEnumFORMATETC *iface, ULONG celt)
static HRESULT WINAPI EnumFORMATETC_Reset(IEnumFORMATETC *iface)
{
EnumFORMATETC *This = ENUMF_THIS(iface);
EnumFORMATETC *This = impl_from_IEnumFORMATETC(iface);
TRACE("(%p)\n", This);
@@ -130,7 +133,7 @@ static HRESULT WINAPI EnumFORMATETC_Reset(IEnumFORMATETC *iface)
static HRESULT WINAPI EnumFORMATETC_Clone(IEnumFORMATETC *iface, IEnumFORMATETC **ppenum)
{
EnumFORMATETC *This = ENUMF_THIS(iface);
EnumFORMATETC *This = impl_from_IEnumFORMATETC(iface);
TRACE("(%p)->(%p)\n", This, ppenum);
@@ -157,7 +160,7 @@ static IEnumFORMATETC *EnumFORMATETC_Create(UINT cfmtetc, const FORMATETC *rgfmt
URLMON_LockModule();
ret->lpEnumFORMATETCVtbl = &EnumFORMATETCVtbl;
ret->IEnumFORMATETC_iface.lpVtbl = &EnumFORMATETCVtbl;
ret->ref = 1;
ret->it = it;
ret->fetc_cnt = cfmtetc;
@@ -165,7 +168,7 @@ static IEnumFORMATETC *EnumFORMATETC_Create(UINT cfmtetc, const FORMATETC *rgfmt
ret->fetc = heap_alloc(cfmtetc*sizeof(FORMATETC));
memcpy(ret->fetc, rgfmtetc, cfmtetc*sizeof(FORMATETC));
return (IEnumFORMATETC*)ret;
return &ret->IEnumFORMATETC_iface;
}
/**********************************************************
+112 -79
View File
@@ -17,6 +17,10 @@
*/
#include "urlmon_main.h"
#define NO_SHLWAPI_REG
#include "shlwapi.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
@@ -24,15 +28,27 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
typedef struct {
Protocol base;
const IInternetProtocolVtbl *lpIInternetProtocolVtbl;
const IInternetPriorityVtbl *lpInternetPriorityVtbl;
const IWinInetHttpInfoVtbl *lpWinInetHttpInfoVtbl;
IInternetProtocolEx IInternetProtocolEx_iface;
IInternetPriority IInternetPriority_iface;
IWinInetHttpInfo IWinInetHttpInfo_iface;
LONG ref;
} FtpProtocol;
#define PRIORITY(x) ((IInternetPriority*) &(x)->lpInternetPriorityVtbl)
#define INETHTTPINFO(x) ((IWinInetHttpInfo*) &(x)->lpWinInetHttpInfoVtbl)
static inline FtpProtocol *impl_from_IInternetProtocolEx(IInternetProtocolEx *iface)
{
return CONTAINING_RECORD(iface, FtpProtocol, IInternetProtocolEx_iface);
}
static inline FtpProtocol *impl_from_IInternetPriority(IInternetPriority *iface)
{
return CONTAINING_RECORD(iface, FtpProtocol, IInternetPriority_iface);
}
static inline FtpProtocol *impl_from_IWinInetHttpInfo(IWinInetHttpInfo *iface)
{
return CONTAINING_RECORD(iface, FtpProtocol, IWinInetHttpInfo_iface);
}
#define ASYNCPROTOCOL_THIS(iface) DEFINE_THIS2(FtpProtocol, base, iface)
@@ -59,6 +75,11 @@ static HRESULT FtpProtocol_open_request(Protocol *prot, IUri *uri, DWORD request
return S_OK;
}
static HRESULT FtpProtocol_end_request(Protocol *prot)
{
return E_NOTIMPL;
}
static HRESULT FtpProtocol_start_downloading(Protocol *prot)
{
FtpProtocol *This = ASYNCPROTOCOL_THIS(prot);
@@ -82,35 +103,37 @@ static void FtpProtocol_close_connection(Protocol *prot)
static const ProtocolVtbl AsyncProtocolVtbl = {
FtpProtocol_open_request,
FtpProtocol_end_request,
FtpProtocol_start_downloading,
FtpProtocol_close_connection
};
#define PROTOCOL_THIS(iface) DEFINE_THIS(FtpProtocol, IInternetProtocol, iface)
static HRESULT WINAPI FtpProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv)
static HRESULT WINAPI FtpProtocol_QueryInterface(IInternetProtocolEx *iface, REFIID riid, void **ppv)
{
FtpProtocol *This = PROTOCOL_THIS(iface);
FtpProtocol *This = impl_from_IInternetProtocolEx(iface);
*ppv = NULL;
if(IsEqualGUID(&IID_IUnknown, riid)) {
TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
*ppv = PROTOCOL(This);
*ppv = &This->IInternetProtocolEx_iface;
}else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) {
TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv);
*ppv = PROTOCOL(This);
*ppv = &This->IInternetProtocolEx_iface;
}else if(IsEqualGUID(&IID_IInternetProtocol, riid)) {
TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv);
*ppv = PROTOCOL(This);
*ppv = &This->IInternetProtocolEx_iface;
}else if(IsEqualGUID(&IID_IInternetProtocolEx, riid)) {
TRACE("(%p)->(IID_IInternetProtocolEx %p)\n", This, ppv);
*ppv = &This->IInternetProtocolEx_iface;
}else if(IsEqualGUID(&IID_IInternetPriority, riid)) {
TRACE("(%p)->(IID_IInternetPriority %p)\n", This, ppv);
*ppv = PRIORITY(This);
*ppv = &This->IInternetPriority_iface;
}else if(IsEqualGUID(&IID_IWinInetInfo, riid)) {
TRACE("(%p)->(IID_IWinInetInfo %p)\n", This, ppv);
*ppv = INETHTTPINFO(This);
*ppv = &This->IWinInetHttpInfo_iface;
}else if(IsEqualGUID(&IID_IWinInetHttpInfo, riid)) {
TRACE("(%p)->(IID_IWinInetHttpInfo %p)\n", This, ppv);
*ppv = INETHTTPINFO(This);
*ppv = &This->IWinInetHttpInfo_iface;
}
if(*ppv) {
@@ -122,17 +145,17 @@ static HRESULT WINAPI FtpProtocol_QueryInterface(IInternetProtocol *iface, REFII
return E_NOINTERFACE;
}
static ULONG WINAPI FtpProtocol_AddRef(IInternetProtocol *iface)
static ULONG WINAPI FtpProtocol_AddRef(IInternetProtocolEx *iface)
{
FtpProtocol *This = PROTOCOL_THIS(iface);
FtpProtocol *This = impl_from_IInternetProtocolEx(iface);
LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
return ref;
}
static ULONG WINAPI FtpProtocol_Release(IInternetProtocol *iface)
static ULONG WINAPI FtpProtocol_Release(IInternetProtocolEx *iface)
{
FtpProtocol *This = PROTOCOL_THIS(iface);
FtpProtocol *This = impl_from_IInternetProtocolEx(iface);
LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
@@ -147,52 +170,50 @@ static ULONG WINAPI FtpProtocol_Release(IInternetProtocol *iface)
return ref;
}
static HRESULT WINAPI FtpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl,
static HRESULT WINAPI FtpProtocol_Start(IInternetProtocolEx *iface, LPCWSTR szUrl,
IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
DWORD grfPI, HANDLE_PTR dwReserved)
{
FtpProtocol *This = PROTOCOL_THIS(iface);
FtpProtocol *This = impl_from_IInternetProtocolEx(iface);
IUri *uri;
HRESULT hres;
static const WCHAR ftpW[] = {'f','t','p',':'};
TRACE("(%p)->(%s %p %p %08x %lx)\n", This, debugstr_w(szUrl), pOIProtSink,
pOIBindInfo, grfPI, dwReserved);
if(strncmpW(szUrl, ftpW, sizeof(ftpW)/sizeof(WCHAR)))
return MK_E_SYNTAX;
hres = CreateUri(szUrl, 0, 0, &uri);
if(FAILED(hres))
return hres;
hres = protocol_start(&This->base, PROTOCOL(This), uri, pOIProtSink, pOIBindInfo);
hres = IInternetProtocolEx_StartEx(&This->IInternetProtocolEx_iface, uri, pOIProtSink,
pOIBindInfo, grfPI, (HANDLE*)dwReserved);
IUri_Release(uri);
return hres;
}
static HRESULT WINAPI FtpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData)
static HRESULT WINAPI FtpProtocol_Continue(IInternetProtocolEx *iface, PROTOCOLDATA *pProtocolData)
{
FtpProtocol *This = PROTOCOL_THIS(iface);
FtpProtocol *This = impl_from_IInternetProtocolEx(iface);
TRACE("(%p)->(%p)\n", This, pProtocolData);
return protocol_continue(&This->base, pProtocolData);
}
static HRESULT WINAPI FtpProtocol_Abort(IInternetProtocol *iface, HRESULT hrReason,
static HRESULT WINAPI FtpProtocol_Abort(IInternetProtocolEx *iface, HRESULT hrReason,
DWORD dwOptions)
{
FtpProtocol *This = PROTOCOL_THIS(iface);
FIXME("(%p)->(%08x %08x)\n", This, hrReason, dwOptions);
return E_NOTIMPL;
FtpProtocol *This = impl_from_IInternetProtocolEx(iface);
TRACE("(%p)->(%08x %08x)\n", This, hrReason, dwOptions);
return protocol_abort(&This->base, hrReason);
}
static HRESULT WINAPI FtpProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions)
static HRESULT WINAPI FtpProtocol_Terminate(IInternetProtocolEx *iface, DWORD dwOptions)
{
FtpProtocol *This = PROTOCOL_THIS(iface);
FtpProtocol *This = impl_from_IInternetProtocolEx(iface);
TRACE("(%p)->(%08x)\n", This, dwOptions);
@@ -200,59 +221,78 @@ static HRESULT WINAPI FtpProtocol_Terminate(IInternetProtocol *iface, DWORD dwOp
return S_OK;
}
static HRESULT WINAPI FtpProtocol_Suspend(IInternetProtocol *iface)
static HRESULT WINAPI FtpProtocol_Suspend(IInternetProtocolEx *iface)
{
FtpProtocol *This = PROTOCOL_THIS(iface);
FtpProtocol *This = impl_from_IInternetProtocolEx(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI FtpProtocol_Resume(IInternetProtocol *iface)
static HRESULT WINAPI FtpProtocol_Resume(IInternetProtocolEx *iface)
{
FtpProtocol *This = PROTOCOL_THIS(iface);
FtpProtocol *This = impl_from_IInternetProtocolEx(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI FtpProtocol_Read(IInternetProtocol *iface, void *pv,
static HRESULT WINAPI FtpProtocol_Read(IInternetProtocolEx *iface, void *pv,
ULONG cb, ULONG *pcbRead)
{
FtpProtocol *This = PROTOCOL_THIS(iface);
FtpProtocol *This = impl_from_IInternetProtocolEx(iface);
TRACE("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead);
return protocol_read(&This->base, pv, cb, pcbRead);
}
static HRESULT WINAPI FtpProtocol_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove,
static HRESULT WINAPI FtpProtocol_Seek(IInternetProtocolEx *iface, LARGE_INTEGER dlibMove,
DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
{
FtpProtocol *This = PROTOCOL_THIS(iface);
FtpProtocol *This = impl_from_IInternetProtocolEx(iface);
FIXME("(%p)->(%d %d %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition);
return E_NOTIMPL;
}
static HRESULT WINAPI FtpProtocol_LockRequest(IInternetProtocol *iface, DWORD dwOptions)
static HRESULT WINAPI FtpProtocol_LockRequest(IInternetProtocolEx *iface, DWORD dwOptions)
{
FtpProtocol *This = PROTOCOL_THIS(iface);
FtpProtocol *This = impl_from_IInternetProtocolEx(iface);
TRACE("(%p)->(%08x)\n", This, dwOptions);
return protocol_lock_request(&This->base);
}
static HRESULT WINAPI FtpProtocol_UnlockRequest(IInternetProtocol *iface)
static HRESULT WINAPI FtpProtocol_UnlockRequest(IInternetProtocolEx *iface)
{
FtpProtocol *This = PROTOCOL_THIS(iface);
FtpProtocol *This = impl_from_IInternetProtocolEx(iface);
TRACE("(%p)\n", This);
return protocol_unlock_request(&This->base);
}
#undef PROTOCOL_THIS
static HRESULT WINAPI FtpProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUri,
IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
DWORD grfPI, HANDLE *dwReserved)
{
FtpProtocol *This = impl_from_IInternetProtocolEx(iface);
DWORD scheme = 0;
HRESULT hres;
static const IInternetProtocolVtbl FtpProtocolVtbl = {
TRACE("(%p)->(%p %p %p %08x %p)\n", This, pUri, pOIProtSink,
pOIBindInfo, grfPI, dwReserved);
hres = IUri_GetScheme(pUri, &scheme);
if(FAILED(hres))
return hres;
if(scheme != URL_SCHEME_FTP)
return MK_E_SYNTAX;
return protocol_start(&This->base, (IInternetProtocol*)&This->IInternetProtocolEx_iface, pUri,
pOIProtSink, pOIBindInfo);
}
static const IInternetProtocolExVtbl FtpProtocolVtbl = {
FtpProtocol_QueryInterface,
FtpProtocol_AddRef,
FtpProtocol_Release,
@@ -265,32 +305,31 @@ static const IInternetProtocolVtbl FtpProtocolVtbl = {
FtpProtocol_Read,
FtpProtocol_Seek,
FtpProtocol_LockRequest,
FtpProtocol_UnlockRequest
FtpProtocol_UnlockRequest,
FtpProtocol_StartEx
};
#define PRIORITY_THIS(iface) DEFINE_THIS(FtpProtocol, InternetPriority, iface)
static HRESULT WINAPI FtpPriority_QueryInterface(IInternetPriority *iface, REFIID riid, void **ppv)
{
FtpProtocol *This = PRIORITY_THIS(iface);
return IInternetProtocol_QueryInterface(PROTOCOL(This), riid, ppv);
FtpProtocol *This = impl_from_IInternetPriority(iface);
return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
}
static ULONG WINAPI FtpPriority_AddRef(IInternetPriority *iface)
{
FtpProtocol *This = PRIORITY_THIS(iface);
return IInternetProtocol_AddRef(PROTOCOL(This));
FtpProtocol *This = impl_from_IInternetPriority(iface);
return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
}
static ULONG WINAPI FtpPriority_Release(IInternetPriority *iface)
{
FtpProtocol *This = PRIORITY_THIS(iface);
return IInternetProtocol_Release(PROTOCOL(This));
FtpProtocol *This = impl_from_IInternetPriority(iface);
return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
}
static HRESULT WINAPI FtpPriority_SetPriority(IInternetPriority *iface, LONG nPriority)
{
FtpProtocol *This = PRIORITY_THIS(iface);
FtpProtocol *This = impl_from_IInternetPriority(iface);
TRACE("(%p)->(%d)\n", This, nPriority);
@@ -300,7 +339,7 @@ static HRESULT WINAPI FtpPriority_SetPriority(IInternetPriority *iface, LONG nPr
static HRESULT WINAPI FtpPriority_GetPriority(IInternetPriority *iface, LONG *pnPriority)
{
FtpProtocol *This = PRIORITY_THIS(iface);
FtpProtocol *This = impl_from_IInternetPriority(iface);
TRACE("(%p)->(%p)\n", This, pnPriority);
@@ -308,8 +347,6 @@ static HRESULT WINAPI FtpPriority_GetPriority(IInternetPriority *iface, LONG *pn
return S_OK;
}
#undef PRIORITY_THIS
static const IInternetPriorityVtbl FtpPriorityVtbl = {
FtpPriority_QueryInterface,
FtpPriority_AddRef,
@@ -318,30 +355,28 @@ static const IInternetPriorityVtbl FtpPriorityVtbl = {
FtpPriority_GetPriority
};
#define INETINFO_THIS(iface) DEFINE_THIS(FtpProtocol, WinInetHttpInfo, iface)
static HRESULT WINAPI HttpInfo_QueryInterface(IWinInetHttpInfo *iface, REFIID riid, void **ppv)
{
FtpProtocol *This = INETINFO_THIS(iface);
return IBinding_QueryInterface(PROTOCOL(This), riid, ppv);
FtpProtocol *This = impl_from_IWinInetHttpInfo(iface);
return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
}
static ULONG WINAPI HttpInfo_AddRef(IWinInetHttpInfo *iface)
{
FtpProtocol *This = INETINFO_THIS(iface);
return IBinding_AddRef(PROTOCOL(This));
FtpProtocol *This = impl_from_IWinInetHttpInfo(iface);
return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
}
static ULONG WINAPI HttpInfo_Release(IWinInetHttpInfo *iface)
{
FtpProtocol *This = INETINFO_THIS(iface);
return IBinding_Release(PROTOCOL(This));
FtpProtocol *This = impl_from_IWinInetHttpInfo(iface);
return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
}
static HRESULT WINAPI HttpInfo_QueryOption(IWinInetHttpInfo *iface, DWORD dwOption,
void *pBuffer, DWORD *pcbBuffer)
{
FtpProtocol *This = INETINFO_THIS(iface);
FtpProtocol *This = impl_from_IWinInetHttpInfo(iface);
FIXME("(%p)->(%x %p %p)\n", This, dwOption, pBuffer, pcbBuffer);
return E_NOTIMPL;
}
@@ -349,13 +384,11 @@ static HRESULT WINAPI HttpInfo_QueryOption(IWinInetHttpInfo *iface, DWORD dwOpti
static HRESULT WINAPI HttpInfo_QueryInfo(IWinInetHttpInfo *iface, DWORD dwOption,
void *pBuffer, DWORD *pcbBuffer, DWORD *pdwFlags, DWORD *pdwReserved)
{
FtpProtocol *This = INETINFO_THIS(iface);
FtpProtocol *This = impl_from_IWinInetHttpInfo(iface);
FIXME("(%p)->(%x %p %p %p %p)\n", This, dwOption, pBuffer, pcbBuffer, pdwFlags, pdwReserved);
return E_NOTIMPL;
}
#undef INETINFO_THIS
static const IWinInetHttpInfoVtbl WinInetHttpInfoVtbl = {
HttpInfo_QueryInterface,
HttpInfo_AddRef,
@@ -375,12 +408,12 @@ HRESULT FtpProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj)
ret = heap_alloc_zero(sizeof(FtpProtocol));
ret->base.vtbl = &AsyncProtocolVtbl;
ret->lpIInternetProtocolVtbl = &FtpProtocolVtbl;
ret->lpInternetPriorityVtbl = &FtpPriorityVtbl;
ret->lpWinInetHttpInfoVtbl = &WinInetHttpInfoVtbl;
ret->IInternetProtocolEx_iface.lpVtbl = &FtpProtocolVtbl;
ret->IInternetPriority_iface.lpVtbl = &FtpPriorityVtbl;
ret->IWinInetHttpInfo_iface.lpVtbl = &WinInetHttpInfoVtbl;
ret->ref = 1;
*ppobj = PROTOCOL(ret);
*ppobj = &ret->IInternetProtocolEx_iface;
return S_OK;
}
+10 -2
View File
@@ -56,6 +56,11 @@ static HRESULT GopherProtocol_open_request(Protocol *prot, IUri *uri, DWORD requ
return S_OK;
}
static HRESULT GopherProtocol_end_request(Protocol *prot)
{
return E_NOTIMPL;
}
static HRESULT GopherProtocol_start_downloading(Protocol *prot)
{
return S_OK;
@@ -69,6 +74,7 @@ static void GopherProtocol_close_connection(Protocol *prot)
static const ProtocolVtbl AsyncProtocolVtbl = {
GopherProtocol_open_request,
GopherProtocol_end_request,
GopherProtocol_start_downloading,
GopherProtocol_close_connection
};
@@ -161,8 +167,10 @@ static HRESULT WINAPI GopherProtocol_Abort(IInternetProtocol *iface, HRESULT hrR
DWORD dwOptions)
{
GopherProtocol *This = PROTOCOL_THIS(iface);
FIXME("(%p)->(%08x %08x)\n", This, hrReason, dwOptions);
return E_NOTIMPL;
TRACE("(%p)->(%08x %08x)\n", This, hrReason, dwOptions);
return protocol_abort(&This->base, hrReason);
}
static HRESULT WINAPI GopherProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions)
+150 -91
View File
@@ -20,6 +20,9 @@
#include "urlmon_main.h"
#include "wininet.h"
#define NO_SHLWAPI_REG
#include "shlwapi.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
@@ -27,9 +30,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
typedef struct {
Protocol base;
const IInternetProtocolVtbl *lpIInternetProtocolVtbl;
const IInternetPriorityVtbl *lpInternetPriorityVtbl;
const IWinInetHttpInfoVtbl *lpWinInetHttpInfoVtbl;
IInternetProtocolEx IInternetProtocolEx_iface;
IInternetPriority IInternetPriority_iface;
IWinInetHttpInfo IWinInetHttpInfo_iface;
BOOL https;
IHttpNegotiate *http_negotiate;
@@ -38,8 +41,20 @@ typedef struct {
LONG ref;
} HttpProtocol;
#define PRIORITY(x) ((IInternetPriority*) &(x)->lpInternetPriorityVtbl)
#define INETHTTPINFO(x) ((IWinInetHttpInfo*) &(x)->lpWinInetHttpInfoVtbl)
static inline HttpProtocol *impl_from_IInternetProtocolEx(IInternetProtocolEx *iface)
{
return CONTAINING_RECORD(iface, HttpProtocol, IInternetProtocolEx_iface);
}
static inline HttpProtocol *impl_from_IInternetPriority(IInternetPriority *iface)
{
return CONTAINING_RECORD(iface, HttpProtocol, IInternetPriority_iface);
}
static inline HttpProtocol *impl_from_IWinInetHttpInfo(IWinInetHttpInfo *iface)
{
return CONTAINING_RECORD(iface, HttpProtocol, IWinInetHttpInfo_iface);
}
/* Default headers from native */
static const WCHAR wszHeaders[] = {'A','c','c','e','p','t','-','E','n','c','o','d','i','n','g',
@@ -71,7 +86,8 @@ static HRESULT HttpProtocol_open_request(Protocol *prot, IUri *uri, DWORD reques
HINTERNET internet_session, IInternetBindInfo *bind_info)
{
HttpProtocol *This = ASYNCPROTOCOL_THIS(prot);
LPWSTR addl_header = NULL, post_cookie = NULL, optional = NULL;
INTERNET_BUFFERSW send_buffer = {sizeof(INTERNET_BUFFERSW)};
LPWSTR addl_header = NULL, post_cookie = NULL;
IServiceProvider *service_provider = NULL;
IHttpNegotiate2 *http_negotiate2 = NULL;
BSTR url, host, user, pass, path;
@@ -162,6 +178,7 @@ static HRESULT HttpProtocol_open_request(Protocol *prot, IUri *uri, DWORD reques
&IID_IHttpNegotiate, (void **)&This->http_negotiate);
if (hres != S_OK) {
WARN("IServiceProvider_QueryService IID_IHttpNegotiate failed: %08x\n", hres);
IServiceProvider_Release(service_provider);
return hres;
}
@@ -219,13 +236,30 @@ static HRESULT HttpProtocol_open_request(Protocol *prot, IUri *uri, DWORD reques
}
}
send_buffer.lpcszHeader = This->full_header;
send_buffer.dwHeadersLength = send_buffer.dwHeadersTotal = strlenW(This->full_header);
if(This->base.bind_info.dwBindVerb != BINDVERB_GET) {
/* Native does not use GlobalLock/GlobalUnlock, so we won't either */
if (This->base.bind_info.stgmedData.tymed != TYMED_HGLOBAL)
WARN("Expected This->base.bind_info.stgmedData.tymed to be TYMED_HGLOBAL, not %d\n",
This->base.bind_info.stgmedData.tymed);
else
optional = (LPWSTR)This->base.bind_info.stgmedData.u.hGlobal;
switch(This->base.bind_info.stgmedData.tymed) {
case TYMED_HGLOBAL:
/* Native does not use GlobalLock/GlobalUnlock, so we won't either */
send_buffer.lpvBuffer = This->base.bind_info.stgmedData.u.hGlobal;
send_buffer.dwBufferLength = send_buffer.dwBufferTotal = This->base.bind_info.cbstgmedData;
break;
case TYMED_ISTREAM: {
LARGE_INTEGER offset;
send_buffer.dwBufferTotal = This->base.bind_info.cbstgmedData;
This->base.post_stream = This->base.bind_info.stgmedData.u.pstm;
IStream_AddRef(This->base.post_stream);
offset.QuadPart = 0;
IStream_Seek(This->base.post_stream, offset, STREAM_SEEK_SET, NULL);
break;
}
default:
FIXME("Unsupported This->base.bind_info.stgmedData.tymed %d\n", This->base.bind_info.stgmedData.tymed);
}
}
b = TRUE;
@@ -233,8 +267,11 @@ static HRESULT HttpProtocol_open_request(Protocol *prot, IUri *uri, DWORD reques
if(!res)
WARN("InternetSetOption(INTERNET_OPTION_HTTP_DECODING) failed: %08x\n", GetLastError());
res = HttpSendRequestW(This->base.request, This->full_header, lstrlenW(This->full_header),
optional, optional ? This->base.bind_info.cbstgmedData : 0);
if(This->base.post_stream)
res = HttpSendRequestExW(This->base.request, &send_buffer, NULL, 0, 0);
else
res = HttpSendRequestW(This->base.request, send_buffer.lpcszHeader, send_buffer.dwHeadersLength,
send_buffer.lpvBuffer, send_buffer.dwBufferLength);
if(!res && GetLastError() != ERROR_IO_PENDING) {
WARN("HttpSendRequest failed: %d\n", GetLastError());
return INET_E_DOWNLOAD_FAILURE;
@@ -243,6 +280,19 @@ static HRESULT HttpProtocol_open_request(Protocol *prot, IUri *uri, DWORD reques
return S_OK;
}
static HRESULT HttpProtocol_end_request(Protocol *protocol)
{
BOOL res;
res = HttpEndRequestW(protocol->request, NULL, 0, 0);
if(!res && GetLastError() != ERROR_IO_PENDING) {
FIXME("HttpEndRequest failed: %u\n", GetLastError());
return E_FAIL;
}
return S_OK;
}
static HRESULT HttpProtocol_start_downloading(Protocol *prot)
{
HttpProtocol *This = ASYNCPROTOCOL_THIS(prot);
@@ -331,35 +381,37 @@ static void HttpProtocol_close_connection(Protocol *prot)
static const ProtocolVtbl AsyncProtocolVtbl = {
HttpProtocol_open_request,
HttpProtocol_end_request,
HttpProtocol_start_downloading,
HttpProtocol_close_connection
};
#define PROTOCOL_THIS(iface) DEFINE_THIS(HttpProtocol, IInternetProtocol, iface)
static HRESULT WINAPI HttpProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv)
static HRESULT WINAPI HttpProtocol_QueryInterface(IInternetProtocolEx *iface, REFIID riid, void **ppv)
{
HttpProtocol *This = PROTOCOL_THIS(iface);
HttpProtocol *This = impl_from_IInternetProtocolEx(iface);
*ppv = NULL;
if(IsEqualGUID(&IID_IUnknown, riid)) {
TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
*ppv = PROTOCOL(This);
*ppv = &This->IInternetProtocolEx_iface;
}else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) {
TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv);
*ppv = PROTOCOL(This);
*ppv = &This->IInternetProtocolEx_iface;
}else if(IsEqualGUID(&IID_IInternetProtocol, riid)) {
TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv);
*ppv = PROTOCOL(This);
*ppv = &This->IInternetProtocolEx_iface;
}else if(IsEqualGUID(&IID_IInternetProtocolEx, riid)) {
TRACE("(%p)->(IID_IInternetProtocolEx %p)\n", This, ppv);
*ppv = &This->IInternetProtocolEx_iface;
}else if(IsEqualGUID(&IID_IInternetPriority, riid)) {
TRACE("(%p)->(IID_IInternetPriority %p)\n", This, ppv);
*ppv = PRIORITY(This);
*ppv = &This->IInternetPriority_iface;
}else if(IsEqualGUID(&IID_IWinInetInfo, riid)) {
TRACE("(%p)->(IID_IWinInetInfo %p)\n", This, ppv);
*ppv = INETHTTPINFO(This);
*ppv = &This->IWinInetHttpInfo_iface;
}else if(IsEqualGUID(&IID_IWinInetHttpInfo, riid)) {
TRACE("(%p)->(IID_IWinInetHttpInfo %p)\n", This, ppv);
*ppv = INETHTTPINFO(This);
*ppv = &This->IWinInetHttpInfo_iface;
}
if(*ppv) {
@@ -371,17 +423,17 @@ static HRESULT WINAPI HttpProtocol_QueryInterface(IInternetProtocol *iface, REFI
return E_NOINTERFACE;
}
static ULONG WINAPI HttpProtocol_AddRef(IInternetProtocol *iface)
static ULONG WINAPI HttpProtocol_AddRef(IInternetProtocolEx *iface)
{
HttpProtocol *This = PROTOCOL_THIS(iface);
HttpProtocol *This = impl_from_IInternetProtocolEx(iface);
LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
return ref;
}
static ULONG WINAPI HttpProtocol_Release(IInternetProtocol *iface)
static ULONG WINAPI HttpProtocol_Release(IInternetProtocolEx *iface)
{
HttpProtocol *This = PROTOCOL_THIS(iface);
HttpProtocol *This = impl_from_IInternetProtocolEx(iface);
LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
@@ -396,55 +448,50 @@ static ULONG WINAPI HttpProtocol_Release(IInternetProtocol *iface)
return ref;
}
static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl,
static HRESULT WINAPI HttpProtocol_Start(IInternetProtocolEx *iface, LPCWSTR szUrl,
IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
DWORD grfPI, HANDLE_PTR dwReserved)
{
HttpProtocol *This = PROTOCOL_THIS(iface);
HttpProtocol *This = impl_from_IInternetProtocolEx(iface);
IUri *uri;
HRESULT hres;
static const WCHAR httpW[] = {'h','t','t','p',':'};
static const WCHAR httpsW[] = {'h','t','t','p','s',':'};
TRACE("(%p)->(%s %p %p %08x %lx)\n", This, debugstr_w(szUrl), pOIProtSink,
pOIBindInfo, grfPI, dwReserved);
if(This->https
? strncmpW(szUrl, httpsW, sizeof(httpsW)/sizeof(WCHAR))
: strncmpW(szUrl, httpW, sizeof(httpW)/sizeof(WCHAR)))
return MK_E_SYNTAX;
hres = CreateUri(szUrl, 0, 0, &uri);
if(FAILED(hres))
return hres;
hres = protocol_start(&This->base, PROTOCOL(This), uri, pOIProtSink, pOIBindInfo);
hres = IInternetProtocolEx_StartEx(&This->IInternetProtocolEx_iface, uri, pOIProtSink,
pOIBindInfo, grfPI, (HANDLE*)dwReserved);
IUri_Release(uri);
return hres;
}
static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData)
static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocolEx *iface, PROTOCOLDATA *pProtocolData)
{
HttpProtocol *This = PROTOCOL_THIS(iface);
HttpProtocol *This = impl_from_IInternetProtocolEx(iface);
TRACE("(%p)->(%p)\n", This, pProtocolData);
return protocol_continue(&This->base, pProtocolData);
}
static HRESULT WINAPI HttpProtocol_Abort(IInternetProtocol *iface, HRESULT hrReason,
static HRESULT WINAPI HttpProtocol_Abort(IInternetProtocolEx *iface, HRESULT hrReason,
DWORD dwOptions)
{
HttpProtocol *This = PROTOCOL_THIS(iface);
FIXME("(%p)->(%08x %08x)\n", This, hrReason, dwOptions);
return E_NOTIMPL;
HttpProtocol *This = impl_from_IInternetProtocolEx(iface);
TRACE("(%p)->(%08x %08x)\n", This, hrReason, dwOptions);
return protocol_abort(&This->base, hrReason);
}
static HRESULT WINAPI HttpProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions)
static HRESULT WINAPI HttpProtocol_Terminate(IInternetProtocolEx *iface, DWORD dwOptions)
{
HttpProtocol *This = PROTOCOL_THIS(iface);
HttpProtocol *This = impl_from_IInternetProtocolEx(iface);
TRACE("(%p)->(%08x)\n", This, dwOptions);
@@ -452,59 +499,78 @@ static HRESULT WINAPI HttpProtocol_Terminate(IInternetProtocol *iface, DWORD dwO
return S_OK;
}
static HRESULT WINAPI HttpProtocol_Suspend(IInternetProtocol *iface)
static HRESULT WINAPI HttpProtocol_Suspend(IInternetProtocolEx *iface)
{
HttpProtocol *This = PROTOCOL_THIS(iface);
HttpProtocol *This = impl_from_IInternetProtocolEx(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI HttpProtocol_Resume(IInternetProtocol *iface)
static HRESULT WINAPI HttpProtocol_Resume(IInternetProtocolEx *iface)
{
HttpProtocol *This = PROTOCOL_THIS(iface);
HttpProtocol *This = impl_from_IInternetProtocolEx(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI HttpProtocol_Read(IInternetProtocol *iface, void *pv,
static HRESULT WINAPI HttpProtocol_Read(IInternetProtocolEx *iface, void *pv,
ULONG cb, ULONG *pcbRead)
{
HttpProtocol *This = PROTOCOL_THIS(iface);
HttpProtocol *This = impl_from_IInternetProtocolEx(iface);
TRACE("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead);
return protocol_read(&This->base, pv, cb, pcbRead);
}
static HRESULT WINAPI HttpProtocol_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove,
static HRESULT WINAPI HttpProtocol_Seek(IInternetProtocolEx *iface, LARGE_INTEGER dlibMove,
DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
{
HttpProtocol *This = PROTOCOL_THIS(iface);
HttpProtocol *This = impl_from_IInternetProtocolEx(iface);
FIXME("(%p)->(%d %d %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition);
return E_NOTIMPL;
}
static HRESULT WINAPI HttpProtocol_LockRequest(IInternetProtocol *iface, DWORD dwOptions)
static HRESULT WINAPI HttpProtocol_LockRequest(IInternetProtocolEx *iface, DWORD dwOptions)
{
HttpProtocol *This = PROTOCOL_THIS(iface);
HttpProtocol *This = impl_from_IInternetProtocolEx(iface);
TRACE("(%p)->(%08x)\n", This, dwOptions);
return protocol_lock_request(&This->base);
}
static HRESULT WINAPI HttpProtocol_UnlockRequest(IInternetProtocol *iface)
static HRESULT WINAPI HttpProtocol_UnlockRequest(IInternetProtocolEx *iface)
{
HttpProtocol *This = PROTOCOL_THIS(iface);
HttpProtocol *This = impl_from_IInternetProtocolEx(iface);
TRACE("(%p)\n", This);
return protocol_unlock_request(&This->base);
}
#undef PROTOCOL_THIS
static HRESULT WINAPI HttpProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUri,
IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
DWORD grfPI, HANDLE *dwReserved)
{
HttpProtocol *This = impl_from_IInternetProtocolEx(iface);
DWORD scheme = 0;
HRESULT hres;
static const IInternetProtocolVtbl HttpProtocolVtbl = {
TRACE("(%p)->(%p %p %p %08x %p)\n", This, pUri, pOIProtSink,
pOIBindInfo, grfPI, dwReserved);
hres = IUri_GetScheme(pUri, &scheme);
if(FAILED(hres))
return hres;
if(scheme != (This->https ? URL_SCHEME_HTTPS : URL_SCHEME_HTTP))
return MK_E_SYNTAX;
return protocol_start(&This->base, (IInternetProtocol*)&This->IInternetProtocolEx_iface, pUri,
pOIProtSink, pOIBindInfo);
}
static const IInternetProtocolExVtbl HttpProtocolVtbl = {
HttpProtocol_QueryInterface,
HttpProtocol_AddRef,
HttpProtocol_Release,
@@ -517,32 +583,31 @@ static const IInternetProtocolVtbl HttpProtocolVtbl = {
HttpProtocol_Read,
HttpProtocol_Seek,
HttpProtocol_LockRequest,
HttpProtocol_UnlockRequest
HttpProtocol_UnlockRequest,
HttpProtocol_StartEx
};
#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);
HttpProtocol *This = impl_from_IInternetPriority(iface);
return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
}
static ULONG WINAPI HttpPriority_AddRef(IInternetPriority *iface)
{
HttpProtocol *This = PRIORITY_THIS(iface);
return IInternetProtocol_AddRef(PROTOCOL(This));
HttpProtocol *This = impl_from_IInternetPriority(iface);
return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
}
static ULONG WINAPI HttpPriority_Release(IInternetPriority *iface)
{
HttpProtocol *This = PRIORITY_THIS(iface);
return IInternetProtocol_Release(PROTOCOL(This));
HttpProtocol *This = impl_from_IInternetPriority(iface);
return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
}
static HRESULT WINAPI HttpPriority_SetPriority(IInternetPriority *iface, LONG nPriority)
{
HttpProtocol *This = PRIORITY_THIS(iface);
HttpProtocol *This = impl_from_IInternetPriority(iface);
TRACE("(%p)->(%d)\n", This, nPriority);
@@ -552,7 +617,7 @@ static HRESULT WINAPI HttpPriority_SetPriority(IInternetPriority *iface, LONG nP
static HRESULT WINAPI HttpPriority_GetPriority(IInternetPriority *iface, LONG *pnPriority)
{
HttpProtocol *This = PRIORITY_THIS(iface);
HttpProtocol *This = impl_from_IInternetPriority(iface);
TRACE("(%p)->(%p)\n", This, pnPriority);
@@ -560,8 +625,6 @@ static HRESULT WINAPI HttpPriority_GetPriority(IInternetPriority *iface, LONG *p
return S_OK;
}
#undef PRIORITY_THIS
static const IInternetPriorityVtbl HttpPriorityVtbl = {
HttpPriority_QueryInterface,
HttpPriority_AddRef,
@@ -570,30 +633,28 @@ static const IInternetPriorityVtbl HttpPriorityVtbl = {
HttpPriority_GetPriority
};
#define INETINFO_THIS(iface) DEFINE_THIS(HttpProtocol, WinInetHttpInfo, iface)
static HRESULT WINAPI HttpInfo_QueryInterface(IWinInetHttpInfo *iface, REFIID riid, void **ppv)
{
HttpProtocol *This = INETINFO_THIS(iface);
return IBinding_QueryInterface(PROTOCOL(This), riid, ppv);
HttpProtocol *This = impl_from_IWinInetHttpInfo(iface);
return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
}
static ULONG WINAPI HttpInfo_AddRef(IWinInetHttpInfo *iface)
{
HttpProtocol *This = INETINFO_THIS(iface);
return IBinding_AddRef(PROTOCOL(This));
HttpProtocol *This = impl_from_IWinInetHttpInfo(iface);
return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
}
static ULONG WINAPI HttpInfo_Release(IWinInetHttpInfo *iface)
{
HttpProtocol *This = INETINFO_THIS(iface);
return IBinding_Release(PROTOCOL(This));
HttpProtocol *This = impl_from_IWinInetHttpInfo(iface);
return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
}
static HRESULT WINAPI HttpInfo_QueryOption(IWinInetHttpInfo *iface, DWORD dwOption,
void *pBuffer, DWORD *pcbBuffer)
{
HttpProtocol *This = INETINFO_THIS(iface);
HttpProtocol *This = impl_from_IWinInetHttpInfo(iface);
FIXME("(%p)->(%x %p %p)\n", This, dwOption, pBuffer, pcbBuffer);
return E_NOTIMPL;
}
@@ -601,13 +662,11 @@ static HRESULT WINAPI HttpInfo_QueryOption(IWinInetHttpInfo *iface, DWORD dwOpti
static HRESULT WINAPI HttpInfo_QueryInfo(IWinInetHttpInfo *iface, DWORD dwOption,
void *pBuffer, DWORD *pcbBuffer, DWORD *pdwFlags, DWORD *pdwReserved)
{
HttpProtocol *This = INETINFO_THIS(iface);
HttpProtocol *This = impl_from_IWinInetHttpInfo(iface);
FIXME("(%p)->(%x %p %p %p %p)\n", This, dwOption, pBuffer, pcbBuffer, pdwFlags, pdwReserved);
return E_NOTIMPL;
}
#undef INETINFO_THIS
static const IWinInetHttpInfoVtbl WinInetHttpInfoVtbl = {
HttpInfo_QueryInterface,
HttpInfo_AddRef,
@@ -625,15 +684,15 @@ static HRESULT create_http_protocol(BOOL https, void **ppobj)
return E_OUTOFMEMORY;
ret->base.vtbl = &AsyncProtocolVtbl;
ret->lpIInternetProtocolVtbl = &HttpProtocolVtbl;
ret->lpInternetPriorityVtbl = &HttpPriorityVtbl;
ret->lpWinInetHttpInfoVtbl = &WinInetHttpInfoVtbl;
ret->IInternetProtocolEx_iface.lpVtbl = &HttpProtocolVtbl;
ret->IInternetPriority_iface.lpVtbl = &HttpPriorityVtbl;
ret->IWinInetHttpInfo_iface.lpVtbl = &WinInetHttpInfoVtbl;
ret->https = https;
ret->ref = 1;
*ppobj = PROTOCOL(ret);
*ppobj = &ret->IInternetProtocolEx_iface;
URLMON_LockModule();
return S_OK;
}
+58
View File
@@ -104,6 +104,8 @@ static void request_complete(Protocol *protocol, INTERNET_ASYNC_RESULT *ar)
{
PROTOCOLDATA data;
TRACE("(%p)->(%p)\n", protocol, ar);
if(!ar->dwResult) {
WARN("request failed: %d\n", ar->dwError);
return;
@@ -191,6 +193,42 @@ static void WINAPI internet_status_callback(HINTERNET internet, DWORD_PTR contex
}
}
static HRESULT write_post_stream(Protocol *protocol)
{
BYTE buf[0x20000];
DWORD written;
ULONG size;
BOOL res;
HRESULT hres;
protocol->flags &= ~FLAG_REQUEST_COMPLETE;
while(1) {
size = 0;
hres = IStream_Read(protocol->post_stream, buf, sizeof(buf), &size);
if(FAILED(hres) || !size)
break;
res = InternetWriteFile(protocol->request, buf, size, &written);
if(!res) {
FIXME("InternetWriteFile failed: %u\n", GetLastError());
hres = E_FAIL;
break;
}
}
if(SUCCEEDED(hres)) {
IStream_Release(protocol->post_stream);
protocol->post_stream = NULL;
hres = protocol->vtbl->end_request(protocol);
}
if(FAILED(hres))
return report_result(protocol, hres);
return S_OK;
}
static HINTERNET create_internet_session(IInternetBindInfo *bind_info)
{
LPWSTR global_user_agent = NULL;
@@ -293,6 +331,9 @@ HRESULT protocol_continue(Protocol *protocol, PROTOCOLDATA *data)
return S_OK;
}
if(protocol->post_stream)
return write_post_stream(protocol);
if(data->pData == (LPVOID)BINDSTATUS_DOWNLOADINGDATA) {
hres = protocol->vtbl->start_downloading(protocol);
if(FAILED(hres)) {
@@ -428,6 +469,18 @@ HRESULT protocol_unlock_request(Protocol *protocol)
return S_OK;
}
HRESULT protocol_abort(Protocol *protocol, HRESULT reason)
{
if(!protocol->protocol_sink)
return S_OK;
if(protocol->flags & FLAG_RESULT_REPORTED)
return INET_E_RESULT_DISPATCHED;
report_result(protocol, reason);
return S_OK;
}
void protocol_close_connection(Protocol *protocol)
{
protocol->vtbl->close_connection(protocol);
@@ -438,5 +491,10 @@ void protocol_close_connection(Protocol *protocol)
if(protocol->connection)
InternetCloseHandle(protocol->connection);
if(protocol->post_stream) {
IStream_Release(protocol->post_stream);
protocol->post_stream = NULL;
}
protocol->flags = 0;
}
+31 -23
View File
@@ -295,7 +295,7 @@ static HRESULT get_action_policy(DWORD zone, DWORD action, BYTE *policy, DWORD s
*
*/
typedef struct {
const IInternetSecurityManagerVtbl* lpInternetSecurityManagerVtbl;
IInternetSecurityManager IInternetSecurityManager_iface;
LONG ref;
@@ -303,11 +303,14 @@ typedef struct {
IInternetSecurityManager *custom_manager;
} SecManagerImpl;
#define SECMGR_THIS(iface) DEFINE_THIS(SecManagerImpl, InternetSecurityManager, iface)
static inline SecManagerImpl *impl_from_IInternetSecurityManager(IInternetSecurityManager *iface)
{
return CONTAINING_RECORD(iface, SecManagerImpl, IInternetSecurityManager_iface);
}
static HRESULT WINAPI SecManagerImpl_QueryInterface(IInternetSecurityManager* iface,REFIID riid,void** ppvObject)
{
SecManagerImpl *This = SECMGR_THIS(iface);
SecManagerImpl *This = impl_from_IInternetSecurityManager(iface);
TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),ppvObject);
@@ -337,7 +340,7 @@ static HRESULT WINAPI SecManagerImpl_QueryInterface(IInternetSecurityManager* if
static ULONG WINAPI SecManagerImpl_AddRef(IInternetSecurityManager* iface)
{
SecManagerImpl *This = SECMGR_THIS(iface);
SecManagerImpl *This = impl_from_IInternetSecurityManager(iface);
ULONG refCount = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%u\n", This, refCount);
@@ -347,7 +350,7 @@ static ULONG WINAPI SecManagerImpl_AddRef(IInternetSecurityManager* iface)
static ULONG WINAPI SecManagerImpl_Release(IInternetSecurityManager* iface)
{
SecManagerImpl *This = SECMGR_THIS(iface);
SecManagerImpl *This = impl_from_IInternetSecurityManager(iface);
ULONG refCount = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%u\n", This, refCount);
@@ -370,7 +373,7 @@ static ULONG WINAPI SecManagerImpl_Release(IInternetSecurityManager* iface)
static HRESULT WINAPI SecManagerImpl_SetSecuritySite(IInternetSecurityManager *iface,
IInternetSecurityMgrSite *pSite)
{
SecManagerImpl *This = SECMGR_THIS(iface);
SecManagerImpl *This = impl_from_IInternetSecurityManager(iface);
TRACE("(%p)->(%p)\n", This, pSite);
@@ -405,7 +408,7 @@ static HRESULT WINAPI SecManagerImpl_SetSecuritySite(IInternetSecurityManager *i
static HRESULT WINAPI SecManagerImpl_GetSecuritySite(IInternetSecurityManager *iface,
IInternetSecurityMgrSite **ppSite)
{
SecManagerImpl *This = SECMGR_THIS(iface);
SecManagerImpl *This = impl_from_IInternetSecurityManager(iface);
TRACE("(%p)->(%p)\n", This, ppSite);
@@ -423,7 +426,7 @@ static HRESULT WINAPI SecManagerImpl_MapUrlToZone(IInternetSecurityManager *ifac
LPCWSTR pwszUrl, DWORD *pdwZone,
DWORD dwFlags)
{
SecManagerImpl *This = SECMGR_THIS(iface);
SecManagerImpl *This = impl_from_IInternetSecurityManager(iface);
HRESULT hres;
TRACE("(%p)->(%s %p %08x)\n", iface, debugstr_w(pwszUrl), pdwZone, dwFlags);
@@ -449,7 +452,7 @@ static HRESULT WINAPI SecManagerImpl_MapUrlToZone(IInternetSecurityManager *ifac
static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManager *iface,
LPCWSTR pwszUrl, BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD_PTR dwReserved)
{
SecManagerImpl *This = SECMGR_THIS(iface);
SecManagerImpl *This = impl_from_IInternetSecurityManager(iface);
LPWSTR url, ptr, ptr2;
DWORD zone, len;
HRESULT hres;
@@ -529,7 +532,7 @@ static HRESULT WINAPI SecManagerImpl_ProcessUrlAction(IInternetSecurityManager *
BYTE *pContext, DWORD cbContext,
DWORD dwFlags, DWORD dwReserved)
{
SecManagerImpl *This = SECMGR_THIS(iface);
SecManagerImpl *This = impl_from_IInternetSecurityManager(iface);
DWORD zone, policy;
HRESULT hres;
@@ -584,7 +587,7 @@ static HRESULT WINAPI SecManagerImpl_QueryCustomPolicy(IInternetSecurityManager
BYTE *pContext, DWORD cbContext,
DWORD dwReserved)
{
SecManagerImpl *This = SECMGR_THIS(iface);
SecManagerImpl *This = impl_from_IInternetSecurityManager(iface);
HRESULT hres;
TRACE("(%p)->(%s %s %p %p %p %08x %08x )\n", iface, debugstr_w(pwszUrl), debugstr_guid(guidKey),
@@ -604,7 +607,7 @@ static HRESULT WINAPI SecManagerImpl_QueryCustomPolicy(IInternetSecurityManager
static HRESULT WINAPI SecManagerImpl_SetZoneMapping(IInternetSecurityManager *iface,
DWORD dwZone, LPCWSTR pwszPattern, DWORD dwFlags)
{
SecManagerImpl *This = SECMGR_THIS(iface);
SecManagerImpl *This = impl_from_IInternetSecurityManager(iface);
HRESULT hres;
TRACE("(%p)->(%08x %s %08x)\n", iface, dwZone, debugstr_w(pwszPattern),dwFlags);
@@ -623,7 +626,7 @@ static HRESULT WINAPI SecManagerImpl_SetZoneMapping(IInternetSecurityManager *if
static HRESULT WINAPI SecManagerImpl_GetZoneMappings(IInternetSecurityManager *iface,
DWORD dwZone, IEnumString **ppenumString, DWORD dwFlags)
{
SecManagerImpl *This = SECMGR_THIS(iface);
SecManagerImpl *This = impl_from_IInternetSecurityManager(iface);
HRESULT hres;
TRACE("(%p)->(%08x %p %08x)\n", iface, dwZone, ppenumString,dwFlags);
@@ -662,7 +665,7 @@ HRESULT SecManagerImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj)
This = heap_alloc(sizeof(*This));
/* Initialize the virtual function table. */
This->lpInternetSecurityManagerVtbl = &VT_SecManagerImpl;
This->IInternetSecurityManager_iface.lpVtbl = &VT_SecManagerImpl;
This->ref = 1;
This->mgrsite = NULL;
@@ -680,12 +683,17 @@ HRESULT SecManagerImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj)
*
*/
typedef struct {
const IInternetZoneManagerEx2Vtbl* lpVtbl;
IInternetZoneManagerEx2 IInternetZoneManagerEx2_iface;
LONG ref;
LPDWORD *zonemaps;
DWORD zonemap_count;
} ZoneMgrImpl;
static inline ZoneMgrImpl *impl_from_IInternetZoneManagerEx2(IInternetZoneManagerEx2 *iface)
{
return CONTAINING_RECORD(iface, ZoneMgrImpl, IInternetZoneManagerEx2_iface);
}
/***********************************************************************
* build_zonemap_from_reg [internal]
@@ -750,7 +758,7 @@ cleanup:
*/
static HRESULT WINAPI ZoneMgrImpl_QueryInterface(IInternetZoneManagerEx2* iface, REFIID riid, void** ppvObject)
{
ZoneMgrImpl* This = (ZoneMgrImpl*)iface;
ZoneMgrImpl* This = impl_from_IInternetZoneManagerEx2(iface);
TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppvObject);
@@ -783,7 +791,7 @@ static HRESULT WINAPI ZoneMgrImpl_QueryInterface(IInternetZoneManagerEx2* iface,
*/
static ULONG WINAPI ZoneMgrImpl_AddRef(IInternetZoneManagerEx2* iface)
{
ZoneMgrImpl* This = (ZoneMgrImpl*)iface;
ZoneMgrImpl* This = impl_from_IInternetZoneManagerEx2(iface);
ULONG refCount = InterlockedIncrement(&This->ref);
TRACE("(%p)->(ref before=%u)\n",This, refCount - 1);
@@ -796,7 +804,7 @@ static ULONG WINAPI ZoneMgrImpl_AddRef(IInternetZoneManagerEx2* iface)
*/
static ULONG WINAPI ZoneMgrImpl_Release(IInternetZoneManagerEx2* iface)
{
ZoneMgrImpl* This = (ZoneMgrImpl*)iface;
ZoneMgrImpl* This = impl_from_IInternetZoneManagerEx2(iface);
ULONG refCount = InterlockedDecrement(&This->ref);
TRACE("(%p)->(ref before=%u)\n",This, refCount + 1);
@@ -818,7 +826,7 @@ static HRESULT WINAPI ZoneMgrImpl_GetZoneAttributes(IInternetZoneManagerEx2* ifa
DWORD dwZone,
ZONEATTRIBUTES* pZoneAttributes)
{
ZoneMgrImpl* This = (ZoneMgrImpl*)iface;
ZoneMgrImpl* This = impl_from_IInternetZoneManagerEx2(iface);
HRESULT hr;
HKEY hcu;
HKEY hklm = NULL;
@@ -957,7 +965,7 @@ static HRESULT WINAPI ZoneMgrImpl_CreateZoneEnumerator(IInternetZoneManagerEx2*
DWORD* pdwCount,
DWORD dwFlags)
{
ZoneMgrImpl* This = (ZoneMgrImpl*)iface;
ZoneMgrImpl* This = impl_from_IInternetZoneManagerEx2(iface);
LPDWORD * new_maps;
LPDWORD data;
DWORD i;
@@ -1012,7 +1020,7 @@ static HRESULT WINAPI ZoneMgrImpl_GetZoneAt(IInternetZoneManagerEx2* iface,
DWORD dwIndex,
DWORD* pdwZone)
{
ZoneMgrImpl* This = (ZoneMgrImpl*)iface;
ZoneMgrImpl* This = impl_from_IInternetZoneManagerEx2(iface);
LPDWORD data;
TRACE("(%p)->(0x%08x, %d, %p)\n", This, dwEnum, dwIndex, pdwZone);
@@ -1035,7 +1043,7 @@ static HRESULT WINAPI ZoneMgrImpl_GetZoneAt(IInternetZoneManagerEx2* iface,
static HRESULT WINAPI ZoneMgrImpl_DestroyZoneEnumerator(IInternetZoneManagerEx2* iface,
DWORD dwEnum)
{
ZoneMgrImpl* This = (ZoneMgrImpl*)iface;
ZoneMgrImpl* This = impl_from_IInternetZoneManagerEx2(iface);
LPDWORD data;
TRACE("(%p)->(0x%08x)\n", This, dwEnum);
@@ -1202,7 +1210,7 @@ HRESULT ZoneMgrImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj)
ZoneMgrImpl* ret = heap_alloc_zero(sizeof(ZoneMgrImpl));
TRACE("(%p %p)\n", pUnkOuter, ppobj);
ret->lpVtbl = &ZoneMgrImplVtbl;
ret->IInternetZoneManagerEx2_iface.lpVtbl = &ZoneMgrImplVtbl;
ret->ref = 1;
*ppobj = (IInternetZoneManagerEx*)ret;
+29 -17
View File
@@ -92,7 +92,7 @@ static HRESULT get_protocol_cf(LPCWSTR schema, DWORD schema_len, CLSID *pclsid,
heap_free(wszKey);
if(res != ERROR_SUCCESS) {
TRACE("Could not open protocol handler key\n");
return E_FAIL;
return MK_E_SYNTAX;
}
size = sizeof(str_clsid);
@@ -100,7 +100,7 @@ static HRESULT get_protocol_cf(LPCWSTR schema, DWORD schema_len, CLSID *pclsid,
RegCloseKey(hkey);
if(res != ERROR_SUCCESS || type != REG_SZ) {
WARN("Could not get protocol CLSID res=%d\n", res);
return E_FAIL;
return MK_E_SYNTAX;
}
hres = CLSIDFromString(str_clsid, &clsid);
@@ -115,7 +115,8 @@ static HRESULT get_protocol_cf(LPCWSTR schema, DWORD schema_len, CLSID *pclsid,
if(!ret)
return S_OK;
return CoGetClassObject(&clsid, CLSCTX_INPROC_SERVER, NULL, &IID_IClassFactory, (void**)ret);
hres = CoGetClassObject(&clsid, CLSCTX_INPROC_SERVER, NULL, &IID_IClassFactory, (void**)ret);
return SUCCEEDED(hres) ? S_OK : MK_E_SYNTAX;
}
static HRESULT register_namespace(IClassFactory *cf, REFIID clsid, LPCWSTR protocol, BOOL urlmon_protocol)
@@ -235,23 +236,22 @@ IInternetProtocolInfo *get_protocol_info(LPCWSTR url)
return ret;
}
HRESULT get_protocol_handler(LPCWSTR url, CLSID *clsid, BOOL *urlmon_protocol, IClassFactory **ret)
HRESULT get_protocol_handler(IUri *uri, CLSID *clsid, BOOL *urlmon_protocol, IClassFactory **ret)
{
name_space *ns;
WCHAR schema[64];
DWORD schema_len;
BSTR scheme;
HRESULT hres;
*ret = NULL;
hres = CoInternetParseUrl(url, PARSE_SCHEMA, 0, schema, sizeof(schema)/sizeof(schema[0]),
&schema_len, 0);
if(FAILED(hres) || !schema_len)
return schema_len ? hres : E_FAIL;
/* FIXME: Avoid GetSchemeName call for known schemes */
hres = IUri_GetSchemeName(uri, &scheme);
if(FAILED(hres))
return hres;
EnterCriticalSection(&session_cs);
ns = find_name_space(schema);
ns = find_name_space(scheme);
if(ns) {
*ret = ns->cf;
IClassFactory_AddRef(*ret);
@@ -263,12 +263,16 @@ HRESULT get_protocol_handler(LPCWSTR url, CLSID *clsid, BOOL *urlmon_protocol, I
LeaveCriticalSection(&session_cs);
if(*ret)
return S_OK;
if(*ret) {
hres = S_OK;
}else {
if(urlmon_protocol)
*urlmon_protocol = FALSE;
hres = get_protocol_cf(scheme, SysStringLen(scheme), clsid, ret);
}
if(urlmon_protocol)
*urlmon_protocol = FALSE;
return get_protocol_cf(schema, schema_len, clsid, ret);
SysFreeString(scheme);
return hres;
}
IInternetProtocol *get_mime_filter(LPCWSTR mime)
@@ -420,13 +424,21 @@ static HRESULT WINAPI InternetSession_CreateBinding(IInternetSession *iface,
LPBC pBC, LPCWSTR szUrl, IUnknown *pUnkOuter, IUnknown **ppUnk,
IInternetProtocol **ppOInetProt, DWORD dwOption)
{
IInternetProtocolEx *protocol;
HRESULT hres;
TRACE("(%p %s %p %p %p %08x)\n", pBC, debugstr_w(szUrl), pUnkOuter, ppUnk,
ppOInetProt, dwOption);
if(pBC || pUnkOuter || ppUnk || dwOption)
FIXME("Unsupported arguments\n");
return create_binding_protocol(szUrl, FALSE, ppOInetProt);
hres = create_binding_protocol(FALSE, &protocol);
if(FAILED(hres))
return hres;
*ppOInetProt = (IInternetProtocol*)protocol;
return S_OK;
}
static HRESULT WINAPI InternetSession_SetSessionOption(IInternetSession *iface,
+19 -2
View File
@@ -200,6 +200,7 @@ static HRESULT WINAPI URLMoniker_BindToObject(IMoniker *iface, IBindCtx* pbc, IM
{
URLMoniker *This = MONIKER_THIS(iface);
IRunningObjectTable *obj_tbl;
IUri *uri;
HRESULT hres;
TRACE("(%p)->(%p,%p,%s,%p): stub\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppv);
@@ -210,20 +211,36 @@ static HRESULT WINAPI URLMoniker_BindToObject(IMoniker *iface, IBindCtx* pbc, IM
IRunningObjectTable_Release(obj_tbl);
}
return bind_to_object(iface, This->URLName, pbc, riid, ppv);
hres = CreateUri(This->URLName, Uri_CREATE_FILE_USE_DOS_PATH, 0, &uri);
if(FAILED(hres))
return hres;
hres = bind_to_object(iface, uri, pbc, riid, ppv);
IUri_Release(uri);
return hres;
}
static HRESULT WINAPI URLMoniker_BindToStorage(IMoniker* iface, IBindCtx* pbc,
IMoniker* pmkToLeft, REFIID riid, void **ppvObject)
{
URLMoniker *This = MONIKER_THIS(iface);
IUri *uri;
HRESULT hres;
TRACE("(%p)->(%p %p %s %p)\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppvObject);
if(pmkToLeft)
FIXME("Unsupported pmkToLeft\n");
return bind_to_storage(This->URLName, pbc, riid, ppvObject);
hres = CreateUri(This->URLName, Uri_CREATE_FILE_USE_DOS_PATH, 0, &uri);
if(FAILED(hres))
return hres;
hres = bind_to_storage(uri, pbc, riid, ppvObject);
IUri_Release(uri);
return hres;
}
static HRESULT WINAPI URLMoniker_Reduce(IMoniker *iface, IBindCtx *pbc,
File diff suppressed because it is too large Load Diff
+3
View File
@@ -11,7 +11,9 @@
@ stdcall CoGetClassObjectFromURL(ptr wstr long long wstr ptr long ptr ptr ptr)
@ stub CoInstall
@ stdcall CoInternetCombineUrl(wstr wstr long wstr long ptr long)
@ stdcall CoInternetCombineUrlEx(ptr wstr long ptr long)
@ stdcall CoInternetCompareUrl(wstr wstr long)
@ stdcall CoInternetCombineIUri(ptr ptr long ptr long)
@ stdcall CoInternetCreateSecurityManager(ptr ptr long)
@ stdcall CoInternetCreateZoneManager(ptr ptr long)
@ stub CoInternetGetProtocolFlags
@@ -19,6 +21,7 @@
@ stdcall CoInternetGetSession(long ptr long)
@ stdcall CoInternetIsFeatureEnabled(long long)
@ stdcall CoInternetParseUrl(wstr long long wstr long ptr long)
@ stdcall CoInternetParseIUri(ptr long long wstr long ptr long)
@ stdcall CoInternetQueryInfo(ptr long long ptr long ptr long)
@ stdcall CoInternetSetFeatureEnabled(long long long)
@ stub CompareSecurityIds
+123 -122
View File
@@ -636,6 +636,127 @@ static BOOL application_octet_stream_filter(const BYTE *b, DWORD size)
return TRUE;
}
static HRESULT find_mime_from_buffer(const BYTE *buf, DWORD size, const WCHAR *proposed_mime, WCHAR **ret_mime)
{
LPCWSTR ret = NULL;
DWORD len, i;
static const WCHAR text_htmlW[] = {'t','e','x','t','/','h','t','m','l',0};
static const WCHAR text_richtextW[] = {'t','e','x','t','/','r','i','c','h','t','e','x','t',0};
static const WCHAR audio_basicW[] = {'a','u','d','i','o','/','b','a','s','i','c',0};
static const WCHAR audio_wavW[] = {'a','u','d','i','o','/','w','a','v',0};
static const WCHAR image_gifW[] = {'i','m','a','g','e','/','g','i','f',0};
static const WCHAR image_pjpegW[] = {'i','m','a','g','e','/','p','j','p','e','g',0};
static const WCHAR image_tiffW[] = {'i','m','a','g','e','/','t','i','f','f',0};
static const WCHAR image_xpngW[] = {'i','m','a','g','e','/','x','-','p','n','g',0};
static const WCHAR image_bmpW[] = {'i','m','a','g','e','/','b','m','p',0};
static const WCHAR video_aviW[] = {'v','i','d','e','o','/','a','v','i',0};
static const WCHAR video_mpegW[] = {'v','i','d','e','o','/','m','p','e','g',0};
static const WCHAR app_postscriptW[] =
{'a','p','p','l','i','c','a','t','i','o','n','/','p','o','s','t','s','c','r','i','p','t',0};
static const WCHAR app_pdfW[] = {'a','p','p','l','i','c','a','t','i','o','n','/','p','d','f',0};
static const WCHAR app_xzipW[] = {'a','p','p','l','i','c','a','t','i','o','n','/',
'x','-','z','i','p','-','c','o','m','p','r','e','s','s','e','d',0};
static const WCHAR app_xgzipW[] = {'a','p','p','l','i','c','a','t','i','o','n','/',
'x','-','g','z','i','p','-','c','o','m','p','r','e','s','s','e','d',0};
static const WCHAR app_javaW[] = {'a','p','p','l','i','c','a','t','i','o','n','/',
'j','a','v','a',0};
static const WCHAR app_xmsdownloadW[] = {'a','p','p','l','i','c','a','t','i','o','n','/',
'x','-','m','s','d','o','w','n','l','o','a','d',0};
static const WCHAR text_plainW[] = {'t','e','x','t','/','p','l','a','i','n','\0'};
static const WCHAR app_octetstreamW[] = {'a','p','p','l','i','c','a','t','i','o','n','/',
'o','c','t','e','t','-','s','t','r','e','a','m','\0'};
static const struct {
LPCWSTR mime;
BOOL (*filter)(const BYTE *,DWORD);
} mime_filters[] = {
{text_htmlW, text_html_filter},
{text_richtextW, text_richtext_filter},
/* {audio_xaiffW, audio_xaiff_filter}, */
{audio_basicW, audio_basic_filter},
{audio_wavW, audio_wav_filter},
{image_gifW, image_gif_filter},
{image_pjpegW, image_pjpeg_filter},
{image_tiffW, image_tiff_filter},
{image_xpngW, image_xpng_filter},
/* {image_xbitmapW, image_xbitmap_filter}, */
{image_bmpW, image_bmp_filter},
/* {image_xjgW, image_xjg_filter}, */
/* {image_xemfW, image_xemf_filter}, */
/* {image_xwmfW, image_xwmf_filter}, */
{video_aviW, video_avi_filter},
{video_mpegW, video_mpeg_filter},
{app_postscriptW, application_postscript_filter},
/* {app_base64W, application_base64_filter}, */
/* {app_macbinhex40W, application_macbinhex40_filter}, */
{app_pdfW, application_pdf_filter},
/* {app_zcompressedW, application_xcompressed_filter}, */
{app_xzipW, application_xzip_filter},
{app_xgzipW, application_xgzip_filter},
{app_javaW, application_java_filter},
{app_xmsdownloadW, application_xmsdownload},
{text_plainW, text_plain_filter},
{app_octetstreamW, application_octet_stream_filter}
};
if(!buf || !size) {
if(!proposed_mime)
return E_FAIL;
len = strlenW(proposed_mime)+1;
*ret_mime = CoTaskMemAlloc(len*sizeof(WCHAR));
if(!*ret_mime)
return E_OUTOFMEMORY;
memcpy(*ret_mime, proposed_mime, len*sizeof(WCHAR));
return S_OK;
}
if(proposed_mime && strcmpW(proposed_mime, app_octetstreamW)) {
for(i=0; i < sizeof(mime_filters)/sizeof(*mime_filters); i++) {
if(!strcmpW(proposed_mime, mime_filters[i].mime))
break;
}
if(i == sizeof(mime_filters)/sizeof(*mime_filters) || mime_filters[i].filter(buf, size)) {
len = strlenW(proposed_mime)+1;
*ret_mime = CoTaskMemAlloc(len*sizeof(WCHAR));
if(!*ret_mime)
return E_OUTOFMEMORY;
memcpy(*ret_mime, proposed_mime, len*sizeof(WCHAR));
return S_OK;
}
}
i=0;
while(!ret) {
if(mime_filters[i].filter(buf, size))
ret = mime_filters[i].mime;
i++;
}
TRACE("found %s for %s\n", debugstr_w(ret), debugstr_an((const char*)buf, min(32, size)));
if(proposed_mime) {
if(i == sizeof(mime_filters)/sizeof(*mime_filters))
ret = proposed_mime;
/* text/html is a special case */
if(!strcmpW(proposed_mime, text_htmlW) && !strcmpW(ret, text_plainW))
ret = text_htmlW;
}
len = strlenW(ret)+1;
*ret_mime = CoTaskMemAlloc(len*sizeof(WCHAR));
if(!*ret_mime)
return E_OUTOFMEMORY;
memcpy(*ret_mime, ret, len*sizeof(WCHAR));
return S_OK;
}
/***********************************************************************
* FindMimeFromData (URLMON.@)
*
@@ -658,128 +779,8 @@ HRESULT WINAPI FindMimeFromData(LPBC pBC, LPCWSTR pwzUrl, LPVOID pBuffer,
if(!ppwzMimeOut || (!pwzUrl && !pBuffer))
return E_INVALIDARG;
if(pwzMimeProposed && (!pBuffer || (pBuffer && !cbSize))) {
DWORD len;
if(!pwzMimeProposed)
return E_FAIL;
len = strlenW(pwzMimeProposed)+1;
*ppwzMimeOut = CoTaskMemAlloc(len*sizeof(WCHAR));
memcpy(*ppwzMimeOut, pwzMimeProposed, len*sizeof(WCHAR));
return S_OK;
}
if(pBuffer) {
const BYTE *buf = pBuffer;
DWORD len;
LPCWSTR ret = NULL;
unsigned int i;
static const WCHAR wszTextHtml[] = {'t','e','x','t','/','h','t','m','l',0};
static const WCHAR wszTextRichtext[] = {'t','e','x','t','/','r','i','c','h','t','e','x','t',0};
static const WCHAR wszAudioBasic[] = {'a','u','d','i','o','/','b','a','s','i','c',0};
static const WCHAR wszAudioWav[] = {'a','u','d','i','o','/','w','a','v',0};
static const WCHAR wszImageGif[] = {'i','m','a','g','e','/','g','i','f',0};
static const WCHAR wszImagePjpeg[] = {'i','m','a','g','e','/','p','j','p','e','g',0};
static const WCHAR wszImageTiff[] = {'i','m','a','g','e','/','t','i','f','f',0};
static const WCHAR wszImageXPng[] = {'i','m','a','g','e','/','x','-','p','n','g',0};
static const WCHAR wszImageBmp[] = {'i','m','a','g','e','/','b','m','p',0};
static const WCHAR wszVideoAvi[] = {'v','i','d','e','o','/','a','v','i',0};
static const WCHAR wszVideoMpeg[] = {'v','i','d','e','o','/','m','p','e','g',0};
static const WCHAR wszAppPostscript[] =
{'a','p','p','l','i','c','a','t','i','o','n','/','p','o','s','t','s','c','r','i','p','t',0};
static const WCHAR wszAppPdf[] = {'a','p','p','l','i','c','a','t','i','o','n','/',
'p','d','f',0};
static const WCHAR wszAppXZip[] = {'a','p','p','l','i','c','a','t','i','o','n','/',
'x','-','z','i','p','-','c','o','m','p','r','e','s','s','e','d',0};
static const WCHAR wszAppXGzip[] = {'a','p','p','l','i','c','a','t','i','o','n','/',
'x','-','g','z','i','p','-','c','o','m','p','r','e','s','s','e','d',0};
static const WCHAR wszAppJava[] = {'a','p','p','l','i','c','a','t','i','o','n','/',
'j','a','v','a',0};
static const WCHAR wszAppXMSDownload[] = {'a','p','p','l','i','c','a','t','i','o','n','/',
'x','-','m','s','d','o','w','n','l','o','a','d',0};
static const WCHAR wszTextPlain[] = {'t','e','x','t','/','p','l','a','i','n','\0'};
static const WCHAR wszAppOctetStream[] = {'a','p','p','l','i','c','a','t','i','o','n','/',
'o','c','t','e','t','-','s','t','r','e','a','m','\0'};
static const struct {
LPCWSTR mime;
BOOL (*filter)(const BYTE *,DWORD);
} mime_filters[] = {
{wszTextHtml, text_html_filter},
{wszTextRichtext, text_richtext_filter},
/* {wszAudioXAiff, audio_xaiff_filter}, */
{wszAudioBasic, audio_basic_filter},
{wszAudioWav, audio_wav_filter},
{wszImageGif, image_gif_filter},
{wszImagePjpeg, image_pjpeg_filter},
{wszImageTiff, image_tiff_filter},
{wszImageXPng, image_xpng_filter},
/* {wszImageXBitmap, image_xbitmap_filter}, */
{wszImageBmp, image_bmp_filter},
/* {wszImageXJg, image_xjg_filter}, */
/* {wszImageXEmf, image_xemf_filter}, */
/* {wszImageXWmf, image_xwmf_filter}, */
{wszVideoAvi, video_avi_filter},
{wszVideoMpeg, video_mpeg_filter},
{wszAppPostscript, application_postscript_filter},
/* {wszAppBase64, application_base64_filter}, */
/* {wszAppMacbinhex40, application_macbinhex40_filter}, */
{wszAppPdf, application_pdf_filter},
/* {wszAppXCompressed, application_xcompressed_filter}, */
{wszAppXZip, application_xzip_filter},
{wszAppXGzip, application_xgzip_filter},
{wszAppJava, application_java_filter},
{wszAppXMSDownload, application_xmsdownload},
{wszTextPlain, text_plain_filter},
{wszAppOctetStream, application_octet_stream_filter}
};
if(!cbSize)
return E_FAIL;
if(pwzMimeProposed && strcmpW(pwzMimeProposed, wszAppOctetStream)) {
for(i=0; i < sizeof(mime_filters)/sizeof(*mime_filters); i++) {
if(!strcmpW(pwzMimeProposed, mime_filters[i].mime))
break;
}
if(i == sizeof(mime_filters)/sizeof(*mime_filters)
|| mime_filters[i].filter(buf, cbSize)) {
len = strlenW(pwzMimeProposed)+1;
*ppwzMimeOut = CoTaskMemAlloc(len*sizeof(WCHAR));
memcpy(*ppwzMimeOut, pwzMimeProposed, len*sizeof(WCHAR));
return S_OK;
}
}
i=0;
while(!ret) {
if(mime_filters[i].filter(buf, cbSize))
ret = mime_filters[i].mime;
i++;
}
TRACE("found %s for data\n"
"%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
debugstr_w(ret), buf[0],buf[1],buf[2],buf[3], buf[4],buf[5],buf[6],buf[7],
buf[8],buf[9],buf[10],buf[11], buf[12],buf[13],buf[14],buf[15]);
if(pwzMimeProposed) {
if(i == sizeof(mime_filters)/sizeof(*mime_filters))
ret = pwzMimeProposed;
/* text/html is a special case */
if(!strcmpW(pwzMimeProposed, wszTextHtml) && !strcmpW(ret, wszTextPlain))
ret = wszTextHtml;
}
len = strlenW(ret)+1;
*ppwzMimeOut = CoTaskMemAlloc(len*sizeof(WCHAR));
memcpy(*ppwzMimeOut, ret, len*sizeof(WCHAR));
return S_OK;
}
if(pwzMimeProposed || pBuffer)
return find_mime_from_buffer(pBuffer, cbSize, pwzMimeProposed, ppwzMimeOut);
if(pwzUrl) {
HKEY hkey;
+12 -6
View File
@@ -66,7 +66,7 @@ static inline void URLMON_UnlockModule(void) { InterlockedDecrement( &URLMON_ref
#define DEFINE_THIS(cls,ifc,iface) DEFINE_THIS2(cls,lp ## ifc ## Vtbl,iface)
IInternetProtocolInfo *get_protocol_info(LPCWSTR);
HRESULT get_protocol_handler(LPCWSTR,CLSID*,BOOL*,IClassFactory**);
HRESULT get_protocol_handler(IUri*,CLSID*,BOOL*,IClassFactory**);
IInternetProtocol *get_mime_filter(LPCWSTR);
BOOL is_registered_protocol(LPCWSTR);
void register_urlmon_namespace(IClassFactory*,REFIID,LPCWSTR,BOOL);
@@ -74,12 +74,14 @@ HINTERNET get_internet_session(IInternetBindInfo*);
LPWSTR get_useragent(void);
void free_session(void);
HRESULT bind_to_storage(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv);
HRESULT bind_to_object(IMoniker *mon, LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv);
HRESULT bind_to_storage(IUri*,IBindCtx*,REFIID,void**);
HRESULT bind_to_object(IMoniker*,IUri*,IBindCtx*,REFIID,void**ppv);
HRESULT create_binding_protocol(LPCWSTR url, BOOL from_urlmon, IInternetProtocol **protocol);
void set_binding_sink(IInternetProtocol *bind_protocol, IInternetProtocolSink *sink, IInternetBindInfo *bind_info);
IWinInetInfo *get_wininet_info(IInternetProtocol*);
HRESULT create_binding_protocol(BOOL,IInternetProtocolEx**);
void set_binding_sink(IInternetProtocolEx*,IInternetProtocolSink*,IInternetBindInfo*);
IWinInetInfo *get_wininet_info(IInternetProtocolEx*);
HRESULT create_default_callback(IBindStatusCallback**);
HRESULT wrap_callback(IBindStatusCallback*,IBindStatusCallback**);
typedef struct ProtocolVtbl ProtocolVtbl;
@@ -101,11 +103,14 @@ typedef struct {
ULONG content_length;
ULONG available_bytes;
IStream *post_stream;
LONG priority;
} Protocol;
struct ProtocolVtbl {
HRESULT (*open_request)(Protocol*,IUri*,DWORD,HINTERNET,IInternetBindInfo*);
HRESULT (*end_request)(Protocol*);
HRESULT (*start_downloading)(Protocol*);
void (*close_connection)(Protocol*);
};
@@ -115,6 +120,7 @@ HRESULT protocol_continue(Protocol*,PROTOCOLDATA*);
HRESULT protocol_read(Protocol*,void*,ULONG,ULONG*);
HRESULT protocol_lock_request(Protocol*);
HRESULT protocol_unlock_request(Protocol*);
HRESULT protocol_abort(Protocol*,HRESULT);
void protocol_close_connection(Protocol*);
typedef struct {