From 960852f44780742b9bc1099a4b13222ef076cd8d Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Sat, 6 Apr 2013 15:52:31 +0400 Subject: [PATCH] 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 f56601bf0b7..f2c46b0dd15 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; - return E_NOTIMPL; + 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; + + 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 dd80fe475bf..400ea3d5042 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(); }