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 
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 
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  }
122  {
123  return m_encoding;
124  }
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();
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  }
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  }
248  {
249  return m_input;
250  }
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 
286  std::stack<int> m_headerVersionStack;
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;
306 
308  std::vector<librevenge::RVNGString> m_poolList;
309 };
310 #endif
311 // vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab:
Encoding
the different encoding
Definition: StarEncoding.hxx:54
the main class to read/.
Definition: StarEncryption.hxx:52
a zone in a StarOffice file
Definition: StarZone.hxx:57
long m_flagEndZone
end of a cflags zone
Definition: StarZone.hxx:305
bool closeVersionCompatHeader(std::string const &debugName)
close a zone header
Definition: StarZone.cxx:397
bool closeSDRHeader(std::string const &debugName)
close a zone header
Definition: StarZone.cxx:436
bool openSWRecord(unsigned char &type)
try to open a SW record: type + size (24 bytes)
Definition: StarZone.cxx:507
bool openSCRecord()
try to open a SC record: size (32 bytes) + size bytes
Definition: StarZone.cxx:483
bool openVersionCompatHeader()
open a version compat header (version+size)
Definition: StarZone.cxx:372
StarZone(STOFFInputStreamPtr const &input, std::string const &ascName, std::string const &zoneName, char const *password)
constructor
Definition: StarZone.cxx:49
std::stack< int > m_headerVersionStack
the header version (for SDR zone)
Definition: StarZone.hxx:286
int m_version
the zone version
Definition: StarZone.hxx:282
bool getPoolName(int poolId, librevenge::RVNGString &res) const
try to return a pool name
Definition: StarZone.hxx:235
bool closeRecord(std::string const &debugName)
try to close a record
Definition: StarZone.hxx:147
bool closeSWRecord(unsigned char type, std::string const &debugName)
try to close a record
Definition: StarZone.hxx:177
std::vector< librevenge::RVNGString > m_poolList
the pool name list
Definition: StarZone.hxx:308
int m_documentVersion
the document version
Definition: StarZone.hxx:284
STOFFInputStreamPtr m_input
the input stream
Definition: StarZone.hxx:278
bool readRecordSizes(long pos)
try to read the record sizes
Definition: StarZone.cxx:637
std::stack< unsigned char > m_typeStack
the type stack
Definition: StarZone.hxx:299
int isCompatibleWith(int vers) const
checks if the document is compatible with vers
Definition: StarZone.hxx:99
long getRecordLastPosition() const
returns the actual record last position
Definition: StarZone.hxx:200
bool openSDRHeader(std::string &magic)
open a zone header present in a SDR file
Definition: StarZone.cxx:403
int getHeaderVersion() const
returns the StarOffice header version (if set)
Definition: StarZone.hxx:94
bool openSfxRecord(unsigned char &type)
try to open a Sfx record: type + size (24 bytes)
Definition: StarZone.cxx:550
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
bool checkEncryption(uint32_t date, uint32_t time, std::vector< uint8_t > const &passwd)
check encryption
Definition: StarZone.cxx:174
bool openRecord()
try to open a classic record: size (32 bytes) + size-4 bytes
Definition: StarZone.cxx:455
int getGuiType() const
returns the zone GUI type
Definition: StarZone.hxx:131
int isCompatibleWith(int vers1, int vers2) const
checks if the document is compatible with vers1 and not vers2
Definition: StarZone.hxx:104
STOFFInputStreamPtr input()
return the zone input
Definition: StarZone.hxx:247
std::string m_asciiName
the file ascii name
Definition: StarZone.hxx:294
bool closeSCHHeader(std::string const &debugName)
close a zone header
Definition: StarZone.cxx:366
void closeFlagZone()
close the cflag zone
Definition: StarZone.cxx:618
StarEncoding::Encoding getEncoding() const
returns the zone encoding
Definition: StarZone.hxx:121
bool openSCHHeader()
open a zone header present in a SCH file
Definition: StarZone.cxx:341
std::string const & name() const
return the zone name
Definition: StarZone.hxx:259
bool closeSCRecord(std::string const &debugName)
try to close a record
Definition: StarZone.hxx:165
StarEncoding::Encoding m_encoding
the zone encoding
Definition: StarZone.hxx:288
int getVersion() const
returns the StarOffice version: 3-5
Definition: StarZone.hxx:84
unsigned char openFlagZone()
try to open a cflag zone
Definition: StarZone.cxx:611
std::map< long, long > m_beginToEndMap
other position to end position zone
Definition: StarZone.hxx:303
bool closeSfxRecord(unsigned char type, std::string const &debugName)
try to close a record
Definition: StarZone.hxx:189
std::stack< long > m_positionStack
the position stack
Definition: StarZone.hxx:301
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
virtual ~StarZone()
destructor
Definition: StarZone.cxx:70
bool closeDummyRecord()
close a dummy record
Definition: StarZone.hxx:154
bool readSWHeader()
read the zone header present in a SW file
Definition: StarZone.cxx:190
std::shared_ptr< StarEncryption > m_encryption
the encryption
Definition: StarZone.hxx:292
libstoff::DebugFile m_ascii
the ascii zone
Definition: StarZone.hxx:280
bool openDummyRecord()
open a dummy record
Definition: StarZone.cxx:445
void setInput(STOFFInputStreamPtr input)
reset the current input
Definition: StarZone.cxx:75
int getNumPoolNames() const
return the number of pool name
Definition: StarZone.hxx:230
void setEncoding(StarEncoding::Encoding encod)
sets the zone encoding
Definition: StarZone.hxx:126
int getDocumentVersion() const
returns the StarOffice document version
Definition: StarZone.hxx:89
libstoff::DebugFile & ascii()
returns the ascii file
Definition: StarZone.hxx:254
bool readStringsPool()
try to read a pool of strings
Definition: StarZone.cxx:103
void setGuiType(int type)
sets the zone GUI type
Definition: StarZone.hxx:136
std::string m_zoneName
the zone name
Definition: StarZone.hxx:296
long getFlagLastPosition() const
returns the flag last position
Definition: StarZone.hxx:214
int getRecordLevel() const
returns the record level
Definition: StarZone.hxx:195
bool readString(std::vector< uint32_t > &string, int encoding=-1) const
try to read an unicode string
Definition: StarZone.hxx:220
int m_guiType
the zone GUI type
Definition: StarZone.hxx:290
Definition: STOFFDebug.hxx:211
std::shared_ptr< STOFFInputStream > STOFFInputStreamPtr
a smart pointer of STOFFInputStream
Definition: libstaroffice_internal.hxx:489
#define STOFF_DEBUG_MSG(M)
Definition: libstaroffice_internal.hxx:129

Generated on Wed Mar 15 2023 00:00:00 for libstaroffice by doxygen 1.9.1