Module: wine Branch: master Commit: d3f81a95df3a7f0528a1c45b39a4c289f015d158 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d3f81a95df3a7f0528a1c45b39...
Author: Huw Davies huw@codeweavers.com Date: Thu Feb 4 19:54:59 2010 +0000
msdaps: Add support for remoting IRow_Open.
---
dlls/msdaps/row_server.c | 54 ++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 50 insertions(+), 4 deletions(-)
diff --git a/dlls/msdaps/row_server.c b/dlls/msdaps/row_server.c index 26d0e13..a9f7a45 100644 --- a/dlls/msdaps/row_server.c +++ b/dlls/msdaps/row_server.c @@ -219,10 +219,51 @@ static HRESULT WINAPI server_Open(IWineRowServer* iface, IUnknown *pUnkOuter, DB IUnknown **ppUnk) { server *This = impl_from_IWineRowServer(iface); + IRow *row; + HRESULT hr; + IWineRowServer *new_server; + IMarshal *marshal; + IUnknown *obj;
- FIXME("(%p)->(%p, %p, %s, %08x, %s, %p): stub\n", This, pUnkOuter, pColumnID, debugstr_guid(rguidColumnType), + TRACE("(%p)->(%p, %p, %s, %08x, %s, %p)\n", This, pUnkOuter, pColumnID, debugstr_guid(rguidColumnType), dwBindFlags, debugstr_guid(riid), ppUnk); - return E_NOTIMPL; + + *ppUnk = NULL; + + hr = IUnknown_QueryInterface(This->inner_unk, &IID_IRow, (void**)&row); + if(FAILED(hr)) return hr; + + if(IsEqualGUID(rguidColumnType, &DBGUID_ROWSET)) + hr = CoCreateInstance(&CLSID_wine_rowset_server, NULL, CLSCTX_INPROC_SERVER, &IID_IWineRowServer, (void**)&new_server); + else + { + FIXME("Unhandled object %s\n", debugstr_guid(rguidColumnType)); + hr = E_NOTIMPL; + } + + if(FAILED(hr)) + { + IRow_Release(row); + return hr; + } + + IWineRowServer_GetMarshal(new_server, &marshal); + hr = IRow_Open(row, (IUnknown*)marshal, pColumnID, rguidColumnType, dwBindFlags, &IID_IUnknown, &obj); + IMarshal_Release(marshal); + IRow_Release(row); + + if(FAILED(hr)) + { + IWineRowServer_Release(new_server); + return hr; + } + + IWineRowServer_SetInnerUnk(new_server, obj); + hr = IUnknown_QueryInterface(obj, riid, (void**)ppUnk); + IUnknown_Release(obj); + + TRACE("returning %08x\n", hr); + return hr; }
static HRESULT WINAPI server_SetColumns(IWineRowServer* iface, DBORDINAL num_cols, @@ -659,10 +700,15 @@ static HRESULT WINAPI row_Open(IRow* iface, IUnknown *pUnkOuter, { row_proxy *This = impl_from_IRow(iface);
- FIXME("(%p)->(%p, %p, %s, %08x, %s, %p): stub\n", This, pUnkOuter, pColumnID, debugstr_guid(rguidColumnType), + TRACE("(%p)->(%p, %p, %s, %08x, %s, %p)\n", This, pUnkOuter, pColumnID, debugstr_guid(rguidColumnType), dwBindFlags, debugstr_guid(riid), ppUnk); + if(pUnkOuter) + { + FIXME("Aggregation not supported\n"); + return CLASS_E_NOAGGREGATION; + }
- return E_NOTIMPL; + return IWineRowServer_Open(This->server, pUnkOuter, pColumnID, rguidColumnType, dwBindFlags, riid, ppUnk); }
static const IRowVtbl row_vtbl =