Nikolay Sivov : oledb32: Implement GetConversionSize for DBTYPE_VARIANT -> DBTYPE_STR case.
Alexandre Julliard
julliard at winehq.org
Mon Apr 8 14:13:36 CDT 2013
Module: wine
Branch: master
Commit: 960852f44780742b9bc1099a4b13222ef076cd8d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=960852f44780742b9bc1099a4b13222ef076cd8d
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sat Apr 6 15:52:31 2013 +0400
oledb32: Implement GetConversionSize for DBTYPE_VARIANT -> DBTYPE_STR case.
---
dlls/oledb32/convert.c | 54 ++++++++++++++++++++++++++++++++++++++----
dlls/oledb32/tests/convert.c | 30 +++++++++++++++++++++++
2 files changed, 79 insertions(+), 5 deletions(-)
diff --git a/dlls/oledb32/convert.c b/dlls/oledb32/convert.c
index f56601b..f2c46b0 100644
--- a/dlls/oledb32/convert.c
+++ b/dlls/oledb32/convert.c
@@ -996,14 +996,58 @@ static HRESULT WINAPI convert_CanConvert(IDataConvert* iface,
}
static HRESULT WINAPI convert_GetConversionSize(IDataConvert* iface,
- DBTYPE wSrcType, DBTYPE wDstType,
- DBLENGTH *pcbSrcLength, DBLENGTH *pcbDstLength,
- void *pSrc)
+ DBTYPE src_type, DBTYPE dst_type,
+ DBLENGTH *src_len, DBLENGTH *dst_len,
+ void *src)
{
convert *This = impl_from_IDataConvert(iface);
- FIXME("(%p)->(%d, %d, %p, %p, %p): stub\n", This, wSrcType, wDstType, pcbSrcLength, pcbDstLength, pSrc);
+ HRESULT hr;
+
+ TRACE("(%p)->(%d, %d, %p, %p, %p)\n", This, src_type, dst_type, src_len, dst_len, src);
+
+ hr = IDataConvert_CanConvert(iface, src_type, dst_type);
+ if (hr != S_OK)
+ return DB_E_UNSUPPORTEDCONVERSION;
+
+ if (!dst_len)
+ return E_INVALIDARG;
+
+ /* for some types we don't need to look into source data */
+ if ((*dst_len = get_length(dst_type)))
+ return S_OK;
+
+ switch (dst_type)
+ {
+ case DBTYPE_STR:
+ {
+ switch (src_type)
+ {
+ case DBTYPE_VARIANT:
+ {
+ VARIANT v;
- return E_NOTIMPL;
+ VariantInit(&v);
+ if ((hr = VariantChangeType(&v, (VARIANT*)src, 0, VT_BSTR)) == S_OK)
+ {
+ *dst_len = WideCharToMultiByte(CP_ACP, 0, V_BSTR(&v), -1, NULL, 0, NULL, NULL);
+ VariantClear(&v);
+ }
+ else
+ return hr;
+ }
+ break;
+ default:
+ FIXME("unimplemented for %04x -> DBTYPE_STR\n", src_type);
+ return E_NOTIMPL;
+ }
+ }
+ break;
+ default:
+ FIXME("unimplemented for destination type %d\n", dst_type);
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
}
static const struct IDataConvertVtbl convert_vtbl =
diff --git a/dlls/oledb32/tests/convert.c b/dlls/oledb32/tests/convert.c
index dd80fe4..400ea3d 100644
--- a/dlls/oledb32/tests/convert.c
+++ b/dlls/oledb32/tests/convert.c
@@ -2435,6 +2435,35 @@ todo_wine
IDataConvert_Release(convert);
}
+static void test_getconversionsize(void)
+{
+ IDataConvert *convert;
+ DBLENGTH dst_len;
+ HRESULT hr;
+
+ hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
+ if(FAILED(hr))
+ {
+ win_skip("Unable to load oledb conversion library\n");
+ return;
+ }
+
+ /* same way as CanConvert fails here */
+ dst_len = 0;
+ hr = IDataConvert_GetConversionSize(convert, DBTYPE_NULL, DBTYPE_BSTR, NULL, &dst_len, NULL);
+ ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got 0x%08x\n", hr);
+
+ dst_len = 0;
+ hr = IDataConvert_GetConversionSize(convert, DBTYPE_I2, DBTYPE_I4, NULL, &dst_len, NULL);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(dst_len == 4, "got %ld\n", dst_len);
+
+ hr = IDataConvert_GetConversionSize(convert, DBTYPE_I2, DBTYPE_I4, NULL, NULL, NULL);
+ ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+ IDataConvert_Release(convert);
+}
+
START_TEST(convert)
{
OleInitialize(NULL);
@@ -2453,5 +2482,6 @@ START_TEST(convert)
test_converttofiletime();
test_converttocy();
test_converttoui8();
+ test_getconversionsize();
OleUninitialize();
}
More information about the wine-cvs
mailing list