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