Huw Davies : oledb32: Implement DBTYPE_STR and DBTYPE_WSTR src types.
Alexandre Julliard
julliard at winehq.org
Wed Sep 23 11:03:22 CDT 2009
Module: wine
Branch: master
Commit: 4a61c1d265adc3cbfee7edb7ac4abf310735c4a4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4a61c1d265adc3cbfee7edb7ac4abf310735c4a4
Author: Huw Davies <huw at codeweavers.com>
Date: Tue Sep 22 16:58:24 2009 +0100
oledb32: Implement DBTYPE_STR and DBTYPE_WSTR src types.
---
dlls/oledb32/convert.c | 43 +++++++++++++++++++++++++++++++++++++++++-
dlls/oledb32/tests/convert.c | 16 ---------------
2 files changed, 42 insertions(+), 17 deletions(-)
diff --git a/dlls/oledb32/convert.c b/dlls/oledb32/convert.c
index f49a699..9803caf 100644
--- a/dlls/oledb32/convert.c
+++ b/dlls/oledb32/convert.c
@@ -25,6 +25,7 @@
#include "windef.h"
#include "winbase.h"
+#include "winnls.h"
#include "ole2.h"
#include "msdadc.h"
#include "oledberr.h"
@@ -143,7 +144,7 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface,
convert *This = impl_from_IDataConvert(iface);
HRESULT hr;
- TRACE("(%p)->(%d, %d, %d, %p, %p, %p, %d, %d, %p, %d, %d, %x): stub\n", This,
+ TRACE("(%p)->(%d, %d, %d, %p, %p, %p, %d, %d, %p, %d, %d, %x)\n", This,
src_type, dst_type, src_len, dst_len, src, dst, dst_max_len,
src_status, dst_status, precision, scale, flags);
@@ -155,6 +156,46 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface,
return DB_E_UNSUPPORTEDCONVERSION;
}
+ if(src_type == DBTYPE_STR)
+ {
+ BSTR b;
+ DWORD len;
+
+ if(flags & DBDATACONVERT_LENGTHFROMNTS)
+ len = MultiByteToWideChar(CP_ACP, 0, src, -1, NULL, 0) - 1;
+ else
+ len = MultiByteToWideChar(CP_ACP, 0, src, src_len, NULL, 0);
+ b = SysAllocStringLen(NULL, len);
+ if(!b) return E_OUTOFMEMORY;
+ if(flags & DBDATACONVERT_LENGTHFROMNTS)
+ MultiByteToWideChar(CP_ACP, 0, src, -1, b, len + 1);
+ else
+ MultiByteToWideChar(CP_ACP, 0, src, src_len, b, len);
+
+ hr = IDataConvert_DataConvert(iface, DBTYPE_BSTR, dst_type, 0, dst_len,
+ &b, dst, dst_max_len, src_status, dst_status,
+ precision, scale, flags);
+
+ SysFreeString(b);
+ return hr;
+ }
+
+ if(src_type == DBTYPE_WSTR)
+ {
+ BSTR b;
+
+ if(flags & DBDATACONVERT_LENGTHFROMNTS)
+ b = SysAllocString(src);
+ else
+ b = SysAllocStringLen(src, src_len / 2);
+ if(!b) return E_OUTOFMEMORY;
+ hr = IDataConvert_DataConvert(iface, DBTYPE_BSTR, dst_type, 0, dst_len,
+ &b, dst, dst_max_len, src_status, dst_status,
+ precision, scale, flags);
+ SysFreeString(b);
+ return hr;
+ }
+
switch(dst_type)
{
case DBTYPE_I4:
diff --git a/dlls/oledb32/tests/convert.c b/dlls/oledb32/tests/convert.c
index acda3a9..7a733c2 100644
--- a/dlls/oledb32/tests/convert.c
+++ b/dlls/oledb32/tests/convert.c
@@ -541,49 +541,33 @@ todo_wine
i4 = 0x12345678;
strcpy((char *)src, "10");
hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_I4, 2, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
-todo_wine
-{
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
-}
ok(dst_len == sizeof(i4), "got %d\n", dst_len);
-todo_wine
ok(i4 == 10, "got %08x\n", i4);
i4 = 0x12345678;
strcpy((char *)src, "10");
hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
-todo_wine
-{
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
-}
ok(dst_len == sizeof(i4), "got %d\n", dst_len);
-todo_wine
ok(i4 == 10, "got %08x\n", i4);
i4 = 0x12345678;
memcpy(src, ten, sizeof(ten));
hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_I4, 4, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
-todo_wine
-{
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
-}
ok(dst_len == sizeof(i4), "got %d\n", dst_len);
-todo_wine
ok(i4 == 10, "got %08x\n", i4);
i4 = 0x12345678;
memcpy(src, ten, sizeof(ten));
hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
-todo_wine
-{
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
-}
ok(dst_len == sizeof(i4), "got %d\n", dst_len);
-todo_wine
ok(i4 == 10, "got %08x\n", i4);
IDataConvert_Release(convert);
More information about the wine-cvs
mailing list