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

#include <rtl/ustring.hxx>
#include <osl/mutex.hxx>
#include <ucbhelper/providerhelper.hxx>
#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
#include <com/sun/star/container/XContainerListener.hpp>
#include <com/sun/star/container/XContainer.hpp>
#include <com/sun/star/lang/XComponent.hpp>


namespace chelp {

//=========================================================================

// UNO service name for the provider. This name will be used by the UCB to
// create instances of the provider.

//#define MYUCP_CONTENT_PROVIDER_SERVICE_NAME         "com.sun.star.ucb.CHelpContentProvider"
#define MYUCP_CONTENT_PROVIDER_SERVICE_NAME1   "com.sun.star.help.XMLHelp"
#define MYUCP_CONTENT_PROVIDER_SERVICE_NAME_LENGTH1	25

#define MYUCP_CONTENT_PROVIDER_SERVICE_NAME2  "com.sun.star.ucb.HelpContentProvider"
#define MYUCP_CONTENT_PROVIDER_SERVICE_NAME_LENGTH2	36

// URL scheme. This is the scheme the provider will be able to create
// contents for. The UCB will select the provider ( i.e. in order to create
// contents ) according to this scheme.

#define MYUCP_URL_SCHEME        "vnd.sun.star.help"
#define MYUCP_URL_SCHEME_LENGTH	18
#define MYUCP_CONTENT_TYPE      "application/vnd.sun.star.xmlhelp"    // UCB Content Type.

//=========================================================================


	class Databases;


	class ContentProvider :
		public ::ucbhelper::ContentProviderImplHelper,
		public ::com::sun::star::container::XContainerListener,
		public ::com::sun::star::lang::XComponent
	{
	public:
		ContentProvider(
			const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rSMgr );

		virtual ~ContentProvider();

		// XInterface
		XINTERFACE_DECL()

			// XTypeProvider
			XTYPEPROVIDER_DECL()

			// XServiceInfo
			XSERVICEINFO_DECL()

			// XContentProvider
			virtual ::com::sun::star::uno::Reference<
		::com::sun::star::ucb::XContent > SAL_CALL
		queryContent( const ::com::sun::star::uno::Reference<
					  ::com::sun::star::ucb::XContentIdentifier >& Identifier )
			throw( ::com::sun::star::ucb::IllegalIdentifierException,
				   ::com::sun::star::uno::RuntimeException );

		//////////////////////////////////////////////////////////////////////
		// Additional interfaces
		//////////////////////////////////////////////////////////////////////

		// XComponent

		virtual void SAL_CALL
		dispose(  )
			throw (::com::sun::star::uno::RuntimeException);

		virtual void SAL_CALL
		addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& xListener )
			throw (::com::sun::star::uno::RuntimeException)
		{
			(void)xListener;
		}

		virtual void SAL_CALL
		removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& aListener )
			throw (::com::sun::star::uno::RuntimeException)
		{
			(void)aListener;
		}

		// XConainerListener ( deriver from XEventListener )

		virtual void SAL_CALL
		disposing( const ::com::sun::star::lang::EventObject& Source )
			throw (::com::sun::star::uno::RuntimeException)
		{
			(void)Source;
			m_xContainer = com::sun::star::uno::Reference<com::sun::star::container::XContainer>(0);
		}

		virtual void SAL_CALL
		elementInserted( const ::com::sun::star::container::ContainerEvent& Event )
			throw (::com::sun::star::uno::RuntimeException)
		{
			(void)Event;
		}

		virtual void SAL_CALL
		elementRemoved( const ::com::sun::star::container::ContainerEvent& Event )
			throw (::com::sun::star::uno::RuntimeException)
		{
			(void)Event;
		}

		virtual void SAL_CALL
		elementReplaced( const ::com::sun::star::container::ContainerEvent& Event )
			throw (::com::sun::star::uno::RuntimeException);


		//////////////////////////////////////////////////////////////////////
		// Non-interface methods.
		//////////////////////////////////////////////////////////////////////

	private:

		osl::Mutex     m_aMutex;
		bool           isInitialized;
		rtl::OUString  m_aScheme;
		Databases*     m_pDatabases;
		com::sun::star::uno::Reference<com::sun::star::container::XContainer> m_xContainer;

		// private methods

		void init();

		::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >
		getConfiguration() const;

		::com::sun::star::uno::Reference< ::com::sun::star::container::XHierarchicalNameAccess >
		getHierAccess( const ::com::sun::star::uno::Reference<  ::com::sun::star::lang::XMultiServiceFactory >& sProvider,
					   const char* file ) const;

		::rtl::OUString
		getKey( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XHierarchicalNameAccess >& xHierAccess,
				const char* key ) const;

	  sal_Bool
	  getBooleanKey(
					const ::com::sun::star::uno::Reference<
					::com::sun::star::container::XHierarchicalNameAccess >& xHierAccess,
					const char* key) const;

	  void subst( rtl::OUString& instpath ) const;
	};

}

#endif
