oledb32: Implement GetConversionSize for DBTYPE_VARIANT -> DBTYPE_STR case.

This commit is contained in:
Nikolay Sivov 2013-04-06 15:52:31 +04:00 committed by Alexandre Julliard
parent 15bb6bfa68
commit 960852f447
2 changed files with 79 additions and 5 deletions

View File

@ -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 =

View File

@ -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();
}