oledb32: Implement GetConversionSize for DBTYPE_VARIANT -> DBTYPE_STR case.
This commit is contained in:
parent
15bb6bfa68
commit
960852f447
|
@ -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 =
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue