MWAWInputStream.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 /* libmwaw
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 #ifndef MWAW_INPUT_STREAM_H
35 #define MWAW_INPUT_STREAM_H
36 
37 #include <string>
38 #include <vector>
39 
40 #include <librevenge/librevenge.h>
41 #include <librevenge-stream/librevenge-stream.h>
42 #include "libmwaw_internal.hxx"
43 
54 {
55 public:
60  MWAWInputStream(std::shared_ptr<librevenge::RVNGInputStream> input, bool inverted);
61 
66  MWAWInputStream(librevenge::RVNGInputStream *input, bool inverted, bool checkCompression=false);
69 
71  std::shared_ptr<librevenge::RVNGInputStream> input()
72  {
73  return m_stream;
74  }
76  static std::shared_ptr<MWAWInputStream> get(librevenge::RVNGBinaryData const &data, bool inverted);
77 
79  bool readInverted() const
80  {
81  return m_inverseRead;
82  }
84  void setReadInverted(bool newVal)
85  {
86  m_inverseRead = newVal;
87  }
88  //
89  // Position: access
90  //
91 
96  int seek(long offset, librevenge::RVNG_SEEK_TYPE seekType);
98  long tell();
100  long size() const
101  {
102  return m_streamSize;
103  }
105  bool checkPosition(long pos) const
106  {
107  if (pos < 0) return false;
108  if (m_readLimit > 0 && pos > m_readLimit) return false;
109  return pos<=m_streamSize;
110  }
112  bool isEnd();
113 
117  void pushLimit(long newLimit)
118  {
119  m_prevLimits.push_back(m_readLimit);
120  m_readLimit = newLimit > m_streamSize ? m_streamSize : newLimit;
121  }
123  void popLimit()
124  {
125  if (!m_prevLimits.empty()) {
126  m_readLimit = m_prevLimits.back();
127  m_prevLimits.pop_back();
128  }
129  else m_readLimit = -1;
130  }
131 
137  void recomputeStreamSize();
138 
139  //
140  // get data
141  //
142 
144  unsigned long readULong(int num)
145  {
146  return readULong(m_stream.get(), num, 0, m_inverseRead);
147  }
149  long readLong(int num);
151  bool readDouble8(double &res, bool &isNotANumber);
153  bool readDoubleReverted8(double &res, bool &isNotANumber);
155  bool readDouble10(double &res, bool &isNotANumber);
156 
160  const uint8_t *read(size_t numBytes, unsigned long &numBytesRead);
164  static unsigned long readULong(librevenge::RVNGInputStream *stream, int num, unsigned long a, bool inverseRead);
165 
167  bool readDataBlock(long size, librevenge::RVNGBinaryData &data);
169  bool readEndDataBlock(librevenge::RVNGBinaryData &data);
170 
171  //
172  // OLE/Zip access
173  //
174 
176  bool isStructured();
178  unsigned subStreamCount();
180  std::string subStreamName(unsigned id);
181 
183  std::shared_ptr<MWAWInputStream> getSubStreamByName(std::string const &name);
185  std::shared_ptr<MWAWInputStream> getSubStreamById(unsigned id);
186 
187  //
188  // Finder Info access
189  //
191  bool getFinderInfo(std::string &type, std::string &creator) const
192  {
193  if (!m_fInfoType.length() || !m_fInfoCreator.length()) {
194  type = creator = "";
195  return false;
196  }
197  type = m_fInfoType;
198  creator = m_fInfoCreator;
199  return true;
200  }
201 
202  //
203  // Resource Fork access
204  //
205 
207  bool hasDataFork() const
208  {
209  return bool(m_stream);
210  }
212  bool hasResourceFork() const
213  {
214  return bool(m_resourceFork);
215  }
217  std::shared_ptr<MWAWInputStream> getResourceForkStream()
218  {
219  return m_resourceFork;
220  }
221 
222 
223 protected:
225  void updateStreamSize();
227  static uint8_t readU8(librevenge::RVNGInputStream *stream);
228 
230  bool unBinHex();
232  bool unzipStream();
234  bool unMacMIME();
237  std::shared_ptr<librevenge::RVNGInputStream> &dataInput,
238  std::shared_ptr<librevenge::RVNGInputStream> &rsrcInput) const;
241 
242 private:
243  MWAWInputStream(MWAWInputStream const &orig) = delete;
244  MWAWInputStream &operator=(MWAWInputStream const &orig) = delete;
245 
246 protected:
248  std::shared_ptr<librevenge::RVNGInputStream> m_stream;
251 
255  std::vector<long> m_prevLimits;
256 
258  mutable std::string m_fInfoType;
260  mutable std::string m_fInfoCreator;
262  std::shared_ptr<MWAWInputStream> m_resourceFork;
265 };
266 
267 #endif
268 // vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab:
MWAWInputStream(std::shared_ptr< librevenge::RVNGInputStream > input, bool inverted)
creates a stream with given endian
Definition: MWAWInputStream.cxx:48
bool unMacMIME()
check if some stream are in MacMIME format, if so de MacMIME
Definition: MWAWInputStream.cxx:686
long tell()
returns actual offset position
Definition: MWAWInputStream.cxx:147
std::string subStreamName(unsigned id)
returns the name of the i^th substream
Definition: MWAWInputStream.cxx:856
bool readDoubleReverted8(double &res, bool &isNotANumber)
try to read a double of size 8: 6.5 bytes mantisse, 1.5 bytes exponent
Definition: MWAWInputStream.cxx:340
bool readDouble10(double &res, bool &isNotANumber)
try to read a double of size 10: 2 bytes exponent, 8 bytes mantisse
Definition: MWAWInputStream.cxx:299
int seek(long offset, librevenge::RVNG_SEEK_TYPE seekType)
seeks to a offset position, from actual, beginning or ending position
Definition: MWAWInputStream.cxx:154
void popLimit()
pops a section defined by pushLimit
Definition: MWAWInputStream.hxx:123
bool unBinHex()
unbinhex the data in the file is a BinHex 4.0 file of a mac file
Definition: MWAWInputStream.cxx:390
bool readDataBlock(long size, librevenge::RVNGBinaryData &data)
reads a librevenge::RVNGBinaryData with a given size in the actual section/file
Definition: MWAWInputStream.cxx:916
void setReadInverted(bool newVal)
sets the endian mode
Definition: MWAWInputStream.hxx:84
long size() const
returns the stream size
Definition: MWAWInputStream.hxx:100
long m_readLimit
actual section limit (-1 if no limit)
Definition: MWAWInputStream.hxx:253
bool readDouble8(double &res, bool &isNotANumber)
try to read a double of size 8: 1.5 bytes exponent, 6.5 bytes mantisse
Definition: MWAWInputStream.cxx:257
bool m_inverseRead
big or normal endian
Definition: MWAWInputStream.hxx:264
Internal class used to read the file stream Internal class used to read the file stream, this class adds some usefull functions to the basic librevenge::RVNGInputStream:
Definition: MWAWInputStream.hxx:53
std::string m_fInfoCreator
finder info type
Definition: MWAWInputStream.hxx:260
std::shared_ptr< MWAWInputStream > m_resourceFork
the resource fork
Definition: MWAWInputStream.hxx:262
std::shared_ptr< MWAWInputStream > getSubStreamById(unsigned id)
return a new stream for a ole zone
Definition: MWAWInputStream.cxx:890
bool hasDataFork() const
returns true if the data fork block exists
Definition: MWAWInputStream.hxx:207
bool unzipStream()
unzip the data in the file is a zip file of a mac file
Definition: MWAWInputStream.cxx:641
bool readInverted() const
returns the endian mode (see constructor)
Definition: MWAWInputStream.hxx:79
bool isEnd()
returns true if we are at the end of the section/file
Definition: MWAWInputStream.cxx:177
long readLong(int num)
return a int8, int16, int32 readed from actualPos
Definition: MWAWInputStream.cxx:229
static uint8_t readU8(librevenge::RVNGInputStream *stream)
internal function used to read a byte
Definition: MWAWInputStream.cxx:244
long m_streamSize
the stream size
Definition: MWAWInputStream.hxx:250
bool isStructured()
return true if the stream is ole
Definition: MWAWInputStream.cxx:838
std::vector< long > m_prevLimits
list of previous limits
Definition: MWAWInputStream.hxx:255
bool readEndDataBlock(librevenge::RVNGBinaryData &data)
reads a librevenge::RVNGBinaryData from actPos to the end of the section/file
Definition: MWAWInputStream.cxx:935
bool getFinderInfo(std::string &type, std::string &creator) const
returns the finder info type and creator (if known)
Definition: MWAWInputStream.hxx:191
std::shared_ptr< MWAWInputStream > getResourceForkStream()
returns the resource fork if find
Definition: MWAWInputStream.hxx:217
std::string m_fInfoType
finder info type
Definition: MWAWInputStream.hxx:258
std::shared_ptr< librevenge::RVNGInputStream > m_stream
the initial input
Definition: MWAWInputStream.hxx:248
const uint8_t * read(size_t numBytes, unsigned long &numBytesRead)
! reads numbytes data, WITHOUT using any endian or section consideration
Definition: MWAWInputStream.cxx:140
bool hasResourceFork() const
returns true if the resource fork block exists
Definition: MWAWInputStream.hxx:212
void pushLimit(long newLimit)
defines a new section in the file (from actualPos to newLimit) next call of seek, tell...
Definition: MWAWInputStream.hxx:117
void recomputeStreamSize()
Definition: MWAWInputStream.cxx:122
bool unsplitInternalMergeStream()
check if a stream is an internal merge stream
Definition: MWAWInputStream.cxx:573
void updateStreamSize()
update the stream size ( must be called in the constructor )
Definition: MWAWInputStream.cxx:128
std::shared_ptr< MWAWInputStream > getSubStreamByName(std::string const &name)
return a new stream for a ole zone
Definition: MWAWInputStream.cxx:870
unsigned subStreamCount()
returns the number of substream
Definition: MWAWInputStream.cxx:847
std::shared_ptr< librevenge::RVNGInputStream > input()
returns the basic librevenge::RVNGInputStream
Definition: MWAWInputStream.hxx:71
bool checkPosition(long pos) const
checks if a position is or not a valid file position
Definition: MWAWInputStream.hxx:105
~MWAWInputStream()
destructor
Definition: MWAWInputStream.cxx:98
unsigned long readULong(int num)
returns a uint8, uint16, uint32 readed from actualPos
Definition: MWAWInputStream.hxx:144
MWAWInputStream & operator=(MWAWInputStream const &orig)=delete

Generated for libmwaw by doxygen 1.8.14