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 :
21 : #include <limits.h>
22 : #include <ctype.h>
23 : #include <bastype.hxx>
24 : #include <lex.hxx>
25 : #include <globals.hxx>
26 : #include <hash.hxx>
27 : #include <database.hxx>
28 :
29 0 : static sal_Bool ReadRangeSvIdl( SvStringHashEntry * pName, SvTokenStream & rInStm,
30 : sal_uLong nMin, sal_uLong nMax, sal_uLong* pValue )
31 : {
32 0 : sal_uInt32 nTokPos = rInStm.Tell();
33 0 : SvToken * pTok = rInStm.GetToken_Next();
34 0 : if( pTok->Is( pName ) )
35 : {
36 0 : sal_Bool bOk = sal_False;
37 0 : if( rInStm.Read( '=' ) )
38 : {
39 0 : pTok = rInStm.GetToken_Next();
40 0 : if( pTok->IsInteger() )
41 : {
42 0 : sal_uLong n = pTok->GetNumber();
43 0 : if ( n >= nMin && n <= nMax )
44 : {
45 0 : *pValue = n;
46 0 : bOk = sal_True;
47 : }
48 : }
49 : }
50 :
51 0 : if( bOk )
52 0 : return sal_True;
53 : }
54 :
55 0 : rInStm.Seek( nTokPos );
56 0 : return sal_False;
57 : }
58 :
59 0 : sal_uInt32 SvUINT32::Read( SvStream & rStm )
60 : {
61 0 : return SvPersistStream::ReadCompressed( rStm );
62 : }
63 :
64 0 : void SvUINT32::Write( SvStream & rStm, sal_uInt32 nVal )
65 : {
66 0 : SvPersistStream::WriteCompressed( rStm, nVal );
67 0 : }
68 :
69 0 : SvStream& WriteSvBOOL(SvStream & rStm, const SvBOOL & rb )
70 : {
71 0 : sal_uInt8 n = rb.nVal;
72 0 : if( rb.bSet )
73 0 : n |= 0x02;
74 0 : rStm.WriteUChar( n );
75 0 : return rStm;
76 : }
77 0 : SvStream& operator >> (SvStream & rStm, SvBOOL & rb )
78 : {
79 : sal_uInt8 n;
80 0 : rStm.ReadUChar( n );
81 0 : rb.nVal = (n & 0x01) ? sal_True : sal_False;
82 0 : rb.bSet = (n & 0x02) ? sal_True : sal_False;
83 0 : if( n & ~0x03 )
84 : {
85 0 : rStm.SetError( SVSTREAM_FILEFORMAT_ERROR );
86 : OSL_FAIL( "format error" );
87 : }
88 0 : return rStm;
89 : }
90 :
91 0 : SvStream& WriteSvVersion(SvStream & rStm, const SvVersion & r )
92 : {
93 0 : if( (r.GetMajorVersion() || r.GetMinorVersion())
94 0 : && r.GetMajorVersion() <= 0x0F && r.GetMinorVersion() <= 0x0F )
95 : { // compress version number in 1 byte
96 : // format first 4 bit for major, then 4 bit for minor
97 : // 0.0 gets not compressed
98 :
99 0 : int n = r.GetMajorVersion() << 4;
100 0 : n |= r.GetMinorVersion();
101 0 : rStm.WriteUChar( (sal_uInt8)n );
102 : }
103 : else
104 : {
105 0 : rStm.WriteUChar( (sal_uInt8)0 );
106 0 : rStm.WriteUInt16( r.GetMajorVersion() );
107 0 : rStm.WriteUInt16( r.GetMinorVersion() );
108 : }
109 0 : return rStm;
110 : }
111 :
112 0 : SvStream& operator >> (SvStream & rStm, SvVersion & r )
113 : {
114 : sal_uInt8 n;
115 0 : rStm.ReadUChar( n );
116 0 : if( n == 0 )
117 : { // not compressed
118 0 : rStm.ReadUInt16( r.nMajorVersion );
119 0 : rStm.ReadUInt16( r.nMinorVersion );
120 : }
121 : else
122 : { // compressed
123 0 : r.nMajorVersion = (n >> 4) & 0x0F;
124 0 : r.nMinorVersion = n & 0x0F;
125 : }
126 0 : return rStm;
127 : }
128 :
129 :
130 0 : sal_Bool SvBOOL::ReadSvIdl( SvStringHashEntry * pName, SvTokenStream & rInStm )
131 : {
132 0 : sal_uInt32 nTokPos = rInStm.Tell();
133 0 : SvToken * pTok = rInStm.GetToken_Next();
134 :
135 0 : if( pTok->Is( pName ) )
136 : {
137 0 : sal_Bool bOk = sal_True;
138 0 : sal_Bool bBraket = rInStm.Read( '(' );
139 0 : if( bBraket || rInStm.Read( '=' ) )
140 : {
141 0 : pTok = rInStm.GetToken();
142 0 : if( pTok->IsBool() )
143 : {
144 0 : *this = pTok->GetBool();
145 :
146 0 : rInStm.GetToken_Next();
147 : }
148 0 : if( bOk && bBraket )
149 0 : bOk = rInStm.Read( ')' );
150 : }
151 : else
152 0 : *this = sal_True; //default action set to TRUE
153 0 : if( bOk )
154 0 : return sal_True;
155 : }
156 0 : rInStm.Seek( nTokPos );
157 0 : return sal_False;
158 : }
159 :
160 0 : sal_Bool SvBOOL::WriteSvIdl( SvStringHashEntry * pName, SvStream & rOutStm )
161 : {
162 0 : if( nVal )
163 0 : rOutStm.WriteCharPtr( pName->GetName().getStr() );
164 : else
165 0 : rOutStm.WriteCharPtr( pName->GetName().getStr() ).WriteCharPtr( "(FALSE)" );
166 0 : return sal_True;
167 : }
168 :
169 0 : OString SvBOOL::GetSvIdlString( SvStringHashEntry * pName )
170 : {
171 0 : if( nVal )
172 0 : return pName->GetName();
173 :
174 0 : return OStringBuffer(pName->GetName()).
175 0 : append("(FALSE)").
176 0 : makeStringAndClear();
177 : }
178 :
179 0 : sal_Bool SvIdentifier::ReadSvIdl( SvStringHashEntry * pName, SvTokenStream & rInStm )
180 : {
181 0 : sal_uInt32 nTokPos = rInStm.Tell();
182 0 : SvToken * pTok = rInStm.GetToken_Next();
183 :
184 0 : if( pTok->Is( pName ) )
185 : {
186 0 : sal_Bool bOk = sal_True;
187 0 : sal_Bool bBraket = rInStm.Read( '(' );
188 0 : if( bBraket || rInStm.Read( '=' ) )
189 : {
190 0 : pTok = rInStm.GetToken();
191 0 : if( pTok->IsIdentifier() )
192 : {
193 0 : setString(pTok->GetString());
194 0 : rInStm.GetToken_Next();
195 : }
196 0 : if( bOk && bBraket )
197 0 : bOk = rInStm.Read( ')' );
198 : }
199 0 : if( bOk )
200 0 : return sal_True;
201 : }
202 0 : rInStm.Seek( nTokPos );
203 0 : return sal_False;
204 : }
205 :
206 0 : sal_Bool SvIdentifier::WriteSvIdl( SvStringHashEntry * pName,
207 : SvStream & rOutStm,
208 : sal_uInt16 /*nTab */ )
209 : {
210 0 : rOutStm.WriteCharPtr( pName->GetName().getStr() ).WriteChar( '(' );
211 0 : rOutStm.WriteCharPtr( getString().getStr() ).WriteChar( ')' );
212 0 : return sal_True;
213 : }
214 :
215 0 : SvStream& WriteSvIdentifier(SvStream & rStm, const SvIdentifier & r )
216 : {
217 0 : write_uInt16_lenPrefixed_uInt8s_FromOString(rStm, r.getString());
218 0 : return rStm;
219 : }
220 :
221 0 : SvStream& operator >> (SvStream & rStm, SvIdentifier & r )
222 : {
223 0 : r.setString(read_uInt16_lenPrefixed_uInt8s_ToOString(rStm));
224 0 : return rStm;
225 : }
226 :
227 :
228 0 : sal_Bool SvNumberIdentifier::ReadSvIdl( SvIdlDataBase & rBase,
229 : SvStringHashEntry * pName,
230 : SvTokenStream & rInStm )
231 : {
232 0 : if( SvIdentifier::ReadSvIdl( pName, rInStm ) )
233 : {
234 : sal_uLong n;
235 0 : if( rBase.FindId( getString(), &n ) )
236 : {
237 0 : nValue = n;
238 0 : return sal_True;
239 : }
240 : else
241 : {
242 0 : OStringBuffer aStr("no value for identifier <");
243 0 : aStr.append(getString()).append("> ");
244 0 : rBase.SetError( aStr.makeStringAndClear(), rInStm.GetToken() );
245 0 : rBase.WriteError( rInStm );
246 : }
247 : }
248 0 : return sal_False;
249 : }
250 :
251 0 : sal_Bool SvNumberIdentifier::ReadSvIdl( SvIdlDataBase & rBase,
252 : SvTokenStream & rInStm )
253 : {
254 0 : sal_uInt32 nTokPos = rInStm.Tell();
255 0 : SvToken * pTok = rInStm.GetToken_Next();
256 :
257 0 : if( pTok->IsIdentifier() )
258 : {
259 : sal_uLong n;
260 0 : if( rBase.FindId( pTok->GetString(), &n ) )
261 : {
262 0 : setString(pTok->GetString());
263 0 : nValue = n;
264 0 : return sal_True;
265 : }
266 : else
267 : {
268 0 : OStringBuffer aStr("no value for identifier <");
269 0 : aStr.append(getString()).append("> ");
270 0 : rBase.SetError( aStr.makeStringAndClear(), rInStm.GetToken() );
271 0 : rBase.WriteError( rInStm );
272 : }
273 : }
274 0 : rInStm.Seek( nTokPos );
275 0 : return sal_False;
276 : }
277 :
278 0 : SvStream& WriteSvNumberIdentifier(SvStream & rStm, const SvNumberIdentifier & r )
279 : {
280 0 : WriteSvIdentifier( rStm, (SvIdentifier &)r );
281 0 : SvPersistStream::WriteCompressed( rStm, r.nValue );
282 0 : return rStm;
283 : }
284 :
285 0 : SvStream& operator >> (SvStream & rStm, SvNumberIdentifier & r )
286 : {
287 0 : rStm >> (SvIdentifier &)r;
288 0 : r.nValue = SvPersistStream::ReadCompressed( rStm );
289 0 : return rStm;
290 : }
291 :
292 :
293 0 : sal_Bool SvString::ReadSvIdl( SvStringHashEntry * pName, SvTokenStream & rInStm )
294 : {
295 0 : sal_uInt32 nTokPos = rInStm.Tell();
296 0 : SvToken * pTok = rInStm.GetToken_Next();
297 :
298 0 : if( pTok->Is( pName ) )
299 : {
300 0 : sal_Bool bOk = sal_True;
301 0 : sal_Bool bBraket = rInStm.Read( '(' );
302 0 : if( bBraket || rInStm.Read( '=' ) )
303 : {
304 0 : pTok = rInStm.GetToken();
305 0 : if( pTok->IsString() )
306 : {
307 0 : setString(pTok->GetString());
308 0 : rInStm.GetToken_Next();
309 : }
310 0 : if( bOk && bBraket )
311 0 : bOk = rInStm.Read( ')' );
312 : }
313 0 : if( bOk )
314 0 : return sal_True;
315 : }
316 0 : rInStm.Seek( nTokPos );
317 0 : return sal_False;
318 : }
319 :
320 0 : sal_Bool SvString::WriteSvIdl( SvStringHashEntry * pName, SvStream & rOutStm,
321 : sal_uInt16 /*nTab */ )
322 : {
323 0 : rOutStm.WriteCharPtr( pName->GetName().getStr() ).WriteCharPtr( "(\"" );
324 0 : rOutStm.WriteCharPtr( m_aStr.getStr() ).WriteCharPtr( "\")" );
325 0 : return sal_True;
326 : }
327 :
328 0 : SvStream& WriteSvString(SvStream & rStm, const SvString & r )
329 : {
330 0 : write_uInt16_lenPrefixed_uInt8s_FromOString(rStm, r.getString());
331 0 : return rStm;
332 : }
333 :
334 0 : SvStream& operator >> (SvStream & rStm, SvString & r )
335 : {
336 0 : r.setString(read_uInt16_lenPrefixed_uInt8s_ToOString(rStm));
337 0 : return rStm;
338 : }
339 :
340 :
341 0 : sal_Bool SvHelpText::ReadSvIdl( SvIdlDataBase &, SvTokenStream & rInStm )
342 : {
343 0 : return SvString::ReadSvIdl( SvHash_HelpText(), rInStm );
344 : }
345 :
346 0 : sal_Bool SvHelpText::WriteSvIdl( SvIdlDataBase &, SvStream & rOutStm, sal_uInt16 nTab )
347 : {
348 0 : return SvString::WriteSvIdl( SvHash_HelpText(), rOutStm, nTab );
349 : }
350 :
351 0 : sal_Bool SvUUId::ReadSvIdl( SvIdlDataBase &, SvTokenStream & rInStm )
352 : {
353 0 : sal_uInt32 nTokPos = rInStm.Tell();
354 0 : SvToken * pTok = rInStm.GetToken_Next();
355 :
356 0 : if( pTok->Is( SvHash_uuid() ) )
357 : {
358 0 : sal_Bool bOk = sal_True;
359 0 : sal_Bool bBraket = rInStm.Read( '(' );
360 0 : if( bBraket || rInStm.Read( '=' ) )
361 : {
362 0 : pTok = rInStm.GetToken();
363 0 : if( pTok->IsString() )
364 : {
365 0 : pTok = rInStm.GetToken_Next();
366 0 : bOk = MakeId(OStringToOUString(pTok->GetString(), RTL_TEXTENCODING_ASCII_US));
367 : }
368 0 : if( bOk && bBraket )
369 0 : bOk = rInStm.Read( ')' );
370 : }
371 0 : if( bOk )
372 0 : return sal_True;
373 : }
374 0 : rInStm.Seek( nTokPos );
375 0 : return sal_False;
376 : }
377 :
378 0 : sal_Bool SvUUId::WriteSvIdl( SvStream & rOutStm )
379 : {
380 : // write global id
381 0 : rOutStm.WriteCharPtr( SvHash_uuid()->GetName().getStr() ).WriteCharPtr( "(\"" );
382 0 : rOutStm.WriteCharPtr( OUStringToOString(GetHexName(), RTL_TEXTENCODING_UTF8).getStr() ).WriteCharPtr( "\")" );
383 0 : return sal_True;
384 : }
385 :
386 :
387 0 : sal_Bool SvVersion::ReadSvIdl( SvTokenStream & rInStm )
388 : {
389 0 : sal_uLong n = 0;
390 :
391 0 : sal_uInt32 nTokPos = rInStm.Tell();
392 0 : if( ReadRangeSvIdl( SvHash_Version(), rInStm, 0 , 0xFFFF, &n ) )
393 : {
394 0 : nMajorVersion = (sal_uInt16)n;
395 0 : if( rInStm.Read( '.' ) )
396 : {
397 0 : SvToken * pTok = rInStm.GetToken_Next();
398 0 : if( pTok->IsInteger() && pTok->GetNumber() <= 0xFFFF )
399 : {
400 0 : nMinorVersion = (sal_uInt16)pTok->GetNumber();
401 0 : return sal_True;
402 : }
403 : }
404 : else
405 0 : return sal_True;
406 : }
407 0 : rInStm.Seek( nTokPos );
408 0 : return sal_False;
409 : }
410 :
411 0 : sal_Bool SvVersion::WriteSvIdl( SvStream & rOutStm )
412 : {
413 0 : rOutStm.WriteCharPtr( SvHash_Version()->GetName().getStr() ).WriteChar( '(' )
414 0 : .WriteCharPtr( OString::number(nMajorVersion).getStr() )
415 0 : .WriteChar( '.' )
416 0 : .WriteCharPtr( OString::number(nMinorVersion).getStr() )
417 0 : .WriteChar( ')' );
418 0 : return sal_True;
419 : }
420 :
421 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|