///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Microsoft WMIOLE DB Provider
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
//
//  dataconvert.h
//
////////////////////////////////////////////////////////////////////////////

typedef LONG_PTR HSLOT;
#define MAX_CIM_STRING_SIZE -1

#ifndef __DATA_CONVERT_H__
#define __DATA_CONVERT_H__

class CDataMap
{

		HRESULT AllocateData(DBTYPE dwType,void *& pData,DBLENGTH &dwLength);
		BOOL	IsValidDBTimeStamp(DBTIMESTAMP *pTimeStamp);
		BOOL	IsSafeArrayEmpty(SAFEARRAY *psa);
		BOOL	IsDateType(DWORD dwType);
		HRESULT ConvertDateTypes(DWORD		dwSrcType,
								DWORD		dwDstType,
								DBLENGTH	dwSrcLen,
								DBLENGTH*	pdwDstLen,
								void  *		pSrc,
								void * &	pDst,
								DBLENGTH	dbDstLen,
								DWORD *		pdwStatus);

    public:
        CDataMap()  {};
        ~CDataMap() {};

        HRESULT MapOLEDBTypeToCIMType(WORD dwDataType, long & dwCIMType );
        HRESULT MapCIMTypeToOLEDBType(long lType, WORD & dwdbOLEDBType, DBLENGTH & uColumnSize , DWORD &dwFlags);
        HRESULT FreeData(DBTYPE lType, BYTE *& pData);
        HRESULT AllocateAndMapCIMTypeToOLEDBType(CVARIANT & vValue,BYTE *& pData,DBTYPE &dwColType,DBLENGTH & dwSize, DWORD &dwFlags);
		HRESULT MapAndConvertOLEDBTypeToCIMType(DBTYPE wDataType, void *pData ,DBLENGTH dwSrcLength,VARIANT &varData,LONG_PTR dwArrayCIMType = -1);
		HRESULT ConvertVariantType(VARIANT &varSrc, VARIANT varDst ,CIMTYPE lType);
		BOOL	CompareData(DWORD dwType,void * pData1 , void *pData2);

		// Array conversion functions
		HRESULT ConvertAndCopyArray(SAFEARRAY *psaSrc, SAFEARRAY **psaDst, DBTYPE dwSrcType,DBTYPE dwDstType,DBSTATUS *pdwStatus);
		HRESULT ConvertToVariantArray(SAFEARRAY *pArray,DBTYPE dwSrcType,SAFEARRAY ** ppArrayOut);

		// Date conversion functions
		HRESULT ConvertOledbDateToCIMType(VARIANT *vTimeStamp,BSTR &strDate);
		HRESULT ConvertDateToOledbType(BSTR strDate,DBTIMESTAMP *pTimeStamp);
		HRESULT ConvertVariantDateOledbDate(DATE *pDate,DBTIMESTAMP *pTimeStamp);
		HRESULT ConvertOledbDateToCIMType(DBTIMESTAMP *pTimeStamp,BSTR &strDate);
		HRESULT ConvertVariantDateToCIMType(DATE *pDate,BSTR &strDate);
		
		HRESULT ClearData(DBTYPE lType, void * pData);
		HRESULT ConvertToCIMType(BYTE *pData, DBTYPE lType ,DBLENGTH lDataLength,LONG lCIMType ,VARIANT &varData);
		HRESULT AllocateAndConvertToOLEDBType(VARIANT &varData,LONG lCimType , DBTYPE lOledbType,BYTE *&pData, DBLENGTH &lDataLength, DBSTATUS &dwStatus);
	
        HRESULT TranslateParameterStringToOLEDBType( DBTYPE & wDataType, WCHAR * str) ;
};
#endif