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


// NOT FULLY DECLARED SERVICES
#include <ary/idl/i_gate.hxx>
#include <ary/idl/i_property.hxx>
#include <ary/idl/ip_ce.hxx>
#include <ary/doc/d_oldidldocu.hxx>
#include <s2_luidl/pe_type2.hxx>
#include <s2_luidl/tk_keyw.hxx>
#include <s2_luidl/tk_ident.hxx>
#include <s2_luidl/tk_punct.hxx>


namespace csi
{
namespace uidl
{


PE_Variable::PE_Variable( ary::idl::Type_id &	i_rResult_Type,
						  String &	            i_rResult_Name )
	:	eState(e_none),
		pResult_Type(&i_rResult_Type),
		pResult_Name(&i_rResult_Name),
		pPE_Type(0)
{
	pPE_Type = new PE_Type(i_rResult_Type);
}

void
PE_Variable::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);
}

PE_Variable::~PE_Variable()
{
}

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


void
PE_Variable::Process_Default()
{
	if (eState == expect_type)
	{
		SetResult( not_done, push_sure, pPE_Type.Ptr() );
	}
	else{ 
		csv_assert(false);
    }
}

void
PE_Variable::Process_Identifier( const TokIdentifier & i_rToken )
{
	if (eState == expect_type)
	{
		SetResult( not_done, push_sure, pPE_Type.Ptr() );
	}
	else if (eState == expect_name)
	{
		*pResult_Name = i_rToken.Text();
		SetResult( done, stay );
        eState = expect_finish;
	}
	else {
		csv_assert(false);
    }
}

void
PE_Variable::Process_Punctuation( const TokPunctuation & )
{
	if (eState == expect_finish)
	{
		SetResult( not_done, pop_success );
        eState = e_none;
	}
	else if (eState == expect_name)
	{
		SetResult( not_done, pop_success );
        eState = e_none;
	}
	else {
		csv_assert(false);
    }
}

void
PE_Variable::Process_BuiltInType( const TokBuiltInType & i_rToken )
{
	if (eState == expect_type)
	{
		SetResult( not_done, push_sure, pPE_Type.Ptr() );
	}
    else if (eState == expect_name AND i_rToken.Id() == TokBuiltInType::bty_ellipse)
    {
		SetResult( not_done, pop_success );
        eState = e_none;
    }
	else {
		csv_assert(false);
    }
}

void
PE_Variable::InitData()
{
	eState = expect_type;

	*pResult_Type = 0;
	*pResult_Name = "";
}

void
PE_Variable::ReceiveData()
{
	eState = expect_name;
}

void
PE_Variable::TransferData()
{
	eState = e_none;
}

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

}   // namespace uidl
}   // namespace csi

