Huw Davies : msdaps: Add a stub row proxy object.

Alexandre Julliard julliard at winehq.org
Wed Feb 3 09:33:06 CST 2010


Module: wine
Branch: master
Commit: 53ecb953466bf83f8ed421bf470aec6676001504
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=53ecb953466bf83f8ed421bf470aec6676001504

Author: Huw Davies <huw at codeweavers.com>
Date:   Tue Feb  2 16:35:43 2010 +0000

msdaps: Add a stub row proxy object.

---

 dlls/msdaps/row_server.c |  128 +++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 126 insertions(+), 2 deletions(-)

diff --git a/dlls/msdaps/row_server.c b/dlls/msdaps/row_server.c
index 017f8c4..92c82fb 100644
--- a/dlls/msdaps/row_server.c
+++ b/dlls/msdaps/row_server.c
@@ -169,10 +169,134 @@ HRESULT create_rowset_server(IUnknown *outer, void **obj)
     return create_server(outer, &CLSID_wine_rowset_server, obj);
 }
 
-HRESULT create_proxy(IWineRowServer *server, const CLSID *class, IUnknown **obj)
+typedef struct
+{
+    const IRowVtbl *row_vtbl;
+
+    LONG ref;
+
+    IWineRowServer *server;
+} row_proxy;
+
+static inline row_proxy *impl_from_IRow(IRow *iface)
+{
+    return (row_proxy *)((char*)iface - FIELD_OFFSET(row_proxy, row_vtbl));
+}
+
+static HRESULT WINAPI row_QueryInterface(IRow *iface, REFIID iid, void **obj)
+{
+    row_proxy *This = impl_from_IRow(iface);
+    TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(iid), obj);
+
+    if(IsEqualIID(iid, &IID_IUnknown) ||
+       IsEqualIID(iid, &IID_IRow))
+    {
+        *obj = &This->row_vtbl;
+    }
+    else
+    {
+        FIXME("interface %s not implemented\n", debugstr_guid(iid));
+        return E_NOINTERFACE;
+    }
+
+    IRow_AddRef(iface);
+    return S_OK;
+}
+
+static ULONG WINAPI row_AddRef(IRow *iface)
+{
+    row_proxy *This = impl_from_IRow(iface);
+    TRACE("(%p)\n", This);
+
+    return InterlockedIncrement(&This->ref);
+}
+
+static ULONG WINAPI row_Release(IRow *iface)
+{
+    row_proxy *This = impl_from_IRow(iface);
+    LONG ref;
+
+    TRACE("(%p)\n", This);
+
+    ref = InterlockedDecrement(&This->ref);
+    if(ref == 0)
+    {
+        if(This->server) IWineRowServer_Release(This->server);
+        HeapFree(GetProcessHeap(), 0, This);
+    }
+
+    return ref;
+}
+
+static HRESULT WINAPI row_GetColumns(IRow* iface, DBORDINAL cColumns, DBCOLUMNACCESS rgColumns[])
+{
+    row_proxy *This = impl_from_IRow(iface);
+
+    FIXME("(%p)->(%d, %p): stub\n", This, cColumns, rgColumns);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI row_GetSourceRowset(IRow* iface, REFIID riid, IUnknown **ppRowset,
+                                          HROW *phRow)
+{
+    row_proxy *This = impl_from_IRow(iface);
+
+    FIXME("(%p)->(%s, %p, %p): stub\n", This, debugstr_guid(riid), ppRowset, phRow);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI row_Open(IRow* iface, IUnknown *pUnkOuter,
+                               DBID *pColumnID, REFGUID rguidColumnType,
+                               DWORD dwBindFlags, REFIID riid, IUnknown **ppUnk)
 {
-    FIXME("stub\n");
+    row_proxy *This = impl_from_IRow(iface);
+
+    FIXME("(%p)->(%p, %p, %s, %08x, %s, %p): stub\n", This, pUnkOuter, pColumnID, debugstr_guid(rguidColumnType),
+          dwBindFlags, debugstr_guid(riid), ppUnk);
+
+    return E_NOTIMPL;
+}
+
+static const IRowVtbl row_vtbl =
+{
+    row_QueryInterface,
+    row_AddRef,
+    row_Release,
+    row_GetColumns,
+    row_GetSourceRowset,
+    row_Open
+};
+
+static HRESULT create_row_proxy(IWineRowServer *server, IUnknown **obj)
+{
+    row_proxy *proxy;
+
+    TRACE("(%p, %p)\n", server, obj);
     *obj = NULL;
+
+    proxy = HeapAlloc(GetProcessHeap(), 0, sizeof(*proxy));
+    if(!proxy) return E_OUTOFMEMORY;
+
+    proxy->row_vtbl = &row_vtbl;
+    proxy->ref = 1;
+    IWineRowServer_AddRef(server);
+    proxy->server = server;
+
+    *obj = (IUnknown*)&proxy->row_vtbl;
+    TRACE("returing %p\n", *obj);
+    return S_OK;
+}
+
+static HRESULT create_proxy(IWineRowServer *server, const CLSID *class, IUnknown **obj)
+{
+    *obj = NULL;
+
+    if(IsEqualGUID(class, &CLSID_wine_row_proxy))
+        return create_row_proxy(server, obj);
+    else
+        FIXME("Unhandled proxy class %s\n", debugstr_guid(class));
     return E_NOTIMPL;
 }
 




More information about the wine-cvs mailing list