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

#include <precomp.h>
#include <s2_luidl/pe_func2.hxx>


// NOT FULLY DEFINED SERVICES
#include <ary/idl/i_function.hxx>
#include <ary/idl/i_type.hxx>
#include <ary/idl/i_gate.hxx>
#include <ary/idl/ip_ce.hxx>
#include <ary/idl/ip_type.hxx>
#include <ary/doc/d_oldidldocu.hxx>
#include <s2_luidl/pe_type2.hxx>
#include <s2_luidl/pe_vari2.hxx>
#include <s2_luidl/tk_keyw.hxx>
#include <s2_luidl/tk_ident.hxx>
#include <s2_luidl/tk_punct.hxx>
#include <x_parse2.hxx>


namespace csi
{
namespace uidl
{


PE_Function::PE_Function( const RParent &	    i_rCurInterface )
	:	eState(e_none),
		sData_Name(),
        nData_ReturnType(0),
        bData_Oneway(false),
        pCurFunction(0),
		pCurParent(&i_rCurInterface),
		pPE_Type(0),
		nCurParsedType(0),
		sName(),
		pPE_Variable(0),
		eCurParsedParam_Direction(ary::idl::param_in),
		nCurParsedParam_Type(0),
		sCurParsedParam_Name(),
		bIsForConstructors(false)
{
	pPE_Type 		= new PE_Type(nCurParsedType);
	pPE_Variable 	= new PE_Variable(nCurParsedParam_Type, sCurParsedParam_Name);
}

PE_Function::PE_Function( const RParent &	  i_rCurService,
						  E_Constructor        )
	:	eState(expect_name),
		sData_Name(),
        nData_ReturnType(0),
        bData_Oneway(false),
        pCurFunction(0),
		pCurParent(&i_rCurService),
		pPE_Type(0),
		nCurParsedType(0),
		sName(),
		pPE_Variable(0),
		eCurParsedParam_Direction(ary::idl::param_in),
		nCurParsedParam_Type(0),
		sCurParsedParam_Name(),
		bIsForConstructors(true)
{
	pPE_Type 		= new PE_Type(nCurParsedType);
	pPE_Variable 	= new PE_Variable(nCurParsedParam_Type, sCurParsedParam_Name);
}

void
PE_Function::EstablishContacts( UnoIDL_PE *				 io_pParentPE,
								ary::Repository &	     io_rRepository,
								TokenProcessing_Result & o_rResult )
{
	UnoIDL_PE::EstablishContacts(io_pParentPE,io_rRepository,o_rResult);
	pPE_Type->EstablishContacts(this,io_rRepository,o_rResult);
	pPE_Variable->EstablishContacts(this,io_rRepository,o_rResult);
}

PE_Function::~PE_Function()
{
}

void
PE_Function::ProcessToken( const Token & i_rToken )
{
	i_rToken.Trigger(*this);
}

void
PE_Function::Process_Stereotype( const TokStereotype & i_rToken )
{
	if (eState == e_start)
	{
		switch (i_rToken.Id())
		{
			case TokStereotype::ste_oneway:
						bData_Oneway = true;
						SetResult(done, stay);
						break;
			default:
						OnDefault();
		}	// end switch
	}
	else
		OnDefault();
}

void
PE_Function::Process_Identifier( const TokIdentifier & i_rToken )
{
	switch (eState)
    {
		case e_start:
					GoIntoReturnType();
					break;
		case expect_name:
					sData_Name = i_rToken.Text();
					SetResult(done,stay);
					eState = expect_params_list;

					if (NOT bIsForConstructors)
					{
                        pCurFunction = &Gate().Ces().Store_Function(
                                                        *pCurParent,
                                                        sData_Name,
                                                        nData_ReturnType,
                                                        bData_Oneway );
					}
					else
					{
                        pCurFunction = &Gate().Ces().Store_ServiceConstructor(
                                                        *pCurParent,
                                                        sData_Name );
					}
	                PassDocuAt(*pCurFunction);
					break;
		case expect_parameter_variable:
					GoIntoParameterVariable();
					break;
		case expect_exception:
					GoIntoException();
					break;
		default:
        			OnDefault();
	}
}

void
PE_Function::Process_Punctuation( const TokPunctuation & i_rToken )
{
	switch (eState)
	{
		case e_start:
					SetResult(done,stay);
					break;
		case expect_params_list:
					if (i_rToken.Id() != TokPunctuation::BracketOpen)
					{
						OnDefault();
						return;
					}
					SetResult(done,stay);
					eState = expect_parameter;
					break;
		case expect_parameter:
					if (i_rToken.Id() == TokPunctuation::BracketClose)
					{
						SetResult(done,stay);
						eState = params_finished;
					}
					else
					{
						OnDefault();
						return;
					}
					break;
		case expect_parameter_separator:
					if (i_rToken.Id() == TokPunctuation::Comma)
					{
						SetResult(done,stay);
						eState = expect_parameter;
					}
					else if (i_rToken.Id() == TokPunctuation::BracketClose)
					{
						SetResult(done,stay);
						eState = params_finished;
					}
					else
					{
						OnDefault();
						return;
					}
					break;
		case params_finished:
		case exceptions_finished:
					if (i_rToken.Id() != TokPunctuation::Semicolon)
					{
						OnDefault();
						return;
					}
					SetResult(done,pop_success);
					eState = e_none;
					break;
		case expect_exceptions_list:
					if (i_rToken.Id() != TokPunctuation::BracketOpen)
					{
						OnDefault();
						return;
					}
					SetResult(done,stay);
					eState = expect_exception;
					break;
		case expect_exception_separator:
					if (i_rToken.Id() == TokPunctuation::Comma)
					{
						SetResult(done,stay);
						eState = expect_exception;
					}
					else if (i_rToken.Id() == TokPunctuation::BracketClose)
					{
						SetResult(done,stay);
						eState = exceptions_finished;
					}
					else
					{
						OnDefault();
						return;
					}
					break;
		default:
					OnDefault();
	}
}

void
PE_Function::Process_BuiltInType( const TokBuiltInType & i_rToken )
{
	switch (eState)
	{
		case e_start:
				GoIntoReturnType();
				break;
		case expect_parameter_variable:
   				GoIntoParameterVariable();
                break;
		case expect_parameter_separator:
                if (i_rToken.Id() != TokBuiltInType::bty_ellipse)
                {
                    OnDefault();
                }
                else
                {
                    pCurFunction->Set_Ellipse();
                   	SetResult(done,stay);
		        	// eState stays the same, because we wait for the closing ")" now.
                }
		        break;
		case expect_exception:
				GoIntoException();
				break;
		default:
			OnDefault();
	}	// end switch
}

void
PE_Function::Process_ParameterHandling( const TokParameterHandling & i_rToken )
{
	if (eState != expect_parameter)
	{
		OnDefault();
		return;
	}

	switch (i_rToken.Id())
	{
		case TokParameterHandling::ph_in:
					eCurParsedParam_Direction = ary::idl::param_in;
					break;
		case TokParameterHandling::ph_out:
					eCurParsedParam_Direction = ary::idl::param_out;
					break;
		case TokParameterHandling::ph_inout:
					eCurParsedParam_Direction = ary::idl::param_inout;
					break;
		default:
					csv_assert(false);
	}
	SetResult(done,stay);
	eState = expect_parameter_variable;
}

void
PE_Function::Process_Raises()
{
	if (eState != params_finished)
	{
		OnDefault();
		return;
	}
	SetResult(done,stay);
	eState = expect_exceptions_list;
}

void
PE_Function::Process_Default()
{
	switch (eState)
	{
		case e_start:
				GoIntoReturnType();
				break;
		case expect_parameter_variable:
				GoIntoParameterVariable();
				break;
		case expect_exception:
				GoIntoException();
				break;
		default:
			OnDefault();
	}	// end switch
}

void
PE_Function::GoIntoReturnType()
{
	SetResult(not_done, push_sure, pPE_Type.Ptr());
	eState = in_return_type;
}

void
PE_Function::GoIntoParameterVariable()
{
	SetResult(not_done, push_sure, pPE_Variable.Ptr());
	eState = in_parameter_variable;
}

void
PE_Function::GoIntoException()
{
	SetResult(not_done, push_sure, pPE_Type.Ptr());
	eState = in_exception;
}

void
PE_Function::OnDefault()
{
	throw X_AutodocParser(X_AutodocParser::x_Any);
}

void
PE_Function::InitData()
{
	eState = e_start;

	sData_Name.clear();
    nData_ReturnType = 0;
    bData_Oneway = false;
    pCurFunction = 0;

	nCurParsedType = 0;
	eCurParsedParam_Direction = ary::idl::param_in;
	nCurParsedParam_Type = 0;
	sCurParsedParam_Name.clear();

	if (bIsForConstructors)
	{
        eState = expect_name;
	}
}

void
PE_Function::ReceiveData()
{
	switch (eState)
	{
		case in_return_type:
				nData_ReturnType = nCurParsedType;
				nCurParsedType = 0;
				eState = expect_name;
				break;
		case in_parameter_variable:
                csv_assert(pCurFunction != 0);
				pCurFunction->Add_Parameter(
                                    sCurParsedParam_Name,
									nCurParsedParam_Type,
									eCurParsedParam_Direction );
				sCurParsedParam_Name = "";
				nCurParsedParam_Type = 0;
				eCurParsedParam_Direction = ary::idl::param_in;
				eState = expect_parameter_separator;
				break;
		case in_exception:
                csv_assert(pCurFunction != 0);
				pCurFunction->Add_Exception(nCurParsedType);
				eState = expect_exception_separator;
				break;
		default:
			csv_assert(false);
	}   // end switch
}

void
PE_Function::TransferData()
{
    pCurFunction = 0;
	eState = e_none;
}

UnoIDL_PE &
PE_Function::MyPE()
{
	return *this;
}



}   // namespace uidl
}   // namespace csi
