178bc99aaSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
378bc99aaSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
478bc99aaSAndrew Rist * or more contributor license agreements. See the NOTICE file
578bc99aaSAndrew Rist * distributed with this work for additional information
678bc99aaSAndrew Rist * regarding copyright ownership. The ASF licenses this file
778bc99aaSAndrew Rist * to you under the Apache License, Version 2.0 (the
878bc99aaSAndrew Rist * "License"); you may not use this file except in compliance
978bc99aaSAndrew Rist * with the License. You may obtain a copy of the License at
1078bc99aaSAndrew Rist *
1178bc99aaSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
1278bc99aaSAndrew Rist *
1378bc99aaSAndrew Rist * Unless required by applicable law or agreed to in writing,
1478bc99aaSAndrew Rist * software distributed under the License is distributed on an
1578bc99aaSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1678bc99aaSAndrew Rist * KIND, either express or implied. See the License for the
1778bc99aaSAndrew Rist * specific language governing permissions and limitations
1878bc99aaSAndrew Rist * under the License.
1978bc99aaSAndrew Rist *
2078bc99aaSAndrew Rist *************************************************************/
21cdf0e10cSrcweir
22cdf0e10cSrcweir #include <precomp.h>
23cdf0e10cSrcweir #include <s2_luidl/pe_servi.hxx>
24cdf0e10cSrcweir
25cdf0e10cSrcweir
26cdf0e10cSrcweir // NOT FULLY DEFINED SERVICES
27cdf0e10cSrcweir #include <ary/idl/i_gate.hxx>
28cdf0e10cSrcweir #include <ary/idl/i_service.hxx>
29cdf0e10cSrcweir #include <ary/idl/i_siservice.hxx>
30cdf0e10cSrcweir #include <ary/idl/ip_ce.hxx>
31cdf0e10cSrcweir #include <ary/doc/d_oldidldocu.hxx>
32cdf0e10cSrcweir #include <s2_luidl/pe_func2.hxx>
33cdf0e10cSrcweir #include <s2_luidl/pe_property.hxx>
34cdf0e10cSrcweir #include <s2_luidl/pe_type2.hxx>
35cdf0e10cSrcweir #include <s2_luidl/tk_keyw.hxx>
36cdf0e10cSrcweir #include <s2_luidl/tk_ident.hxx>
37cdf0e10cSrcweir #include <s2_luidl/tk_punct.hxx>
38cdf0e10cSrcweir
39cdf0e10cSrcweir
40cdf0e10cSrcweir
41cdf0e10cSrcweir namespace csi
42cdf0e10cSrcweir {
43cdf0e10cSrcweir namespace uidl
44cdf0e10cSrcweir {
45cdf0e10cSrcweir
46cdf0e10cSrcweir
47cdf0e10cSrcweir
PE_Service()48cdf0e10cSrcweir PE_Service::PE_Service()
49cdf0e10cSrcweir : eState(e_none),
50cdf0e10cSrcweir sData_Name(),
51cdf0e10cSrcweir bIsPreDeclaration(false),
52cdf0e10cSrcweir pCurService(0),
53cdf0e10cSrcweir pCurSiService(0),
54cdf0e10cSrcweir nCurService(0),
55cdf0e10cSrcweir pPE_Property(0),
56cdf0e10cSrcweir nCurParsed_Property(0),
57cdf0e10cSrcweir pPE_Type(0),
58cdf0e10cSrcweir nCurParsed_Type(0),
59cdf0e10cSrcweir pPE_Constructor(0),
60cdf0e10cSrcweir bOptionalMember(false)
61cdf0e10cSrcweir {
62cdf0e10cSrcweir pPE_Property = new PE_Property(nCurService);
63cdf0e10cSrcweir pPE_Type = new PE_Type(nCurParsed_Type);
64cdf0e10cSrcweir pPE_Constructor = new PE_Function(nCurService, PE_Function::constructor);
65cdf0e10cSrcweir }
66cdf0e10cSrcweir
67cdf0e10cSrcweir void
EstablishContacts(UnoIDL_PE * io_pParentPE,ary::Repository & io_rRepository,TokenProcessing_Result & o_rResult)68cdf0e10cSrcweir PE_Service::EstablishContacts( UnoIDL_PE * io_pParentPE,
69cdf0e10cSrcweir ary::Repository & io_rRepository,
70cdf0e10cSrcweir TokenProcessing_Result & o_rResult )
71cdf0e10cSrcweir {
72cdf0e10cSrcweir UnoIDL_PE::EstablishContacts(io_pParentPE,io_rRepository,o_rResult);
73cdf0e10cSrcweir pPE_Property->EstablishContacts(this,io_rRepository,o_rResult);
74cdf0e10cSrcweir pPE_Type->EstablishContacts(this,io_rRepository,o_rResult);
75cdf0e10cSrcweir pPE_Constructor->EstablishContacts(this,io_rRepository,o_rResult);
76cdf0e10cSrcweir }
77cdf0e10cSrcweir
~PE_Service()78cdf0e10cSrcweir PE_Service::~PE_Service()
79cdf0e10cSrcweir {
80cdf0e10cSrcweir }
81cdf0e10cSrcweir
82cdf0e10cSrcweir void
ProcessToken(const Token & i_rToken)83cdf0e10cSrcweir PE_Service::ProcessToken( const Token & i_rToken )
84cdf0e10cSrcweir {
85cdf0e10cSrcweir i_rToken.Trigger(*this);
86cdf0e10cSrcweir }
87cdf0e10cSrcweir
88cdf0e10cSrcweir
89cdf0e10cSrcweir void
Process_MetaType(const TokMetaType & i_rToken)90cdf0e10cSrcweir PE_Service::Process_MetaType( const TokMetaType & i_rToken )
91cdf0e10cSrcweir {
92cdf0e10cSrcweir switch ( i_rToken.Id() )
93cdf0e10cSrcweir {
94cdf0e10cSrcweir case TokMetaType::mt_service:
95cdf0e10cSrcweir if (eState == need_name)
96cdf0e10cSrcweir SetResult(done, stay );
97cdf0e10cSrcweir else if (eState == e_std)
98cdf0e10cSrcweir {
99cdf0e10cSrcweir SetResult(done, push_sure, pPE_Type.Ptr());
100cdf0e10cSrcweir eState = in_service_type;
101cdf0e10cSrcweir }
102cdf0e10cSrcweir else
103cdf0e10cSrcweir On_Default();
104cdf0e10cSrcweir break;
105cdf0e10cSrcweir case TokMetaType::mt_interface:
106cdf0e10cSrcweir if (eState == e_std)
107cdf0e10cSrcweir {
108cdf0e10cSrcweir SetResult(done, push_sure, pPE_Type.Ptr());
109cdf0e10cSrcweir eState = in_ifc_type;
110cdf0e10cSrcweir }
111cdf0e10cSrcweir else
112cdf0e10cSrcweir On_Default();
113cdf0e10cSrcweir break;
114cdf0e10cSrcweir case TokMetaType::mt_property:
115cdf0e10cSrcweir if (eState == e_std)
116cdf0e10cSrcweir {
117cdf0e10cSrcweir StartProperty();
118cdf0e10cSrcweir }
119cdf0e10cSrcweir else
120cdf0e10cSrcweir On_Default();
121cdf0e10cSrcweir break;
122cdf0e10cSrcweir default:
123cdf0e10cSrcweir // KORR_FUTURE:
124cdf0e10cSrcweir // Should throw syntax error warning.
125cdf0e10cSrcweir ;
126cdf0e10cSrcweir } // end switch
127cdf0e10cSrcweir }
128cdf0e10cSrcweir
129cdf0e10cSrcweir void
Process_Identifier(const TokIdentifier & i_rToken)130cdf0e10cSrcweir PE_Service::Process_Identifier( const TokIdentifier & i_rToken )
131cdf0e10cSrcweir {
132cdf0e10cSrcweir if (eState == need_name)
133cdf0e10cSrcweir {
134cdf0e10cSrcweir sData_Name = i_rToken.Text();
135cdf0e10cSrcweir SetResult(done, stay);
136cdf0e10cSrcweir eState = need_curlbr_open;
137cdf0e10cSrcweir }
138cdf0e10cSrcweir else if (eState == e_std_sib)
139cdf0e10cSrcweir {
140cdf0e10cSrcweir SetResult(not_done, push_sure, pPE_Constructor.Ptr());
141cdf0e10cSrcweir }
142cdf0e10cSrcweir else
143cdf0e10cSrcweir On_Default();
144cdf0e10cSrcweir }
145cdf0e10cSrcweir
146cdf0e10cSrcweir void
Process_Punctuation(const TokPunctuation & i_rToken)147cdf0e10cSrcweir PE_Service::Process_Punctuation( const TokPunctuation & i_rToken )
148cdf0e10cSrcweir {
149cdf0e10cSrcweir switch (i_rToken.Id())
150cdf0e10cSrcweir {
151cdf0e10cSrcweir case TokPunctuation::Colon:
152cdf0e10cSrcweir if (eState == need_curlbr_open)
153cdf0e10cSrcweir {
154cdf0e10cSrcweir SetResult(done, push_sure, pPE_Type.Ptr());
155cdf0e10cSrcweir eState = need_base_interface;
156cdf0e10cSrcweir }
157cdf0e10cSrcweir else
158cdf0e10cSrcweir On_Default();
159cdf0e10cSrcweir break;
160cdf0e10cSrcweir
161cdf0e10cSrcweir case TokPunctuation::CurledBracketOpen:
162cdf0e10cSrcweir if (eState == need_curlbr_open)
163cdf0e10cSrcweir {
164cdf0e10cSrcweir pCurService = &Gate().Ces().Store_Service(
165cdf0e10cSrcweir CurNamespace().CeId(),
166cdf0e10cSrcweir sData_Name );
167cdf0e10cSrcweir nCurService = pCurService->CeId();
168cdf0e10cSrcweir PassDocuAt(*pCurService);
169cdf0e10cSrcweir SetResult(done, stay);
170cdf0e10cSrcweir eState = e_std;
171cdf0e10cSrcweir }
172cdf0e10cSrcweir else if (eState == need_curlbr_open_sib)
173cdf0e10cSrcweir {
174cdf0e10cSrcweir SetResult(done, stay);
175cdf0e10cSrcweir eState = e_std_sib;
176cdf0e10cSrcweir }
177cdf0e10cSrcweir else
178cdf0e10cSrcweir On_Default();
179cdf0e10cSrcweir break;
180cdf0e10cSrcweir case TokPunctuation::CurledBracketClose:
181cdf0e10cSrcweir if (eState == e_std OR eState == e_std_sib)
182cdf0e10cSrcweir {
183cdf0e10cSrcweir SetResult(done, stay);
184cdf0e10cSrcweir eState = need_finish;
185cdf0e10cSrcweir }
186cdf0e10cSrcweir else
187cdf0e10cSrcweir On_Default();
188cdf0e10cSrcweir break;
189cdf0e10cSrcweir case TokPunctuation::Comma:
190cdf0e10cSrcweir if (eState == expect_ifc_separator)
191cdf0e10cSrcweir {
192cdf0e10cSrcweir SetResult(done, push_sure, pPE_Type.Ptr());
193cdf0e10cSrcweir eState = in_ifc_type;
194cdf0e10cSrcweir }
195cdf0e10cSrcweir else if (eState == expect_service_separator)
196cdf0e10cSrcweir {
197cdf0e10cSrcweir SetResult(done, push_sure, pPE_Type.Ptr());
198cdf0e10cSrcweir eState = in_service_type;
199cdf0e10cSrcweir }
200cdf0e10cSrcweir else if (eState == e_std)
201cdf0e10cSrcweir {
202cdf0e10cSrcweir SetResult(done, stay);
203cdf0e10cSrcweir }
204cdf0e10cSrcweir else
205cdf0e10cSrcweir On_Default();
206cdf0e10cSrcweir break;
207cdf0e10cSrcweir case TokPunctuation::Semicolon:
208cdf0e10cSrcweir switch (eState)
209cdf0e10cSrcweir {
210cdf0e10cSrcweir case need_curlbr_open:
211cdf0e10cSrcweir sData_Name.clear();
212cdf0e10cSrcweir bIsPreDeclaration = true;
213cdf0e10cSrcweir SetResult(done, pop_success);
214cdf0e10cSrcweir eState = e_none;
215cdf0e10cSrcweir break;
216cdf0e10cSrcweir case need_curlbr_open_sib:
217cdf0e10cSrcweir SetResult(done, pop_success);
218cdf0e10cSrcweir eState = e_none;
219cdf0e10cSrcweir break;
220cdf0e10cSrcweir case expect_ifc_separator:
221cdf0e10cSrcweir case expect_service_separator:
222cdf0e10cSrcweir SetResult(done, stay);
223cdf0e10cSrcweir eState = e_std;
224cdf0e10cSrcweir break;
225cdf0e10cSrcweir case need_finish:
226cdf0e10cSrcweir SetResult(done, pop_success);
227cdf0e10cSrcweir eState = e_none;
228cdf0e10cSrcweir break;
229cdf0e10cSrcweir case at_ignore:
230cdf0e10cSrcweir SetResult(done, stay);
231cdf0e10cSrcweir eState = e_std;
232cdf0e10cSrcweir break;
233cdf0e10cSrcweir default:
234cdf0e10cSrcweir On_Default();
235cdf0e10cSrcweir } // end switch
236cdf0e10cSrcweir break;
237cdf0e10cSrcweir default:
238cdf0e10cSrcweir On_Default();
239cdf0e10cSrcweir } // end switch
240cdf0e10cSrcweir }
241cdf0e10cSrcweir
242cdf0e10cSrcweir void
Process_Stereotype(const TokStereotype & i_rToken)243cdf0e10cSrcweir PE_Service::Process_Stereotype( const TokStereotype & i_rToken )
244cdf0e10cSrcweir {
245cdf0e10cSrcweir if (i_rToken.Id() == TokStereotype::ste_optional)
246cdf0e10cSrcweir {
247cdf0e10cSrcweir bOptionalMember = true;
248cdf0e10cSrcweir SetResult(done, stay);
249cdf0e10cSrcweir }
250cdf0e10cSrcweir else if ( eState == e_std )
251cdf0e10cSrcweir {
252cdf0e10cSrcweir StartProperty();
253cdf0e10cSrcweir }
254cdf0e10cSrcweir else
255cdf0e10cSrcweir On_Default();
256cdf0e10cSrcweir }
257cdf0e10cSrcweir
258cdf0e10cSrcweir void
Process_Needs()259cdf0e10cSrcweir PE_Service::Process_Needs()
260cdf0e10cSrcweir {
261cdf0e10cSrcweir SetResult(done,stay);
262cdf0e10cSrcweir eState = at_ignore;
263cdf0e10cSrcweir }
264cdf0e10cSrcweir
265cdf0e10cSrcweir void
Process_Observes()266cdf0e10cSrcweir PE_Service::Process_Observes()
267cdf0e10cSrcweir {
268cdf0e10cSrcweir SetResult(done,stay);
269cdf0e10cSrcweir eState = at_ignore;
270cdf0e10cSrcweir }
271cdf0e10cSrcweir
272cdf0e10cSrcweir void
Process_Default()273cdf0e10cSrcweir PE_Service::Process_Default()
274cdf0e10cSrcweir {
275cdf0e10cSrcweir On_Default();
276cdf0e10cSrcweir }
277cdf0e10cSrcweir
278cdf0e10cSrcweir
279cdf0e10cSrcweir void
On_Default()280cdf0e10cSrcweir PE_Service::On_Default()
281cdf0e10cSrcweir {
282cdf0e10cSrcweir if (eState == at_ignore)
283cdf0e10cSrcweir SetResult(done, stay);
284cdf0e10cSrcweir else
285cdf0e10cSrcweir SetResult(not_done, pop_failure);
286cdf0e10cSrcweir }
287cdf0e10cSrcweir
288cdf0e10cSrcweir void
InitData()289cdf0e10cSrcweir PE_Service::InitData()
290cdf0e10cSrcweir {
291cdf0e10cSrcweir eState = need_name;
292cdf0e10cSrcweir sData_Name.clear();
293cdf0e10cSrcweir bIsPreDeclaration = false;
294cdf0e10cSrcweir pCurService = 0;
295cdf0e10cSrcweir pCurSiService = 0;
296cdf0e10cSrcweir nCurService = 0;
297cdf0e10cSrcweir nCurParsed_Property = 0;
298cdf0e10cSrcweir nCurParsed_Type = 0;
299cdf0e10cSrcweir bOptionalMember = false;
300cdf0e10cSrcweir }
301cdf0e10cSrcweir
302cdf0e10cSrcweir void
TransferData()303cdf0e10cSrcweir PE_Service::TransferData()
304cdf0e10cSrcweir {
305cdf0e10cSrcweir if (NOT bIsPreDeclaration)
306cdf0e10cSrcweir {
307*a0d53b35SJürgen Schmidt csv_assert(! sData_Name.empty());
308cdf0e10cSrcweir csv_assert( (pCurService != 0) != (pCurSiService != 0) );
309cdf0e10cSrcweir }
310cdf0e10cSrcweir
311cdf0e10cSrcweir eState = e_none;
312cdf0e10cSrcweir }
313cdf0e10cSrcweir
314cdf0e10cSrcweir void
ReceiveData()315cdf0e10cSrcweir PE_Service::ReceiveData()
316cdf0e10cSrcweir {
317cdf0e10cSrcweir switch (eState)
318cdf0e10cSrcweir {
319cdf0e10cSrcweir case in_property:
320cdf0e10cSrcweir eState = e_std;
321cdf0e10cSrcweir break;
322cdf0e10cSrcweir case in_ifc_type:
323cdf0e10cSrcweir if (bOptionalMember)
324cdf0e10cSrcweir {
325cdf0e10cSrcweir pPE_Type->SetOptional();
326cdf0e10cSrcweir }
327cdf0e10cSrcweir pCurService->AddRef_SupportedInterface(
328cdf0e10cSrcweir nCurParsed_Type,
329cdf0e10cSrcweir pPE_Type->ReleaseDocu());
330cdf0e10cSrcweir nCurParsed_Type = 0;
331cdf0e10cSrcweir eState = expect_ifc_separator;
332cdf0e10cSrcweir break;
333cdf0e10cSrcweir case in_service_type:
334cdf0e10cSrcweir if (bOptionalMember)
335cdf0e10cSrcweir {
336cdf0e10cSrcweir pPE_Type->SetOptional();
337cdf0e10cSrcweir }
338cdf0e10cSrcweir pCurService->AddRef_IncludedService(
339cdf0e10cSrcweir nCurParsed_Type,
340cdf0e10cSrcweir pPE_Type->ReleaseDocu());
341cdf0e10cSrcweir nCurParsed_Type = 0;
342cdf0e10cSrcweir eState = expect_service_separator;
343cdf0e10cSrcweir break;
344cdf0e10cSrcweir case need_base_interface:
345cdf0e10cSrcweir pCurSiService = &Gate().Ces().Store_SglIfcService(
346cdf0e10cSrcweir CurNamespace().CeId(),
347cdf0e10cSrcweir sData_Name,
348cdf0e10cSrcweir nCurParsed_Type );
349cdf0e10cSrcweir nCurService = pCurSiService->CeId();
350cdf0e10cSrcweir PassDocuAt(*pCurSiService);
351cdf0e10cSrcweir
352cdf0e10cSrcweir nCurParsed_Type = 0;
353cdf0e10cSrcweir eState = need_curlbr_open_sib;
354cdf0e10cSrcweir break;
355cdf0e10cSrcweir case e_std_sib:
356cdf0e10cSrcweir break;
357cdf0e10cSrcweir default:
358cdf0e10cSrcweir csv_assert(false);
359cdf0e10cSrcweir }
360cdf0e10cSrcweir
361cdf0e10cSrcweir bOptionalMember = false;
362cdf0e10cSrcweir }
363cdf0e10cSrcweir
364cdf0e10cSrcweir
365cdf0e10cSrcweir UnoIDL_PE &
MyPE()366cdf0e10cSrcweir PE_Service::MyPE()
367cdf0e10cSrcweir {
368cdf0e10cSrcweir return *this;
369cdf0e10cSrcweir }
370cdf0e10cSrcweir
371cdf0e10cSrcweir void
StartProperty()372cdf0e10cSrcweir PE_Service::StartProperty()
373cdf0e10cSrcweir {
374cdf0e10cSrcweir SetResult(not_done, push_sure, pPE_Property.Ptr());
375cdf0e10cSrcweir eState = in_property;
376cdf0e10cSrcweir
377cdf0e10cSrcweir if (bOptionalMember)
378cdf0e10cSrcweir {
379cdf0e10cSrcweir pPE_Property->PresetOptional();
380cdf0e10cSrcweir bOptionalMember = false;
381cdf0e10cSrcweir }
382cdf0e10cSrcweir }
383cdf0e10cSrcweir
384cdf0e10cSrcweir
385cdf0e10cSrcweir } // namespace uidl
386cdf0e10cSrcweir } // namespace csi
387cdf0e10cSrcweir
388