Robert Shearman : ole32: Implement IMarshal for composite monikers.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon May 8 09:06:10 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 9e799f2054fc924f596d69ae091b3cf386d0a5bc
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=9e799f2054fc924f596d69ae091b3cf386d0a5bc
Author: Robert Shearman <rob at codeweavers.com>
Date: Mon May 8 12:38:55 2006 +0100
ole32: Implement IMarshal for composite monikers.
---
dlls/ole32/compositemoniker.c | 195 +++++++++++++++++++++++++++++++++++++++++
1 files changed, 195 insertions(+), 0 deletions(-)
diff --git a/dlls/ole32/compositemoniker.c b/dlls/ole32/compositemoniker.c
index 5096d0d..2673fda 100644
--- a/dlls/ole32/compositemoniker.c
+++ b/dlls/ole32/compositemoniker.c
@@ -54,6 +54,8 @@ typedef struct CompositeMonikerImpl{
*/
const IROTDataVtbl* lpvtbl2; /* VTable relative to the IROTData interface.*/
+ const IMarshalVtbl* lpvtblMarshal; /* VTable relative to the IMarshal interface.*/
+
LONG ref; /* reference counter for this object */
IMoniker** tabMoniker; /* dynamaic table containing all components (monikers) of this composite moniker */
@@ -85,6 +87,11 @@ static inline IMoniker *impl_from_IROTDa
return (IMoniker *)((char*)iface - FIELD_OFFSET(CompositeMonikerImpl, lpvtbl2));
}
+static inline IMoniker *impl_from_IMarshal( IMarshal *iface )
+{
+ return (IMoniker *)((char*)iface - FIELD_OFFSET(CompositeMonikerImpl, lpvtblMarshal));
+}
+
static HRESULT EnumMonikerImpl_CreateEnumMoniker(IMoniker** tabMoniker,ULONG tabSize,ULONG currentPos,BOOL leftToRigth,IEnumMoniker ** ppmk);
/*******************************************************************************
@@ -113,6 +120,8 @@ CompositeMonikerImpl_QueryInterface(IMon
*ppvObject = iface;
else if (IsEqualIID(&IID_IROTData, riid))
*ppvObject = (IROTData*)&(This->lpvtbl2);
+ else if (IsEqualIID(&IID_IMarshal, riid))
+ *ppvObject = (IROTData*)&(This->lpvtblMarshal);
/* Check that we obtained an interface.*/
if ((*ppvObject)==0)
@@ -1307,6 +1316,178 @@ CompositeMonikerROTDataImpl_GetCompariso
return S_OK;
}
+static HRESULT WINAPI CompositeMonikerMarshalImpl_QueryInterface(IMarshal *iface, REFIID riid, LPVOID *ppv)
+{
+ IMoniker *This = impl_from_IMarshal(iface);
+
+ TRACE("(%p,%s,%p)\n",iface,debugstr_guid(riid),ppv);
+
+ return CompositeMonikerImpl_QueryInterface(This, riid, ppv);
+}
+
+static ULONG WINAPI CompositeMonikerMarshalImpl_AddRef(IMarshal *iface)
+{
+ IMoniker *This = impl_from_IMarshal(iface);
+
+ TRACE("(%p)\n",iface);
+
+ return CompositeMonikerImpl_AddRef(This);
+}
+
+static ULONG WINAPI CompositeMonikerMarshalImpl_Release(IMarshal *iface)
+{
+ IMoniker *This = impl_from_IMarshal(iface);
+
+ TRACE("(%p)\n",iface);
+
+ return CompositeMonikerImpl_Release(This);
+}
+
+static HRESULT WINAPI CompositeMonikerMarshalImpl_GetUnmarshalClass(
+ LPMARSHAL iface, REFIID riid, void* pv, DWORD dwDestContext,
+ void* pvDestContext, DWORD mshlflags, CLSID* pCid)
+{
+ IMoniker *This = impl_from_IMarshal(iface);
+
+ TRACE("(%s, %p, %lx, %p, %lx, %p)\n", debugstr_guid(riid), pv,
+ dwDestContext, pvDestContext, mshlflags, pCid);
+
+ return IMoniker_GetClassID(This, pCid);
+}
+
+static HRESULT WINAPI CompositeMonikerMarshalImpl_GetMarshalSizeMax(
+ LPMARSHAL iface, REFIID riid, void* pv, DWORD dwDestContext,
+ void* pvDestContext, DWORD mshlflags, DWORD* pSize)
+{
+ IMoniker *This = impl_from_IMarshal(iface);
+ IEnumMoniker *pEnumMk;
+ IMoniker *pmk;
+ HRESULT hr;
+ ULARGE_INTEGER size;
+
+ TRACE("(%s, %p, %lx, %p, %lx, %p)\n", debugstr_guid(riid), pv,
+ dwDestContext, pvDestContext, mshlflags, pSize);
+
+ *pSize = 0;
+
+ hr = IMoniker_Enum(This, TRUE, &pEnumMk);
+ if (FAILED(hr)) return hr;
+
+ hr = IMoniker_GetSizeMax(This, &size);
+
+ while (IEnumMoniker_Next(pEnumMk, 1, &pmk, NULL) == S_OK)
+ {
+ ULONG size;
+
+ hr = CoGetMarshalSizeMax(&size, &IID_IMoniker, (IUnknown *)pmk, dwDestContext, pvDestContext, mshlflags);
+ if (SUCCEEDED(hr))
+ *pSize += size;
+
+ IMoniker_Release(pmk);
+
+ if (FAILED(hr))
+ {
+ IEnumMoniker_Release(pEnumMk);
+ return hr;
+ }
+ }
+
+ IEnumMoniker_Release(pEnumMk);
+
+ return S_OK;
+}
+
+static HRESULT WINAPI CompositeMonikerMarshalImpl_MarshalInterface(LPMARSHAL iface, IStream *pStm,
+ REFIID riid, void* pv, DWORD dwDestContext,
+ void* pvDestContext, DWORD mshlflags)
+{
+ IMoniker *This = impl_from_IMarshal(iface);
+ IEnumMoniker *pEnumMk;
+ IMoniker *pmk;
+ HRESULT hr;
+ ULONG i = 0;
+
+ TRACE("(%p, %s, %p, %lx, %p, %lx)\n", pStm, debugstr_guid(riid), pv,
+ dwDestContext, pvDestContext, mshlflags);
+
+ hr = IMoniker_Enum(This, TRUE, &pEnumMk);
+ if (FAILED(hr)) return hr;
+
+ while (IEnumMoniker_Next(pEnumMk, 1, &pmk, NULL) == S_OK)
+ {
+ hr = CoMarshalInterface(pStm, &IID_IMoniker, (IUnknown *)pmk, dwDestContext, pvDestContext, mshlflags);
+
+ IMoniker_Release(pmk);
+
+ if (FAILED(hr))
+ {
+ IEnumMoniker_Release(pEnumMk);
+ return hr;
+ }
+ i++;
+ }
+
+ if (i != 2)
+ FIXME("moniker count of %ld not supported\n", i);
+
+ IEnumMoniker_Release(pEnumMk);
+
+ return S_OK;
+}
+
+static HRESULT WINAPI CompositeMonikerMarshalImpl_UnmarshalInterface(LPMARSHAL iface, IStream *pStm, REFIID riid, void **ppv)
+{
+ CompositeMonikerImpl *This = (CompositeMonikerImpl *)impl_from_IMarshal(iface);
+ HRESULT hr;
+
+ TRACE("(%p, %s, %p)\n", pStm, debugstr_guid(riid), ppv);
+
+ CompositeMonikerImpl_ReleaseMonikersInTable(This);
+
+ /* resize the table if needed */
+ if (This->tabLastIndex + 2 > This->tabSize)
+ {
+ This->tabSize += max(BLOCK_TAB_SIZE, 2);
+ This->tabMoniker=HeapReAlloc(GetProcessHeap(),0,This->tabMoniker,This->tabSize*sizeof(IMoniker));
+
+ if (This->tabMoniker==NULL)
+ return E_OUTOFMEMORY;
+ }
+
+ hr = CoUnmarshalInterface(pStm, &IID_IMoniker, (void**)&This->tabMoniker[This->tabLastIndex]);
+ if (FAILED(hr))
+ {
+ ERR("couldn't unmarshal moniker, hr = 0x%08lx\n", hr);
+ return hr;
+ }
+ This->tabLastIndex++;
+ hr = CoUnmarshalInterface(pStm, &IID_IMoniker, (void**)&This->tabMoniker[This->tabLastIndex]);
+ if (FAILED(hr))
+ {
+ ERR("couldn't unmarshal moniker, hr = 0x%08lx\n", hr);
+ return hr;
+ }
+ This->tabLastIndex++;
+
+ return IMoniker_QueryInterface((IMoniker *)&This->lpvtbl1, riid, ppv);
+}
+
+static HRESULT WINAPI CompositeMonikerMarshalImpl_ReleaseMarshalData(LPMARSHAL iface, IStream *pStm)
+{
+ TRACE("(%p)\n", pStm);
+ /* can't release a state-based marshal as nothing on server side to
+ * release */
+ return S_OK;
+}
+
+static HRESULT WINAPI CompositeMonikerMarshalImpl_DisconnectObject(LPMARSHAL iface, DWORD dwReserved)
+{
+ TRACE("(0x%lx)\n", dwReserved);
+ /* can't disconnect a state-based marshal as nothing on server side to
+ * disconnect from */
+ return S_OK;
+}
+
/******************************************************************************
* EnumMonikerImpl_QueryInterface
******************************************************************************/
@@ -1548,6 +1729,19 @@ static const IROTDataVtbl VT_ROTDataImpl
CompositeMonikerROTDataImpl_GetComparisonData
};
+static const IMarshalVtbl VT_MarshalImpl =
+{
+ CompositeMonikerMarshalImpl_QueryInterface,
+ CompositeMonikerMarshalImpl_AddRef,
+ CompositeMonikerMarshalImpl_Release,
+ CompositeMonikerMarshalImpl_GetUnmarshalClass,
+ CompositeMonikerMarshalImpl_GetMarshalSizeMax,
+ CompositeMonikerMarshalImpl_MarshalInterface,
+ CompositeMonikerMarshalImpl_UnmarshalInterface,
+ CompositeMonikerMarshalImpl_ReleaseMarshalData,
+ CompositeMonikerMarshalImpl_DisconnectObject
+};
+
/******************************************************************************
* Composite-Moniker_Construct (local function)
*******************************************************************************/
@@ -1565,6 +1759,7 @@ CompositeMonikerImpl_Construct(Composite
/* Initialize the virtual function table. */
This->lpvtbl1 = &VT_CompositeMonikerImpl;
This->lpvtbl2 = &VT_ROTDataImpl;
+ This->lpvtblMarshal= &VT_MarshalImpl;
This->ref = 0;
This->tabSize=BLOCK_TAB_SIZE;
More information about the wine-cvs
mailing list