Huw Davies : msdaps: Add a stub server object.

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


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Tue Feb  2 12:07:12 2010 +0000

msdaps: Add a stub server object.

---

 dlls/msdaps/row_server.c   |  128 +++++++++++++++++++++++++++++++++++++++++--
 dlls/msdaps/row_server.idl |   14 +++++
 2 files changed, 136 insertions(+), 6 deletions(-)

diff --git a/dlls/msdaps/row_server.c b/dlls/msdaps/row_server.c
index 14f11d2..11ace6c 100644
--- a/dlls/msdaps/row_server.c
+++ b/dlls/msdaps/row_server.c
@@ -39,18 +39,134 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(oledb);
 
-HRESULT create_row_server(IUnknown *outer, void **obj)
+
+typedef struct
+{
+    const IWineRowServerVtbl *vtbl;
+
+    LONG ref;
+
+    CLSID class;
+    IMarshal *marshal;
+    IUnknown *inner_unk;
+} server;
+
+static inline server *impl_from_IWineRowServer(IWineRowServer *iface)
+{
+    return (server *)((char*)iface - FIELD_OFFSET(server, vtbl));
+}
+
+static HRESULT WINAPI server_QueryInterface(IWineRowServer *iface, REFIID riid, void **obj)
 {
-    FIXME("(%p, %p): stub\n", outer, obj);
+    server *This = impl_from_IWineRowServer(iface);
+    TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), obj);
+
     *obj = NULL;
-    return E_NOTIMPL;
+
+    if(IsEqualIID(riid, &IID_IUnknown) ||
+       IsEqualIID(riid, &IID_IWineRowServer))
+    {
+        *obj = iface;
+    }
+    else
+    {
+        if(!IsEqualIID(riid, &IID_IMarshal)) /* We use standard marshalling */
+            FIXME("interface %s not implemented\n", debugstr_guid(riid));
+        return E_NOINTERFACE;
+    }
+
+    IWineRowServer_AddRef(iface);
+    return S_OK;
 }
 
-HRESULT create_rowset_server(IUnknown *outer, void **obj)
+static ULONG WINAPI server_AddRef(IWineRowServer *iface)
+{
+    server *This = impl_from_IWineRowServer(iface);
+    TRACE("(%p)\n", This);
+
+    return InterlockedIncrement(&This->ref);
+}
+
+static ULONG WINAPI server_Release(IWineRowServer *iface)
+{
+    server *This = impl_from_IWineRowServer(iface);
+    LONG ref;
+
+    TRACE("(%p)\n", This);
+
+    ref = InterlockedDecrement(&This->ref);
+    if(ref == 0)
+    {
+        IMarshal_Release(This->marshal);
+        if(This->inner_unk) IUnknown_Release(This->inner_unk);
+        HeapFree(GetProcessHeap(), 0, This);
+    }
+
+    return ref;
+}
+
+static HRESULT WINAPI server_SetInnerUnk(IWineRowServer *iface, IUnknown *inner)
+{
+    server *This = impl_from_IWineRowServer(iface);
+
+    if(This->inner_unk) IUnknown_Release(This->inner_unk);
+
+    if(inner) IUnknown_AddRef(inner);
+    This->inner_unk = inner;
+    return S_OK;
+}
+
+static HRESULT WINAPI server_GetMarshal(IWineRowServer *iface, IMarshal **marshal)
+{
+    server *This = impl_from_IWineRowServer(iface);
+
+    IMarshal_AddRef(This->marshal);
+    *marshal = This->marshal;
+    return S_OK;
+}
+
+static const IWineRowServerVtbl server_vtbl =
 {
-    FIXME("(%p, %p): stub\n", outer, obj);
+    server_QueryInterface,
+    server_AddRef,
+    server_Release,
+    server_SetInnerUnk,
+    server_GetMarshal
+};
+
+static HRESULT create_server(IUnknown *outer, const CLSID *class, void **obj)
+{
+    server *server;
+    TRACE("(%p, %s, %p)\n", outer, debugstr_guid(class), obj);
+
     *obj = NULL;
-    return E_NOTIMPL;
+
+    server = HeapAlloc(GetProcessHeap(), 0, sizeof(*server));
+    if(!server) return E_OUTOFMEMORY;
+
+    server->vtbl = &server_vtbl;
+    server->ref = 1;
+    server->class = *class;
+    server->inner_unk = NULL;
+    if(IsEqualGUID(class, &CLSID_wine_row_server))
+        create_row_marshal((IUnknown*)server, (void**)&server->marshal);
+    else if(IsEqualGUID(class, &CLSID_wine_rowset_server))
+        create_rowset_marshal((IUnknown*)server, (void**)&server->marshal);
+    else
+        ERR("create_server called with class %s\n", debugstr_guid(class));
+
+    *obj = server;
+    return S_OK;
+}
+
+HRESULT create_row_server(IUnknown *outer, void **obj)
+{
+    return create_server(outer, &CLSID_wine_row_server, obj);
+}
+
+HRESULT create_rowset_server(IUnknown *outer, void **obj)
+{
+    return create_server(outer, &CLSID_wine_rowset_server, obj);
 }
 
 /* Marshal impl */
diff --git a/dlls/msdaps/row_server.idl b/dlls/msdaps/row_server.idl
index 4da585f..f6d6303 100644
--- a/dlls/msdaps/row_server.idl
+++ b/dlls/msdaps/row_server.idl
@@ -18,6 +18,20 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+import "oledb.idl";
+
+[
+    object,
+    uuid(38248178-cf6d-11de-abe5-000c2916d865),
+    pointer_default(unique)
+]
+interface IWineRowServer : IUnknown
+{
+    [local] HRESULT SetInnerUnk([in] IUnknown *unknown);
+
+    [local] HRESULT GetMarshal([out] IMarshal **marshal);
+}
+
 [
     uuid(38248178-cf6d-11de-abe5-000c2916d865)
 ]




More information about the wine-cvs mailing list