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

#include <com/sun/star/uno/Reference.hxx>
#include "abptypes.hxx"

//========================================================================
namespace com { namespace sun { namespace star {
	namespace lang {
		class XMultiServiceFactory;
	}
	namespace beans {
		class XPropertySet;
	}
} } }

class Window;


//.........................................................................
namespace abp
{
//.........................................................................

	//=====================================================================
	//= ODataSourceContext
	//=====================================================================
	struct ODataSourceContextImpl;
	class ODataSource;
	/// a non-UNO wrapper for the data source context
	class ODataSourceContext
	{
	private:
		ODataSourceContextImpl*		m_pImpl;

	public:
		ODataSourceContext(
			const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB
		);

		/// retrieves the names of all data sources
		void	getDataSourceNames( StringBag& _rNames ) const SAL_THROW (( ));

		/// disambiguates the given name by appending auccessive numbers
		::rtl::OUString& disambiguate(::rtl::OUString& _rDataSourceName);

		/// creates a new MORK data source
		ODataSource createNewMORK( const ::rtl::OUString& _rName ) SAL_THROW (( ));

		/// creates a new Thunderbird data source
		ODataSource createNewThunderbird( const ::rtl::OUString& _rName ) SAL_THROW (( ));

		/// creates a new Evolution local data source
		ODataSource createNewEvolution( const ::rtl::OUString& _rName ) SAL_THROW (( ));

		/// creates a new Evolution LDAP data source
		ODataSource createNewEvolutionLdap( const ::rtl::OUString& _rName ) SAL_THROW (( ));

		/// creates a new Evolution GROUPWISE data source
		ODataSource createNewEvolutionGroupwise( const ::rtl::OUString& _rName ) SAL_THROW (( ));

		/// creates a new KDE address book data source
		ODataSource createNewKab( const ::rtl::OUString& _rName ) SAL_THROW (( ));

		/// creates a new Mac OS X address book data source
		ODataSource createNewMacab( const ::rtl::OUString& _rName ) SAL_THROW (( ));

		/// creates a new LDAP data source
		ODataSource	createNewLDAP( const ::rtl::OUString& _rName ) SAL_THROW (( ));

		/// creates a new Outlook data source
		ODataSource	createNewOutlook( const ::rtl::OUString& _rName ) SAL_THROW (( ));

		/// creates a new Outlook express data source
		ODataSource	createNewOE( const ::rtl::OUString& _rName ) SAL_THROW (( ));

		/// creates a new dBase data source
		ODataSource	createNewDBase( const ::rtl::OUString& _rName ) SAL_THROW (( ));
	};

	//=====================================================================
	//= ODataSource
	//=====================================================================
	struct ODataSourceImpl;
	struct PackageAccessControl;
	/** a non-UNO wrapper for a data source
		<p>This class allows to access data sources without the need to compile the respective file with
		exception handling enabled (hopefully :).</p>
		<p>In addition to wrapping an UNO data source, an instance of this class can handle at most
		one valid connection, as obtained from the data source.</p>
	*/
	class ODataSource
	{
	private:
		ODataSourceImpl*	m_pImpl;

	public:
		// ----------------------------------------------------------------
		// - ctor/dtor/assignment
		// ----------------------------------------------------------------
		/// constructs an object which is initially invalid
		ODataSource(
			const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB
		);

		/// copy ctor
		ODataSource( const ODataSource& _rSource );

		/// dtor
		~ODataSource( );

		/// assignment
		ODataSource& operator=( const ODataSource& _rSource );

		// ----------------------------------------------------------------
		/// checks whether or not the object represents a valid data source
		sal_Bool	isValid() const SAL_THROW (( ));

		// ----------------------------------------------------------------
		/// removes the data source represented by the object from the data source context
		void		remove() SAL_THROW (( ));
			// TODO: put this into the context class

		/// returns the name of the data source
		::rtl::OUString
					getName() const SAL_THROW (( ));

		/// renames the data source
		sal_Bool	rename( const ::rtl::OUString& _rName ) SAL_THROW (( ));
			// TODO: put this into the context class

		// ----------------------------------------------------------------
		// - connection handling
		// ----------------------------------------------------------------
		/** connects to the data source represented by this object
			@param _pMessageParent
				the window to use as parent for any error messages. If this is <NULL/>, no messages are displayed
				at all.
			@see isConnected
		*/
		sal_Bool	connect( Window* _pMessageParent ) SAL_THROW (( ));

		/// returns <TRUE/> if the object has a valid connection, obtained from it's data source
		sal_Bool	isConnected( ) const SAL_THROW (( ));

		/// disconnects from the data source (i.e. disposes the UNO connection hold internally)
		void		disconnect( ) SAL_THROW (( ));

		/// stores the database file
		void		store() SAL_THROW (( ));

		/// register the data source under the given name in the configuration
		void		registerDataSource( const ::rtl::OUString& _sRegisteredDataSourceName )  SAL_THROW (( ));

		// ----------------------------------------------------------------
		/** retrieves the tables names from the connection
			<p>to be called when <method>isConnection</method> returns <TRUE/> only</p>
		*/
		const StringBag&	getTableNames() const SAL_THROW (( ));

        /** determines whether a given table exists
        */
        bool    hasTable( const ::rtl::OUString& _rTableName ) const;

		/// return the intern data source object
		::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > getDataSource() const SAL_THROW (( ));


		// ----------------------------------------------------------------
		/** set a new data source.
			<p>Available to selected clients only</p>
		*/
		void		setDataSource(
			const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxDS
			,const ::rtl::OUString& _sName
			,PackageAccessControl
		);

	private:
		ODataSource( ); // never implemented
	};

//.........................................................................
}	// namespace abp
//.........................................................................

#endif // EXTENSIONS_ABP_DATASOURCEHANDLING_HXX

