/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_svl.hxx"
#include <ctype.h>
#include <stdio.h>
#include <com/sun/star/beans/PropertyValues.hpp>

#include <svl/ownlist.hxx>

using namespace com::sun::star;

//=========================================================================
//============== SvCommandList ============================================
//=========================================================================
PRV_SV_IMPL_OWNER_LIST(SvCommandList,SvCommand)


static String parseString(const String & rCmd, sal_uInt16 * pIndex)
{
	String result;

	if(rCmd.GetChar( *pIndex ) == '\"') {
		(*pIndex) ++;

		sal_uInt16 begin = *pIndex;

		while(*pIndex < rCmd.Len() && rCmd.GetChar((*pIndex) ++) != '\"') ;

		result = String(rCmd.Copy(begin, *pIndex - begin - 1));
	}

	return result;
}

static String parseWord(const String & rCmd, sal_uInt16 * pIndex)
{
	sal_uInt16 begin = *pIndex;

	while(*pIndex < rCmd.Len() && !isspace(rCmd.GetChar(*pIndex)) && rCmd.GetChar(*pIndex) != '=')
		(*pIndex) ++;

	return String(rCmd.Copy(begin, *pIndex - begin));
}

static void eatSpace(const String & rCmd, sal_uInt16 * pIndex)
{
	while(*pIndex < rCmd.Len() && isspace(rCmd.GetChar(*pIndex)))
		(*pIndex) ++;
}


//=========================================================================
sal_Bool SvCommandList::AppendCommands
(
	const String & rCmd,	/* Dieser Text wird in Kommandos umgesetzt */
	sal_uInt16 * pEaten			/* Anzahl der Zeichen, die gelesen wurden */
)
/*	[Beschreibung]

	Es wird eine Text geparsed und die einzelnen Kommandos werden an
	die Liste angeh"angt.

	[R"uckgabewert]

	sal_Bool		sal_True, der Text wurde korrekt geparsed.
				sal_False, der Text wurde nicht korrekt geparsed.
*/
{
	sal_uInt16 index = 0;
	while(index < rCmd.Len())
	{

		eatSpace(rCmd, &index);
		String name = (rCmd.GetChar(index) == '\"') ? parseString(rCmd, &index) : parseWord(rCmd, &index);

		eatSpace(rCmd, &index);
		String value;
		if(index < rCmd.Len() && rCmd.GetChar(index) == '=')
		{
			index ++;

			eatSpace(rCmd, &index);
			value = (rCmd.GetChar(index) == '\"') ? parseString(rCmd, &index) : parseWord(rCmd, &index);
		}

		SvCommand * pCmd = new SvCommand(name, value);
		aTypes.Insert(pCmd, LIST_APPEND);
	}

	*pEaten = index;

//  	sal_uInt16 nPos = 0;
//  	while( nPos < rCmd.Len() )
//  	{
//  		// ein Zeichen ? Dann faengt hier eine Option an
//    		if( isalpha( rCmd[nPos] ) )
//  		{
//  			String aValue;
//  			sal_uInt16 nStt = nPos;
//  			register char c;

//  			while( nPos < rCmd.Len() &&
//  					( isalnum(c=rCmd[nPos]) || '-'==c || '.'==c ) )
//  				nPos++;

//  			String aToken( rCmd.Copy( nStt, nPos-nStt ) );

//  			while( nPos < rCmd.Len() &&
//  					( !String::IsPrintable( (c=rCmd[nPos]),
//  					RTL_TEXTENCODING_MS_1252 ) || isspace(c) ) )
//  				nPos++;

//  			// hat die Option auch einen Wert?
//  			if( nPos!=rCmd.Len() && '='==c )
//  			{
//  				nPos++;

//  				while( nPos < rCmd.Len() &&
//  					 	( !String::IsPrintable( (c=rCmd[nPos]),
//  						RTL_TEXTENCODING_MS_1252 ) || isspace(c) ) )
//  					nPos++;

//  				if( nPos != rCmd.Len() )
//  				{
//  					sal_uInt16 nLen = 0;
//  					nStt = nPos;
//  					if( '"' == c )
//  					{
//  						nPos++; nStt++;
//  						while( nPos < rCmd.Len() &&
//  					    	 	'"' != rCmd[nPos] )
//  							nPos++, nLen++;
//  						if( nPos!=rCmd.Len() )
//  							nPos++;
//  					}
//  					else
//  						// hier sind wir etwas laxer als der
//  						// Standard und erlauben alles druckbare
//  						while( nPos < rCmd.Len() &&
//  		 				    	String::IsPrintable( (c=rCmd[nPos]),
//  								RTL_TEXTENCODING_MS_1252 ) &&
//  								!isspace( c ) )
//  							nPos++, nLen++;

//  					if( nLen )
//  						aValue = rCmd( nStt, nLen );
//  				}
//  			}

//  			SvCommand * pCmd = new SvCommand( aToken, aValue );
//  		    aTypes.Insert( pCmd, LIST_APPEND );
//  		}
//  		else
//  			// white space un unerwartete Zeichen ignorieren wie
//  			nPos++;
//  	}
//  	*pEaten = nPos;
	return sal_True;
}

//=========================================================================
String SvCommandList::GetCommands() const
/*	[Beschreibung]

	Die Kommandos in der Liste werden als Text hintereinander, durch ein
	Leerzeichen getrennt geschrieben. Der Text muss nicht genauso
	aussehen wie der in <SvCommandList::AppendCommands()> "ubergebene.

	[R"uckgabewert]

	String		Die Kommandos werden zur"uckgegeben.
*/
{
	String aRet;
	for( sal_uLong i = 0; i < aTypes.Count(); i++ )
	{
		if( i != 0 )
			aRet += ' ';
		SvCommand * pCmd = (SvCommand *)aTypes.GetObject( i );
		aRet += pCmd->GetCommand();
		if( pCmd->GetArgument().Len() )
		{
			aRet.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "=\"" ) );
			aRet += pCmd->GetArgument();
			aRet.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "\"" ) );
		}
	}
	return aRet;
}

//=========================================================================
SvCommand & SvCommandList::Append
(
	const String & rCommand,	/* das Kommando	*/
	const String & rArg			/* dasArgument des Kommandos */
)
/*	[Beschreibung]

	Es wird eine Objekt vom Typ SvCommand erzeugt und an die Liste
	angeh"angt.

	[R"uckgabewert]

	SvCommand &		Das erteugte Objekt wird zur"uckgegeben.
*/
{
	SvCommand * pCmd = new SvCommand( rCommand, rArg );
	aTypes.Insert( pCmd, LIST_APPEND );
	return *pCmd;
}

//=========================================================================
SvStream & operator >>
(
	SvStream & rStm,     	/* Stream aus dem gelesen wird */
	SvCommandList & rThis	/* Die zu f"ullende Liste */
)
/*	[Beschreibung]

	Die Liste mit ihren Elementen wird gelesen. Das Format ist:
	1. Anzahl der Elemente
	2. Alle Elemente

	[R"uckgabewert]

	SvStream &		Der "ubergebene Stream.
*/
{
	sal_uInt32 nCount = 0;
	rStm >> nCount;
	if( !rStm.GetError() )
	{
		while( nCount-- )
		{
			SvCommand * pCmd = new SvCommand();
			rStm >> *pCmd;
			rThis.aTypes.Insert( pCmd, LIST_APPEND );
		}
	}
	return rStm;
}

//=========================================================================
SvStream & operator <<
(
	SvStream & rStm,     		/* Stream in den geschrieben wird */
	const SvCommandList & rThis	/* Die zu schreibende Liste */
)
/*	[Beschreibung]

	Die Liste mit ihren Elementen wir geschrieben. Das Format ist:
	1. Anzahl der Elemente
	2. Alle Elemente

	[R"uckgabewert]

	SvStream &		Der "ubergebene Stream.
*/
{
	sal_uInt32 nCount = rThis.aTypes.Count();
	rStm << nCount;

	for( sal_uInt32 i = 0; i < nCount; i++ )
	{
		SvCommand * pCmd = (SvCommand *)rThis.aTypes.GetObject( i );
		rStm << *pCmd;
	}
	return rStm;
}

sal_Bool SvCommandList::FillFromSequence( const com::sun::star::uno::Sequence < com::sun::star::beans::PropertyValue >& aCommandSequence )
{
	const sal_Int32 nCount = aCommandSequence.getLength();
	String aCommand, aArg;
    ::rtl::OUString aApiArg;
    for( sal_Int32 nIndex=0; nIndex<nCount; nIndex++ )
	{
		aCommand = aCommandSequence[nIndex].Name;
		if( !( aCommandSequence[nIndex].Value >>= aApiArg ) )
			return sal_False;
		aArg = aApiArg;
        Append( aCommand, aArg );
	}

    return sal_True;
}

void SvCommandList::FillSequence( com::sun::star::uno::Sequence < com::sun::star::beans::PropertyValue >& aCommandSequence )
{
    const sal_Int32 nCount = Count();
	aCommandSequence.realloc( nCount );
	for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ )
	{
        const SvCommand& rCommand = (*this)[ nIndex ];
		aCommandSequence[nIndex].Name = rCommand.GetCommand();
		aCommandSequence[nIndex].Handle = -1;
        aCommandSequence[nIndex].Value = uno::makeAny( ::rtl::OUString( rCommand.GetArgument() ) );
        aCommandSequence[nIndex].State = beans::PropertyState_DIRECT_VALUE;
	}
}

