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