static HRESULT WINAPI FTMarshalImpl_MarshalInterface (LPMARSHAL iface, IStream * pStm, REFIID riid, void *pv, DWORD dwDestContext, void *pvDestContext, DWORD mshlflags) { IMarshal *pMarshal = NULL; HRESULT hres; TRACE("(%p, %s, %p, 0x%x, %p, 0x%x)\n", pStm, debugstr_guid(riid), pv, dwDestContext, pvDestContext, mshlflags); /* if the marshalling happens inside the same process the interface pointer is copied between the apartments */ if (dwDestContext == MSHCTX_INPROC || dwDestContext == MSHCTX_CROSSCTX) { void *object; DWORD constant = 0; GUID unknown_guid = { 0 }; hres = IUnknown_QueryInterface((IUnknown *)pv, riid, &object); if (FAILED(hres)) return hres; /* don't hold a reference to table-weak marshaled interfaces */ if (mshlflags & MSHLFLAGS_TABLEWEAK) IUnknown_Release((IUnknown *)object); hres = IStream_Write (pStm, &mshlflags, sizeof (mshlflags), NULL); if (hres != S_OK) return STG_E_MEDIUMFULL; hres = IStream_Write (pStm, &object, sizeof (object), NULL); if (hres != S_OK) return STG_E_MEDIUMFULL; if (sizeof(object) == sizeof(DWORD)) { hres = IStream_Write (pStm, &constant, sizeof (constant), NULL); if (hres != S_OK) return STG_E_MEDIUMFULL; } hres = IStream_Write (pStm, &unknown_guid, sizeof (unknown_guid), NULL); if (hres != S_OK) return STG_E_MEDIUMFULL; return S_OK; } /* use the standard marshaler to handle all other cases */ CoGetStandardMarshal (riid, pv, dwDestContext, pvDestContext, mshlflags, &pMarshal); hres = IMarshal_MarshalInterface (pMarshal, pStm, riid, pv, dwDestContext, pvDestContext, mshlflags); IMarshal_Release (pMarshal); return hres; }
HRESULT __RPC_STUB IBindResource_Bind_Stub(IBindResource* This, IUnknown *pUnkOuter, LPCOLESTR pwszURL, DBBINDURLFLAG dwBindURLFlags, REFGUID rguid, REFIID riid, IAuthenticate *pAuthenticate, IUnknown *pSessionUnkOuter, IID *piid, IUnknown **ppSession, DBBINDURLSTATUS *pdwBindStatus, IUnknown **ppUnk) { HRESULT hr; DBIMPLICITSESSION impl_session; IWineRowServer *server; IMarshal *marshal; IUnknown *obj; TRACE("(%p, %p, %s, %08x, %s, %s, %p, %p, %p, %p, %p, %p)\n", This, pUnkOuter, debugstr_w(pwszURL), dwBindURLFlags, debugstr_guid(rguid), debugstr_guid(riid), pAuthenticate, pSessionUnkOuter, piid, ppSession, pdwBindStatus, ppUnk); *ppUnk = NULL; if(IsEqualGUID(rguid, &DBGUID_ROWSET)) hr = CoCreateInstance(&CLSID_wine_rowset_server, NULL, CLSCTX_INPROC_SERVER, &IID_IWineRowServer, (void**)&server); else if(IsEqualGUID(rguid, &DBGUID_ROW)) hr = CoCreateInstance(&CLSID_wine_row_server, NULL, CLSCTX_INPROC_SERVER, &IID_IWineRowServer, (void**)&server); else { hr = E_NOTIMPL; FIXME("Unhandled object %s\n", debugstr_guid(rguid)); } if(FAILED(hr)) return hr; impl_session.pUnkOuter = pSessionUnkOuter; impl_session.piid = piid; impl_session.pSession = NULL; IWineRowServer_GetMarshal(server, &marshal); hr = IBindResource_Bind(This, (IUnknown*)marshal, pwszURL, dwBindURLFlags, rguid, &IID_IUnknown, pAuthenticate, ppSession ? &impl_session : NULL, pdwBindStatus, &obj); IMarshal_Release(marshal); if(FAILED(hr)) { IWineRowServer_Release(server); return hr; } IWineRowServer_SetInnerUnk(server, obj); hr = IUnknown_QueryInterface(obj, riid, (void**)ppUnk); IUnknown_Release(obj); if(ppSession) *ppSession = impl_session.pSession; return hr; }
HRESULT __RPC_STUB ICreateRow_CreateRow_Stub(ICreateRow* This, IUnknown *pUnkOuter, LPCOLESTR pwszURL, DBBINDURLFLAG dwBindURLFlags, REFGUID rguid, REFIID riid, IAuthenticate *pAuthenticate, IUnknown *pSessionUnkOuter, IID *piid, IUnknown **ppSession, DBBINDURLSTATUS *pdwBindStatus, LPOLESTR *ppwszNewURL, IUnknown **ppUnk) { HRESULT hr; DBIMPLICITSESSION impl_session; IWineRowServer *row_server; IMarshal *marshal; IUnknown *obj; TRACE("(%p, %p, %s, %08x, %s, %s, %p, %p, %p, %p, %p, %p, %p)\n", This, pUnkOuter, debugstr_w(pwszURL), dwBindURLFlags, debugstr_guid(rguid), debugstr_guid(riid), pAuthenticate, pSessionUnkOuter, piid, ppSession, pdwBindStatus, ppwszNewURL, ppUnk); *ppUnk = NULL; hr = CoCreateInstance(&CLSID_wine_row_server, NULL, CLSCTX_INPROC_SERVER, &IID_IWineRowServer, (void**)&row_server); if(FAILED(hr)) return hr; impl_session.pUnkOuter = pSessionUnkOuter; impl_session.piid = piid; impl_session.pSession = NULL; IWineRowServer_GetMarshal(row_server, &marshal); hr = ICreateRow_CreateRow(This, (IUnknown*) marshal, pwszURL, dwBindURLFlags, rguid, &IID_IUnknown, pAuthenticate, ppSession ? &impl_session : NULL, pdwBindStatus, ppwszNewURL, &obj); IMarshal_Release(marshal); if(FAILED(hr)) { IWineRowServer_Release(row_server); return hr; } IWineRowServer_SetInnerUnk(row_server, obj); hr = IUnknown_QueryInterface(obj, riid, (void**)ppUnk); IUnknown_Release(obj); if(ppSession) *ppSession = impl_session.pSession; return hr; }
HRESULT __RPC_STUB ICommand_Execute_Stub(ICommand* This, IUnknown *pUnkOuter, REFIID riid, HACCESSOR hAccessor, DB_UPARAMS cParamSets, GUID *pGuid, ULONG ulGuidOffset, RMTPACK *pInputParams, RMTPACK *pOutputParams, DBCOUNTITEM cBindings, DBBINDING *rgBindings, DBSTATUS *rgStatus, DBROWCOUNT *pcRowsAffected, IUnknown **ppRowset) { IWineRowServer *rowset_server; IMarshal *marshal; IUnknown *obj = NULL; HRESULT hr; TRACE("(%p)->(%p, %s, %08lx, %d, %p, %d, %p, %p, %d, %p, %p, %p, %p): stub\n", This, pUnkOuter, debugstr_guid(riid), hAccessor, cParamSets, pGuid, ulGuidOffset, pInputParams, pOutputParams, cBindings, rgBindings, rgStatus, pcRowsAffected, ppRowset); *ppRowset = NULL; hr = CoCreateInstance(&CLSID_wine_rowset_server, NULL, CLSCTX_INPROC_SERVER, &IID_IWineRowServer, (void**)&rowset_server); if(FAILED(hr)) return hr; IWineRowServer_GetMarshal(rowset_server, &marshal); hr = ICommand_Execute(This, (IUnknown*)marshal, &IID_IUnknown, NULL, pcRowsAffected, &obj); IMarshal_Release(marshal); if(FAILED(hr)) { IWineRowServer_Release(rowset_server); return hr; } IWineRowServer_SetInnerUnk(rowset_server, obj); hr = IUnknown_QueryInterface(obj, riid, (void**)ppRowset); IUnknown_Release(obj); return hr; }
static HRESULT WINAPI FTMarshalImpl_GetMarshalSizeMax (LPMARSHAL iface, REFIID riid, void *pv, DWORD dwDestContext, void *pvDestContext, DWORD mshlflags, DWORD * pSize) { IMarshal *pMarshal = NULL; HRESULT hres; TRACE("(%s, %p, 0x%lx, %p, 0x%lx, %p)\n", debugstr_guid(riid), pv, dwDestContext, pvDestContext, mshlflags, pSize); /* if the marshalling happens inside the same process the interface pointer is copied between the apartments */ if (dwDestContext == MSHCTX_INPROC || dwDestContext == MSHCTX_CROSSCTX) { *pSize = sizeof (mshlflags) + sizeof (pv) + sizeof (DWORD) + sizeof (GUID); return S_OK; } /* use the standard marshaller to handle all other cases */ CoGetStandardMarshal (riid, pv, dwDestContext, pvDestContext, mshlflags, &pMarshal); hres = IMarshal_GetMarshalSizeMax (pMarshal, riid, pv, dwDestContext, pvDestContext, mshlflags, pSize); IMarshal_Release (pMarshal); return hres; }