Lotus.h
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
2 /* libwps
3  * Version: MPL 2.0 / LGPLv2.1+
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * Major Contributor(s):
10  * Copyright (C) 2006, 2007 Andrew Ziem
11  * Copyright (C) 2003-2005 William Lachance (william.lachance@sympatico.ca)
12  * Copyright (C) 2003 Marc Maurer (uwog@uwog.net)
13  *
14  * For minor contributions see the git repository.
15  *
16  * Alternatively, the contents of this file may be used under the terms
17  * of the GNU Lesser General Public License Version 2.1 or later
18  * (LGPLv2.1+), in which case the provisions of the LGPLv2.1+ are
19  * applicable instead of those above.
20  */
21 
22 #ifndef LOTUS_H
23 #define LOTUS_H
24 
25 #include <vector>
26 
27 #include <librevenge-stream/librevenge-stream.h>
28 #include "libwps_internal.h"
29 #include "libwps_tools_win.h"
30 #include "WPSDebug.h"
31 
32 #include "WKSParser.h"
33 
34 namespace LotusParserInternal
35 {
36 class SubDocument;
37 struct State;
38 }
39 
40 class LotusGraph;
41 class LotusChart;
42 class LotusSpreadsheet;
43 class LotusStyleManager;
44 class WPSGraphicStyle;
45 class WPSOLE1Parser;
46 
47 /* .wk3: a spreadsheet is composed in two files
48  + a wk3 file which contains the spreadsheet data
49  + a fm3 file which contains the different formatings
50 
51  .wk4: the file contains three parts:
52  + the wk3 previous file
53  + the fm3 file
54  + an unknown part, which may code the file structure,
55 
56  Normally the wk3 and the fm3 are a sequence of small zones,
57  but picture seems to be appeared at random position inside the
58  fm3 part (and even inside some structure fm3 structures...)
59 
60  search for .ole and OLE1
61 
62  .123: the file contains at least two parts:
63  + the 123 storing the spreadsheet's data and format
64  + the last part containing the file's structure
65  + some optional part containing chart, picture, ...
66  */
67 
72 class LotusParser final : public WKSParser
73 {
75  friend class LotusChart;
76  friend class LotusGraph;
77  friend class LotusSpreadsheet;
78  friend class LotusStyleManager;
79 public:
83  char const *password=nullptr);
85  ~LotusParser() final;
87  void parse(librevenge::RVNGSpreadsheetInterface *documentInterface) final;
89  bool checkHeader(WPSHeader *header, bool strict=false);
90 
92  struct Link
93  {
95  Link() : m_name(), m_linkName()
96  {
97  }
99  std::string m_name;
101  WPSVec3i m_cells[2];
103  librevenge::RVNGString m_linkName;
104  };
105 protected:
107  int version() const;
108 
109  //
110  // interface
111  //
112 
114  bool getFont(int id, WPSFont &font, libwps_tools_win::Font::Type &type) const;
120  std::vector<Link> getLinksList(int lId) const;
121 
122  //
123  // interface with LotusChart
124  //
125 
127  bool sendChart(int cId, WPSPosition const &pos, WPSGraphicStyle const &style);
128 
129  //
130  // interface with LotusGraph
131  //
132 
134  bool hasGraphics(int sheetId) const;
136  void sendGraphics(int sheetId);
137 
138  //
139  // interface with LotusSpreadsheet
140  //
141 
143  bool getLeftTopPosition(Vec2i const &cell, int spreadsheet, Vec2f &pos) const;
145  librevenge::RVNGString getSheetName(int id) const;
146 
147  //
148  // interface with WPSOLE1Parser
149  //
150 
152  bool updateEmbeddedObject(int id, WPSEmbeddedObject &object) const;
153 
155  bool createZones();
157  bool createListener(librevenge::RVNGSpreadsheetInterface *interface);
158 
159  //
160  // low level
161  //
162 
164  bool parseFormatStream();
165 
167  bool checkHeader(std::shared_ptr<WPSStream> stream, bool mainStream, bool strict);
169  bool readZones(std::shared_ptr<WPSStream> stream);
171  bool readDataZone(std::shared_ptr<WPSStream> stream);
173  bool readZone(std::shared_ptr<WPSStream> &stream);
175  bool readZone1(std::shared_ptr<WPSStream> stream);
177  bool readSheetZone(std::shared_ptr<WPSStream> stream);
179  bool readZone4(std::shared_ptr<WPSStream> stream);
181  bool readChartZone(std::shared_ptr<WPSStream> stream);
183  bool readRefZone(std::shared_ptr<WPSStream> stream);
185  bool readZone7(std::shared_ptr<WPSStream> stream);
187  bool readZone8(std::shared_ptr<WPSStream> stream);
189  bool readVersionZone(std::shared_ptr<WPSStream> stream);
191  bool readZoneV3(std::shared_ptr<WPSStream> stream);
193 
195  bool readMacFontName(std::shared_ptr<WPSStream> stream, long endPos);
197  bool readFMTStyleName(std::shared_ptr<WPSStream> stream);
199  bool readLinkZone(std::shared_ptr<WPSStream> stream);
201  bool readDocumentInfoMac(std::shared_ptr<WPSStream> stream, long endPos);
202 
204 
206  static RVNGInputStreamPtr decodeStream(RVNGInputStreamPtr input, long endPos, std::vector<uint8_t> const &key);
208  static std::vector<uint8_t> retrievePasswordKeys(std::vector<uint8_t> const &fileKeys);
209 
210  std::shared_ptr<WKSContentListener> m_listener;
211  std::shared_ptr<LotusParserInternal::State> m_state;
214  std::shared_ptr<LotusStyleManager> m_styleManager;
216  std::shared_ptr<LotusChart> m_chartParser;
218  std::shared_ptr<LotusGraph> m_graphParser;
220  std::shared_ptr<LotusSpreadsheet> m_spreadsheetParser;
222  std::shared_ptr<WPSOLE1Parser> m_ole1Parser;
223 };
224 
225 #endif /* LOTUS_H */
226 /* vim:set shiftwidth=4 softtabstop=4 noexpandtab: */
bool updateEmbeddedObject(int id, WPSEmbeddedObject &object) const
try to retrieve the content of a graphic, knowing it local id
Definition: Lotus.cpp:324
std::shared_ptr< WPSOLE1Parser > m_ole1Parser
the ole1 parser
Definition: Lotus.h:222
bool readSheetZone(std::shared_ptr< WPSStream > stream)
reads a zone of type 2: 123 files
Definition: Lotus.cpp:1969
bool readZone1(std::shared_ptr< WPSStream > stream)
reads a zone of type 1: 123 files
Definition: Lotus.cpp:1785
bool checkHeader(WPSHeader *header, bool strict=false)
checks if the document header is correct (or not)
Definition: Lotus.cpp:423
libwps_tools_win::Font::Type getDefaultFontType() const
returns the default font type, ie.
Definition: Lotus.cpp:269
Definition: WPSOLEStream.h:33
static std::vector< uint8_t > retrievePasswordKeys(std::vector< uint8_t > const &fileKeys)
try to guess a password knowing its file keys. Returns the keys if it founds a valid password ...
Definition: Lotus.cpp:3367
std::vector< Link > getLinksList(int lId) const
returns a list of links corresponding to an id
Definition: Lotus.cpp:287
friend class LotusParserInternal::SubDocument
Definition: Lotus.h:74
bool createListener(librevenge::RVNGSpreadsheetInterface *interface)
creates the main listener
Definition: Lotus.cpp:404
bool readZone7(std::shared_ptr< WPSStream > stream)
reads a zone of type 7: 123 files
Definition: Lotus.cpp:2638
std::shared_ptr< LotusSpreadsheet > m_spreadsheetParser
the spreadsheet manager
Definition: Lotus.h:220
This class parses Microsoft Works chart file.
Definition: LotusChart.h:53
define the font properties
Definition: WPSFont.h:36
std::shared_ptr< LotusGraph > m_graphParser
the graph manager
Definition: Lotus.h:218
bool readVersionZone(std::shared_ptr< WPSStream > stream)
reads a zone of type a: 123 files
Definition: Lotus.cpp:2906
bool readLinkZone(std::shared_ptr< WPSStream > stream)
reads a link
Definition: Lotus.cpp:3111
librevenge::RVNGString getSheetName(int id) const
returns the name of the id&#39;s spreadsheet
Definition: Lotus.cpp:314
Type
enum Type
Definition: libwps_tools_win.h:46
int version() const
return the file version
Definition: Lotus.cpp:261
bool readMacFontName(std::shared_ptr< WPSStream > stream, long endPos)
reads a mac font name
Definition: Lotus.cpp:2944
bool getLeftTopPosition(Vec2i const &cell, int spreadsheet, Vec2f &pos) const
returns the left top position of a cell
Definition: Lotus.cpp:309
This class parses Microsoft Works graph file.
Definition: LotusGraph.h:55
This class parses a wk3,wk4,123 Lotus spreadsheet.
Definition: Lotus.h:72
bool getFont(int id, WPSFont &font, libwps_tools_win::Font::Type &type) const
returns the font corresponding to an id
Definition: Lotus.cpp:274
a class used to parse a container which is used by Lotus123 (and also by RagTime).
Definition: WPSOLE1Parser.h:49
a structure used to define a picture style
Definition: WPSGraphicStyle.h:37
std::shared_ptr< WKSContentListener > m_listener
Definition: Lotus.h:210
bool readDocumentInfoMac(std::shared_ptr< WPSStream > stream, long endPos)
reads a mac document info zone: zone 1b, then 2af8
Definition: Lotus.cpp:3233
bool readZone(std::shared_ptr< WPSStream > &stream)
reads a zone
Definition: Lotus.cpp:645
LotusParser(RVNGInputStreamPtr &input, WPSHeaderPtr &header, libwps_tools_win::Font::Type encoding=libwps_tools_win::Font::UNKNOWN, char const *password=nullptr)
constructor
Definition: Lotus.cpp:239
void sendGraphics(int sheetId)
send the graphics corresponding to a sheetId
Definition: Lotus.cpp:304
Definition: WPSHeader.h:31
static RVNGInputStreamPtr decodeStream(RVNGInputStreamPtr input, long endPos, std::vector< uint8_t > const &key)
try to decode a stream, if successful, replace the stream&#39;input by the new one
Definition: Lotus.cpp:3305
This class parses the Lotus style.
Definition: LotusStyleManager.h:47
Definition: libwps_tools_win.h:61
Internal: namespace to define internal class of LotusParser.
Definition: Lotus.cpp:60
std::shared_ptr< librevenge::RVNGInputStream > RVNGInputStreamPtr
shared pointer to librevenge::RVNGInputStream
Definition: libwps_internal.h:87
bool readZoneV3(std::shared_ptr< WPSStream > stream)
parse a wk123 zone
Definition: Lotus.cpp:1761
bool readChartZone(std::shared_ptr< WPSStream > stream)
reads a zone of type 5: 123 files
Definition: Lotus.cpp:2452
~LotusParser() final
destructor
Definition: Lotus.cpp:257
std::shared_ptr< LotusParserInternal::State > m_state
the listener (if set)
Definition: Lotus.h:212
This class parses Microsoft Works spreadsheet file.
Definition: LotusSpreadsheet.h:52
bool readFMTStyleName(std::shared_ptr< WPSStream > stream)
reads a format style name: b6
Definition: Lotus.cpp:3064
bool readZones(std::shared_ptr< WPSStream > stream)
finds the different zones (spreadsheet, chart, print, ...)
Definition: Lotus.cpp:573
bool readDataZone(std::shared_ptr< WPSStream > stream)
parse the different zones 1B
Definition: Lotus.cpp:1328
small class use to define a embedded object
Definition: libwps_internal.h:1076
bool readRefZone(std::shared_ptr< WPSStream > stream)
reads a zone of type 6: 123 files
Definition: Lotus.cpp:2552
bool hasGraphics(int sheetId) const
return true if the sheet sheetId has some graphic
Definition: Lotus.cpp:299
Class to define the position of an object (textbox, picture, ..) in the document. ...
Definition: WPSPosition.h:39
bool readZone8(std::shared_ptr< WPSStream > stream)
reads a zone of type 8: 123 files
Definition: Lotus.cpp:2764
std::shared_ptr< LotusStyleManager > m_styleManager
the style manager
Definition: Lotus.h:214
bool createZones()
try to parse the different zones
Definition: Lotus.cpp:510
std::shared_ptr< WPSHeader > WPSHeaderPtr
shared pointer to WPSHeader
Definition: libwps_internal.h:109
Definition: WKSParser.h:33
bool readZone4(std::shared_ptr< WPSStream > stream)
reads a zone of type 4: 123 files
Definition: Lotus.cpp:2268
bool sendChart(int cId, WPSPosition const &pos, WPSGraphicStyle const &style)
try to send a chart
Definition: Lotus.cpp:319
std::shared_ptr< LotusChart > m_chartParser
the chart manager
Definition: Lotus.h:216
bool parseFormatStream()
check for the existence of a format stream, if it exists, parse it
Definition: Lotus.cpp:549
void parse(librevenge::RVNGSpreadsheetInterface *documentInterface) final
called by WPSDocument to parse the file
Definition: Lotus.cpp:339

Generated on Fri May 27 2022 03:07:00 for libwps by doxygen 1.8.14