/**************************************************************
 *
 * 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_connectivity.hxx"

#include "file/FStringFunctions.hxx"
#include <rtl/ustrbuf.hxx>
#include <rtl/logfile.hxx>

using namespace connectivity;
using namespace connectivity::file;
//------------------------------------------------------------------
ORowSetValue OOp_Upper::operate(const ORowSetValue& lhs) const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_Upper::operate" );
	if ( lhs.isNull() )
		return lhs;

	return lhs.getString().toAsciiUpperCase();
}
//------------------------------------------------------------------
ORowSetValue OOp_Lower::operate(const ORowSetValue& lhs) const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_Lower::operate" );
	if ( lhs.isNull() )
		return lhs;

	return lhs.getString().toAsciiLowerCase();
}
//------------------------------------------------------------------
ORowSetValue OOp_Ascii::operate(const ORowSetValue& lhs) const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_Ascii::operate" );
	if ( lhs.isNull() )
		return lhs;
	::rtl::OString sStr(::rtl::OUStringToOString(lhs,RTL_TEXTENCODING_ASCII_US));
	sal_Int32 nAscii = sStr.toChar();
	return nAscii;
}
//------------------------------------------------------------------
ORowSetValue OOp_CharLength::operate(const ORowSetValue& lhs) const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_CharLength::operate" );
	if ( lhs.isNull() )
		return lhs;

	return lhs.getString().getLength();
}
//------------------------------------------------------------------
ORowSetValue OOp_Char::operate(const ::std::vector<ORowSetValue>& lhs) const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_Char::operate" );
	if ( lhs.empty() )
		return ORowSetValue();

	::rtl::OUString sRet;
	::std::vector<ORowSetValue>::const_reverse_iterator aIter = lhs.rbegin();
	::std::vector<ORowSetValue>::const_reverse_iterator aEnd = lhs.rend();
	for (; aIter != aEnd; ++aIter)
	{
		if ( !aIter->isNull() )
		{
			sal_Char c = static_cast<sal_Char>(static_cast<sal_Int32>(*aIter));

			sRet += ::rtl::OUString(&c,1,RTL_TEXTENCODING_ASCII_US);
		}
	}

	return sRet;
}
//------------------------------------------------------------------
ORowSetValue OOp_Concat::operate(const ::std::vector<ORowSetValue>& lhs) const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_Concat::operate" );
	if ( lhs.empty() )
		return ORowSetValue();

	::rtl::OUStringBuffer sRet;
	::std::vector<ORowSetValue>::const_reverse_iterator aIter = lhs.rbegin();
	::std::vector<ORowSetValue>::const_reverse_iterator aEnd = lhs.rend();
	for (; aIter != aEnd; ++aIter)
	{
		if ( aIter->isNull() )
			return ORowSetValue();

		sRet.append(aIter->operator ::rtl::OUString());
	}

	return sRet.makeStringAndClear();
}
//------------------------------------------------------------------
ORowSetValue OOp_Locate::operate(const ::std::vector<ORowSetValue>& lhs) const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_Locate::operate" );
	::std::vector<ORowSetValue>::const_iterator aIter = lhs.begin();
	::std::vector<ORowSetValue>::const_iterator aEnd = lhs.end();
	for (; aIter != aEnd; ++aIter)
	{
		if ( aIter->isNull() )
			return ORowSetValue();
	}
	if ( lhs.size() == 2 )
		return ::rtl::OUString::valueOf(lhs[0].getString().indexOf(lhs[1].getString())+1);

	else if ( lhs.size() != 3 )
		return ORowSetValue();

	return lhs[1].getString().indexOf(lhs[2].getString(),lhs[0]) + 1;
}
//------------------------------------------------------------------
ORowSetValue OOp_SubString::operate(const ::std::vector<ORowSetValue>& lhs) const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_SubString::operate" );
	::std::vector<ORowSetValue>::const_iterator aIter = lhs.begin();
	::std::vector<ORowSetValue>::const_iterator aEnd = lhs.end();
	for (; aIter != aEnd; ++aIter)
	{
		if ( aIter->isNull() )
			return ORowSetValue();
	}
	if ( lhs.size() == 2 && static_cast<sal_Int32>(lhs[0]) >= sal_Int32(0) )
		return lhs[1].getString().copy(static_cast<sal_Int32>(lhs[0])-1);

	else if ( lhs.size() != 3 || static_cast<sal_Int32>(lhs[1]) < sal_Int32(0))
		return ORowSetValue();

	return lhs[2].getString().copy(static_cast<sal_Int32>(lhs[1])-1,lhs[0]);
}
//------------------------------------------------------------------
ORowSetValue OOp_LTrim::operate(const ORowSetValue& lhs) const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_LTrim::operate" );
	if ( lhs.isNull() )
		return lhs;

	::rtl::OUString sRet = lhs;
	::rtl::OUString sNew = sRet.trim();
	return sRet.copy(sRet.indexOf(sNew));
}
//------------------------------------------------------------------
ORowSetValue OOp_RTrim::operate(const ORowSetValue& lhs) const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_RTrim::operate" );
	if ( lhs.isNull() )
		return lhs;

	::rtl::OUString sRet = lhs;
	::rtl::OUString sNew = sRet.trim();
	return sRet.copy(0,sRet.lastIndexOf(sNew.getStr()[sNew.getLength()-1])+1);
}
//------------------------------------------------------------------
ORowSetValue OOp_Space::operate(const ORowSetValue& lhs) const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_Space::operate" );
	if ( lhs.isNull() )
		return lhs;

	const sal_Char c = ' ';
	::rtl::OUStringBuffer sRet;
	sal_Int32 nCount = lhs;
	for (sal_Int32 i=0; i < nCount; ++i)
	{
		sRet.appendAscii(&c,1);
	}
	return sRet.makeStringAndClear();
}
//------------------------------------------------------------------
ORowSetValue OOp_Replace::operate(const ::std::vector<ORowSetValue>& lhs) const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_Replace::operate" );
	if ( lhs.size() != 3 )
		return ORowSetValue();

	::rtl::OUString sStr  = lhs[2];
	::rtl::OUString sFrom = lhs[1];
	::rtl::OUString sTo   = lhs[0];
	sal_Int32 nIndexOf = sStr.indexOf(sFrom);
	while( nIndexOf != -1 )
	{
		sStr = sStr.replaceAt(nIndexOf,sFrom.getLength(),sTo);
		nIndexOf = sStr.indexOf(sFrom,nIndexOf + sTo.getLength());
	}

	return sStr;
}
//------------------------------------------------------------------
ORowSetValue OOp_Repeat::operate(const ORowSetValue& lhs,const ORowSetValue& rhs) const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_Repeat::operate" );
	if ( lhs.isNull() || rhs.isNull() )
		return lhs;

	::rtl::OUString sRet;
	sal_Int32 nCount = rhs;
	for (sal_Int32 i=0; i < nCount; ++i)
	{
		sRet += lhs;
	}
	return sRet;
}
//------------------------------------------------------------------
ORowSetValue OOp_Insert::operate(const ::std::vector<ORowSetValue>& lhs) const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_Insert::operate" );
	if ( lhs.size() != 4 )
		return ORowSetValue();

	::rtl::OUString sStr = lhs[3];

	sal_Int32 nStart = static_cast<sal_Int32>(lhs[2]);
	if ( nStart < 1 )
		nStart = 1;
	return sStr.replaceAt(nStart-1,static_cast<sal_Int32>(lhs[1]),lhs[0]);
}
//------------------------------------------------------------------
ORowSetValue OOp_Left::operate(const ORowSetValue& lhs,const ORowSetValue& rhs) const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_Left::operate" );
	if ( lhs.isNull() || rhs.isNull() )
		return lhs;

	::rtl::OUString sRet = lhs;
	sal_Int32 nCount = rhs;
	if ( nCount < 0 )
		return ORowSetValue();
	return sRet.copy(0,nCount);
}
//------------------------------------------------------------------
ORowSetValue OOp_Right::operate(const ORowSetValue& lhs,const ORowSetValue& rhs) const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_Right::operate" );
	if ( lhs.isNull() || rhs.isNull() )
		return lhs;

	sal_Int32 nCount = rhs;
	::rtl::OUString sRet = lhs;
	if ( nCount < 0 || nCount >= sRet.getLength() )
		return ORowSetValue();

	return sRet.copy(sRet.getLength()-nCount,nCount);
}
