Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #ifndef _SVPARSER_HXX
21 : #define _SVPARSER_HXX
22 :
23 : #include "svtools/svtdllapi.h"
24 : #include <tools/link.hxx>
25 : #include <tools/string.hxx>
26 : #include <tools/ref.hxx>
27 : #include <rtl/textenc.h>
28 : #include <boost/ptr_container/ptr_vector.hpp>
29 : #include <boost/utility.hpp>
30 : #include <vector>
31 :
32 : struct SvParser_Impl;
33 : class SvStream;
34 :
35 : enum SvParserState
36 : {
37 : SVPAR_ACCEPTED = 0,
38 : SVPAR_NOTSTARTED,
39 : SVPAR_WORKING,
40 : SVPAR_PENDING,
41 : SVPAR_WAITFORDATA,
42 : SVPAR_ERROR
43 : };
44 :
45 : class SVT_DLLPUBLIC SvParser : public SvRefBase
46 : {
47 : DECL_STATIC_LINK( SvParser, NewDataRead, void* );
48 :
49 : protected:
50 : SvStream& rInput;
51 : String aToken; // gescanntes Token
52 : sal_uLong nlLineNr; // akt. Zeilen Nummer
53 : sal_uLong nlLinePos; // akt. Spalten Nummer
54 :
55 : SvParser_Impl *pImplData; // interne Daten
56 : long nTokenValue; // zusaetzlicher Wert (RTF)
57 : sal_Bool bTokenHasValue; // indicates whether nTokenValue is valid
58 : SvParserState eState; // Status auch in abgl. Klassen
59 :
60 : rtl_TextEncoding eSrcEnc; // Source encoding
61 :
62 : sal_uLong nNextChPos;
63 : sal_Unicode nNextCh; // Akt. Zeichen fuer die "lex"
64 :
65 :
66 : sal_Bool bDownloadingFile : 1;// sal_True: Es wird gerade ein externes
67 : // File geladen. d.h. alle
68 : // DataAvailable Links muessen
69 : // ignoriert werden.
70 : // Wenn keibes der folgenden
71 : // Flags gesetzt ist, wird der
72 : // Stream als ANSI gelesen,
73 : // aber als CharSet DONTKNOW
74 : // zurueckgegeben.
75 : sal_Bool bUCS2BSrcEnc : 1; // oder als big-endian UCS2
76 : sal_Bool bSwitchToUCS2 : 1; // Umschalten des ist erlaubt
77 :
78 : sal_Bool bRTF_InTextRead : 1; // only for RTF-Parser!!!
79 :
80 : struct TokenStackType
81 : {
82 : String sToken;
83 : long nTokenValue;
84 : sal_Bool bTokenHasValue;
85 : int nTokenId;
86 :
87 6 : inline TokenStackType() { nTokenId = 0; }
88 6 : inline ~TokenStackType() { }
89 : };
90 :
91 : // Methoden fuer Token-Stack
92 : int SkipToken( short nCnt = -1 ); // n Tokens zurueck "skippen"
93 : TokenStackType* GetStackPtr( short nCnt );
94 : inline sal_uInt8 GetStackPos() const;
95 :
96 : // scanne das naechste Token:
97 : // Tokenstack abarbeiten und ggfs. _GetNextToken() rufen. Diese
98 : // ist fuers erkennen von neuen Token verantwortlich
99 : int GetNextToken();
100 : virtual int _GetNextToken() = 0;
101 :
102 : // wird fuer jedes Token gerufen, das in CallParser erkannt wird
103 : virtual void NextToken( int nToken );
104 :
105 : // zu Zeiten der SvRefBase-Ableitung darf nicht jeder loeschen
106 : virtual ~SvParser();
107 :
108 : void ClearTxtConvContext();
109 :
110 : private:
111 : TokenStackType* pTokenStack;
112 : TokenStackType *pTokenStackPos;
113 : sal_uInt8 nTokenStackSize, nTokenStackPos;
114 :
115 : public:
116 : // Konstruktor
117 : SvParser( SvStream& rIn, sal_uInt8 nStackSize = 3 );
118 :
119 : virtual SvParserState CallParser() = 0; // Aufruf des Parsers
120 :
121 2 : inline SvParserState GetStatus() const { return eState; } // StatusInfo
122 :
123 39 : inline sal_uLong GetLineNr() const { return nlLineNr; }
124 39 : inline sal_uLong GetLinePos() const { return nlLinePos; }
125 21 : inline sal_uLong IncLineNr() { return ++nlLineNr; }
126 604 : inline sal_uLong IncLinePos() { return ++nlLinePos; }
127 : inline sal_uLong SetLineNr( sal_uLong nlNum ); // inline unten
128 : inline sal_uLong SetLinePos( sal_uLong nlPos ); // inline unten
129 :
130 : sal_Unicode GetNextChar();
131 : void RereadLookahead();
132 :
133 869 : inline int IsParserWorking() const { return SVPAR_WORKING == eState; }
134 :
135 0 : Link GetAsynchCallLink() const
136 0 : { return STATIC_LINK( this, SvParser, NewDataRead ); }
137 :
138 : long CallAsyncCallLink() { return NewDataRead( this, 0 ); }
139 :
140 : // fuers asynchrone lesen aus dem SvStream
141 : /*virtual*/ void SaveState( int nToken );
142 : /*virtual*/ void RestoreState();
143 : virtual void Continue( int nToken );
144 :
145 : inline void SetDownloadingFile( sal_Bool bSet ) { bDownloadingFile = bSet; }
146 0 : inline sal_Bool IsDownloadingFile() const { return bDownloadingFile; }
147 :
148 : // Set/get source encoding. The UCS2BEncoding flag is valid if source
149 : // encoding is UCS2. It specifies a big endian encoding.
150 : void SetSrcEncoding( rtl_TextEncoding eSrcEnc );
151 1 : rtl_TextEncoding GetSrcEncoding() const { return eSrcEnc; }
152 :
153 : void SetSrcUCS2BEncoding( sal_Bool bSet ) { bUCS2BSrcEnc = bSet; }
154 : sal_Bool IsSrcUCS2BEncoding() const { return bUCS2BSrcEnc; }
155 :
156 : // Darf der Zeichensatz auf UCS/2 umgeschaltet werden, wenn
157 : // in den ersten beiden Zeichen im Stream eine BOM steht?
158 2 : void SetSwitchToUCS2( sal_Bool bSet ) { bSwitchToUCS2 = bSet; }
159 : sal_Bool IsSwitchToUCS2() const { return bSwitchToUCS2; }
160 :
161 : // Aus wie vielen Bytes betseht ein Zeichen
162 : inline sal_uInt16 GetCharSize() const;
163 :
164 : int GetSaveToken() const;
165 :
166 : // Aufbau einer Which-Map 'rWhichMap' aus einem Array von
167 : // 'pWhichIds' von Which-Ids. Es hat die Lange 'nWhichIds'.
168 : // Die Which-Map wird nicht geloescht.
169 : static void BuildWhichTbl( std::vector<sal_uInt16> &rWhichMap,
170 : sal_uInt16 *pWhichIds,
171 : sal_uInt16 nWhichIds );
172 : };
173 :
174 :
175 : #ifndef GOODIES_DECL_SVPARSER_DEFINED
176 : #define GOODIES_DECL_SVPARSER_DEFINED
177 1 : SV_DECL_REF(SvParser)
178 : #endif
179 2 : SV_IMPL_REF(SvParser)
180 :
181 :
182 :
183 0 : inline sal_uLong SvParser::SetLineNr( sal_uLong nlNum )
184 0 : { sal_uLong nlOld = nlLineNr; nlLineNr = nlNum; return nlOld; }
185 :
186 21 : inline sal_uLong SvParser::SetLinePos( sal_uLong nlPos )
187 21 : { sal_uLong nlOld = nlLinePos; nlLinePos = nlPos; return nlOld; }
188 :
189 : inline sal_uInt8 SvParser::GetStackPos() const
190 : { return nTokenStackPos; }
191 :
192 0 : inline sal_uInt16 SvParser::GetCharSize() const
193 : {
194 0 : return (RTL_TEXTENCODING_UCS2 == eSrcEnc) ? 2 : 1;
195 : }
196 :
197 :
198 : /*========================================================================
199 : *
200 : * SvKeyValue.
201 : *
202 : *======================================================================*/
203 :
204 7054 : SV_DECL_REF(SvKeyValueIterator)
205 :
206 1858 : class SvKeyValue
207 : {
208 : /** Representation.
209 : */
210 : String m_aKey;
211 : String m_aValue;
212 :
213 : public:
214 : /** Construction.
215 : */
216 625 : SvKeyValue (void)
217 625 : {}
218 :
219 623 : SvKeyValue (const String &rKey, const String &rValue)
220 623 : : m_aKey (rKey), m_aValue (rValue)
221 623 : {}
222 :
223 623 : SvKeyValue (const SvKeyValue &rOther)
224 623 : : m_aKey (rOther.m_aKey), m_aValue (rOther.m_aValue)
225 623 : {}
226 :
227 : /** Assignment.
228 : */
229 627 : SvKeyValue& operator= (SvKeyValue &rOther)
230 : {
231 627 : m_aKey = rOther.m_aKey;
232 627 : m_aValue = rOther.m_aValue;
233 627 : return *this;
234 : }
235 :
236 : /** Operation.
237 : */
238 1250 : const String& GetKey (void) const { return m_aKey; }
239 625 : const String& GetValue (void) const { return m_aValue; }
240 :
241 : void SetKey (const String &rKey ) { m_aKey = rKey; }
242 : void SetValue (const String &rValue) { m_aValue = rValue; }
243 : };
244 :
245 : /*========================================================================
246 : *
247 : * SvKeyValueIterator.
248 : *
249 : *======================================================================*/
250 :
251 : typedef boost::ptr_vector<SvKeyValue> SvKeyValueList_Impl;
252 :
253 : class SVT_DLLPUBLIC SvKeyValueIterator : public SvRefBase,
254 : private boost::noncopyable
255 : {
256 : /** Representation.
257 : */
258 : SvKeyValueList_Impl* m_pList;
259 : sal_uInt16 m_nPos;
260 :
261 : public:
262 : /** Construction/Destruction.
263 : */
264 : SvKeyValueIterator (void);
265 : virtual ~SvKeyValueIterator (void);
266 :
267 : /** Operation.
268 : */
269 : virtual sal_Bool GetFirst (SvKeyValue &rKeyVal);
270 : virtual sal_Bool GetNext (SvKeyValue &rKeyVal);
271 : virtual void Append (const SvKeyValue &rKeyVal);
272 : };
273 :
274 6923 : SV_IMPL_REF(SvKeyValueIterator);
275 :
276 : #endif //_SVPARSER_HXX
277 :
278 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|