StarZone.hxx
Go to the documentation of this file.
1/* -*- Mode: C++; c-default-style: "k&r"; indent-tabs-mode: nil; tab-width: 2; c-basic-offset: 2 -*- */
2
3/* libstaroffice
4* Version: MPL 2.0 / LGPLv2+
5*
6* The contents of this file are subject to the Mozilla Public License Version
7* 2.0 (the "License"); you may not use this file except in compliance with
8* the License or as specified alternatively below. You may obtain a copy of
9* the License at http://www.mozilla.org/MPL/
10*
11* Software distributed under the License is distributed on an "AS IS" basis,
12* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13* for the specific language governing rights and limitations under the
14* License.
15*
16* Major Contributor(s):
17* Copyright (C) 2002 William Lachance (wrlach@gmail.com)
18* Copyright (C) 2002,2004 Marc Maurer (uwog@uwog.net)
19* Copyright (C) 2004-2006 Fridrich Strba (fridrich.strba@bluewin.ch)
20* Copyright (C) 2006, 2007 Andrew Ziem
21* Copyright (C) 2011, 2012 Alonso Laurent (alonso@loria.fr)
22*
23*
24* All Rights Reserved.
25*
26* For minor contributions see the git repository.
27*
28* Alternatively, the contents of this file may be used under the terms of
29* the GNU Lesser General Public License Version 2 or later (the "LGPLv2+"),
30* in which case the provisions of the LGPLv2+ are applicable
31* instead of those above.
32*/
33
34/*
35 * StarZone zone of StarOffice document
36 *
37 */
38#ifndef STAR_ZONE
39# define STAR_ZONE
40
41#include <vector>
42#include <stack>
43
44#include "libstaroffice_internal.hxx"
45
46#include "STOFFDebug.hxx"
47#include "StarEncoding.hxx"
48
49 class StarEncryption;
50
56 class StarZone
57{
58 public:
60 StarZone(STOFFInputStreamPtr const &input, std::string const &ascName, std::string const &zoneName, char const *password);
62 virtual ~StarZone();
64 bool readSWHeader();
65
67 bool checkEncryption(uint32_t date, uint32_t time, std::vector<uint8_t> const &passwd);
69 bool openSDRHeader(std::string &magic);
71 bool closeSDRHeader(std::string const &debugName);
72
74 bool openSCHHeader();
76 bool closeSCHHeader(std::string const &debugName);
77
79 bool openVersionCompatHeader();
81 bool closeVersionCompatHeader(std::string const &debugName);
82
84 int getVersion() const
85 {
86 return m_version;
87 }
89 int getDocumentVersion() const
90 {
91 return m_documentVersion;
92 }
94 int getHeaderVersion() const
95 {
96 return m_headerVersionStack.empty() ? 0 : m_headerVersionStack.top();
97 }
99 int isCompatibleWith(int vers) const
100 {
101 return m_documentVersion>=vers;
102 }
104 int isCompatibleWith(int vers1, int vers2) const
105 {
106 return m_documentVersion>=vers1 && m_documentVersion<vers2;
107 }
109 int isCompatibleWith(int vers1, int vers2, int vers3) const
110 {
111 return (m_documentVersion>=vers1 && m_documentVersion<vers2) ||
112 m_documentVersion>=vers3;
113 }
115 int isCompatibleWith(int vers1, int vers2, int vers3, int vers4) const
116 {
117 return (m_documentVersion>=vers1 && m_documentVersion<vers2) ||
118 (m_documentVersion>=vers3 && m_documentVersion<vers4);
119 }
121 StarEncoding::Encoding getEncoding() const
122 {
123 return m_encoding;
124 }
126 void setEncoding(StarEncoding::Encoding encod)
127 {
128 m_encoding=encod;
129 }
131 int getGuiType() const
132 {
133 return m_guiType;
134 }
136 void setGuiType(int type)
137 {
138 m_guiType=type;
139 }
140 //
141 // basic
142 //
143
145 bool openRecord();
147 bool closeRecord(std::string const &debugName)
148 {
149 return closeRecord(' ', debugName);
150 }
152 bool openDummyRecord();
154 bool closeDummyRecord()
155 {
156 return closeRecord('@', "Entries(BadDummy)");
157 }
158 //
159 // sc record
160 //
161
163 bool openSCRecord();
165 bool closeSCRecord(std::string const &debugName)
166 {
167 return closeRecord('_', debugName);
168 }
169
170 //
171 // sw record
172 //
173
175 bool openSWRecord(unsigned char &type);
177 bool closeSWRecord(unsigned char type, std::string const &debugName)
178 {
179 return closeRecord(type, debugName);
180 }
181
182 //
183 // sfx record
184 //
185
187 bool openSfxRecord(unsigned char &type);
189 bool closeSfxRecord(unsigned char type, std::string const &debugName)
190 {
191 return closeRecord(type, debugName);
192 }
193
195 int getRecordLevel() const
196 {
197 return int(m_positionStack.size());
198 }
200 long getRecordLastPosition() const
201 {
202 if (m_positionStack.empty()) {
203 STOFF_DEBUG_MSG(("StarZone::getRecordLastPosition: can not find last position\n"));
204 return 0;
205 }
206 return m_positionStack.top();
207 }
208
210 unsigned char openFlagZone();
212 void closeFlagZone();
214 long getFlagLastPosition() const
215 {
216 return m_flagEndZone;
217 }
218
220 bool readString(std::vector<uint32_t> &string, int encoding=-1) const
221 {
222 std::vector<size_t> srcPositions;
223 return readString(string, srcPositions, encoding);
224 }
226 bool readString(std::vector<uint32_t> &string, std::vector<size_t> &srcPositions, int encoding=-1, bool checkEncryption=false) const;
228 bool readStringsPool();
230 int getNumPoolNames() const
231 {
232 return int(m_poolList.size());
233 }
235 bool getPoolName(int poolId, librevenge::RVNGString &res) const
236 {
237 res="";
238 if (poolId>=0 && poolId<int(m_poolList.size())) {
239 res=m_poolList[size_t(poolId)];
240 return true;
241 }
242 if (poolId==0xFFF0) return true;
243 STOFF_DEBUG_MSG(("StarZone::getPoolName: can not find pool name for %d\n", poolId));
244 return false;
245 }
247 STOFFInputStreamPtr input()
248 {
249 return m_input;
250 }
252 void setInput(STOFFInputStreamPtr input);
254 libstoff::DebugFile &ascii()
255 {
256 return m_ascii;
257 }
259 std::string const &name() const
260 {
261 return m_zoneName;
262 }
263 protected:
264 //
265 // low level
266 //
267
269 bool readRecordSizes(long pos);
271 bool closeRecord(unsigned char type, std::string const &debugName);
272
273 //
274 // data
275 //
276
278 STOFFInputStreamPtr m_input;
280 libstoff::DebugFile m_ascii;
282 int m_version;
284 int m_documentVersion;
286 std::stack<int> m_headerVersionStack;
288 StarEncoding::Encoding m_encoding;
290 int m_guiType;
292 std::shared_ptr<StarEncryption> m_encryption;
294 std::string m_asciiName;
296 std::string m_zoneName;
297
299 std::stack<unsigned char> m_typeStack;
301 std::stack<long> m_positionStack;
303 std::map<long, long> m_beginToEndMap;
305 long m_flagEndZone;
306
308 std::vector<librevenge::RVNGString> m_poolList;
309};
310#endif
311// vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab:
STOFFDebug.hxx
StarEncoding.hxx
StarEncoding::Encoding
Encoding
the different encoding
Definition StarEncoding.hxx:54
StarEncryption
the main class to read/.
Definition StarEncryption.hxx:52
StarZone
a zone in a StarOffice file
Definition StarZone.hxx:57
StarZone::m_flagEndZone
long m_flagEndZone
end of a cflags zone
Definition StarZone.hxx:305
StarZone::closeVersionCompatHeader
bool closeVersionCompatHeader(std::string const &debugName)
close a zone header
Definition StarZone.cxx:397
StarZone::closeSDRHeader
bool closeSDRHeader(std::string const &debugName)
close a zone header
Definition StarZone.cxx:436
StarZone::openSWRecord
bool openSWRecord(unsigned char &type)
try to open a SW record: type + size (24 bytes)
Definition StarZone.cxx:507
StarZone::openSCRecord
bool openSCRecord()
try to open a SC record: size (32 bytes) + size bytes
Definition StarZone.cxx:483
StarZone::openVersionCompatHeader
bool openVersionCompatHeader()
open a version compat header (version+size)
Definition StarZone.cxx:372
StarZone::StarZone
StarZone(STOFFInputStreamPtr const &input, std::string const &ascName, std::string const &zoneName, char const *password)
constructor
Definition StarZone.cxx:49
StarZone::m_headerVersionStack
std::stack< int > m_headerVersionStack
the header version (for SDR zone)
Definition StarZone.hxx:286
StarZone::m_version
int m_version
the zone version
Definition StarZone.hxx:282
StarZone::getPoolName
bool getPoolName(int poolId, librevenge::RVNGString &res) const
try to return a pool name
Definition StarZone.hxx:235
StarZone::closeRecord
bool closeRecord(std::string const &debugName)
try to close a record
Definition StarZone.hxx:147
StarZone::closeSWRecord
bool closeSWRecord(unsigned char type, std::string const &debugName)
try to close a record
Definition StarZone.hxx:177
StarZone::m_poolList
std::vector< librevenge::RVNGString > m_poolList
the pool name list
Definition StarZone.hxx:308
StarZone::m_documentVersion
int m_documentVersion
the document version
Definition StarZone.hxx:284
StarZone::m_input
STOFFInputStreamPtr m_input
the input stream
Definition StarZone.hxx:278
StarZone::readRecordSizes
bool readRecordSizes(long pos)
try to read the record sizes
Definition StarZone.cxx:637
StarZone::m_typeStack
std::stack< unsigned char > m_typeStack
the type stack
Definition StarZone.hxx:299
StarZone::isCompatibleWith
int isCompatibleWith(int vers) const
checks if the document is compatible with vers
Definition StarZone.hxx:99
StarZone::getRecordLastPosition
long getRecordLastPosition() const
returns the actual record last position
Definition StarZone.hxx:200
StarZone::openSDRHeader
bool openSDRHeader(std::string &magic)
open a zone header present in a SDR file
Definition StarZone.cxx:403
StarZone::getHeaderVersion
int getHeaderVersion() const
returns the StarOffice header version (if set)
Definition StarZone.hxx:94
StarZone::openSfxRecord
bool openSfxRecord(unsigned char &type)
try to open a Sfx record: type + size (24 bytes)
Definition StarZone.cxx:550
StarZone::isCompatibleWith
int isCompatibleWith(int vers1, int vers2, int vers3, int vers4) const
checks if the document is compatible with vers1 and not vers2 or vers3 and not vers4
Definition StarZone.hxx:115
StarZone::checkEncryption
bool checkEncryption(uint32_t date, uint32_t time, std::vector< uint8_t > const &passwd)
check encryption
Definition StarZone.cxx:174
StarZone::openRecord
bool openRecord()
try to open a classic record: size (32 bytes) + size-4 bytes
Definition StarZone.cxx:455
StarZone::getGuiType
int getGuiType() const
returns the zone GUI type
Definition StarZone.hxx:131
StarZone::isCompatibleWith
int isCompatibleWith(int vers1, int vers2) const
checks if the document is compatible with vers1 and not vers2
Definition StarZone.hxx:104
StarZone::input
STOFFInputStreamPtr input()
return the zone input
Definition StarZone.hxx:247
StarZone::ascii
libstoff::DebugFile & ascii()
returns the ascii file
Definition StarZone.hxx:254
StarZone::m_asciiName
std::string m_asciiName
the file ascii name
Definition StarZone.hxx:294
StarZone::closeSCHHeader
bool closeSCHHeader(std::string const &debugName)
close a zone header
Definition StarZone.cxx:366
StarZone::closeFlagZone
void closeFlagZone()
close the cflag zone
Definition StarZone.cxx:618
StarZone::getEncoding
StarEncoding::Encoding getEncoding() const
returns the zone encoding
Definition StarZone.hxx:121
StarZone::openSCHHeader
bool openSCHHeader()
open a zone header present in a SCH file
Definition StarZone.cxx:341
StarZone::closeSCRecord
bool closeSCRecord(std::string const &debugName)
try to close a record
Definition StarZone.hxx:165
StarZone::m_encoding
StarEncoding::Encoding m_encoding
the zone encoding
Definition StarZone.hxx:288
StarZone::getVersion
int getVersion() const
returns the StarOffice version: 3-5
Definition StarZone.hxx:84
StarZone::openFlagZone
unsigned char openFlagZone()
try to open a cflag zone
Definition StarZone.cxx:611
StarZone::m_beginToEndMap
std::map< long, long > m_beginToEndMap
other position to end position zone
Definition StarZone.hxx:303
StarZone::closeSfxRecord
bool closeSfxRecord(unsigned char type, std::string const &debugName)
try to close a record
Definition StarZone.hxx:189
StarZone::m_positionStack
std::stack< long > m_positionStack
the position stack
Definition StarZone.hxx:301
StarZone::isCompatibleWith
int isCompatibleWith(int vers1, int vers2, int vers3) const
checks if the document is compatible with vers1 and not vers2 or vers3
Definition StarZone.hxx:109
StarZone::~StarZone
virtual ~StarZone()
destructor
Definition StarZone.cxx:70
StarZone::closeDummyRecord
bool closeDummyRecord()
close a dummy record
Definition StarZone.hxx:154
StarZone::readSWHeader
bool readSWHeader()
read the zone header present in a SW file
Definition StarZone.cxx:190
StarZone::m_encryption
std::shared_ptr< StarEncryption > m_encryption
the encryption
Definition StarZone.hxx:292
StarZone::m_ascii
libstoff::DebugFile m_ascii
the ascii zone
Definition StarZone.hxx:280
StarZone::openDummyRecord
bool openDummyRecord()
open a dummy record
Definition StarZone.cxx:445
StarZone::setInput
void setInput(STOFFInputStreamPtr input)
reset the current input
Definition StarZone.cxx:75
StarZone::getNumPoolNames
int getNumPoolNames() const
return the number of pool name
Definition StarZone.hxx:230
StarZone::setEncoding
void setEncoding(StarEncoding::Encoding encod)
sets the zone encoding
Definition StarZone.hxx:126
StarZone::name
std::string const & name() const
return the zone name
Definition StarZone.hxx:259
StarZone::getDocumentVersion
int getDocumentVersion() const
returns the StarOffice document version
Definition StarZone.hxx:89
StarZone::readStringsPool
bool readStringsPool()
try to read a pool of strings
Definition StarZone.cxx:103
StarZone::setGuiType
void setGuiType(int type)
sets the zone GUI type
Definition StarZone.hxx:136
StarZone::m_zoneName
std::string m_zoneName
the zone name
Definition StarZone.hxx:296
StarZone::getFlagLastPosition
long getFlagLastPosition() const
returns the flag last position
Definition StarZone.hxx:214
StarZone::getRecordLevel
int getRecordLevel() const
returns the record level
Definition StarZone.hxx:195
StarZone::readString
bool readString(std::vector< uint32_t > &string, int encoding=-1) const
try to read an unicode string
Definition StarZone.hxx:220
StarZone::m_guiType
int m_guiType
the zone GUI type
Definition StarZone.hxx:290
libstoff::DebugFile
Definition STOFFDebug.hxx:211
libstaroffice_internal.hxx
STOFFInputStreamPtr
std::shared_ptr< STOFFInputStream > STOFFInputStreamPtr
a smart pointer of STOFFInputStream
Definition libstaroffice_internal.hxx:489
STOFF_DEBUG_MSG
#define STOFF_DEBUG_MSG(M)
Definition libstaroffice_internal.hxx:129