From e40f814be034a2bc9891691accfccb2ebab6ddab Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 23 Jan 2007 19:33:30 +0100 Subject: [PATCH] urlmon: Added IInternetSession::CreateBinding beginning implementation. --- dlls/urlmon/Makefile.in | 1 + dlls/urlmon/bindprot.c | 254 ++++++++++++++++++++++++++++++++++++++ dlls/urlmon/session.c | 8 +- dlls/urlmon/urlmon_main.h | 2 + 4 files changed, 263 insertions(+), 2 deletions(-) create mode 100644 dlls/urlmon/bindprot.c diff --git a/dlls/urlmon/Makefile.in b/dlls/urlmon/Makefile.in index 488114ae962..fd120228c11 100644 --- a/dlls/urlmon/Makefile.in +++ b/dlls/urlmon/Makefile.in @@ -9,6 +9,7 @@ EXTRALIBS = -luuid C_SRCS = \ binding.c \ + bindprot.c \ file.c \ format.c \ ftp.c \ diff --git a/dlls/urlmon/bindprot.c b/dlls/urlmon/bindprot.c new file mode 100644 index 00000000000..9d086716022 --- /dev/null +++ b/dlls/urlmon/bindprot.c @@ -0,0 +1,254 @@ +/* + * Copyright 2007 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "ole2.h" +#include "urlmon.h" +#include "urlmon_main.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(urlmon); + +typedef struct { + const IInternetProtocolVtbl *lpInternetProtocolVtbl; + const IInternetBindInfoVtbl *lpInternetBindInfoVtbl; + + LONG ref; +} BindProtocol; + +#define PROTOCOL(x) ((IInternetProtocol*) &(x)->lpInternetProtocolVtbl) +#define BINDINFO(x) ((IInternetBindInfo*) &(x)->lpInternetBindInfoVtbl) + +#define PROTOCOL_THIS(iface) DEFINE_THIS(BindProtocol, InternetProtocol, iface) + +static HRESULT WINAPI BindProtocol_QueryInterface(IInternetProtocol *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); + }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) { + TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv); + *ppv = PROTOCOL(This); + }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) { + TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv); + *ppv = PROTOCOL(This); + }else if(IsEqualGUID(&IID_IInternetBindInfo, riid)) { + TRACE("(%p)->(IID_IInternetBindInfo %p)\n", This, ppv); + *ppv = BINDINFO(This); + } + + if(*ppv) { + IInternetProtocol_AddRef(iface); + return S_OK; + } + + WARN("not supported interface %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI BindProtocol_AddRef(IInternetProtocol *iface) +{ + BindProtocol *This = PROTOCOL_THIS(iface); + LONG ref = InterlockedIncrement(&This->ref); + TRACE("(%p) ref=%d\n", This, ref); + return ref; +} + +static ULONG WINAPI BindProtocol_Release(IInternetProtocol *iface) +{ + BindProtocol *This = PROTOCOL_THIS(iface); + LONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + if(!ref) { + HeapFree(GetProcessHeap(), 0, This); + + URLMON_UnlockModule(); + } + + return ref; +} + +static HRESULT WINAPI BindProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, + IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, + DWORD grfPI, DWORD dwReserved) +{ + BindProtocol *This = PROTOCOL_THIS(iface); + + FIXME("(%p)->(%s %p %p %08x %d)\n", This, debugstr_w(szUrl), pOIProtSink, + pOIBindInfo, grfPI, dwReserved); + + if(!szUrl || !pOIProtSink || !pOIBindInfo) + return E_INVALIDARG; + + return E_NOTIMPL; +} + +static HRESULT WINAPI BindProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData) +{ + BindProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%p)\n", This, pProtocolData); + return E_NOTIMPL; +} + +static HRESULT WINAPI BindProtocol_Abort(IInternetProtocol *iface, HRESULT hrReason, + DWORD dwOptions) +{ + BindProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%08x %08x)\n", This, hrReason, dwOptions); + return E_NOTIMPL; +} + +static HRESULT WINAPI BindProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions) +{ + BindProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%08x)\n", This, dwOptions); + return E_NOTIMPL; +} + +static HRESULT WINAPI BindProtocol_Suspend(IInternetProtocol *iface) +{ + BindProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI BindProtocol_Resume(IInternetProtocol *iface) +{ + BindProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI BindProtocol_Read(IInternetProtocol *iface, void *pv, + ULONG cb, ULONG *pcbRead) +{ + BindProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead); + return E_NOTIMPL; +} + +static HRESULT WINAPI BindProtocol_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove, + DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition) +{ + BindProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%d %d %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition); + return E_NOTIMPL; +} + +static HRESULT WINAPI BindProtocol_LockRequest(IInternetProtocol *iface, DWORD dwOptions) +{ + BindProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%08x)\n", This, dwOptions); + return E_NOTIMPL; +} + +static HRESULT WINAPI BindProtocol_UnlockRequest(IInternetProtocol *iface) +{ + BindProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +#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 BINDINFO_THIS(iface) DEFINE_THIS(BindProtocol, InternetBindInfo, iface) + +static HRESULT WINAPI BindInfo_QueryInterface(IInternetBindInfo *iface, + REFIID riid, void **ppv) +{ + BindProtocol *This = BINDINFO_THIS(iface); + return IInternetProtocol_QueryInterface(PROTOCOL(This), riid, ppv); +} + +static ULONG WINAPI BindInfo_AddRef(IInternetBindInfo *iface) +{ + BindProtocol *This = BINDINFO_THIS(iface); + return IBinding_AddRef(PROTOCOL(This)); +} + +static ULONG WINAPI BindInfo_Release(IInternetBindInfo *iface) +{ + BindProtocol *This = BINDINFO_THIS(iface); + return IBinding_Release(PROTOCOL(This)); +} + +static HRESULT WINAPI BindInfo_GetBindInfo(IInternetBindInfo *iface, + DWORD *grfBINDF, BINDINFO *pbindinfo) +{ + BindProtocol *This = BINDINFO_THIS(iface); + FIXME("(%p)->(%p %p)\n", This, grfBINDF, pbindinfo); + return E_NOTIMPL; +} + +static HRESULT WINAPI BindInfo_GetBindString(IInternetBindInfo *iface, + ULONG ulStringType, LPOLESTR *ppwzStr, ULONG cEl, ULONG *pcElFetched) +{ + BindProtocol *This = BINDINFO_THIS(iface); + FIXME("(%p)->(%d %p %d %p)\n", This, ulStringType, ppwzStr, cEl, pcElFetched); + return E_NOTIMPL; +} + +#undef BINDFO_THIS + +static const IInternetBindInfoVtbl InternetBindInfoVtbl = { + BindInfo_QueryInterface, + BindInfo_AddRef, + BindInfo_Release, + BindInfo_GetBindInfo, + BindInfo_GetBindString +}; + +HRESULT create_binding_protocol(LPCWSTR url, IInternetProtocol **protocol) +{ + BindProtocol *ret = HeapAlloc(GetProcessHeap(), 0, sizeof(BindProtocol)); + + ret->lpInternetProtocolVtbl = &BindProtocolVtbl; + ret->lpInternetBindInfoVtbl = &InternetBindInfoVtbl; + ret->ref = 1; + + *protocol = PROTOCOL(ret); + return S_OK; +} diff --git a/dlls/urlmon/session.c b/dlls/urlmon/session.c index ed87d27642d..a9eb2924d12 100644 --- a/dlls/urlmon/session.c +++ b/dlls/urlmon/session.c @@ -268,9 +268,13 @@ static HRESULT WINAPI InternetSession_CreateBinding(IInternetSession *iface, LPBC pBC, LPCWSTR szUrl, IUnknown *pUnkOuter, IUnknown **ppUnk, IInternetProtocol **ppOInetProt, DWORD dwOption) { - FIXME("(%p %s %p %p %p %08x)\n", pBC, debugstr_w(szUrl), pUnkOuter, ppUnk, + TRACE("(%p %s %p %p %p %08x)\n", pBC, debugstr_w(szUrl), pUnkOuter, ppUnk, ppOInetProt, dwOption); - return E_NOTIMPL; + + if(pBC || pUnkOuter || ppUnk || dwOption) + FIXME("Unsupported arguments\n"); + + return create_binding_protocol(szUrl, ppOInetProt); } static HRESULT WINAPI InternetSession_SetSessionOption(IInternetSession *iface, diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h index c3af9eac88f..bc48062e54a 100644 --- a/dlls/urlmon/urlmon_main.h +++ b/dlls/urlmon/urlmon_main.h @@ -60,4 +60,6 @@ HRESULT get_protocol_handler(LPCWSTR url, IClassFactory **ret); HRESULT start_binding(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv); +HRESULT create_binding_protocol(LPCWSTR url, IInternetProtocol **protocol); + #endif /* __WINE_URLMON_MAIN_H */