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

#include <rtl/ustring.hxx>
#include <rtl/string.hxx>
#include <com/sun/star/ucb/IllegalIdentifierException.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/ucb/XCommandEnvironment.hpp>
#include <com/sun/star/io/XActiveDataSink.hpp>
#include <com/sun/star/io/XOutputStream.hpp>
#include <com/sun/star/ucb/Command.hpp>

namespace chelp {

	
	class Databases;
	

	class DbtToStringConverter
	{
	public:
	
		DbtToStringConverter( const sal_Char* ptr,sal_Int32 len )
			: m_len( len ),
              m_ptr( ptr )
		{
		}
	

		rtl::OUString getHash()
		{
			if( m_ptr )
			{
				sal_Int32 sizeOfFile = ( sal_Int32 ) m_ptr[0];
				rtl::OUString Hash( m_ptr+1,sizeOfFile,RTL_TEXTENCODING_UTF8 );
				sal_Int32 idx;
				if( ( idx = Hash.indexOf( sal_Unicode( '#' ) ) ) != -1 )
					return Hash.copy( 1+idx );
			}
			return rtl::OUString();
		}
	
		
		rtl::OUString getFile()
		{
			if( ! m_ptr )
				return rtl::OUString();
		
			sal_Int32 sizeOfFile = ( sal_Int32 ) m_ptr[0];
			rtl::OUString File( m_ptr+1,sizeOfFile,RTL_TEXTENCODING_UTF8 );
			sal_Int32 idx;
			if( ( idx = File.indexOf( sal_Unicode( '#' ) ) ) != -1 )
				return File.copy( 0,idx );
			else
				return File;
		}

	
		rtl::OUString getDatabase()
		{
			if( ! m_ptr )
				return rtl::OUString();  	
		
			sal_Int32 sizeOfDatabase = ( int ) m_ptr[ 1+ ( sal_Int32 ) m_ptr[0] ];
			return rtl::OUString( m_ptr + 2 + ( sal_Int32 ) m_ptr[0],sizeOfDatabase,RTL_TEXTENCODING_UTF8 );
		}
	
	
		rtl::OUString getTitle()
		{
			if( ! m_ptr ) // || getHash().getLength() )
				return rtl::OUString();
            
			sal_Int32 sizeOfTitle =
				( sal_Int32 ) m_ptr[  2 + m_ptr[0] +  ( sal_Int32 ) m_ptr[ 1+ ( sal_Int32 ) m_ptr[0] ] ];
			return rtl::OUString( m_ptr + 3 + m_ptr[0] +  ( sal_Int32 ) m_ptr[ 1+ ( sal_Int32 ) m_ptr[0] ],
								  sizeOfTitle,
								  RTL_TEXTENCODING_UTF8 );
		}

	
	private:

		sal_Int32 m_len;
	
		const sal_Char* m_ptr;

	};


	
	
	class URLParameter
	{
	public:
		
		URLParameter( const rtl::OUString& aURL,
					  Databases* pDatabases ) 
			throw( com::sun::star::ucb::IllegalIdentifierException );
		
		bool isPicture() 		{ return m_aModule.compareToAscii("picture") == 0; }
		bool isActive()         { return m_aActive.getLength() > 0 && m_aActive.compareToAscii( "true" ) == 0; }
		bool isQuery()          { return m_aId.compareToAscii("") == 0 && m_aQuery.compareToAscii("") != 0; }
		bool isEntryForModule() { return m_aId.compareToAscii("start") == 0 || m_bStart; }
		bool isFile()           { return m_aId.compareToAscii( "" ) != 0; }
		bool isModule()         { return m_aId.compareToAscii("") == 0 && m_aModule.compareToAscii("") != 0; }
		bool isRoot()           { return m_aModule.compareToAscii("") == 0; }
		bool isErrorDocument();
		
		rtl::OUString get_url() { return m_aURL; }
	
		rtl::OUString get_id();
		
		rtl::OUString get_tag();

		//  Not called for an directory
		
		rtl::OUString get_path()   { return get_the_path(); }
		
		rtl::OUString get_eid()    { return m_aEid; } 
		
		rtl::OUString get_title();
		
		rtl::OUString get_jar()      { return get_the_jar(); }      // BerkeleyDb
		
		rtl::OUString get_ExtensionRegistryPath()    { return m_aExtensionRegistryPath; }
		
		rtl::OUString get_module()   { return m_aModule; }

        rtl::OUString get_dbpar()    { 
            if( m_aDbPar.getLength() ) return m_aDbPar;
            else return m_aModule;
        }
		
		rtl::OUString get_prefix()   { return m_aPrefix; }
		
		rtl::OUString get_language();

		rtl::OUString get_device()   { return m_aDevice; }

		rtl::OUString get_program();
		
		rtl::OUString get_query()    { return m_aQuery; }
	
		rtl::OUString get_scope()    { return m_aScope; }
		
		rtl::OUString get_system()   { return m_aSystem; }
 	    
		sal_Int32     get_hitCount() { return m_nHitCount; }

		rtl::OString getByName( const char* par );

		void open( const com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >& rxSMgr,
				   const com::sun::star::ucb::Command& aCommand,
				   sal_Int32 CommandId,
				   const com::sun::star::uno::Reference< com::sun::star::ucb::XCommandEnvironment >& Environment,
				   const com::sun::star::uno::Reference< com::sun::star::io::XActiveDataSink >& xDataSink );

		void open( const com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >& rxSMgr,
				   const com::sun::star::ucb::Command& aCommand,
				   sal_Int32 CommandId,
				   const com::sun::star::uno::Reference< com::sun::star::ucb::XCommandEnvironment >& Environment,
				   const com::sun::star::uno::Reference< com::sun::star::io::XOutputStream >& xDataSink );
		
	private:

		Databases* m_pDatabases;

		bool m_bBerkeleyRead;
		bool m_bStart;
		bool m_bUseDB;
        
		rtl::OUString  m_aURL;
		
		rtl::OUString  m_aTag;
		rtl::OUString  m_aId;
		rtl::OUString  m_aPath;
		rtl::OUString  m_aModule;
		rtl::OUString  m_aTitle;
		rtl::OUString  m_aJar;
		rtl::OUString  m_aExtensionRegistryPath;
		rtl::OUString  m_aEid;
		rtl::OUString  m_aDbPar;
        
		rtl::OUString  m_aDefaultLanguage;
		rtl::OUString  m_aLanguage;
		
		rtl::OUString  m_aPrefix;
		rtl::OUString  m_aDevice;
		rtl::OUString  m_aProgram;
		rtl::OUString  m_aSystem;
		rtl::OUString  m_aActive;
		
		rtl::OUString  m_aQuery;
		rtl::OUString  m_aScope;

		rtl::OUString m_aExpr;
		
		sal_Int32      m_nHitCount;                // The default maximum hitcount


		// private methods 

		void init( bool bDefaultLanguageIsInitialized );
		
		rtl::OUString get_the_tag();

		rtl::OUString get_the_path();
		
		rtl::OUString get_the_title();

		rtl::OUString get_the_jar();

		void readBerkeley();
		
		void parse() throw( com::sun::star::ucb::IllegalIdentifierException );
		
		bool scheme();

		bool module();

		bool name( bool modulePresent );
	
		bool query();

	};   // end class URLParameter

	
}  // end namespace chelp

#endif
