xref: /trunk/main/autodoc/source/parser_i/idl/pe_selem.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_selem.hxx>
30 
31 // NOT FULLY DECLARED SERVICES
32 #include <ary/idl/i_gate.hxx>
33 #include <ary/idl/i_struct.hxx>
34 #include <ary/idl/i_structelem.hxx>
35 #include <ary/idl/ip_ce.hxx>
36 #include <ary/doc/d_oldidldocu.hxx>
37 #include <s2_luidl/pe_type2.hxx>
38 #include <s2_luidl/tk_ident.hxx>
39 #include <s2_luidl/tk_punct.hxx>
40 
41 
42 namespace csi
43 {
44 namespace uidl
45 {
46 
47 namespace
48 {
49     const String  C_sNone;
50 }
51 
52 PE_StructElement::PE_StructElement( RStructElement &    o_rResult,
53                                     const RStruct &     i_rCurStruct,
54                                     const String &      i_rCurStructTemplateParam )
55     :   eState(e_none),
56         pResult(&o_rResult),
57         pCurStruct(&i_rCurStruct),
58         bIsExceptionElement(false),
59         pPE_Type(0),
60         nType(0),
61         sName(),
62         pCurStructTemplateParam(&i_rCurStructTemplateParam)
63 {
64     pPE_Type = new PE_Type(nType);
65 }
66 
67 PE_StructElement::PE_StructElement( RStructElement &    o_rResult,
68                                     const RStruct &     i_rCurExc )
69     :   eState(e_none),
70         pResult(&o_rResult),
71         pCurStruct(&i_rCurExc),
72         bIsExceptionElement(true),
73         pPE_Type(0),
74         nType(0),
75         sName(),
76         pCurStructTemplateParam(&C_sNone)
77 {
78     pPE_Type = new PE_Type(nType);
79 }
80 
81 void
82 PE_StructElement::EstablishContacts( UnoIDL_PE *                io_pParentPE,
83                                      ary::Repository &      io_rRepository,
84                                      TokenProcessing_Result &   o_rResult )
85 {
86     UnoIDL_PE::EstablishContacts(io_pParentPE,io_rRepository,o_rResult);
87     pPE_Type->EstablishContacts(this,io_rRepository,o_rResult);
88 }
89 
90 PE_StructElement::~PE_StructElement()
91 {
92 }
93 
94 void
95 PE_StructElement::ProcessToken( const Token & i_rToken )
96 {
97     i_rToken.Trigger(*this);
98 }
99 
100 void
101 PE_StructElement::Process_Default()
102 {
103     if (eState == expect_type)
104     {
105         SetResult( not_done, push_sure, pPE_Type.Ptr() );
106         eState = expect_name;
107     }
108     else {
109         csv_assert(false);
110     }
111 }
112 
113 void
114 PE_StructElement::Process_Identifier( const TokIdentifier & i_rToken )
115 {
116     csv_assert(*i_rToken.Text() != 0);
117 
118     if (eState == expect_type)
119     {
120         if ( *pCurStructTemplateParam == i_rToken.Text() )
121         {
122             nType = lhf_FindTemplateParamType();
123             SetResult( done, stay );
124             eState = expect_name;
125         }
126         else    // No template parameter type existing, or not matching:
127         {
128             SetResult( not_done, push_sure, pPE_Type.Ptr() );
129             eState = expect_name;
130         }
131     }
132     else if (eState == expect_name)
133     {
134         sName = i_rToken.Text();
135         SetResult( done, stay );
136         eState = expect_finish;
137     }
138     else {
139         csv_assert(false);
140     }
141 }
142 
143 void
144 PE_StructElement::Process_Punctuation( const TokPunctuation &)
145 {
146     csv_assert(eState == expect_finish);
147 
148     SetResult( done, pop_success );
149 }
150 
151 void
152 PE_StructElement::InitData()
153 {
154     eState = expect_type;
155 
156     nType = 0;
157     sName = "";
158 }
159 
160 void
161 PE_StructElement::TransferData()
162 {
163     csv_assert(pResult != 0 AND pCurStruct != 0);
164 
165     ary::idl::StructElement *
166         pCe = 0;
167     if (bIsExceptionElement)
168     {
169         pCe = & Gate().Ces().Store_ExceptionMember(
170                                             *pCurStruct,
171                                             sName,
172                                             nType );
173     }
174     else
175     {
176         pCe = & Gate().Ces().Store_StructMember(
177                                             *pCurStruct,
178                                             sName,
179                                             nType );
180     }
181     *pResult = pCe->CeId();
182     PassDocuAt(*pCe);
183 
184     eState = e_none;
185 }
186 
187 UnoIDL_PE &
188 PE_StructElement::MyPE()
189 {
190     return *this;
191 }
192 
193 ary::idl::Type_id
194 PE_StructElement::lhf_FindTemplateParamType() const
195 {
196     const ary::idl::CodeEntity &
197         rCe = Gate().Ces().Find_Ce(*pCurStruct);
198     const ary::idl::Struct &
199         rStruct = static_cast< const ary::idl::Struct& >(rCe);
200     return rStruct.TemplateParameterType();
201 }
202 
203 
204 }   // namespace uidl
205 }   // namespace csi
206