MSHTML: Added support for aggregation to res protocol
Jacek Caban
jack at itma.pwr.wroc.pl
Sun Aug 14 15:12:04 CDT 2005
Changelog:
- Added support for aggregation to res protocol
- Fix AboutProtocol_Release
- Use *_THIS macros in protocol objects
-------------- next part --------------
Index: dlls/mshtml/protocol.c
===================================================================
RCS file: /home/wine/wine/dlls/mshtml/protocol.c,v
retrieving revision 1.10
diff -u -p -r1.10 protocol.c
--- dlls/mshtml/protocol.c 11 Aug 2005 17:04:45 -0000 1.10
+++ dlls/mshtml/protocol.c 14 Aug 2005 20:05:40 -0000
@@ -145,9 +145,11 @@ typedef struct {
IUnknown *pUnkOuter;
} AboutProtocol;
+#define PROTOCOL_THIS(iface) DEFINE_THIS(AboutProtocol, InternetProtocol, iface)
+
static HRESULT WINAPI AboutProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv)
{
- AboutProtocol *This = (AboutProtocol*)iface;
+ AboutProtocol *This = PROTOCOL_THIS(iface);
*ppv = NULL;
@@ -178,7 +180,7 @@ static HRESULT WINAPI AboutProtocol_Quer
static ULONG WINAPI AboutProtocol_AddRef(IInternetProtocol *iface)
{
- AboutProtocol *This = (AboutProtocol*)iface;
+ AboutProtocol *This = PROTOCOL_THIS(iface);
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%ld\n", iface, ref);
return This->pUnkOuter ? IUnknown_AddRef(This->pUnkOuter) : ref;
@@ -186,7 +188,8 @@ static ULONG WINAPI AboutProtocol_AddRef
static ULONG WINAPI AboutProtocol_Release(IInternetProtocol *iface)
{
- AboutProtocol *This = (AboutProtocol*)iface;
+ AboutProtocol *This = PROTOCOL_THIS(iface);
+ IUnknown *pUnkOuter = This->pUnkOuter;
ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%lx\n", iface, ref);
@@ -197,14 +200,14 @@ static ULONG WINAPI AboutProtocol_Releas
UNLOCK_MODULE();
}
- return This->pUnkOuter ? IUnknown_Release(This->pUnkOuter) : ref;
+ return pUnkOuter ? IUnknown_Release(pUnkOuter) : ref;
}
static HRESULT WINAPI AboutProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl,
IInternetProtocolSink* pOIProtSink, IInternetBindInfo* pOIBindInfo,
DWORD grfPI, DWORD dwReserved)
{
- AboutProtocol *This = (AboutProtocol*)iface;
+ AboutProtocol *This = PROTOCOL_THIS(iface);
BINDINFO bindinfo;
DWORD grfBINDF = 0;
LPCWSTR text = NULL;
@@ -259,7 +262,7 @@ static HRESULT WINAPI AboutProtocol_Star
static HRESULT WINAPI AboutProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA* pProtocolData)
{
- AboutProtocol *This = (AboutProtocol*)iface;
+ AboutProtocol *This = PROTOCOL_THIS(iface);
FIXME("(%p)->(%p)\n", This, pProtocolData);
return E_NOTIMPL;
}
@@ -267,35 +270,35 @@ static HRESULT WINAPI AboutProtocol_Cont
static HRESULT WINAPI AboutProtocol_Abort(IInternetProtocol *iface, HRESULT hrReason,
DWORD dwOptions)
{
- AboutProtocol *This = (AboutProtocol*)iface;
+ AboutProtocol *This = PROTOCOL_THIS(iface);
FIXME("(%p)->(%08lx %08lx)\n", This, hrReason, dwOptions);
return E_NOTIMPL;
}
static HRESULT WINAPI AboutProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions)
{
- AboutProtocol *This = (AboutProtocol*)iface;
+ AboutProtocol *This = PROTOCOL_THIS(iface);
TRACE("(%p)->(%08lx)\n", This, dwOptions);
return S_OK;
}
static HRESULT WINAPI AboutProtocol_Suspend(IInternetProtocol *iface)
{
- AboutProtocol *This = (AboutProtocol*)iface;
+ AboutProtocol *This = PROTOCOL_THIS(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI AboutProtocol_Resume(IInternetProtocol *iface)
{
- AboutProtocol *This = (AboutProtocol*)iface;
+ AboutProtocol *This = PROTOCOL_THIS(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI AboutProtocol_Read(IInternetProtocol *iface, void* pv, ULONG cb, ULONG* pcbRead)
{
- AboutProtocol *This = (AboutProtocol*)iface;
+ AboutProtocol *This = PROTOCOL_THIS(iface);
TRACE("(%p)->(%p %lu %p)\n", This, pv, cb, pcbRead);
@@ -316,14 +319,14 @@ static HRESULT WINAPI AboutProtocol_Read
static HRESULT WINAPI AboutProtocol_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove,
DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition)
{
- AboutProtocol *This = (AboutProtocol*)iface;
+ AboutProtocol *This = PROTOCOL_THIS(iface);
FIXME("(%p)->(%ld %ld %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition);
return E_NOTIMPL;
}
static HRESULT WINAPI AboutProtocol_LockRequest(IInternetProtocol *iface, DWORD dwOptions)
{
- AboutProtocol *This = (AboutProtocol*)iface;
+ AboutProtocol *This = PROTOCOL_THIS(iface);
TRACE("(%p)->(%ld)\n", This, dwOptions);
@@ -332,13 +335,15 @@ static HRESULT WINAPI AboutProtocol_Lock
static HRESULT WINAPI AboutProtocol_UnlockRequest(IInternetProtocol *iface)
{
- AboutProtocol *This = (AboutProtocol*)iface;
+ AboutProtocol *This = PROTOCOL_THIS(iface);
TRACE("(%p)\n", This);
return S_OK;
}
+#undef PROTOCOL_THIS
+
static const IInternetProtocolVtbl AboutProtocolVtbl = {
AboutProtocol_QueryInterface,
AboutProtocol_AddRef,
@@ -458,21 +463,29 @@ typedef struct {
BYTE *data;
ULONG data_len;
ULONG cur;
+
+ IUnknown *pUnkOuter;
} ResProtocol;
+#define PROTOCOL_THIS(iface) DEFINE_THIS(ResProtocol, InternetProtocol, iface)
+
static HRESULT WINAPI ResProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv)
{
+ ResProtocol *This = PROTOCOL_THIS(iface);
+
*ppv = NULL;
if(IsEqualGUID(&IID_IUnknown, riid)) {
TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv);
- *ppv = iface;
+ if(This->pUnkOuter)
+ return IUnknown_QueryInterface(This->pUnkOuter, &IID_IUnknown, ppv);
+ *ppv = PROTOCOL(This);
}else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) {
TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", iface, ppv);
- *ppv = iface;
+ *ppv = PROTOCOL(This);
}else if(IsEqualGUID(&IID_IInternetProtocol, riid)) {
TRACE("(%p)->(IID_IInternetProtocol %p)\n", iface, ppv);
- *ppv = iface;
+ *ppv = PROTOCOL(This);
}else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
FIXME("IServiceProvider is not implemented\n");
return E_NOINTERFACE;
@@ -489,15 +502,16 @@ static HRESULT WINAPI ResProtocol_QueryI
static ULONG WINAPI ResProtocol_AddRef(IInternetProtocol *iface)
{
- ResProtocol *This = (ResProtocol*)iface;
+ ResProtocol *This = PROTOCOL_THIS(iface);
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%ld\n", iface, ref);
- return ref;
+ return This->pUnkOuter ? IUnknown_AddRef(This->pUnkOuter) : ref;
}
static ULONG WINAPI ResProtocol_Release(IInternetProtocol *iface)
{
ResProtocol *This = (ResProtocol*)iface;
+ IUnknown *pUnkOuter = This->pUnkOuter;
ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%lx\n", iface, ref);
@@ -508,14 +522,14 @@ static ULONG WINAPI ResProtocol_Release(
UNLOCK_MODULE();
}
- return ref;
+ return pUnkOuter ? IUnknown_Release(pUnkOuter) : ref;
}
static HRESULT WINAPI ResProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl,
IInternetProtocolSink* pOIProtSink, IInternetBindInfo* pOIBindInfo,
DWORD grfPI, DWORD dwReserved)
{
- ResProtocol *This = (ResProtocol*)iface;
+ ResProtocol *This = PROTOCOL_THIS(iface);
DWORD grfBINDF = 0;
BINDINFO bindinfo;
int len;
@@ -592,7 +606,7 @@ static HRESULT WINAPI ResProtocol_Start(
static HRESULT WINAPI ResProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA* pProtocolData)
{
- ResProtocol *This = (ResProtocol*)iface;
+ ResProtocol *This = PROTOCOL_THIS(iface);
FIXME("(%p)->(%p)\n", This, pProtocolData);
return E_NOTIMPL;
}
@@ -600,14 +614,14 @@ static HRESULT WINAPI ResProtocol_Contin
static HRESULT WINAPI ResProtocol_Abort(IInternetProtocol *iface, HRESULT hrReason,
DWORD dwOptions)
{
- ResProtocol *This = (ResProtocol*)iface;
+ ResProtocol *This = PROTOCOL_THIS(iface);
FIXME("(%p)->(%08lx %08lx)\n", This, hrReason, dwOptions);
return E_NOTIMPL;
}
static HRESULT WINAPI ResProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions)
{
- ResProtocol *This = (ResProtocol*)iface;
+ ResProtocol *This = PROTOCOL_THIS(iface);
TRACE("(%p)->(%08lx)\n", This, dwOptions);
@@ -617,21 +631,21 @@ static HRESULT WINAPI ResProtocol_Termin
static HRESULT WINAPI ResProtocol_Suspend(IInternetProtocol *iface)
{
- ResProtocol *This = (ResProtocol*)iface;
+ ResProtocol *This = PROTOCOL_THIS(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI ResProtocol_Resume(IInternetProtocol *iface)
{
- ResProtocol *This = (ResProtocol*)iface;
+ ResProtocol *This = PROTOCOL_THIS(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI ResProtocol_Read(IInternetProtocol *iface, void* pv, ULONG cb, ULONG* pcbRead)
{
- ResProtocol *This = (ResProtocol*)iface;
+ ResProtocol *This = PROTOCOL_THIS(iface);
TRACE("(%p)->(%p %lu %p)\n", This, pv, cb, pcbRead);
@@ -652,14 +666,14 @@ static HRESULT WINAPI ResProtocol_Read(I
static HRESULT WINAPI ResProtocol_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove,
DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition)
{
- ResProtocol *This = (ResProtocol*)iface;
+ ResProtocol *This = PROTOCOL_THIS(iface);
FIXME("(%p)->(%ld %ld %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition);
return E_NOTIMPL;
}
static HRESULT WINAPI ResProtocol_LockRequest(IInternetProtocol *iface, DWORD dwOptions)
{
- ResProtocol *This = (ResProtocol*)iface;
+ ResProtocol *This = PROTOCOL_THIS(iface);
TRACE("(%p)->(%ld)\n", This, dwOptions);
@@ -669,7 +683,7 @@ static HRESULT WINAPI ResProtocol_LockRe
static HRESULT WINAPI ResProtocol_UnlockRequest(IInternetProtocol *iface)
{
- ResProtocol *This = (ResProtocol*)iface;
+ ResProtocol *This = PROTOCOL_THIS(iface);
TRACE("(%p)\n", This);
@@ -677,6 +691,8 @@ static HRESULT WINAPI ResProtocol_Unlock
return S_OK;
}
+#undef PROTOCOL_THIS
+
static const IInternetProtocolVtbl ResProtocolVtbl = {
ResProtocol_QueryInterface,
ResProtocol_AddRef,
@@ -697,7 +713,7 @@ static HRESULT WINAPI ResProtocolFactory
REFIID riid, void **ppv)
{
ResProtocol *ret;
- HRESULT hres;
+ HRESULT hres = S_OK;
TRACE("(%p)->(%p %s %p)\n", iface, pUnkOuter, debugstr_guid(riid), ppv);
@@ -707,8 +723,17 @@ static HRESULT WINAPI ResProtocolFactory
ret->data = NULL;
ret->data_len = 0;
ret->cur = 0;
+ ret->pUnkOuter = pUnkOuter;
- hres = IUnknown_QueryInterface((IUnknown*)ret, riid, ppv);
+ if(pUnkOuter) {
+ ret->ref = 1;
+ if(IsEqualGUID(&IID_IUnknown, riid))
+ *ppv = PROTOCOL(ret);
+ else
+ hres = E_FAIL;
+ }else {
+ hres = IInternetProtocol_QueryInterface(PROTOCOL(ret), riid, ppv);
+ }
if(SUCCEEDED(hres))
LOCK_MODULE();
More information about the wine-patches
mailing list