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

#include <com/sun/star/sdbc/XDriver.hpp>
#include <com/sun/star/sdbcx/XDataDefinitionSupplier.hpp>
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
#include <com/sun/star/sdbcx/XCreateCatalog.hpp>
#include <com/sun/star/sdbcx/XDropCatalog.hpp>

#include <com/sun/star/lang/XEventListener.hpp>

//#include <unotools/tempfile.hxx>
#include <cppuhelper/implbase4.hxx>
#include "odbc/OFunctiondefs.hxx"
#include "odbc/ODriver.hxx"

namespace connectivity
{
    namespace adabas
	{
		::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL ODriver_CreateInstance(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory) throw( ::com::sun::star::uno::Exception );

        typedef ::cppu::ImplHelper4<    ::com::sun::star::sdbcx::XCreateCatalog,
							            ::com::sun::star::sdbcx::XDataDefinitionSupplier,
                                        ::com::sun::star::lang::XEventListener,
							            ::com::sun::star::sdbcx::XDropCatalog> ODriver_BASE2;

		typedef odbc::ODBCDriver ODriver_BASE;

		class ODriver : public ODriver_BASE,
						public ODriver_BASE2
		{
            typedef struct DatabaseStruct
		    {
			    ::rtl::OUString	sControlUser;
			    ::rtl::OUString	sControlPassword;
			    ::rtl::OUString	sSysUser;
			    ::rtl::OUString	sSysPassword;
			    ::rtl::OUString	sDomainPassword;
                ::rtl::OUString sCacheSize;
                ::rtl::OUString sBackupFile;
                ::rtl::OUString sDataDevName;
                ::rtl::OUString sSysDevSpace;
                ::rtl::OUString sTransLogName;
                ::rtl::OUString sDBName;
			    sal_Int32		nDataIncrement;		// which size the database should grow
                sal_Int32		nDataSize;
                sal_Int32		nLogSize;
			    sal_Bool		bShutDown;
                sal_Bool		bRestoreDatabase;

                DatabaseStruct() : nDataIncrement(0),nDataSize(0),nLogSize(0),bShutDown(sal_False),bRestoreDatabase(sal_False){ }
		    } TDatabaseStruct;

		    DECLARE_STL_USTRINGACCESS_MAP(TDatabaseStruct,TDatabaseMap);
		    TDatabaseMap	m_aDatabaseMap;	// contains all adabas databases with their flag to shut down or not

            // environment vars
		    ::rtl::OUString m_sDbWork;
		    ::rtl::OUString m_sDbConfig;
		    ::rtl::OUString m_sDbRoot;
		    ::rtl::OUString m_sDbWorkURL;
		    ::rtl::OUString m_sDbConfigURL;
		    ::rtl::OUString m_sDbRootURL;
		    ::rtl::OUString m_sDbRunDir;
		    ::rtl::OUString m_sDelimit;

		    void checkAndInsertNewDevSpace(const ::rtl::OUString& _rDBName,const TDatabaseStruct& _rDBInfo);
		    void checkAndRestart(const ::rtl::OUString& _rDBName,const TDatabaseStruct& _rDbInfo);
		    void X_CONS(const ::rtl::OUString& _DBNAME,const ::rtl::OString& _ACTION,const ::rtl::OUString& _FILENAME);
		    sal_Bool getDBName(const ::rtl::OUString& _rName,::rtl::OUString& _rDBName) const;
		    ::rtl::OUString getDatabaseInitFile(  const TDatabaseStruct& _aInfo);
		    ::rtl::OUString generateInitFile()  const;
		    void fillEnvironmentVariables();
            void fillInfo(const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info, TDatabaseStruct& _rDBInfo /*out*/);
		    void LoadBatch(const ::rtl::OUString& _rDBNAME,
					    const ::rtl::OUString& _rUSR,
					    const ::rtl::OUString& _rPWD,
					    const ::rtl::OUString& _rBatch);
		    void XUTIL(const ::rtl::OUString& _rParam,
				    const ::rtl::OUString& _DBNAME,
				    const ::rtl::OUString& _USRNAME,
				    const ::rtl::OUString& _USRPWD);		
		    int X_STOP(const ::rtl::OUString& _DBNAME);
		    int X_START(const ::rtl::OUString& _DBNAME);
		    void createDb(const TDatabaseStruct& _aInfo);
		    void clearDatabase(const ::rtl::OUString& _rDBName);
		    int X_PARAM(const ::rtl::OUString& _DBNAME,
					    const ::rtl::OUString& _USR,
					    const ::rtl::OUString& _PWD,
					    const ::rtl::OUString& _CMD);
		    sal_Int32 CreateFiles(const TDatabaseStruct& _aInfo);
		    sal_Bool CreateFile(const ::rtl::OUString &_FileName,
							    sal_Int32 _nSize);
		    void PutParam(const ::rtl::OUString& rDBNAME,
					    const ::rtl::OUString& rWhat,
					    const ::rtl::OUString& rHow);
		    void createNeededDirs(		const ::rtl::OUString& _rDBName);
            sal_Bool isKernelVersion(const char* _pVersion);
		    sal_Bool isVersion(		const ::rtl::OUString& _rDBName,
								    const char* _pVersion);

		    void convertOldVersion(		const ::rtl::OUString& _rDBName,
									    const TDatabaseStruct& _rDbInfo);

		    void installSystemTables(	const TDatabaseStruct& _aInfo);

		protected:
			virtual SQLHANDLE EnvironmentHandle(::rtl::OUString &_rPath);
			virtual ~ODriver();
		public:
			explicit ODriver(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory);

			// XInterface
            static ::rtl::OUString getImplementationName_Static(  ) throw(::com::sun::star::uno::RuntimeException);
            static ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedServiceNames_Static(  ) throw (::com::sun::star::uno::RuntimeException);
        private:
            DECLARE_SERVICE_INFO();

            virtual oslGenericFunction getOdbcFunction(sal_Int32 _nIndex)  const;
			// OComponentHelper
			virtual void SAL_CALL disposing(void);
            virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException);
			virtual void SAL_CALL acquire() throw();
            virtual void SAL_CALL release() throw();

			// XDriver
            ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL connect( const ::rtl::OUString& url, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
            virtual sal_Bool SAL_CALL acceptsURL( const ::rtl::OUString& url ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
            virtual ::com::sun::star::uno::Sequence< ::com::sun::star::sdbc::DriverPropertyInfo > SAL_CALL getPropertyInfo( const ::rtl::OUString& url, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
            virtual sal_Int32 SAL_CALL getMajorVersion(  ) throw(::com::sun::star::uno::RuntimeException);
            virtual sal_Int32 SAL_CALL getMinorVersion(  ) throw(::com::sun::star::uno::RuntimeException);

			// XDataDefinitionSupplier
            virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XTablesSupplier > SAL_CALL getDataDefinitionByConnection( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& connection ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
            virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XTablesSupplier > SAL_CALL getDataDefinitionByURL( const ::rtl::OUString& url, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);

            // XCreateCatalog
		    virtual void SAL_CALL createCatalog( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::container::ElementExistException, ::com::sun::star::uno::RuntimeException);
		    // XDropCatalog
		    virtual void SAL_CALL dropCatalog( const ::rtl::OUString& catalogName, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException);
		    // XEventListener
		    virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException);
		};
	}

}
#endif //_CONNECTIVITY_ADABAS_BDRIVER_HXX_


