/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/


#ifndef _CONNECTIVITY_ADO_AOLEVARIANT_HXX_
#define _CONNECTIVITY_ADO_AOLEVARIANT_HXX_

#include <sal/types.h>
#ifdef __MINGW32__
#include <windows.h>
#endif
#include <rtl/ustring.hxx>
#include <com/sun/star/uno/Sequence.hxx>

#include "ado_pre_sys_include.h"
#include <oaidl.h>
#include "ado_post_sys_include.h"

namespace com
{
	namespace sun
	{
		namespace star
		{
			namespace util
			{
				struct Date;
				struct Time;
				struct DateTime;
			}
		}
	}
}
namespace connectivity
{
	namespace ado
	{
		class OLEString
		{
			BSTR m_sStr;
		public:
			OLEString();
			OLEString(const BSTR& _sBStr);
			OLEString(const ::rtl::OUString& _sBStr);
			OLEString(const OLEString& _rRh)
			{
				OLEString::operator=(_rRh);
			}
			~OLEString();
			OLEString& operator=(const ::rtl::OUString& _rSrc);
			OLEString& operator=(const BSTR& _rSrc);
			OLEString& operator=(const OLEString& _rSrc);
			operator ::rtl::OUString() const;
			operator BSTR() const;
			BSTR* operator &();
			sal_Int32 length() const;
		};

		class OLEVariant	:	public ::tagVARIANT
		{
		public:
			OLEVariant();
			OLEVariant(const VARIANT& varSrc);
			OLEVariant(const OLEVariant& varSrc)	;
			OLEVariant(sal_Bool x)	;
			OLEVariant(sal_Int8 n)	;
			OLEVariant(sal_Int16 n)	;
			OLEVariant(sal_Int32 n)	;
			OLEVariant(sal_Int64 x)	;

			OLEVariant(const rtl::OUString& us)	;
			~OLEVariant()					;
			OLEVariant(const ::com::sun::star::util::Date& x );
			OLEVariant(const ::com::sun::star::util::Time& x );
			OLEVariant(const ::com::sun::star::util::DateTime& x );
			OLEVariant(const float &x);
			OLEVariant(const double &x);
			OLEVariant(IDispatch* pDispInterface);
			OLEVariant(const ::com::sun::star::uno::Sequence< sal_Int8 >& x);
			OLEVariant& operator=(const OLEVariant& varSrc);
			// Assign a const VARIANT& (::VariantCopy handles everything)
			//
			OLEVariant& operator=(const tagVARIANT& varSrc);
			// Assign a const VARIANT* (::VariantCopy handles everything)
			//
			OLEVariant& operator=(const VARIANT* pSrc);
			void setByte(sal_uInt8 n)				;
			void setInt16(sal_Int16 n)				;
			void setInt32(sal_Int32 n)				;
			void setFloat(float f)					;
			void setDouble(double d)				;
			void setDate(DATE d)					;
			void setChar(unsigned char a)			;
			void setCurrency(double aCur)			;
			void setBool(sal_Bool b)				;
			void setString(const rtl::OUString& us)	;
			void setNoArg()							;

			void setIDispatch(IDispatch* pDispInterface);
			void setNull()	 ;
			void setEmpty()	 ;

			void setUI1SAFEARRAYPtr(SAFEARRAY* pSafeAr);
			void setArray(SAFEARRAY* pSafeArray, VARTYPE vtType);
			sal_Bool isNull() const  ;
			sal_Bool isEmpty() const ;

			VARTYPE getType() const ;
			void ChangeType(VARTYPE vartype, const OLEVariant* pSrc);


			operator ::rtl::OUString() const;

			operator sal_Bool()		const {	return getBool();	}
			operator sal_Int8()		const {	return getInt8();	}
			operator sal_Int16()	const {	return getInt16();	}
			operator sal_Int32() 	const {	return getInt32();	}
			operator float()		const {	return getFloat();	}
			operator double()		const {	return getDouble();	}

			operator ::com::sun::star::uno::Sequence< sal_Int8 >() const;
			operator ::com::sun::star::util::Date() const ;
			operator ::com::sun::star::util::Time()	const ;
			operator ::com::sun::star::util::DateTime()const ;
			::rtl::OUString getString()		const;
			sal_Bool		getBool()		const;
			IUnknown*		getIUnknown()	const;
			IDispatch*		getIDispatch()	const;
			sal_uInt8		getByte()		const;
			sal_Int16		getInt16()		const;
			sal_Int8		getInt8()		const;
			sal_Int32		getInt32()		const;
			sal_uInt32		getUInt32()		const;
			float			getFloat()		const;
			double			getDouble()		const;
			double			getDate()		const;
			CY				getCurrency()	const;
			SAFEARRAY*		getUI1SAFEARRAYPtr() const;
            ::com::sun::star::uno::Any makeAny() const;

			static VARIANT_BOOL VariantBool(sal_Bool bEinBoolean);

		private:
			void CHS();

			void set(double n);

		};
	}
}

#endif // _CONNECTIVITY_ADO_AOLEVARIANT_HXX_

