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


// NOT FULLY DEFINED SERVICES
#include <ary/idl/i_interface.hxx>
#include <ary/idl/i_gate.hxx>
#include <ary/idl/ip_ce.hxx>
#include <ary/doc/d_oldidldocu.hxx>
#include <s2_luidl/pe_func2.hxx>
#include <s2_luidl/pe_attri.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>
#include <adc_cl.hxx>



namespace csi
{
namespace uidl
{

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

PE_Interface::F_TOK
PE_Interface::aDispatcher[PE_Interface::e_STATES_MAX][PE_Interface::tt_MAX] =
		{ 	{ DF, DF, DF, DF, DF },  // e_none
			{ &PE_Interface::On_need_uik_MetaType,
				 DF, DF, DF, DF },  // need_uik
			{ DF, &PE_Interface::On_uik_Identifier,
					 &PE_Interface::On_uik_Punctuation,
						 DF, DF },  // uik
			{ &PE_Interface::On_need_ident_MetaType,
				 DF, DF, DF, DF },  // need_ident
			{ DF, &PE_Interface::On_ident_Identifier,
					 &PE_Interface::On_ident_Punctuation,
						 DF, DF },  // ident
			{ &PE_Interface::On_need_interface_MetaType,
				 DF, DF, DF, DF },  // need_interface
			{ DF, &PE_Interface::On_need_name_Identifer,
					DF, DF, DF },  // need_name
			{ DF, DF, &PE_Interface::On_wait_for_base_Punctuation,
						DF, DF },  // wait_for_base
			{ DF, DF, DF, DF, DF },  // in_base
			{ DF, DF, &PE_Interface::On_need_curlbr_open_Punctuation,
						  DF, DF },  // need_curlbr_open
			{ &PE_Interface::On_std_Metatype,
			      &PE_Interface::On_std_GotoFunction,
					  &PE_Interface::On_std_Punctuation,
						  &PE_Interface::On_std_GotoFunction,
							  &PE_Interface::On_std_Stereotype },  // e_std
			{ DF, DF, DF, DF, DF },  // in_function
			{ DF, DF, DF, DF, DF },  // in_attribute
			{ DF, DF, &PE_Interface::On_need_finish_Punctuation,
						  DF, DF },  // need_finish
			{ DF, DF, DF, DF, DF }   // in_base_interface
		};



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



PE_Interface::PE_Interface()
	:	eState(e_none),
		sData_Name(),
		bIsPreDeclaration(false),
        pCurInterface(0),
		nCurInterface(0),
		pPE_Function(0),
		pPE_Attribute(0),
		pPE_Type(0),
		nCurParsed_Base(0),
		bOptionalMember(false)
{
	pPE_Function 	= new PE_Function(nCurInterface);
	pPE_Type 		= new PE_Type(nCurParsed_Base);
	pPE_Attribute   = new PE_Attribute(nCurInterface);
}

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

PE_Interface::~PE_Interface()
{
}

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


void
PE_Interface::Process_MetaType( const TokMetaType &	i_rToken )
{
	CallHandler( i_rToken.Text(), tt_metatype );
}

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

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

void
PE_Interface::Process_NameSeparator()
{
	CallHandler( "", tt_startoftype );
}

void
PE_Interface::Process_BuiltInType( const TokBuiltInType & i_rToken )
{
	CallHandler( i_rToken.Text(), tt_startoftype );
}

void
PE_Interface::Process_TypeModifier( const TokTypeModifier & i_rToken )
{
	CallHandler( i_rToken.Text(), tt_startoftype );
}

void
PE_Interface::Process_Stereotype( const TokStereotype & i_rToken )
{
	CallHandler( i_rToken.Text(), tt_stereotype );
}

void
PE_Interface::Process_Default()
{
	SetResult(done, stay);
}


void
PE_Interface::On_need_uik_MetaType(const char *)
{
    // Deprecated, data will be ignored
	SetResult(done, stay);
	eState = uik;
}

void
PE_Interface::On_uik_Identifier(const char *)
{
    // Deprecated, data will be ignored
	SetResult(done, stay);
}

void
PE_Interface::On_uik_Punctuation(const char * i_sText)
{
    // Deprecated, data will be ignored
	SetResult(done, stay);
	if (strcmp(",",i_sText) == 0)
	{
		eState = need_ident;
	}
}

void
PE_Interface::On_need_ident_MetaType(const char *)
{
	SetResult(done, stay);
	eState = ident;
}

void
PE_Interface::On_ident_Identifier(const char *)
{
	SetResult(done, stay);
}

void
PE_Interface::On_ident_Punctuation(const char * i_sText)
{
	SetResult(done, stay);
	if (strcmp(")",i_sText) == 0)
	{
		eState = need_interface;
	}
}

void
PE_Interface::On_need_interface_MetaType(const char *)
{
	SetResult(done, stay);
	eState = need_name;
}

void
PE_Interface::On_need_name_Identifer(const char * i_sText)
{
	SetResult(done, stay);
	sData_Name = i_sText;
	eState = wait_for_base;
}

void
PE_Interface::On_wait_for_base_Punctuation(const char * i_sText)
{
	if (i_sText[0] != ';')
	{
		switch (i_sText[0])
		{
			case ':':
				SetResult(done, push_sure, pPE_Type.Ptr());
				eState = in_base;
				break;
			case '{':
                store_Interface();

				SetResult(done,stay);
				eState = e_std;
				break;
			default:
				SetResult(not_done, pop_failure);
                eState = e_none;
		}	// end switch
	}
	else
	{
		bIsPreDeclaration = true;
		SetResult(done, pop_success);
		eState = e_none;
	}
}

void
PE_Interface::On_need_curlbr_open_Punctuation(const char * i_sText)
{
	if (i_sText[0] == '{')
	{
        store_Interface();

		SetResult(done, stay);
		eState = e_std;
	}
	else {
    	csv_assert(false);
    }
}


void
PE_Interface::On_std_Metatype(const char * i_sText)
{
    if (strcmp(i_sText,"attribute") ==  0)
    	On_std_GotoAttribute(i_sText);
    else if (strcmp(i_sText,"interface") ==  0)
        On_std_GotoBaseInterface(i_sText);
    else
        On_std_GotoFunction(i_sText);
}

void
PE_Interface::On_std_Punctuation(const char * i_sText)
{
	switch (i_sText[0])
	{
		case '}':
			SetResult(done, stay);
			eState = need_finish;
			break;
		case ';':   // Appears after base interface declarations.
			SetResult(done, stay);
			break;
		default:
			SetResult(not_done, pop_failure);
			eState = e_none;
	}	// end switch
}

void
PE_Interface::On_std_Stereotype(const char * i_sText)
{
    if (strcmp(i_sText,"oneway") ==  0)
    	On_std_GotoFunction(i_sText);
    else if (    strcmp(i_sText,"readonly") ==  0
              OR strcmp(i_sText,"bound") ==  0 )
        On_std_GotoAttribute(i_sText);
    else if (strcmp(i_sText,"optional") ==  0)
    {
        bOptionalMember = true;
        SetResult(done, stay);
    }
    else
    	SetResult(not_done, pop_failure);
}

void
PE_Interface::On_std_GotoFunction(const char * )
{
	SetResult(not_done, push_sure, pPE_Function.Ptr());
	eState = in_function;
}

void
PE_Interface::On_std_GotoAttribute(const char * )
{
    	SetResult(not_done, push_sure, pPE_Attribute.Ptr());
	    eState = in_attribute;
}

void
PE_Interface::On_std_GotoBaseInterface(const char * )
{
   	SetResult(done, push_sure, pPE_Type.Ptr());
    eState = in_base_interface;
}

void
PE_Interface::On_need_finish_Punctuation(const char * i_sText)
{
	switch (i_sText[0])
	{
		case ';':
			SetResult(done, pop_success);
			eState = e_none;
			break;
		default:
			SetResult(not_done, pop_failure);
			eState = e_none;
	}	// end switch
}

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

void
PE_Interface::InitData()
{
	eState = need_interface;

	sData_Name.clear();
	bIsPreDeclaration = false;
	pCurInterface = 0;
	nCurInterface = 0;
	nCurParsed_Base = 0;
	bOptionalMember = false;
}

void
PE_Interface::TransferData()
{
	if (NOT bIsPreDeclaration)
	{
		csv_assert(!sData_Name.empty());
		csv_assert(nCurInterface.IsValid());
	}
	else
    {
     	sData_Name.clear();
     	pCurInterface = 0;
        nCurInterface = 0;
    }

	eState = e_none;
}

void
PE_Interface::ReceiveData()
{
	switch (eState)
    {
		case in_base:
				eState = need_curlbr_open;
				break;
		case in_function:
				eState = e_std;
				break;
		case in_attribute:
				eState = e_std;
				break;
		case in_base_interface:
				if (bOptionalMember)
				{
					pPE_Type->SetOptional();
					bOptionalMember = false;
				}
				pCurInterface->Add_Base(
						            nCurParsed_Base,
                                    pPE_Type->ReleaseDocu());
				nCurParsed_Base = 0;
				eState = e_std;
				break;
		default:
			csv_assert(false);
	}
}

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

void
PE_Interface::store_Interface()
{
    pCurInterface = & Gate().Ces().Store_Interface(
                                        CurNamespace().CeId(),
                                        sData_Name,
                                        nCurParsed_Base );
    nCurInterface = pCurInterface->CeId();
	PassDocuAt(*pCurInterface);
}


}   // namespace uidl
}   // namespace csi
