1*78bc99aaSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*78bc99aaSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*78bc99aaSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*78bc99aaSAndrew Rist  * distributed with this work for additional information
6*78bc99aaSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*78bc99aaSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*78bc99aaSAndrew Rist  * "License"); you may not use this file except in compliance
9*78bc99aaSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*78bc99aaSAndrew Rist  *
11*78bc99aaSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*78bc99aaSAndrew Rist  *
13*78bc99aaSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*78bc99aaSAndrew Rist  * software distributed under the License is distributed on an
15*78bc99aaSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*78bc99aaSAndrew Rist  * KIND, either express or implied.  See the License for the
17*78bc99aaSAndrew Rist  * specific language governing permissions and limitations
18*78bc99aaSAndrew Rist  * under the License.
19*78bc99aaSAndrew Rist  *
20*78bc99aaSAndrew Rist  *************************************************************/
21cdf0e10cSrcweir 
22cdf0e10cSrcweir #include <precomp.h>
23cdf0e10cSrcweir #include <s2_luidl/pe_attri.hxx>
24cdf0e10cSrcweir 
25cdf0e10cSrcweir 
26cdf0e10cSrcweir // NOT FULLY DEFINED SERVICES
27cdf0e10cSrcweir #include <ary/idl/i_gate.hxx>
28cdf0e10cSrcweir #include <ary/idl/i_attribute.hxx>
29cdf0e10cSrcweir #include <ary/idl/i_service.hxx>
30cdf0e10cSrcweir #include <ary/idl/ip_ce.hxx>
31cdf0e10cSrcweir #include <ary/doc/d_oldidldocu.hxx>
32cdf0e10cSrcweir #include <s2_luidl/pe_type2.hxx>
33cdf0e10cSrcweir #include <s2_luidl/pe_vari2.hxx>
34cdf0e10cSrcweir #include <s2_luidl/tk_keyw.hxx>
35cdf0e10cSrcweir #include <s2_luidl/tk_ident.hxx>
36cdf0e10cSrcweir #include <s2_luidl/tk_punct.hxx>
37cdf0e10cSrcweir 
38cdf0e10cSrcweir 
39cdf0e10cSrcweir 
40cdf0e10cSrcweir namespace csi
41cdf0e10cSrcweir {
42cdf0e10cSrcweir namespace uidl
43cdf0e10cSrcweir {
44cdf0e10cSrcweir 
45cdf0e10cSrcweir 
46cdf0e10cSrcweir 
PE_Attribute(const Ce_id & i_rCurOwner)47cdf0e10cSrcweir PE_Attribute::PE_Attribute( const Ce_id & i_rCurOwner )
48cdf0e10cSrcweir     :   eState(e_none),
49cdf0e10cSrcweir         pCurOwner(&i_rCurOwner),
50cdf0e10cSrcweir         pPE_Variable(0),
51cdf0e10cSrcweir         pPE_Exception(0),
52cdf0e10cSrcweir         pCurAttribute(0),
53cdf0e10cSrcweir         nCurParsedType(0),
54cdf0e10cSrcweir         sCurParsedName(),
55cdf0e10cSrcweir         bReadOnly(false),
56cdf0e10cSrcweir         bBound(false)
57cdf0e10cSrcweir {
58cdf0e10cSrcweir     pPE_Variable    = new PE_Variable(nCurParsedType, sCurParsedName);
59cdf0e10cSrcweir     pPE_Exception   = new PE_Type(nCurParsedType);
60cdf0e10cSrcweir }
61cdf0e10cSrcweir 
62cdf0e10cSrcweir void
EstablishContacts(UnoIDL_PE * io_pParentPE,ary::Repository & io_rRepository,TokenProcessing_Result & o_rResult)63cdf0e10cSrcweir PE_Attribute::EstablishContacts( UnoIDL_PE *                io_pParentPE,
64cdf0e10cSrcweir                                  ary::Repository &		io_rRepository,
65cdf0e10cSrcweir                                  TokenProcessing_Result & 	o_rResult )
66cdf0e10cSrcweir {
67cdf0e10cSrcweir     UnoIDL_PE::EstablishContacts(io_pParentPE,io_rRepository,o_rResult);
68cdf0e10cSrcweir     pPE_Variable->EstablishContacts(this,io_rRepository,o_rResult);
69cdf0e10cSrcweir     pPE_Exception->EstablishContacts(this,io_rRepository,o_rResult);
70cdf0e10cSrcweir }
71cdf0e10cSrcweir 
~PE_Attribute()72cdf0e10cSrcweir PE_Attribute::~PE_Attribute()
73cdf0e10cSrcweir {
74cdf0e10cSrcweir }
75cdf0e10cSrcweir 
76cdf0e10cSrcweir void
ProcessToken(const Token & i_rToken)77cdf0e10cSrcweir PE_Attribute::ProcessToken( const Token & i_rToken )
78cdf0e10cSrcweir {
79cdf0e10cSrcweir     i_rToken.Trigger(*this);
80cdf0e10cSrcweir }
81cdf0e10cSrcweir 
82cdf0e10cSrcweir void
Process_Identifier(const TokIdentifier & i_rToken)83cdf0e10cSrcweir PE_Attribute::Process_Identifier( const TokIdentifier & i_rToken )
84cdf0e10cSrcweir {
85cdf0e10cSrcweir     switch (eState)
86cdf0e10cSrcweir     {
87cdf0e10cSrcweir         case e_start:
88cdf0e10cSrcweir             SetResult(not_done, push_sure, pPE_Variable.Ptr());
89cdf0e10cSrcweir             eState = in_variable;
90cdf0e10cSrcweir             break;
91cdf0e10cSrcweir         case in_raise_std:
92cdf0e10cSrcweir             if (strcmp(i_rToken.Text(),"get") == 0)
93cdf0e10cSrcweir             {
94cdf0e10cSrcweir                 SetResult(done, stay);
95cdf0e10cSrcweir                 eState = in_get;
96cdf0e10cSrcweir             }
97cdf0e10cSrcweir             else if (strcmp(i_rToken.Text(),"set") == 0)
98cdf0e10cSrcweir             {
99cdf0e10cSrcweir                 SetResult(done, stay);
100cdf0e10cSrcweir                 eState = in_set;
101cdf0e10cSrcweir             }
102cdf0e10cSrcweir             else
103cdf0e10cSrcweir             {
104cdf0e10cSrcweir                 SetResult(not_done, pop_failure);
105cdf0e10cSrcweir                 eState = e_none;
106cdf0e10cSrcweir             }
107cdf0e10cSrcweir             break;
108cdf0e10cSrcweir         case in_get:
109cdf0e10cSrcweir         case in_set:
110cdf0e10cSrcweir             SetResult(not_done, push_sure, pPE_Exception.Ptr());
111cdf0e10cSrcweir             break;
112cdf0e10cSrcweir         default:
113cdf0e10cSrcweir             SetResult(not_done, pop_failure);
114cdf0e10cSrcweir     }   // end switch
115cdf0e10cSrcweir }
116cdf0e10cSrcweir 
117cdf0e10cSrcweir void
Process_Stereotype(const TokStereotype & i_rToken)118cdf0e10cSrcweir PE_Attribute::Process_Stereotype( const TokStereotype & i_rToken )
119cdf0e10cSrcweir {
120cdf0e10cSrcweir     if (eState != e_start)
121cdf0e10cSrcweir     {
122cdf0e10cSrcweir         SetResult(not_done, pop_failure);
123cdf0e10cSrcweir         eState = e_none;
124cdf0e10cSrcweir         return;
125cdf0e10cSrcweir     }
126cdf0e10cSrcweir 
127cdf0e10cSrcweir     switch (i_rToken.Id())
128cdf0e10cSrcweir     {
129cdf0e10cSrcweir         case TokStereotype::ste_readonly:
130cdf0e10cSrcweir             bReadOnly = true;
131cdf0e10cSrcweir             break;
132cdf0e10cSrcweir         case TokStereotype::ste_bound:
133cdf0e10cSrcweir             bBound = true;
134cdf0e10cSrcweir             break;
135cdf0e10cSrcweir         default:
136cdf0e10cSrcweir             SetResult(not_done, pop_failure);
137cdf0e10cSrcweir             eState = e_none;
138cdf0e10cSrcweir             return;
139cdf0e10cSrcweir     }   // end switch
140cdf0e10cSrcweir 
141cdf0e10cSrcweir     SetResult(done, stay);
142cdf0e10cSrcweir }
143cdf0e10cSrcweir 
144cdf0e10cSrcweir void
Process_MetaType(const TokMetaType & i_rToken)145cdf0e10cSrcweir PE_Attribute::Process_MetaType( const TokMetaType & i_rToken )
146cdf0e10cSrcweir {
147cdf0e10cSrcweir     if (eState != e_start OR i_rToken.Id() != TokMetaType::mt_attribute)
148cdf0e10cSrcweir     {
149cdf0e10cSrcweir         SetResult(not_done, pop_failure);
150cdf0e10cSrcweir         eState = e_none;
151cdf0e10cSrcweir         return;
152cdf0e10cSrcweir     }
153cdf0e10cSrcweir 
154cdf0e10cSrcweir     SetResult(done, stay);
155cdf0e10cSrcweir }
156cdf0e10cSrcweir 
157cdf0e10cSrcweir void
Process_Punctuation(const TokPunctuation & i_rToken)158cdf0e10cSrcweir PE_Attribute::Process_Punctuation( const TokPunctuation & i_rToken )
159cdf0e10cSrcweir {
160cdf0e10cSrcweir     switch (eState)
161cdf0e10cSrcweir     {
162cdf0e10cSrcweir         case e_start:
163cdf0e10cSrcweir             SetResult(done, stay);
164cdf0e10cSrcweir             break;
165cdf0e10cSrcweir         case expect_end:
166cdf0e10cSrcweir             switch(i_rToken.Id())
167cdf0e10cSrcweir             {
168cdf0e10cSrcweir                 case TokPunctuation::Semicolon:
169cdf0e10cSrcweir                     SetResult(done, pop_success);
170cdf0e10cSrcweir                     eState = e_none;
171cdf0e10cSrcweir     		        break;
172cdf0e10cSrcweir     		    case TokPunctuation::Comma:
173cdf0e10cSrcweir                     SetResult(not_done, pop_failure);
174cdf0e10cSrcweir                     Cerr() << "Autodoc does not support comma separated attributes, because those are discouraged by IDL policies." << Endl();
175cdf0e10cSrcweir                     break;
176cdf0e10cSrcweir     		    case TokPunctuation::CurledBracketOpen:
177cdf0e10cSrcweir                     SetResult(done, stay);
178cdf0e10cSrcweir                     eState = in_raise_std;
179cdf0e10cSrcweir                     break;
180cdf0e10cSrcweir         	    default:
181cdf0e10cSrcweir                     SetResult(not_done, pop_failure);
182cdf0e10cSrcweir             }   // end switch
183cdf0e10cSrcweir             break;
184cdf0e10cSrcweir         case in_raise_std:
185cdf0e10cSrcweir             SetResult(done, stay);
186cdf0e10cSrcweir             if (i_rToken.Id() == TokPunctuation::CurledBracketClose)
187cdf0e10cSrcweir             {
188cdf0e10cSrcweir                 eState = expect_end;
189cdf0e10cSrcweir             }
190cdf0e10cSrcweir             break;
191cdf0e10cSrcweir         case in_get:
192cdf0e10cSrcweir         case in_set:
193cdf0e10cSrcweir             SetResult(done, stay);
194cdf0e10cSrcweir             if (i_rToken.Id() == TokPunctuation::Semicolon)
195cdf0e10cSrcweir             {
196cdf0e10cSrcweir                 eState = in_raise_std;
197cdf0e10cSrcweir             }
198cdf0e10cSrcweir             break;
199cdf0e10cSrcweir         default:
200cdf0e10cSrcweir             csv_assert(false);
201cdf0e10cSrcweir     }
202cdf0e10cSrcweir }
203cdf0e10cSrcweir 
204cdf0e10cSrcweir void
Process_Raises()205cdf0e10cSrcweir PE_Attribute::Process_Raises()
206cdf0e10cSrcweir {
207cdf0e10cSrcweir     if (eState == in_get OR eState == in_set)
208cdf0e10cSrcweir     {
209cdf0e10cSrcweir         SetResult(done, stay);
210cdf0e10cSrcweir     }
211cdf0e10cSrcweir     else
212cdf0e10cSrcweir         SetResult(not_done, pop_failure);
213cdf0e10cSrcweir }
214cdf0e10cSrcweir 
215cdf0e10cSrcweir void
Process_Default()216cdf0e10cSrcweir PE_Attribute::Process_Default()
217cdf0e10cSrcweir {
218cdf0e10cSrcweir     if (eState == e_start)
219cdf0e10cSrcweir     {
220cdf0e10cSrcweir         SetResult(not_done, push_sure, pPE_Variable.Ptr());
221cdf0e10cSrcweir         eState = in_variable;
222cdf0e10cSrcweir     }
223cdf0e10cSrcweir     else if (eState == in_get OR eState == in_set)
224cdf0e10cSrcweir         SetResult(not_done, push_sure, pPE_Exception.Ptr());
225cdf0e10cSrcweir     else
226cdf0e10cSrcweir         SetResult(not_done, pop_failure);
227cdf0e10cSrcweir }
228cdf0e10cSrcweir 
229cdf0e10cSrcweir void
InitData()230cdf0e10cSrcweir PE_Attribute::InitData()
231cdf0e10cSrcweir {
232cdf0e10cSrcweir     eState = e_start;
233cdf0e10cSrcweir 
234cdf0e10cSrcweir     pCurAttribute = 0;
235cdf0e10cSrcweir     nCurParsedType = 0;
236cdf0e10cSrcweir     sCurParsedName = "";
237cdf0e10cSrcweir     bReadOnly = false;
238cdf0e10cSrcweir     bBound = false;
239cdf0e10cSrcweir }
240cdf0e10cSrcweir 
241cdf0e10cSrcweir void
TransferData()242cdf0e10cSrcweir PE_Attribute::TransferData()
243cdf0e10cSrcweir {
244cdf0e10cSrcweir     eState = e_none;
245cdf0e10cSrcweir }
246cdf0e10cSrcweir 
247cdf0e10cSrcweir void
ReceiveData()248cdf0e10cSrcweir PE_Attribute::ReceiveData()
249cdf0e10cSrcweir {
250cdf0e10cSrcweir     switch (eState)
251cdf0e10cSrcweir     {
252cdf0e10cSrcweir         case in_variable:
253cdf0e10cSrcweir             csv_assert(pCurOwner->IsValid());
254cdf0e10cSrcweir             pCurAttribute = &Gate().Ces().Store_Attribute(
255cdf0e10cSrcweir                                                     *pCurOwner,
256cdf0e10cSrcweir                                                     sCurParsedName,
257cdf0e10cSrcweir                                                     nCurParsedType,
258cdf0e10cSrcweir                                                     bReadOnly,
259cdf0e10cSrcweir                                                     bBound );
260cdf0e10cSrcweir             PassDocuAt(*pCurAttribute);
261cdf0e10cSrcweir             nCurParsedType = 0;
262cdf0e10cSrcweir             eState = expect_end;
263cdf0e10cSrcweir             break;
264cdf0e10cSrcweir         case in_get:
265cdf0e10cSrcweir             csv_assert(pCurAttribute != 0);
266cdf0e10cSrcweir             pCurAttribute->Add_GetException(nCurParsedType);
267cdf0e10cSrcweir             nCurParsedType = 0;
268cdf0e10cSrcweir             break;
269cdf0e10cSrcweir         case in_set:
270cdf0e10cSrcweir             csv_assert(pCurAttribute != 0);
271cdf0e10cSrcweir             pCurAttribute->Add_SetException(nCurParsedType);
272cdf0e10cSrcweir             nCurParsedType = 0;
273cdf0e10cSrcweir             break;
274cdf0e10cSrcweir         default:
275cdf0e10cSrcweir             csv_assert(false);
276cdf0e10cSrcweir     }   // end switch
277cdf0e10cSrcweir }
278cdf0e10cSrcweir 
279cdf0e10cSrcweir 
280cdf0e10cSrcweir UnoIDL_PE &
MyPE()281cdf0e10cSrcweir PE_Attribute::MyPE()
282cdf0e10cSrcweir {
283cdf0e10cSrcweir     return *this;
284cdf0e10cSrcweir }
285cdf0e10cSrcweir 
286cdf0e10cSrcweir 
287cdf0e10cSrcweir }   // namespace uidl
288cdf0e10cSrcweir }   // namespace csi
289