On Mon, Sep 21, 2009 at 01:50:51PM +0100, Huw Davies wrote:
> ---
> dlls/oledb32/convert.c | 231 +++++++++++++++++++++++++++++++++++++++++-
> dlls/oledb32/tests/convert.c | 10 --
> 2 files changed, 228 insertions(+), 13 deletions(-)
> diff --git a/dlls/oledb32/convert.c b/dlls/oledb32/convert.c
> index 458abb5..a2385f0 100644
> --- a/dlls/oledb32/convert.c
> +++ b/dlls/oledb32/convert.c
> @@ -126,13 +126,238 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface,
> return E_NOTIMPL;
> }
>
> +static inline WORD get_dbtype_class(DBTYPE type)
> +{
> + switch(type)
> + {
> + case DBTYPE_I2:
> + case DBTYPE_R4:
> + case DBTYPE_R8:
> + case DBTYPE_I1:
> + case DBTYPE_UI1:
> + case DBTYPE_UI2:
> + return DBTYPE_I2;
> +
> + case DBTYPE_I4:
> + case DBTYPE_UI4:
> + return DBTYPE_I4;
> +
> + case DBTYPE_I8:
> + case DBTYPE_UI8:
> + return DBTYPE_I8;
> +
> + case DBTYPE_BSTR:
> + case DBTYPE_STR:
> + case DBTYPE_WSTR:
> + return DBTYPE_BSTR;
> +
> + case DBTYPE_DBDATE:
> + case DBTYPE_DBTIME:
> + case DBTYPE_DBTIMESTAMP:
> + return DBTYPE_DBDATE;
> + }
> + return type;
> +}
> +
> +/* Many src types will convert to this group of dst types */
> +static inline BOOL common_class(WORD dst_class)
> +{
> + switch(dst_class)
> + {
> + case DBTYPE_EMPTY:
> + case DBTYPE_NULL:
> + case DBTYPE_I2:
> + case DBTYPE_I4:
> + case DBTYPE_BSTR:
> + case DBTYPE_BOOL:
> + case DBTYPE_VARIANT:
> + case DBTYPE_I8:
> + case DBTYPE_CY:
> + case DBTYPE_DECIMAL:
> + case DBTYPE_NUMERIC:
> + return TRUE;
> + }
> + return FALSE;
> +}
> +
> +static inline BOOL array_type(DBTYPE type)
> +{
> + return (type >= DBTYPE_I2 && type <= DBTYPE_UI4);
> +}
> +
> static HRESULT WINAPI convert_CanConvert(IDataConvert* iface,
> - DBTYPE wSrcType, DBTYPE wDstType)
> + DBTYPE src_type, DBTYPE dst_type)
> {
> convert *This = impl_from_IDataConvert(iface);
> - FIXME("(%p)->(%d, %d): stub\n", This, wSrcType, wDstType);
> + DBTYPE src_base_type = src_type & 0x1ff;
> + DBTYPE dst_base_type = dst_type & 0x1ff;
> + WORD dst_class = get_dbtype_class(dst_base_type);
>
> - return E_NOTIMPL;
> + TRACE("(%p)->(%d, %d)\n", This, src_type, dst_type);
> +
> + if(src_type & DBTYPE_VECTOR || dst_type & DBTYPE_VECTOR) return S_FALSE;
I think this needs brackets...
Ciao, Marcus