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