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