mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 04:13:34 +00:00
[URLMON]
- Sync to Wine 1.3.9 svn path=/trunk/; revision=50074
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
+1542
-244
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user