1*1c78a5d6SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*1c78a5d6SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*1c78a5d6SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*1c78a5d6SAndrew Rist * distributed with this work for additional information
6*1c78a5d6SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*1c78a5d6SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*1c78a5d6SAndrew Rist * "License"); you may not use this file except in compliance
9*1c78a5d6SAndrew Rist * with the License. You may obtain a copy of the License at
10*1c78a5d6SAndrew Rist *
11*1c78a5d6SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*1c78a5d6SAndrew Rist *
13*1c78a5d6SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*1c78a5d6SAndrew Rist * software distributed under the License is distributed on an
15*1c78a5d6SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*1c78a5d6SAndrew Rist * KIND, either express or implied. See the License for the
17*1c78a5d6SAndrew Rist * specific language governing permissions and limitations
18*1c78a5d6SAndrew Rist * under the License.
19*1c78a5d6SAndrew Rist *
20*1c78a5d6SAndrew Rist *************************************************************/
21*1c78a5d6SAndrew Rist
22*1c78a5d6SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir #ifndef LUIDL_DISTRIB_HXX
25cdf0e10cSrcweir #define LUIDL_DISTRIB_HXX
26cdf0e10cSrcweir
27cdf0e10cSrcweir
28cdf0e10cSrcweir
29cdf0e10cSrcweir // USED SERVICES
30cdf0e10cSrcweir // BASE CLASSES
31cdf0e10cSrcweir #include <s2_luidl/tokrecv.hxx>
32cdf0e10cSrcweir #include <s2_dsapi/tokrecv.hxx>
33cdf0e10cSrcweir #include <s2_luidl/tokproct.hxx>
34cdf0e10cSrcweir // COMPONENTS
35cdf0e10cSrcweir // PARAMETERS
36cdf0e10cSrcweir
37cdf0e10cSrcweir
38cdf0e10cSrcweir class ParserInfo;
39cdf0e10cSrcweir
40cdf0e10cSrcweir namespace ary
41cdf0e10cSrcweir {
42cdf0e10cSrcweir class Repository;
43cdf0e10cSrcweir
44cdf0e10cSrcweir namespace doc
45cdf0e10cSrcweir {
46cdf0e10cSrcweir class OldIdlDocu;
47cdf0e10cSrcweir } // namespace inf
48cdf0e10cSrcweir } // namespace ary)
49cdf0e10cSrcweir
50cdf0e10cSrcweir
51cdf0e10cSrcweir
52cdf0e10cSrcweir namespace csi
53cdf0e10cSrcweir {
54cdf0e10cSrcweir namespace dsapi
55cdf0e10cSrcweir {
56cdf0e10cSrcweir class Token_Receiver;
57cdf0e10cSrcweir class SapiDocu_PE;
58cdf0e10cSrcweir }
59cdf0e10cSrcweir
60cdf0e10cSrcweir
61cdf0e10cSrcweir
62cdf0e10cSrcweir namespace uidl
63cdf0e10cSrcweir {
64cdf0e10cSrcweir
65cdf0e10cSrcweir
66cdf0e10cSrcweir typedef std::vector< DYN Token * > TokenQueue;
67cdf0e10cSrcweir typedef TokenQueue::iterator TokenIterator;
68cdf0e10cSrcweir
69cdf0e10cSrcweir class TokenParser_Uidl;
70cdf0e10cSrcweir class UnoIDL_PE;
71cdf0e10cSrcweir class Token;
72cdf0e10cSrcweir
73cdf0e10cSrcweir
74cdf0e10cSrcweir class TokenDistributor : private TokenProcessing_Types
75cdf0e10cSrcweir
76cdf0e10cSrcweir {
77cdf0e10cSrcweir public:
78cdf0e10cSrcweir TokenDistributor(
79cdf0e10cSrcweir ary::Repository & io_rRepository,
80cdf0e10cSrcweir ParserInfo & io_rParserInfo );
81cdf0e10cSrcweir void SetTokenProvider(
82cdf0e10cSrcweir TokenParser_Uidl & io_rTokenSource );
83cdf0e10cSrcweir void SetTopParseEnvironment(
84cdf0e10cSrcweir UnoIDL_PE & io_pTopParseEnvironment );
85cdf0e10cSrcweir ~TokenDistributor();
86cdf0e10cSrcweir
87cdf0e10cSrcweir
Reset()88cdf0e10cSrcweir void Reset() { aDocumentation.Reset(); }
89cdf0e10cSrcweir /** calls pTokenSource->GetNextToken() and checks the incoming tokens, until a
90cdf0e10cSrcweir usable token is found. This token will be forwarded to
91cdf0e10cSrcweir pTopParseEnv;
92cdf0e10cSrcweir */
93cdf0e10cSrcweir void TradeToken();
94cdf0e10cSrcweir
95cdf0e10cSrcweir csi::uidl::Token_Receiver &
96cdf0e10cSrcweir CodeTokens_Receiver();
97cdf0e10cSrcweir csi::dsapi::Token_Receiver &
98cdf0e10cSrcweir DocuTokens_Receiver();
99cdf0e10cSrcweir
100cdf0e10cSrcweir /** Used from PE_File, if there is a docu to get without
101cdf0e10cSrcweir an environment to push (this is the case for modules).
102cdf0e10cSrcweir */
103cdf0e10cSrcweir DYN ary::doc::OldIdlDocu *
ReleaseLastParsedDocu()104cdf0e10cSrcweir ReleaseLastParsedDocu()
105cdf0e10cSrcweir { return aDocumentation.ReleaseLastParsedDocu(); }
106cdf0e10cSrcweir
107cdf0e10cSrcweir /** Used from PE_File, if the term "published" was parsed.
108cdf0e10cSrcweir The next opened parse environment will be set to be published
109cdf0e10cSrcweir (call ->UnoIDL_PE::SetPublished()).
110cdf0e10cSrcweir */
Set_PublishedOn()111cdf0e10cSrcweir void Set_PublishedOn()
112cdf0e10cSrcweir { aProcessingData.Set_PublishedOn(); }
113cdf0e10cSrcweir
114cdf0e10cSrcweir
115cdf0e10cSrcweir private:
116cdf0e10cSrcweir class Documentation;
117cdf0e10cSrcweir class ProcessingData;
118cdf0e10cSrcweir friend class ProcessingData;
119cdf0e10cSrcweir
120cdf0e10cSrcweir class ProcessingData : public csi::uidl::Token_Receiver,
121cdf0e10cSrcweir private TokenProcessing_Types
122cdf0e10cSrcweir {
123cdf0e10cSrcweir public:
124cdf0e10cSrcweir ProcessingData(
125cdf0e10cSrcweir ary::Repository & io_rRepository,
126cdf0e10cSrcweir Documentation & i_rDocuProcessor,
127cdf0e10cSrcweir ParserInfo & io_rParserInfo );
128cdf0e10cSrcweir ~ProcessingData();
129cdf0e10cSrcweir void SetTopParseEnvironment(
130cdf0e10cSrcweir UnoIDL_PE & io_pTopParseEnvironment );
131cdf0e10cSrcweir
132cdf0e10cSrcweir
133cdf0e10cSrcweir /** is called from pTokenSource before finishing a ::TokenParse2::GetNextToken()
134cdf0e10cSrcweir call and passes the just parsed token to this class.
135cdf0e10cSrcweir */
136cdf0e10cSrcweir virtual void Receive(
137cdf0e10cSrcweir DYN csi::uidl::Token &
138cdf0e10cSrcweir let_drToken );
139cdf0e10cSrcweir virtual void Increment_CurLine();
140cdf0e10cSrcweir
141cdf0e10cSrcweir void ProcessCurToken();
142cdf0e10cSrcweir
143cdf0e10cSrcweir UnoIDL_PE & CurEnvironment() const;
144cdf0e10cSrcweir bool NextTokenExists() const;
Set_PublishedOn()145cdf0e10cSrcweir void Set_PublishedOn()
146cdf0e10cSrcweir { bPublishedRecentlyOn = true; }
147cdf0e10cSrcweir
148cdf0e10cSrcweir private:
149cdf0e10cSrcweir typedef uintt TokenQ_Position;
150cdf0e10cSrcweir typedef std::pair< UnoIDL_PE *, TokenQ_Position > EnvironmentInfo;
151cdf0e10cSrcweir typedef std::vector< EnvironmentInfo > EnvironmentStack;
152cdf0e10cSrcweir
153cdf0e10cSrcweir void AcknowledgeResult();
154cdf0e10cSrcweir const csi::uidl::Token &
155cdf0e10cSrcweir CurToken() const;
156cdf0e10cSrcweir UnoIDL_PE & CurEnv() const;
157cdf0e10cSrcweir UnoIDL_PE & PushEnv() const;
158cdf0e10cSrcweir uintt CurTokenPosition() const;
159cdf0e10cSrcweir uintt CurEnv_TriedTokenPosition() const;
160cdf0e10cSrcweir void DecrementTryCount();
161cdf0e10cSrcweir
162cdf0e10cSrcweir EnvironmentStack aEnvironments;
163cdf0e10cSrcweir TokenQueue aTokenQueue;
164cdf0e10cSrcweir TokenIterator itCurToken;
165cdf0e10cSrcweir TokenProcessing_Result
166cdf0e10cSrcweir aCurResult;
167cdf0e10cSrcweir uintt nTryCount;
168cdf0e10cSrcweir bool bFinished;
169cdf0e10cSrcweir ary::Repository &
170cdf0e10cSrcweir rRepository;
171cdf0e10cSrcweir ParserInfo & rParserInfo;
172cdf0e10cSrcweir Documentation * pDocuProcessor;
173cdf0e10cSrcweir bool bPublishedRecentlyOn;
174cdf0e10cSrcweir };
175cdf0e10cSrcweir
176cdf0e10cSrcweir class Documentation : public csi::dsapi::Token_Receiver
177cdf0e10cSrcweir {
178cdf0e10cSrcweir public:
179cdf0e10cSrcweir Documentation(
180cdf0e10cSrcweir ParserInfo & io_rParserInfo);
181cdf0e10cSrcweir ~Documentation();
182cdf0e10cSrcweir
Reset()183cdf0e10cSrcweir void Reset() { bIsPassedFirstDocu = false; }
184cdf0e10cSrcweir
185cdf0e10cSrcweir virtual void Receive(
186cdf0e10cSrcweir DYN csi::dsapi::Token &
187cdf0e10cSrcweir let_drToken );
188cdf0e10cSrcweir virtual void Increment_CurLine();
189cdf0e10cSrcweir DYN ary::doc::OldIdlDocu *
ReleaseLastParsedDocu()190cdf0e10cSrcweir ReleaseLastParsedDocu()
191cdf0e10cSrcweir { return pMostRecentDocu.Release(); }
192cdf0e10cSrcweir private:
193cdf0e10cSrcweir Dyn<csi::dsapi::SapiDocu_PE>
194cdf0e10cSrcweir pDocuParseEnv;
195cdf0e10cSrcweir ParserInfo & rParserInfo;
196cdf0e10cSrcweir Dyn<ary::doc::OldIdlDocu>
197cdf0e10cSrcweir pMostRecentDocu;
198cdf0e10cSrcweir bool bIsPassedFirstDocu;
199cdf0e10cSrcweir };
200cdf0e10cSrcweir
201cdf0e10cSrcweir // DATA
202cdf0e10cSrcweir TokenParser_Uidl * pTokenSource;
203cdf0e10cSrcweir Documentation aDocumentation;
204cdf0e10cSrcweir ProcessingData aProcessingData;
205cdf0e10cSrcweir };
206cdf0e10cSrcweir
207cdf0e10cSrcweir
208cdf0e10cSrcweir
209cdf0e10cSrcweir // IMPLEMENTATION
210cdf0e10cSrcweir
211cdf0e10cSrcweir inline void
SetTokenProvider(TokenParser_Uidl & io_rTokenSource)212cdf0e10cSrcweir TokenDistributor::SetTokenProvider( TokenParser_Uidl & io_rTokenSource )
213cdf0e10cSrcweir { pTokenSource = &io_rTokenSource; }
214cdf0e10cSrcweir
215cdf0e10cSrcweir inline void
SetTopParseEnvironment(UnoIDL_PE & io_pTopParseEnvironment)216cdf0e10cSrcweir TokenDistributor::SetTopParseEnvironment( UnoIDL_PE & io_pTopParseEnvironment )
217cdf0e10cSrcweir { aProcessingData.SetTopParseEnvironment(io_pTopParseEnvironment); }
218cdf0e10cSrcweir
219cdf0e10cSrcweir inline csi::uidl::Token_Receiver &
CodeTokens_Receiver()220cdf0e10cSrcweir TokenDistributor::CodeTokens_Receiver()
221cdf0e10cSrcweir { return aProcessingData; }
222cdf0e10cSrcweir
223cdf0e10cSrcweir inline csi::dsapi::Token_Receiver &
DocuTokens_Receiver()224cdf0e10cSrcweir TokenDistributor::DocuTokens_Receiver()
225cdf0e10cSrcweir { return aDocumentation; }
226cdf0e10cSrcweir
227cdf0e10cSrcweir inline const csi::uidl::Token &
CurToken() const228cdf0e10cSrcweir TokenDistributor::ProcessingData::CurToken() const
229cdf0e10cSrcweir {
230cdf0e10cSrcweir csv_assert( itCurToken != aTokenQueue.end() );
231cdf0e10cSrcweir csv_assert( *itCurToken != 0 );
232cdf0e10cSrcweir return *(*itCurToken);
233cdf0e10cSrcweir }
234cdf0e10cSrcweir
235cdf0e10cSrcweir inline UnoIDL_PE &
CurEnv() const236cdf0e10cSrcweir TokenDistributor::ProcessingData::CurEnv() const
237cdf0e10cSrcweir {
238cdf0e10cSrcweir csv_assert( aEnvironments.size() > 0 );
239cdf0e10cSrcweir csv_assert( aEnvironments.back().first != 0 );
240cdf0e10cSrcweir return *aEnvironments.back().first;
241cdf0e10cSrcweir }
242cdf0e10cSrcweir
243cdf0e10cSrcweir inline UnoIDL_PE &
PushEnv() const244cdf0e10cSrcweir TokenDistributor::ProcessingData::PushEnv() const
245cdf0e10cSrcweir {
246cdf0e10cSrcweir csv_assert( aCurResult.pEnv2Push != 0 );
247cdf0e10cSrcweir return *aCurResult.pEnv2Push;
248cdf0e10cSrcweir }
249cdf0e10cSrcweir
250cdf0e10cSrcweir inline uintt
CurTokenPosition() const251cdf0e10cSrcweir TokenDistributor::ProcessingData::CurTokenPosition() const
252cdf0e10cSrcweir {
253cdf0e10cSrcweir return itCurToken - aTokenQueue.begin();
254cdf0e10cSrcweir }
255cdf0e10cSrcweir
256cdf0e10cSrcweir inline uintt
CurEnv_TriedTokenPosition() const257cdf0e10cSrcweir TokenDistributor::ProcessingData::CurEnv_TriedTokenPosition() const
258cdf0e10cSrcweir {
259cdf0e10cSrcweir csv_assert( aEnvironments.size() > 0 );
260cdf0e10cSrcweir return aEnvironments.back().second;
261cdf0e10cSrcweir }
262cdf0e10cSrcweir
263cdf0e10cSrcweir
264cdf0e10cSrcweir } // namespace uidl
265cdf0e10cSrcweir } // namespace csi
266cdf0e10cSrcweir
267cdf0e10cSrcweir #endif
268cdf0e10cSrcweir
269