RagTime5ClusterManager.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 RAG_TIME_5_CLUSTER_MANAGER
35 # define RAG_TIME_5_CLUSTER_MANAGER
36
37 #include <map>
38 #include <ostream>
39 #include <sstream>
40 #include <string>
41 #include <vector>
42
43 #include "libmwaw_internal.hxx"
44 #include "MWAWDebug.hxx"
45 #include "MWAWEntry.hxx"
46
47 #include "RagTime5StructManager.hxx"
48
49 class RagTime5Parser;
50 class RagTime5StructManager;
51
52 namespace RagTime5ClusterManagerInternal
53 {
54 struct State;
55 }
56
58 class RagTime5ClusterManager
59 {
60 public:
61 struct Link;
62
63 struct Cluster;
64 struct ClusterRoot;
65 struct ClusterParser;
66
67 friend struct ClusterParser;
68
70 explicit RagTime5ClusterManager(RagTime5Parser &parser);
72 ~RagTime5ClusterManager();
73
75 bool sendClusterMainList();
76
78 bool readCluster(RagTime5Zone &zone, ClusterParser &parser, bool warnForUnparsed=true);
80 bool readCluster(RagTime5Zone &zone, std::shared_ptr<Cluster> &cluster, int type=-1);
82 bool readClusterMainList(ClusterRoot &root, std::vector<int> &list, std::vector<int> const &clusterIdList);
83
85 bool readClusterGObjProperties(RagTime5Zone &zone);
87 bool readFieldClusters(Link const &link);
89 bool readUnknownClusterC(Link const &link);
91 int getClusterFileType(RagTime5Zone &zone);
93 int getClusterType(RagTime5Zone &zone, int fileType);
95 bool getClusterBasicHeaderInfo(RagTime5Zone &zone, long &N, long &fSz, long &debHeaderPos);
96
97 // low level
98
100 bool readFieldHeader(RagTime5Zone &zone, long endPos, std::string const &headerName, long &endDataPos, long expectedLVal=-99999);
102 std::string getClusterName(int id);
103
105 struct Link {
107 enum Type { L_ClusterLink,
108 L_LinkDef,
109 L_LongList, L_UnicodeList,
110 L_FieldsList, L_List,
111 L_UnknownClusterC,
112 L_Unknown
113 };
115 explicit Link(Type type=L_Unknown)
116 : m_type(type)
117 , m_name("")
118 , m_ids()
119 , m_N(0)
120 , m_fieldSize(0)
121 , m_longList()
122 {
123 for (auto &typ : m_fileType) typ=0;
124 }
126 bool empty() const
127 {
128 if (m_type==L_LongList && !m_longList.empty())
129 return false;
130 for (auto id : m_ids)
131 if (id>0) return false;
132 return true;
133 }
135 std::string getZoneName() const
136 {
137 switch (m_type) {
138 case L_ClusterLink:
139 return "clustLink";
140 case L_LinkDef:
141 return "linkDef";
142 case L_LongList:
143 if (!m_name.empty())
144 return m_name;
145 else {
146 std::stringstream s;
147 s << "longList" << m_fieldSize;
148 return s.str();
149 }
150 case L_UnicodeList:
151 return "unicodeListLink";
152 case L_UnknownClusterC:
153 return "unknownClusterC";
154 case L_FieldsList:
155 if (!m_name.empty())
156 return m_name;
157 return "fieldsList[unkn]";
158 case L_List:
159 if (!m_name.empty())
160 return m_name;
161 break;
162 case L_Unknown:
163 #if !defined(__clang__)
164 default:
165 #endif
166 break;
167 }
168 std::stringstream s;
169 if (m_type==L_List)
170 s << "ListZone";
171 else
172 s << "FixZone";
173 s << std::hex << m_fileType[0] << "_" << m_fileType[1] << std::dec;
174 if (m_fieldSize)
175 s << "_" << m_fieldSize;
176 s << "A";
177 return s.str();
178 }
180 friend std::ostream &operator<<(std::ostream &o, Link const &z)
181 {
182 if (z.empty()) return o;
183 o << z.getZoneName() << ":";
184 size_t numLinks=z.m_ids.size();
185 if (numLinks>1) o << "[";
186 for (size_t i=0; i<numLinks; ++i) {
187 if (z.m_ids[i]<=0)
188 o << "_";
189 else
190 o << "data" << z.m_ids[i] << "A";
191 if (i+1!=numLinks) o << ",";
192 }
193 if (numLinks>1) o << "]";
194 if (z.m_fieldSize&0x8000)
195 o << "[" << std::hex << z.m_fieldSize << std::dec << ":" << z.m_N << "]";
196 else
197 o << "[" << z.m_fieldSize << ":" << z.m_N << "]";
198 return o;
199 }
201 Type m_type;
203 std::string m_name;
205 std::vector<int> m_ids;
207 int m_N;
209 int m_fieldSize;
211 long m_fileType[2];
213 std::vector<long> m_longList;
214 };
215
217 // cluster classes
219
221 struct Cluster {
223 enum Type {
224 C_ColorPattern, C_Fields, C_Layout, C_Pipeline,
225 C_Root, C_ClusterGProp, C_Script,
226
227 // the main zones
228 C_ChartZone, C_GraphicZone, C_PictureZone, C_SpreadsheetZone, C_TextZone,
229 // the styles
230 C_ColorStyles, C_FormatStyles, C_GraphicStyles, C_TextStyles, C_UnitStyles,
231 // unknown clusters
232 C_ClusterC,
233
234 C_Empty, C_Unknown
235 };
237 explicit Cluster(Type type)
238 : m_type(type)
239 , m_zoneId(0)
240 , m_hiLoEndian(true)
241 , m_name("")
242 , m_dataLink()
243 , m_nameLink()
244 , m_fieldClusterLink()
245 , m_conditionFormulaLinks()
246 , m_settingLinks()
247 , m_linksList()
248 , m_clusterIdsList()
249 , m_isSent(false)
250 {
251 }
253 virtual ~Cluster();
255 Type m_type;
257 int m_zoneId;
259 bool m_hiLoEndian;
261 librevenge::RVNGString m_name;
263 Link m_dataLink;
265 Link m_nameLink;
267 Link m_fieldClusterLink;
269 std::vector<Link> m_conditionFormulaLinks;
271 std::vector<Link> m_settingLinks;
273 std::vector<Link> m_linksList;
275 std::vector<int> m_clusterIdsList;
277 bool m_isSent;
278 };
279
281 Cluster::Type getClusterType(int zId) const;
282
284 struct ClusterRoot final : public Cluster {
286 ClusterRoot()
287 : Cluster(C_Root)
288 , m_graphicTypeLink()
289 , m_docInfoLink()
290 , m_listUnicodeLink()
291 , m_listClusterId(0)
292 , m_listClusterName()
293 , m_linkUnknown()
294 , m_fileName("")
295 {
296 for (auto &id : m_styleClusterIds) id=0;
297 for (auto &id : m_clusterIds) id=0;
298 }
300 ~ClusterRoot() final;
302 int m_styleClusterIds[8];
303
305 int m_clusterIds[1];
306
308 Link m_graphicTypeLink;
309
311 Link m_docInfoLink;
313 Link m_listUnicodeLink;
315 int m_listClusterId;
317 Link m_listClusterName;
319 Link m_listClusterLink[2];
320
322 Link m_linkUnknown;
323
325 librevenge::RVNGString m_fileName;
326 };
327
329 struct ClusterScript final : public Cluster {
331 ClusterScript()
332 : Cluster(C_Script)
333 , m_scriptComment()
334 , m_scriptName("")
335 {
336 }
338 ~ClusterScript() final;
340 Link m_scriptComment;
342 librevenge::RVNGString m_scriptName;
343 };
344
346 // parser class
348
350 struct ClusterParser {
352 ClusterParser(RagTime5ClusterManager &parser, int type, std::string const &zoneName)
353 : m_parser(parser)
354 , m_type(type)
355 , m_hiLoEndian(true)
356 , m_name(zoneName)
357 , m_dataId(0)
358 , m_link()
359 {
360 }
362 virtual ~ClusterParser();
364 virtual std::shared_ptr<Cluster> getCluster()=0;
366 virtual std::string getZoneName() const
367 {
368 return m_name;
369 }
371 virtual std::string getZoneName(int n, int m=-1) const
372 {
373 std::stringstream s;
374 s << m_name << "-" << n;
375 if (m>=0)
376 s << "-B" << m;
377 return s.str();
378 }
380 virtual void startZone()
381 {
382 }
384 virtual bool parseZone(MWAWInputStreamPtr &/*input*/, long /*fSz*/, int /*N*/, int /*flag*/, libmwaw::DebugStream &/*f*/)
385 {
386 return false;
387 }
389 virtual void endZone()
390 {
391 }
393 virtual bool parseField(RagTime5StructManager::Field const &/*field*/, int /*m*/, libmwaw::DebugStream &/*f*/)
394 {
395 return false;
396 }
399 virtual int getNewZoneToParse()
400 {
401 return -1;
402 }
403 //
404 // some tools
405 //
406
408 bool isANameHeader(long N) const
409 {
410 return (m_hiLoEndian && N==int(0x80000000)) || (!m_hiLoEndian && N==0x8000);
411 }
412
414 bool readLinkHeader(MWAWInputStreamPtr &input, long fSz, Link &link, long(&values)[4], std::string &message);
416 std::string getClusterName(int id);
418 RagTime5ClusterManager &m_parser;
420 int m_type;
422 bool m_hiLoEndian;
424 std::string m_name;
426 int m_dataId;
428 Link m_link;
429 private:
430 explicit ClusterParser(ClusterParser const &orig) = delete;
431 ClusterParser &operator=(ClusterParser const &orig) = delete;
432 };
433 protected:
435 std::shared_ptr<RagTime5ClusterManagerInternal::State> m_state;
437 RagTime5Parser &m_mainParser;
439 std::shared_ptr<RagTime5StructManager> m_structManager;
440 private:
441 RagTime5ClusterManager(RagTime5ClusterManager const &orig) = delete;
442 RagTime5ClusterManager operator=(RagTime5ClusterManager const &orig) = delete;
443 };
444
445 #endif
446 // vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab:
RagTime5ClusterManager::ClusterScript::m_scriptName
librevenge::RVNGString m_scriptName
the scriptname if known
Definition: RagTime5ClusterManager.hxx:342
RagTime5ClusterManager::Link::empty
bool empty() const
returns true if all link are empty
Definition: RagTime5ClusterManager.hxx:126
RagTime5ClusterManager::ClusterParser::getNewZoneToParse
virtual int getNewZoneToParse()
returns to new zone to parse.
Definition: RagTime5ClusterManager.hxx:399
RagTime5ClusterManager::m_mainParser
RagTime5Parser & m_mainParser
the main parser
Definition: RagTime5ClusterManager.hxx:437
RagTime5ClusterManager::Cluster::m_type
Type m_type
the cluster type
Definition: RagTime5ClusterManager.hxx:255
RagTime5ClusterManager::Cluster::C_TextZone
Definition: RagTime5ClusterManager.hxx:228
RagTime5ClusterManager::Link::Type
Type
the link type
Definition: RagTime5ClusterManager.hxx:107
RagTime5ClusterManager::Cluster::Cluster
Cluster(Type type)
constructor
Definition: RagTime5ClusterManager.hxx:237
MWAWEntry.hxx
libmwaw_internal.hxx
RagTime5ClusterManager::ClusterParser::m_parser
RagTime5ClusterManager & m_parser
the main parser
Definition: RagTime5ClusterManager.hxx:418
RagTime5ClusterManager::Cluster::C_UnitStyles
Definition: RagTime5ClusterManager.hxx:230
RagTime5ClusterManager::Link::L_LinkDef
Definition: RagTime5ClusterManager.hxx:108
RagTime5ClusterManager::ClusterRoot::ClusterRoot
ClusterRoot()
constructor
Definition: RagTime5ClusterManager.hxx:286
RagTime5ClusterManager::ClusterRoot::m_linkUnknown
Link m_linkUnknown
other link: scripts and field 6
Definition: RagTime5ClusterManager.hxx:322
RagTime5ClusterManager::ClusterRoot::m_listUnicodeLink
Link m_listUnicodeLink
a link to a list of unknown index+unicode string
Definition: RagTime5ClusterManager.hxx:313
RagTime5ClusterManager::ClusterParser::endZone
virtual void endZone()
end of a start zone call
Definition: RagTime5ClusterManager.hxx:389
RagTime5ClusterManager::ClusterParser::m_hiLoEndian
bool m_hiLoEndian
zone endian
Definition: RagTime5ClusterManager.hxx:422
RagTime5ClusterManager::ClusterParser::m_type
int m_type
the cluster type
Definition: RagTime5ClusterManager.hxx:420
RagTime5StructManager.hxx
RagTime5ClusterManager::ClusterScript
the cluster script ( 2/a/4002/400a zone)
Definition: RagTime5ClusterManager.hxx:329
RagTime5ClusterManager::ClusterRoot::m_graphicTypeLink
Link m_graphicTypeLink
the graphic type id
Definition: RagTime5ClusterManager.hxx:308
RagTime5ClusterManager::Cluster::m_isSent
bool m_isSent
true if the cluster was send
Definition: RagTime5ClusterManager.hxx:277
RagTime5ClusterManager::ClusterParser
virtual class use to parse the cluster data
Definition: RagTime5ClusterManager.hxx:350
RagTime5ClusterManager::Link::L_UnicodeList
Definition: RagTime5ClusterManager.hxx:109
RagTime5ClusterManager::Cluster::m_conditionFormulaLinks
std::vector< Link > m_conditionFormulaLinks
the conditions formula links
Definition: RagTime5ClusterManager.hxx:269
RagTime5Zone
main zone in a RagTime v5-v6 document
Definition: RagTime5StructManager.hxx:48
RagTime5ClusterManager::ClusterRoot::m_docInfoLink
Link m_docInfoLink
the doc info link
Definition: RagTime5ClusterManager.hxx:311
RagTime5ClusterManagerInternal
Internal: the structures of a RagTime5ClusterManager.
Definition: RagTime5ClusterManager.cxx:48
RagTime5ClusterManager::Link::operator<<
friend std::ostream & operator<<(std::ostream &o, Link const &z)
operator<<
Definition: RagTime5ClusterManager.hxx:180
RagTime5ClusterManager::ClusterRoot::m_fileName
librevenge::RVNGString m_fileName
the filename if known
Definition: RagTime5ClusterManager.hxx:325
RagTime5ClusterManager::Link::m_ids
std::vector< int > m_ids
the data ids
Definition: RagTime5ClusterManager.hxx:205
RagTime5ClusterManager::ClusterRoot
the cluster for root
Definition: RagTime5ClusterManager.hxx:284
RagTime5ClusterManager::Link::m_name
std::string m_name
the link name
Definition: RagTime5ClusterManager.hxx:203
RagTime5ClusterManager::ClusterScript::ClusterScript
ClusterScript()
constructor
Definition: RagTime5ClusterManager.hxx:331
RagTime5ClusterManager::Link::L_UnknownClusterC
Definition: RagTime5ClusterManager.hxx:111
RagTime5ClusterManager::Cluster::m_hiLoEndian
bool m_hiLoEndian
the cluster hiLo endian
Definition: RagTime5ClusterManager.hxx:259
RagTime5ClusterManager::Cluster::C_Script
Definition: RagTime5ClusterManager.hxx:225
RagTime5ClusterManager::Link::Link
Link(Type type=L_Unknown)
constructor
Definition: RagTime5ClusterManager.hxx:115
RagTime5ClusterManager::ClusterParser::ClusterParser
ClusterParser(RagTime5ClusterManager &parser, int type, std::string const &zoneName)
constructor
Definition: RagTime5ClusterManager.hxx:352
RagTime5ClusterManager::m_structManager
std::shared_ptr< RagTime5StructManager > m_structManager
the structure manager
Definition: RagTime5ClusterManager.hxx:439
RagTime5ClusterManager::ClusterParser::startZone
virtual void startZone()
start a new zone
Definition: RagTime5ClusterManager.hxx:380
RagTime5ClusterManager::Link::m_N
int m_N
the number of data ( or some flag if m_N & 0x8020)
Definition: RagTime5ClusterManager.hxx:207
RagTime5ClusterManager::Link::L_List
Definition: RagTime5ClusterManager.hxx:110
RagTime5ClusterManager::Cluster::C_Pipeline
Definition: RagTime5ClusterManager.hxx:224
RagTime5ClusterManager::ClusterRoot::m_listClusterName
Link m_listClusterName
the cluster list id name zone link
Definition: RagTime5ClusterManager.hxx:317
RagTime5ClusterManager
basic class used to manage RagTime 5/6 zones
Definition: RagTime5ClusterManager.hxx:58
RagTime5ClusterManager::ClusterParser::getZoneName
virtual std::string getZoneName() const
return the debug name corresponding to a zone
Definition: RagTime5ClusterManager.hxx:366
RagTime5ClusterManager::Cluster::m_linksList
std::vector< Link > m_linksList
the link list
Definition: RagTime5ClusterManager.hxx:273
RagTime5ClusterManager::ClusterParser::isANameHeader
bool isANameHeader(long N) const
return true if N correspond to a file/script name
Definition: RagTime5ClusterManager.hxx:408
RagTime5ClusterManager::ClusterParser::m_link
Link m_link
the actual link
Definition: RagTime5ClusterManager.hxx:428
RagTime5ClusterManager::ClusterParser::parseZone
virtual bool parseZone(MWAWInputStreamPtr &, long, int, int, libmwaw::DebugStream &)
parse a zone
Definition: RagTime5ClusterManager.hxx:384
RagTime5ClusterManager::Link::m_type
Type m_type
the link type
Definition: RagTime5ClusterManager.hxx:201
RagTime5Parser
the main class to read a RagTime v5 file
Definition: RagTime5Parser.hxx:73
RagTime5ClusterManager::Link::m_fieldSize
int m_fieldSize
the field size
Definition: RagTime5ClusterManager.hxx:209
RagTime5StructManager::Field
a field of RagTime 5/6 structures
Definition: RagTime5StructManager.hxx:235
MWAWDebug.hxx
MWAWInputStreamPtr
std::shared_ptr< MWAWInputStream > MWAWInputStreamPtr
a smart pointer of MWAWInputStream
Definition: libmwaw_internal.hxx:547
RagTime5ClusterManager::Cluster::m_dataLink
Link m_dataLink
the main data link
Definition: RagTime5ClusterManager.hxx:263
RagTime5ClusterManager::Cluster::Type
Type
the cluster type
Definition: RagTime5ClusterManager.hxx:223
RagTime5ClusterManager::Cluster::m_settingLinks
std::vector< Link > m_settingLinks
the settings links
Definition: RagTime5ClusterManager.hxx:271
RagTime5ClusterManager::ClusterRoot::m_listClusterId
int m_listClusterId
the cluster list id
Definition: RagTime5ClusterManager.hxx:315
RagTime5ClusterManager::Cluster::m_clusterIdsList
std::vector< int > m_clusterIdsList
the cluster ids
Definition: RagTime5ClusterManager.hxx:275
RagTime5ClusterManager::Cluster::m_name
librevenge::RVNGString m_name
the cluster name (if know)
Definition: RagTime5ClusterManager.hxx:261
RagTime5ClusterManager::ClusterParser::parseField
virtual bool parseField(RagTime5StructManager::Field const &, int, libmwaw::DebugStream &)
parse a the data of a zone, n_dataId:m
Definition: RagTime5ClusterManager.hxx:393
RagTime5ClusterManager::ClusterParser::m_name
std::string m_name
the cluster name
Definition: RagTime5ClusterManager.hxx:424
libmwaw::DebugStream
std::stringstream DebugStream
a basic stream (if debug_with_files is not defined, does nothing)
Definition: MWAWDebug.hxx:61
RagTime5ClusterManager::ClusterScript::m_scriptComment
Link m_scriptComment
the script comment zone
Definition: RagTime5ClusterManager.hxx:340
RagTime5ClusterManager::ClusterParser::m_dataId
int m_dataId
the actual zone id
Definition: RagTime5ClusterManager.hxx:426
RagTime5ClusterManager::Cluster::m_nameLink
Link m_nameLink
the name link
Definition: RagTime5ClusterManager.hxx:265
RagTime5StructManager
basic class used to store RagTime 5/6 structures
Definition: RagTime5StructManager.hxx:170
RagTime5ClusterManager::m_state
std::shared_ptr< RagTime5ClusterManagerInternal::State > m_state
the state
Definition: RagTime5ClusterManager.hxx:435
RagTime5ClusterManager::Link::getZoneName
std::string getZoneName() const
returns the zone name
Definition: RagTime5ClusterManager.hxx:135
RagTime5ClusterManager::Cluster::m_fieldClusterLink
Link m_fieldClusterLink
the field cluster links (def and pos)
Definition: RagTime5ClusterManager.hxx:267
RagTime5ClusterManager::Cluster::m_zoneId
int m_zoneId
the zone id
Definition: RagTime5ClusterManager.hxx:257
RagTime5ClusterManager::Cluster::C_ClusterC
Definition: RagTime5ClusterManager.hxx:232
RagTime5ClusterManager::Link
a link to a small zone (or set of zones) in RagTime 5/6 documents
Definition: RagTime5ClusterManager.hxx:105
RagTime5ClusterManager::Cluster
the cluster data
Definition: RagTime5ClusterManager.hxx:221
RagTime5ClusterManager::ClusterParser::getZoneName
virtual std::string getZoneName(int n, int m=-1) const
return the debug name corresponding to a cluster
Definition: RagTime5ClusterManager.hxx:371
RagTime5ClusterManager::Link::m_longList
std::vector< long > m_longList
a list of long used to store decal
Definition: RagTime5ClusterManager.hxx:213