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(shared_ptr<librevenge::RVNGInputStream> input, bool inverted);
61 
66  MWAWInputStream(librevenge::RVNGInputStream *input, bool inverted, bool checkCompression=false);
69 
71  shared_ptr<librevenge::RVNGInputStream> input()
72  {
73  return m_stream;
74  }
76  static 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.size()) {
126  m_readLimit = m_prevLimits.back();
127  m_prevLimits.pop_back();
128  }
129  else m_readLimit = -1;
130  }
131 
132  //
133  // get data
134  //
135 
137  unsigned long readULong(int num)
138  {
139  return readULong(m_stream.get(), num, 0, m_inverseRead);
140  }
142  long readLong(int num);
144  bool readDouble8(double &res, bool &isNotANumber);
146  bool readDoubleReverted8(double &res, bool &isNotANumber);
148  bool readDouble10(double &res, bool &isNotANumber);
149 
153  const uint8_t *read(size_t numBytes, unsigned long &numBytesRead);
157  static unsigned long readULong(librevenge::RVNGInputStream *stream, int num, unsigned long a, bool inverseRead);
158 
160  bool readDataBlock(long size, librevenge::RVNGBinaryData &data);
162  bool readEndDataBlock(librevenge::RVNGBinaryData &data);
163 
164  //
165  // OLE/Zip access
166  //
167 
169  bool isStructured();
171  unsigned subStreamCount();
173  std::string subStreamName(unsigned id);
174 
176  shared_ptr<MWAWInputStream> getSubStreamByName(std::string const &name);
178  shared_ptr<MWAWInputStream> getSubStreamById(unsigned id);
179 
180  //
181  // Finder Info access
182  //
184  bool getFinderInfo(std::string &type, std::string &creator) const
185  {
186  if (!m_fInfoType.length() || !m_fInfoCreator.length()) {
187  type = creator = "";
188  return false;
189  }
190  type = m_fInfoType;
191  creator = m_fInfoCreator;
192  return true;
193  }
194 
195  //
196  // Resource Fork access
197  //
198 
200  bool hasDataFork() const
201  {
202  return bool(m_stream);
203  }
205  bool hasResourceFork() const
206  {
207  return bool(m_resourceFork);
208  }
210  shared_ptr<MWAWInputStream> getResourceForkStream()
211  {
212  return m_resourceFork;
213  }
214 
215 
216 protected:
218  void updateStreamSize();
220  static uint8_t readU8(librevenge::RVNGInputStream *stream);
221 
223  bool unBinHex();
225  bool unzipStream();
227  bool unMacMIME();
229  bool unMacMIME(MWAWInputStream *input,
230  shared_ptr<librevenge::RVNGInputStream> &dataInput,
231  shared_ptr<librevenge::RVNGInputStream> &rsrcInput) const;
232 
233 private:
234  MWAWInputStream(MWAWInputStream const &orig);
236 
237 protected:
239  shared_ptr<librevenge::RVNGInputStream> m_stream;
242 
245 
249  std::vector<long> m_prevLimits;
250 
252  mutable std::string m_fInfoType;
254  mutable std::string m_fInfoCreator;
256  shared_ptr<MWAWInputStream> m_resourceFork;
257 };
258 
259 #endif
260 // vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab:

Generated on Tue Mar 1 2016 23:42:50 for libmwaw by doxygen 1.8.4