xref: /trunk/main/sw/inc/swgstr.hxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 #ifndef _SWGSTR_HXX
28 #define _SWGSTR_HXX
29 
30 #include <tools/stream.hxx>
31 
32 typedef long long3;						// Zur Dokumentation: 3-byte-Longs
33 
34 #define MAX_BEGIN 64					// Maximale Blockschachtelung
35 #define PASSWDLEN 16					// Maximale Passwortlaenge
36 
37 // Neue Version mit SvStreams
38 
39 // Passwort- und Codierungs-Funktionalitaet
40 
41 class swcrypter {
42 protected:
43 	sal_Char   cPasswd[ PASSWDLEN ];	// Passwort-Puffer
44 	sal_Bool   bPasswd;						// sal_True wenn mit Passwort
45 	void   encode( sal_Char*, sal_uInt16 );	// Puffer codieren/decodieren
46 public:
47 	swcrypter();
48 	sal_Bool setpasswd( const String& );	// Passwort setzen
49 	void copypasswd( const sal_Char* );	// Passwort direkt setzen
50 	const sal_Char* getpasswd() { return cPasswd; }
51 };
52 
53 // Reader/Writer-Stream-Basisklasse mit Pufferverwaltung fuer Texte
54 // und Spezial-I/O fuer 3-Byte-Longs
55 
56 class swstreambase : public swcrypter {
57 protected:
58 	SvStream* pStrm;					// eigentlicher Stream
59 	sal_Char*  pBuf; 						// Zwischenpuffer
60 	sal_uInt16 nBuflen;						// Laenge des Zwischenpuffers
61 	short  nLong;						// Long-Laenge (3 oder 4)
62 	sal_Bool   bTempStrm;					// sal_True: Stream loeschen
63 	void   checkbuf( sal_uInt16 );			// Testen der Pufferlaenge
64 
65 	swstreambase( SvStream& );
66 
67 	swstreambase( const swstreambase& );
68 	int operator=( const swstreambase& );
69 public:
70 	~swstreambase();
71 	SvStream& Strm()					{ return *pStrm; }
72 	void clear();						// Puffer loeschen
73 
74 	// Zusatzfunktionen zur I/O von LONGs als 3-Byte-Zahlen
75 
76 	void long3() 						{ nLong = 3; }
77 	void long4() 						{ nLong = 4; }
78 
79     // Alias- und Hilfsfunktionen
80 
81 	void seek( long nPos )				{ pStrm->Seek( nPos );  }
82 	long tell()							{ return pStrm->Tell(); }
83 	long filesize(); 					// Dateigroesse
84 
85 	void setbad();
86 	int good()                          { return ( pStrm->GetError() == SVSTREAM_OK ); }
87     int operator!()                     { return ( pStrm->GetError() != SVSTREAM_OK ); }
88 	int eof()                           { return pStrm->IsEof(); }
89 
90 	sal_uInt8 get();
91 	void get( void* p, sal_uInt16 n )		{ pStrm->Read( (sal_Char*) p, n ); }
92 
93 	inline swstreambase& operator>>( sal_Char& );
94 	inline swstreambase& operator>>( sal_uInt8& );
95 	inline swstreambase& operator>>( short& );
96 	inline swstreambase& operator>>( sal_uInt16& );
97 		   swstreambase& operator>>( long& );
98 	inline swstreambase& operator>>( sal_uLong& );
99 };
100 
101 inline swstreambase& swstreambase::operator>>( sal_Char& c )
102 {
103 	*pStrm >> c; return *this;
104 }
105 
106 inline swstreambase& swstreambase::operator>>( sal_uInt8& c )
107 {
108 	*pStrm >> c; return *this;
109 }
110 
111 inline swstreambase& swstreambase::operator>>( short& c )
112 {
113 	*pStrm >> c; return *this;
114 }
115 
116 inline swstreambase& swstreambase::operator>>( sal_uInt16& c )
117 {
118 	*pStrm >> c; return *this;
119 }
120 
121 inline swstreambase& swstreambase::operator>>( sal_uLong& c )
122 {
123 	return *this >> (long&) c;
124 }
125 
126 class swistream : public swstreambase {
127 	sal_uInt8   cType;						// Record-Typ
128 	sal_uLong  nOffset;						// Record-Offset-Portion
129 public:
130 	swistream( SvStream& );
131 
132 	sal_uInt8 peek();						// 1 Byte testen
133 	sal_uInt8 next();						// Blockstart
134 	sal_uInt8 cur() { return cType; }		// aktueller Block
135 	sal_uInt8 skipnext();					// Record ueberspringen
136 	void undonext();					// next() rueckgaengig machen
137 	long getskip()						{ return nOffset; }
138 	void skip( long = -1L );			// Block ueberspringen
139 	sal_Char* text();					// Textstring lesen (nach BEGIN)
140 	long size();						// aktuelle Record-Laenge
141 
142 private:
143 	swistream( const swistream& );
144 	int operator=( const swistream& );
145 };
146 
147 
148 #endif
149