| /************************************************************** |
| * |
| * 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_servi.hxx> |
| |
| |
| // NOT FULLY DEFINED SERVICES |
| #include <ary/idl/i_gate.hxx> |
| #include <ary/idl/i_service.hxx> |
| #include <ary/idl/i_siservice.hxx> |
| #include <ary/idl/ip_ce.hxx> |
| #include <ary/doc/d_oldidldocu.hxx> |
| #include <s2_luidl/pe_func2.hxx> |
| #include <s2_luidl/pe_property.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_Service::PE_Service() |
| : eState(e_none), |
| sData_Name(), |
| bIsPreDeclaration(false), |
| pCurService(0), |
| pCurSiService(0), |
| nCurService(0), |
| pPE_Property(0), |
| nCurParsed_Property(0), |
| pPE_Type(0), |
| nCurParsed_Type(0), |
| pPE_Constructor(0), |
| bOptionalMember(false) |
| { |
| pPE_Property = new PE_Property(nCurService); |
| pPE_Type = new PE_Type(nCurParsed_Type); |
| pPE_Constructor = new PE_Function(nCurService, PE_Function::constructor); |
| } |
| |
| void |
| PE_Service::EstablishContacts( UnoIDL_PE * io_pParentPE, |
| ary::Repository & io_rRepository, |
| TokenProcessing_Result & o_rResult ) |
| { |
| UnoIDL_PE::EstablishContacts(io_pParentPE,io_rRepository,o_rResult); |
| pPE_Property->EstablishContacts(this,io_rRepository,o_rResult); |
| pPE_Type->EstablishContacts(this,io_rRepository,o_rResult); |
| pPE_Constructor->EstablishContacts(this,io_rRepository,o_rResult); |
| } |
| |
| PE_Service::~PE_Service() |
| { |
| } |
| |
| void |
| PE_Service::ProcessToken( const Token & i_rToken ) |
| { |
| i_rToken.Trigger(*this); |
| } |
| |
| |
| void |
| PE_Service::Process_MetaType( const TokMetaType & i_rToken ) |
| { |
| switch ( i_rToken.Id() ) |
| { |
| case TokMetaType::mt_service: |
| if (eState == need_name) |
| SetResult(done, stay ); |
| else if (eState == e_std) |
| { |
| SetResult(done, push_sure, pPE_Type.Ptr()); |
| eState = in_service_type; |
| } |
| else |
| On_Default(); |
| break; |
| case TokMetaType::mt_interface: |
| if (eState == e_std) |
| { |
| SetResult(done, push_sure, pPE_Type.Ptr()); |
| eState = in_ifc_type; |
| } |
| else |
| On_Default(); |
| break; |
| case TokMetaType::mt_property: |
| if (eState == e_std) |
| { |
| StartProperty(); |
| } |
| else |
| On_Default(); |
| break; |
| default: |
| // KORR_FUTURE: |
| // Should throw syntax error warning. |
| ; |
| } // end switch |
| } |
| |
| void |
| PE_Service::Process_Identifier( const TokIdentifier & i_rToken ) |
| { |
| if (eState == need_name) |
| { |
| sData_Name = i_rToken.Text(); |
| SetResult(done, stay); |
| eState = need_curlbr_open; |
| } |
| else if (eState == e_std_sib) |
| { |
| SetResult(not_done, push_sure, pPE_Constructor.Ptr()); |
| } |
| else |
| On_Default(); |
| } |
| |
| void |
| PE_Service::Process_Punctuation( const TokPunctuation & i_rToken ) |
| { |
| switch (i_rToken.Id()) |
| { |
| case TokPunctuation::Colon: |
| if (eState == need_curlbr_open) |
| { |
| SetResult(done, push_sure, pPE_Type.Ptr()); |
| eState = need_base_interface; |
| } |
| else |
| On_Default(); |
| break; |
| |
| case TokPunctuation::CurledBracketOpen: |
| if (eState == need_curlbr_open) |
| { |
| pCurService = &Gate().Ces().Store_Service( |
| CurNamespace().CeId(), |
| sData_Name ); |
| nCurService = pCurService->CeId(); |
| PassDocuAt(*pCurService); |
| SetResult(done, stay); |
| eState = e_std; |
| } |
| else if (eState == need_curlbr_open_sib) |
| { |
| SetResult(done, stay); |
| eState = e_std_sib; |
| } |
| else |
| On_Default(); |
| break; |
| case TokPunctuation::CurledBracketClose: |
| if (eState == e_std OR eState == e_std_sib) |
| { |
| SetResult(done, stay); |
| eState = need_finish; |
| } |
| else |
| On_Default(); |
| break; |
| case TokPunctuation::Comma: |
| if (eState == expect_ifc_separator) |
| { |
| SetResult(done, push_sure, pPE_Type.Ptr()); |
| eState = in_ifc_type; |
| } |
| else if (eState == expect_service_separator) |
| { |
| SetResult(done, push_sure, pPE_Type.Ptr()); |
| eState = in_service_type; |
| } |
| else if (eState == e_std) |
| { |
| SetResult(done, stay); |
| } |
| else |
| On_Default(); |
| break; |
| case TokPunctuation::Semicolon: |
| switch (eState) |
| { |
| case need_curlbr_open: |
| sData_Name.clear(); |
| bIsPreDeclaration = true; |
| SetResult(done, pop_success); |
| eState = e_none; |
| break; |
| case need_curlbr_open_sib: |
| SetResult(done, pop_success); |
| eState = e_none; |
| break; |
| case expect_ifc_separator: |
| case expect_service_separator: |
| SetResult(done, stay); |
| eState = e_std; |
| break; |
| case need_finish: |
| SetResult(done, pop_success); |
| eState = e_none; |
| break; |
| case at_ignore: |
| SetResult(done, stay); |
| eState = e_std; |
| break; |
| default: |
| On_Default(); |
| } // end switch |
| break; |
| default: |
| On_Default(); |
| } // end switch |
| } |
| |
| void |
| PE_Service::Process_Stereotype( const TokStereotype & i_rToken ) |
| { |
| if (i_rToken.Id() == TokStereotype::ste_optional) |
| { |
| bOptionalMember = true; |
| SetResult(done, stay); |
| } |
| else if ( eState == e_std ) |
| { |
| StartProperty(); |
| } |
| else |
| On_Default(); |
| } |
| |
| void |
| PE_Service::Process_Needs() |
| { |
| SetResult(done,stay); |
| eState = at_ignore; |
| } |
| |
| void |
| PE_Service::Process_Observes() |
| { |
| SetResult(done,stay); |
| eState = at_ignore; |
| } |
| |
| void |
| PE_Service::Process_Default() |
| { |
| On_Default(); |
| } |
| |
| |
| void |
| PE_Service::On_Default() |
| { |
| if (eState == at_ignore) |
| SetResult(done, stay); |
| else |
| SetResult(not_done, pop_failure); |
| } |
| |
| void |
| PE_Service::InitData() |
| { |
| eState = need_name; |
| sData_Name.clear(); |
| bIsPreDeclaration = false; |
| pCurService = 0; |
| pCurSiService = 0; |
| nCurService = 0; |
| nCurParsed_Property = 0; |
| nCurParsed_Type = 0; |
| bOptionalMember = false; |
| } |
| |
| void |
| PE_Service::TransferData() |
| { |
| if (NOT bIsPreDeclaration) |
| { |
| csv_assert(! sData_Name.empty()); |
| csv_assert( (pCurService != 0) != (pCurSiService != 0) ); |
| } |
| |
| eState = e_none; |
| } |
| |
| void |
| PE_Service::ReceiveData() |
| { |
| switch (eState) |
| { |
| case in_property: |
| eState = e_std; |
| break; |
| case in_ifc_type: |
| if (bOptionalMember) |
| { |
| pPE_Type->SetOptional(); |
| } |
| pCurService->AddRef_SupportedInterface( |
| nCurParsed_Type, |
| pPE_Type->ReleaseDocu()); |
| nCurParsed_Type = 0; |
| eState = expect_ifc_separator; |
| break; |
| case in_service_type: |
| if (bOptionalMember) |
| { |
| pPE_Type->SetOptional(); |
| } |
| pCurService->AddRef_IncludedService( |
| nCurParsed_Type, |
| pPE_Type->ReleaseDocu()); |
| nCurParsed_Type = 0; |
| eState = expect_service_separator; |
| break; |
| case need_base_interface: |
| pCurSiService = &Gate().Ces().Store_SglIfcService( |
| CurNamespace().CeId(), |
| sData_Name, |
| nCurParsed_Type ); |
| nCurService = pCurSiService->CeId(); |
| PassDocuAt(*pCurSiService); |
| |
| nCurParsed_Type = 0; |
| eState = need_curlbr_open_sib; |
| break; |
| case e_std_sib: |
| break; |
| default: |
| csv_assert(false); |
| } |
| |
| bOptionalMember = false; |
| } |
| |
| |
| UnoIDL_PE & |
| PE_Service::MyPE() |
| { |
| return *this; |
| } |
| |
| void |
| PE_Service::StartProperty() |
| { |
| SetResult(not_done, push_sure, pPE_Property.Ptr()); |
| eState = in_property; |
| |
| if (bOptionalMember) |
| { |
| pPE_Property->PresetOptional(); |
| bOptionalMember = false; |
| } |
| } |
| |
| |
| } // namespace uidl |
| } // namespace csi |
| |