xref: /trunk/main/autodoc/source/parser_i/idl/pe_excp.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #include <precomp.h>
29 #include <s2_luidl/pe_excp.hxx>
30 
31 
32 // NOT FULLY DECLARED SERVICES
33 #include <ary/idl/i_exception.hxx>
34 #include <ary/idl/i_gate.hxx>
35 #include <ary/idl/i_structelem.hxx>
36 #include <ary/idl/ip_ce.hxx>
37 #include <ary/doc/d_oldidldocu.hxx>
38 #include <s2_luidl/tk_ident.hxx>
39 #include <s2_luidl/tk_punct.hxx>
40 #include <s2_luidl/tk_keyw.hxx>
41 #include <s2_luidl/pe_type2.hxx>
42 #include <s2_luidl/pe_selem.hxx>
43 
44 
45 
46 namespace csi
47 {
48 namespace uidl
49 {
50 
51 
52 PE_Exception::PE_Exception()
53     // :    aWork,
54     //      pStati
55 {
56     pStati = new S_Stati(*this);
57 }
58 
59 void
60 PE_Exception::EstablishContacts( UnoIDL_PE *                io_pParentPE,
61                               ary::Repository &         io_rRepository,
62                               TokenProcessing_Result &  o_rResult )
63 {
64     UnoIDL_PE::EstablishContacts(io_pParentPE,io_rRepository,o_rResult);
65     Work().pPE_Element->EstablishContacts(this,io_rRepository,o_rResult);
66     Work().pPE_Type->EstablishContacts(this,io_rRepository,o_rResult);
67 }
68 
69 PE_Exception::~PE_Exception()
70 {
71 }
72 
73 void
74 PE_Exception::ProcessToken( const Token & i_rToken )
75 {
76     i_rToken.Trigger(*Stati().pCurStatus);
77 }
78 
79 
80 void
81 PE_Exception::InitData()
82 {
83     Work().InitData();
84     Stati().pCurStatus = &Stati().aWaitForName;
85 }
86 
87 void
88 PE_Exception::TransferData()
89 {
90     if (NOT Work().bIsPreDeclaration)
91     {
92         csv_assert(Work().sData_Name.size() > 0);
93         csv_assert(Work().nCurStruct.IsValid());
94     }
95     Stati().pCurStatus = &Stati().aNone;
96 }
97 
98 void
99 PE_Exception::ReceiveData()
100 {
101     Stati().pCurStatus->On_SubPE_Left();
102 }
103 
104 PE_Exception::S_Work::S_Work()
105     :   sData_Name(),
106         bIsPreDeclaration(false),
107         nCurStruct(0),
108         pPE_Element(0),
109         nCurParsed_ElementRef(0),
110         pPE_Type(0),
111         nCurParsed_Base(0)
112 
113 {
114     pPE_Element = new PE_StructElement(nCurParsed_ElementRef,nCurStruct);
115     pPE_Type = new PE_Type(nCurParsed_Base);
116 }
117 
118 void
119 PE_Exception::S_Work::InitData()
120 {
121     sData_Name.clear();
122     bIsPreDeclaration = false;
123     nCurStruct = 0;
124 
125     nCurParsed_ElementRef = 0;
126     nCurParsed_Base = 0;
127 }
128 
129 void
130 PE_Exception::S_Work::Prepare_PE_QualifiedName()
131 {
132     nCurParsed_ElementRef = 0;
133 }
134 
135 void
136 PE_Exception::S_Work::Prepare_PE_Element()
137 {
138     nCurParsed_Base = 0;
139 }
140 
141 void
142 PE_Exception::S_Work::Data_Set_Name( const char * i_sName )
143 {
144     sData_Name = i_sName;
145 }
146 
147 PE_Exception::S_Stati::S_Stati(PE_Exception & io_rStruct)
148     :   aNone(io_rStruct),
149         aWaitForName(io_rStruct),
150         aGotName(io_rStruct),
151         aWaitForBase(io_rStruct),
152         aGotBase(io_rStruct),
153         aWaitForElement(io_rStruct),
154         aWaitForFinish(io_rStruct),
155         pCurStatus(0)
156 {
157     pCurStatus = &aNone;
158 }
159 
160 
161 //***********************       Stati       ***************************//
162 
163 
164 UnoIDL_PE &
165 PE_Exception::PE_StructState::MyPE()
166 {
167     return rStruct;
168 }
169 
170 
171 void
172 PE_Exception::State_WaitForName::Process_Identifier( const TokIdentifier & i_rToken )
173 {
174     Work().Data_Set_Name(i_rToken.Text());
175     MoveState( Stati().aGotName );
176     SetResult(done,stay);
177 }
178 
179 void
180 PE_Exception::State_GotName::Process_Punctuation( const TokPunctuation & i_rToken )
181 {
182     if ( i_rToken.Id() != TokPunctuation::Semicolon )
183     {
184         switch (i_rToken.Id())
185         {
186             case TokPunctuation::Colon:
187                 MoveState( Stati().aWaitForBase );
188                 SetResult(done,push_sure,Work().pPE_Type.Ptr());
189                 Work().Prepare_PE_QualifiedName();
190                 break;
191             case TokPunctuation::CurledBracketOpen:
192                 PE().store_Exception();
193                 MoveState( Stati().aWaitForElement );
194                 SetResult(done,stay);
195                 break;
196             default:
197                 SetResult(not_done,pop_failure);
198         }   // end switch
199     }
200     else
201     {
202         Work().sData_Name.clear();
203         SetResult(done,pop_success);
204     }
205 }
206 
207 void
208 PE_Exception::State_WaitForBase::On_SubPE_Left()
209 {
210     MoveState(Stati().aGotBase);
211 }
212 
213 void
214 PE_Exception::State_GotBase::Process_Punctuation( const TokPunctuation & i_rToken )
215 {
216     if ( i_rToken.Id() == TokPunctuation::CurledBracketOpen )
217     {
218         PE().store_Exception();
219         MoveState( Stati().aWaitForElement );
220         SetResult(done,stay);
221     }
222     else
223     {
224         SetResult(not_done,pop_failure);
225     }
226 }
227 
228 void
229 PE_Exception::State_WaitForElement::Process_Identifier( const TokIdentifier & )
230 {
231     SetResult( not_done, push_sure, Work().pPE_Element.Ptr() );
232     Work().Prepare_PE_Element();
233 }
234 
235 void
236 PE_Exception::State_WaitForElement::Process_NameSeparator()
237 {
238     SetResult( not_done, push_sure, Work().pPE_Element.Ptr());
239     Work().Prepare_PE_Element();
240 }
241 
242 void
243 PE_Exception::State_WaitForElement::Process_BuiltInType( const TokBuiltInType & )
244 {
245     SetResult( not_done, push_sure, Work().pPE_Element.Ptr());
246     Work().Prepare_PE_Element();
247 }
248 
249 void
250 PE_Exception::State_WaitForElement::Process_TypeModifier(const TokTypeModifier & )
251 {
252     SetResult( not_done, push_sure, Work().pPE_Element.Ptr());
253     Work().Prepare_PE_Element();
254 }
255 
256 void
257 PE_Exception::State_WaitForElement::Process_Punctuation( const TokPunctuation & i_rToken )
258 {
259     if ( i_rToken.Id() == TokPunctuation::CurledBracketClose )
260     {
261         MoveState( Stati().aWaitForFinish );
262         SetResult( done, stay );
263     }
264     else
265     {
266         SetResult( not_done, pop_failure );
267     }
268 }
269 
270 void
271 PE_Exception::State_WaitForFinish::Process_Punctuation( const TokPunctuation & i_rToken )
272 {
273     if (i_rToken.Id() == TokPunctuation::Semicolon)
274     {
275         MoveState( Stati().aNone );
276         SetResult( done, pop_success );
277     }
278     else
279     {
280         SetResult( not_done, pop_failure );
281     }
282 }
283 
284 void
285 PE_Exception::store_Exception()
286 {
287     ary::idl::Exception &
288         rCe = Gate().Ces().Store_Exception(
289                             CurNamespace().CeId(),
290                             Work().sData_Name,
291                             Work().nCurParsed_Base );
292     PassDocuAt(rCe);
293     Work().nCurStruct = rCe.Id();
294 }
295 
296 
297 }   // namespace uidl
298 }   // namespace csi
299