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

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


namespace csi
{
namespace uidl
{


#ifdef DF
#undef DF
#endif
#define DF 	&PE_Typedef::On_Default

PE_Typedef::F_TOK
PE_Typedef::aDispatcher[PE_Typedef::e_STATES_MAX][PE_Typedef::tt_MAX] =
		{ 	{ DF, DF, DF },  // e_none
			{ &PE_Typedef::On_expect_description_Any,
				  &PE_Typedef::On_expect_description_Any,
				      DF },  // expect_description
			{ DF, &PE_Typedef::On_expect_name_Identifier,
					  DF },  // expect_name
			{ DF, DF, &PE_Typedef::On_got_name_Punctuation }  // got_name
		};



inline void
PE_Typedef::CallHandler( const char *		i_sTokenText,
						 E_TokenType		i_eTokenType )
	{ (this->*aDispatcher[eState][i_eTokenType])(i_sTokenText); }





PE_Typedef::PE_Typedef()
	:	eState(e_none),
		pPE_Type(0),
		nType(0),
		sName()
{
	pPE_Type = new PE_Type(nType);
}

void
PE_Typedef::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_Typedef::~PE_Typedef()
{
}

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

void
PE_Typedef::Process_Identifier( const TokIdentifier & i_rToken )
{
	CallHandler(i_rToken.Text(), tt_identifier);
}

void
PE_Typedef::Process_Punctuation( const TokPunctuation & i_rToken )
{
	CallHandler(i_rToken.Text(), tt_punctuation);
}

void
PE_Typedef::Process_Default()
{
	CallHandler("", tt_any);
}

void
PE_Typedef::On_expect_description_Any(const char *)
{
	SetResult(not_done,push_sure, pPE_Type.Ptr());
}

void
PE_Typedef::On_expect_name_Identifier(const char * i_sText)
{
	sName = i_sText;
	SetResult(done,stay);
	eState = got_name;
}

void
PE_Typedef::On_got_name_Punctuation(const char * i_sText)
{
	if ( i_sText[0] == ';' )
	{
		SetResult(done,pop_success);
		eState = e_none;
	}
	else
		On_Default(i_sText);
}

void
PE_Typedef::On_Default(const char * )
{
	SetResult(not_done,pop_failure);
}

void
PE_Typedef::InitData()
{
	eState = expect_description;
	nType = 0;
	sName = "";
}

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

void
PE_Typedef::TransferData()
{
    ary::idl::Typedef &
        rCe = Gate().Ces().Store_Typedef(CurNamespace().CeId(), sName, nType);
	PassDocuAt(rCe);
	eState = e_none;
}

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

}   // namespace uidl
}   // namespace csi
