/**************************************************************
 *
 * 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_OSUBCOMPONENT_HXX_
#define _CONNECTIVITY_OSUBCOMPONENT_HXX_

#ifndef _CPPUHELPER_WEAK_HXX_
#include <cppuhelper/weak.hxx>
#endif
#ifndef _CPPUHELPER_INTERFACECONTAINER_H_
#include <cppuhelper/interfacecontainer.h>
#endif
#ifndef _COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_
#include <com/sun/star/lang/DisposedException.hpp>
#endif
#ifndef _CPPUHELPER_PROPSHLP_HXX
#include <cppuhelper/propshlp.hxx>
#endif
#ifndef _OSL_MUTEX_HXX_
#include <osl/mutex.hxx>
#endif
#ifndef _OSL_DIAGNOSE_H_
#include <osl/diagnose.h>
#endif

namespace cppu {
	class IPropertyArrayHelper;
}

namespace com
{
	namespace sun
	{
		namespace star
		{
			namespace lang
			{
				class XComponent;
			}
		}
	}
}
namespace connectivity
{

	namespace mysqlc
	{
		void release(oslInterlockedCount& _refCount,
					 ::cppu::OBroadcastHelper& rBHelper,
					 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _xInterface,
					 ::com::sun::star::lang::XComponent* _pObject);

		void checkDisposed(sal_Bool _bThrow) throw (::com::sun::star::lang::DisposedException);
		//************************************************************
		// OSubComponent
		//************************************************************
		template <class SELF, class WEAK> class OSubComponent
		{
		protected:
			// the parent must support the tunnel implementation
			::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > m_xParent;
			SELF*	m_pDerivedImplementation;

		public:
			OSubComponent(
					const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _xParent,
					SELF* _pDerivedImplementation)
				:m_xParent(_xParent)
				,m_pDerivedImplementation(_pDerivedImplementation)
			{
			}

		protected:
			void dispose_ChildImpl()
			{
				::osl::MutexGuard aGuard(m_pDerivedImplementation->rBHelper.rMutex);
				m_xParent = NULL;
			}
			void relase_ChildImpl()
			{
				release(m_pDerivedImplementation->m_refCount,
										m_pDerivedImplementation->rBHelper,
										m_xParent,
										m_pDerivedImplementation);

				m_pDerivedImplementation->WEAK::release();
			}
		};


		template <class TYPE>
		class OPropertyArrayUsageHelper
		{
		protected:
			static sal_Int32						s_nRefCount;
			static ::cppu::IPropertyArrayHelper*	s_pProps;
			static ::osl::Mutex						s_aMutex;

		public:
			OPropertyArrayUsageHelper();
			virtual ~OPropertyArrayUsageHelper()
			{	// ARGHHHHHHH ..... would like to implement this in proparrhlp_impl.hxx (as we do with all other methods)
				// but SUNPRO 5 compiler (linker) doesn't like this
				::osl::MutexGuard aGuard(s_aMutex);
				OSL_ENSURE(s_nRefCount > 0, "OPropertyArrayUsageHelper::~OPropertyArrayUsageHelper : suspicious call : have a refcount of 0 !");
				if (!--s_nRefCount)
				{
					delete s_pProps;
					s_pProps = NULL;
				}
			}

			/** call this in the getInfoHelper method of your derived class. The method returns the array helper of the
				class, which is created if necessary.
			*/
			::cppu::IPropertyArrayHelper*	getArrayHelper();

		protected:
			/** used to implement the creation of the array helper which is shared amongst all instances of the class.
				This method needs to be implemented in derived classes.
				<BR>
				The method gets called with s_aMutex acquired.
				<BR>
				as long as IPropertyArrayHelper has no virtual destructor, the implementation of ~OPropertyArrayUsageHelper
				assumes that you created an ::cppu::OPropertyArrayHelper when deleting s_pProps.
				@return							an pointer to the newly created array helper. Must not be NULL.
			*/
			virtual ::cppu::IPropertyArrayHelper* createArrayHelper() const = 0;
		};

		template<class TYPE>
		sal_Int32						OPropertyArrayUsageHelper< TYPE >::s_nRefCount	= 0;

		template<class TYPE>
		::cppu::IPropertyArrayHelper*	OPropertyArrayUsageHelper< TYPE >::s_pProps	= NULL;

		template<class TYPE>
		::osl::Mutex					OPropertyArrayUsageHelper< TYPE >::s_aMutex;

		//------------------------------------------------------------------
		template <class TYPE>
		OPropertyArrayUsageHelper<TYPE>::OPropertyArrayUsageHelper()
		{
			::osl::MutexGuard aGuard(s_aMutex);
			++s_nRefCount;
		}

		//------------------------------------------------------------------
		template <class TYPE>
		::cppu::IPropertyArrayHelper* OPropertyArrayUsageHelper<TYPE>::getArrayHelper()
		{
			OSL_ENSURE(s_nRefCount, "OPropertyArrayUsageHelper::getArrayHelper : suspicious call : have a refcount of 0 !");
			if (!s_pProps) {
				::osl::MutexGuard aGuard(s_aMutex);
				if (!s_pProps) {
					s_pProps = createArrayHelper();
					OSL_ENSURE(s_pProps, "OPropertyArrayUsageHelper::getArrayHelper : createArrayHelper returned nonsense !");
				}
			}
			return s_pProps;
		}


		class OBase_Mutex
		{
		public:
			::osl::Mutex m_aMutex;
		};

		namespace internal
		{
			template <class T>
			void implCopySequence(const T* _pSource, T*& _pDest, sal_Int32 _nSourceLen)
			{
				for (sal_Int32 i=0; i<_nSourceLen; ++i, ++_pSource, ++_pDest)
					*_pDest = *_pSource;
			}
		}
		//-------------------------------------------------------------------------
		/// concat two sequences
		template <class T>
		::com::sun::star::uno::Sequence<T> concatSequences(const ::com::sun::star::uno::Sequence<T>& _rLeft, const ::com::sun::star::uno::Sequence<T>& _rRight)
		{
			sal_Int32 nLeft(_rLeft.getLength()), nRight(_rRight.getLength());
			const T* pLeft = _rLeft.getConstArray();
			const T* pRight = _rRight.getConstArray();

			sal_Int32 nReturnLen(nLeft + nRight);
			::com::sun::star::uno::Sequence<T> aReturn(nReturnLen);
			T* pReturn = aReturn.getArray();

			internal::implCopySequence(pLeft, pReturn, nLeft);
			internal::implCopySequence(pRight, pReturn, nRight);

			return aReturn;
		}


#define DECLARE_SERVICE_INFO()	\
	virtual ::rtl::OUString SAL_CALL getImplementationName() throw (::com::sun::star::uno::RuntimeException);	\
	virtual sal_Bool SAL_CALL supportsService(const ::rtl::OUString& ServiceName) throw(::com::sun::star::uno::RuntimeException);	\
	virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException)	\

#define IMPLEMENT_SERVICE_INFO(classname, implasciiname, serviceasciiname)	\
	::rtl::OUString SAL_CALL classname::getImplementationName() throw (::com::sun::star::uno::RuntimeException)	\
	{	\
		return ::rtl::OUString::createFromAscii(implasciiname);	\
	}	\
	::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL classname::getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException)	\
	{	\
		::com::sun::star::uno::Sequence< ::rtl::OUString > aSupported(1);	\
		aSupported[0] = ::rtl::OUString::createFromAscii(serviceasciiname);	\
		return aSupported;	\
	}	\
	sal_Bool SAL_CALL classname::supportsService(const ::rtl::OUString& _rServiceName) throw(::com::sun::star::uno::RuntimeException)	\
	{	\
		Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames());				\
		const ::rtl::OUString* pSupported = aSupported.getConstArray();					\
		const ::rtl::OUString* pEnd = pSupported + aSupported.getLength();				\
		for (;pSupported != pEnd && !pSupported->equals(_rServiceName); ++pSupported)	\
			;																			\
		return pSupported != pEnd;														\
	}	\


	}
}
#endif // _CONNECTIVITY_OSUBCOMPONENT_HXX_
