Huw Davies : msdaps: Add support for remoting IRowChange_SetColumns.

Alexandre Julliard julliard at winehq.org
Mon Feb 8 11:06:07 CST 2010


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Fri Feb  5 13:29:32 2010 +0000

msdaps: Add support for remoting IRowChange_SetColumns.

---

 dlls/msdaps/row_server.c |   74 +++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 70 insertions(+), 4 deletions(-)

diff --git a/dlls/msdaps/row_server.c b/dlls/msdaps/row_server.c
index a9f7a45..f443155 100644
--- a/dlls/msdaps/row_server.c
+++ b/dlls/msdaps/row_server.c
@@ -270,8 +270,43 @@ static HRESULT WINAPI server_SetColumns(IWineRowServer* iface, DBORDINAL num_col
                                         wine_setcolumns_in *in_data, DBSTATUS *status)
 {
     server *This = impl_from_IWineRowServer(iface);
-    FIXME("(%p)->(%d, %p, %p): stub\n", This, num_cols, in_data, status);
-    return E_NOTIMPL;
+    HRESULT hr;
+    DBORDINAL i;
+    DBCOLUMNACCESS *cols;
+    IRowChange *row_change;
+
+    TRACE("(%p)->(%d, %p, %p)\n", This, num_cols, in_data, status);
+    hr = IUnknown_QueryInterface(This->inner_unk, &IID_IRowChange, (void**)&row_change);
+    if(FAILED(hr)) return hr;
+
+    cols = CoTaskMemAlloc(num_cols * sizeof(cols[0]));
+
+    for(i = 0; i < num_cols; i++)
+    {
+        TRACE("%d:\ttype %04x\n", i, in_data[i].type);
+        cols[i].pData        = CoTaskMemAlloc(db_type_size(in_data[i].type, in_data[i].max_len));
+        memcpy(cols[i].pData, &V_I1(&in_data[i].v), db_type_size(in_data[i].type, in_data[i].max_len));
+        cols[i].columnid     = in_data[i].columnid;
+        cols[i].cbDataLen    = in_data[i].data_len;
+        cols[i].dwStatus     = in_data[i].status;
+        cols[i].cbMaxLen     = in_data[i].max_len;
+        cols[i].wType        = in_data[i].type;
+        cols[i].bPrecision   = in_data[i].precision;
+        cols[i].bScale       = in_data[i].scale;
+    }
+
+    hr = IRowChange_SetColumns(row_change, num_cols, cols);
+    IRowChange_Release(row_change);
+
+    for(i = 0; i < num_cols; i++)
+    {
+        CoTaskMemFree(cols[i].pData);
+        status[i] = cols[i].dwStatus;
+    }
+
+    CoTaskMemFree(cols);
+
+    return hr;
 }
 
 static HRESULT WINAPI server_AddRefRows(IWineRowServer* iface, DBCOUNTITEM cRows,
@@ -743,8 +778,39 @@ static HRESULT WINAPI row_change_SetColumns(IRowChange *iface, DBORDINAL cColumn
                                             DBCOLUMNACCESS rgColumns[])
 {
     row_proxy *This = impl_from_IRowChange(iface);
-    FIXME("(%p)->(%d, %p)\n", This, cColumns, rgColumns);
-    return E_NOTIMPL;
+    HRESULT hr;
+    wine_setcolumns_in *in_data;
+    DBSTATUS *status;
+    DBORDINAL i;
+
+    TRACE("(%p)->(%d, %p)\n", This, cColumns, rgColumns);
+
+    in_data = CoTaskMemAlloc(cColumns * sizeof(in_data[0]));
+    status = CoTaskMemAlloc(cColumns * sizeof(status[0]));
+
+    for(i = 0; i < cColumns; i++)
+    {
+        TRACE("%d: wtype %04x max %08x len %08x\n", i, rgColumns[i].wType, rgColumns[i].cbMaxLen, rgColumns[i].cbDataLen);
+        V_VT(&in_data[i].v) = rgColumns[i].wType;
+        memcpy(&V_I1(&in_data[i].v), rgColumns[i].pData, db_type_size(rgColumns[i].wType, rgColumns[i].cbDataLen));
+        in_data[i].columnid = rgColumns[i].columnid;
+        in_data[i].data_len = rgColumns[i].cbDataLen;
+        in_data[i].status = rgColumns[i].dwStatus;
+        in_data[i].max_len = rgColumns[i].cbMaxLen;
+        in_data[i].type = rgColumns[i].wType;
+        in_data[i].precision = rgColumns[i].bPrecision;
+        in_data[i].scale = rgColumns[i].bScale;
+    }
+
+    hr = IWineRowServer_SetColumns(This->server, cColumns, in_data, status);
+
+    for(i = 0; i < cColumns; i++)
+        rgColumns[i].dwStatus = status[i];
+
+    CoTaskMemFree(status);
+    CoTaskMemFree(in_data);
+
+    return hr;
 }
 
 static const IRowChangeVtbl row_change_vtbl =




More information about the wine-cvs mailing list