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_ZONE_MANAGER
35 # define RAG_TIME_5_ZONE_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 
48 
49 class RagTime5Parser;
51 
53 {
54 struct State;
55 }
56 
59 {
60 public:
61  struct Link;
62 
63  struct Cluster;
64  struct ClusterRoot;
65  struct ClusterParser;
66 
67  friend struct ClusterParser;
68 
73 
75  bool readCluster(RagTime5Zone &zone, ClusterParser &parser, bool warnForUnparsed=true);
77  bool readCluster(RagTime5Zone &zone, shared_ptr<Cluster> &cluster, int type=-1);
79  bool readClusterMainList(ClusterRoot &root, std::vector<int> &list, std::vector<int> const &clusterIdList);
80 
82  bool readFieldClusters(Link const &link);
84  bool readUnknownClusterC(Link const &link);
88  int getClusterType(RagTime5Zone &zone, int fileType);
90  bool getClusterBasicHeaderInfo(RagTime5Zone &zone, long &N, long &fSz, long &debHeaderPos);
91 
92  // low level
93 
95  bool readFieldHeader(RagTime5Zone &zone, long endPos, std::string const &headerName, long &endDataPos, long expectedLVal=-99999);
97  std::string getClusterName(int id);
98 
100  struct Link {
108  };
110  Link(Type type=L_Unknown) : m_type(type), m_name(""), m_ids(), m_N(0), m_fieldSize(0), m_longList()
111  {
112  for (int i=0; i<2; ++i)
113  m_fileType[i]=0;
114  }
116  bool empty() const
117  {
118  if (m_type==L_LongList && !m_longList.empty())
119  return false;
120  for (size_t i=0; i<m_ids.size(); ++i)
121  if (m_ids[i]>0) return false;
122  return true;
123  }
125  std::string getZoneName() const
126  {
127  switch (m_type) {
128  case L_ClusterLink:
129  return "clustLink";
130  case L_LinkDef:
131  return "linkDef";
132  case L_LongList:
133  if (!m_name.empty())
134  return m_name;
135  else {
136  std::stringstream s;
137  s << "longList" << m_fieldSize;
138  return s.str();
139  }
140  case L_UnicodeList:
141  return "unicodeListLink";
142  case L_UnknownClusterC:
143  return "unknownClusterC";
144  case L_FieldsList:
145  if (!m_name.empty())
146  return m_name;
147  return "fieldsList[unkn]";
148  case L_List:
149  if (!m_name.empty())
150  return m_name;
151  break;
152  case L_Unknown:
153  default:
154  break;
155  }
156  std::stringstream s;
157  if (m_type==L_List)
158  s << "ListZone";
159  else
160  s << "FixZone";
161  s << std::hex << m_fileType[0] << "_" << m_fileType[1] << std::dec;
162  if (m_fieldSize)
163  s << "_" << m_fieldSize;
164  s << "A";
165  return s.str();
166  }
168  friend std::ostream &operator<<(std::ostream &o, Link const &z)
169  {
170  if (z.empty()) return o;
171  o << z.getZoneName() << ":";
172  size_t numLinks=z.m_ids.size();
173  if (numLinks>1) o << "[";
174  for (size_t i=0; i<numLinks; ++i) {
175  if (z.m_ids[i]<=0)
176  o << "_";
177  else
178  o << "data" << z.m_ids[i] << "A";
179  if (i+1!=numLinks) o << ",";
180  }
181  if (numLinks>1) o << "]";
182  if (z.m_fieldSize&0x8000)
183  o << "[" << std::hex << z.m_fieldSize << std::dec << ":" << z.m_N << "]";
184  else
185  o << "[" << z.m_fieldSize << ":" << z.m_N << "]";
186  return o;
187  }
191  std::string m_name;
193  std::vector<int> m_ids;
195  int m_N;
199  long m_fileType[2];
201  std::vector<long> m_longList;
202  };
203 
205  // cluster classes
207 
209  struct Cluster {
213  {
214  }
216  virtual ~Cluster() {}
218  enum Type {
221 
222  // the styles
224  // unknown clusters
226 
228  };
232  int m_zoneId;
242  std::vector<Link> m_conditionFormulaLinks;
244  std::vector<Link> m_settingLinks;
246  std::vector<Link> m_linksList;
248  std::vector<int> m_clusterIdsList;
249  };
250 
252  struct ClusterLayout : public Cluster {
255  {
256  }
258  virtual ~ClusterLayout() {}
260  std::vector<MWAWVec2f> m_zoneDimensions;
265  };
266 
268  struct ClusterRoot : public Cluster {
272  {
273  for (int i=0; i<8; ++i) m_styleClusterIds[i]=0;
274  for (int i=0; i<1; ++i) m_clusterIds[i]=0;
275  }
277  virtual ~ClusterRoot() {}
280 
282  int m_clusterIds[1];
283 
286 
289 
296 
299 
301  librevenge::RVNGString m_fileName;
302  };
303 
305  struct ClusterScript : public Cluster {
308  {
309  }
311  virtual ~ClusterScript() {}
315  librevenge::RVNGString m_scriptName;
316  };
317 
319  // parser class
321 
323  struct ClusterParser {
325  ClusterParser(RagTime5ClusterManager &parser, int type, std::string const &zoneName) :
326  m_parser(parser), m_type(type), m_hiLoEndian(true), m_name(zoneName), m_dataId(0), m_link()
327  {
328  }
330  virtual ~ClusterParser() {}
332  virtual shared_ptr<Cluster> getCluster()=0;
334  virtual std::string getZoneName() const
335  {
336  return m_name;
337  }
339  virtual std::string getZoneName(int n, int m=-1) const
340  {
341  std::stringstream s;
342  s << m_name << "-" << n;
343  if (m>=0)
344  s << "-B" << m;
345  return s.str();
346  }
348  virtual void startZone()
349  {
350  }
352  virtual bool parseZone(MWAWInputStreamPtr &/*input*/, long /*fSz*/, int /*N*/, int /*flag*/, libmwaw::DebugStream &/*f*/)
353  {
354  return false;
355  }
357  virtual void endZone()
358  {
359  }
361  virtual bool parseField(RagTime5StructManager::Field const &/*field*/, int /*m*/, libmwaw::DebugStream &/*f*/)
362  {
363  return false;
364  }
365 
366  //
367  // some tools
368  //
369 
371  bool isANameHeader(long N) const
372  {
373  return (m_hiLoEndian && N==int(0x80000000)) || (!m_hiLoEndian && N==0x8000);
374  }
375 
377  bool readLinkHeader(MWAWInputStreamPtr &input, long fSz, Link &link, long(&values)[4], std::string &message);
379  std::string getClusterName(int id);
383  int m_type;
387  std::string m_name;
389  int m_dataId;
392  private:
393  ClusterParser(ClusterParser const &orig);
394  ClusterParser &operator=(ClusterParser const &orig);
395  };
396 protected:
398  shared_ptr<RagTime5ClusterManagerInternal::State> m_state;
402  shared_ptr<RagTime5StructManager> m_structManager;
403 private:
406 };
407 
408 #endif
409 // vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab:
bool readClusterMainList(ClusterRoot &root, std::vector< int > &list, std::vector< int > const &clusterIdList)
try to read the cluster root list (in general Data14)
Definition: RagTime5ClusterManager.cxx:197
librevenge::RVNGString m_scriptName
the scriptname if known
Definition: RagTime5ClusterManager.hxx:315
Definition: RagTime5ClusterManager.hxx:220
int m_clusterIds[1]
other cluster id (unknown cluster b, )
Definition: RagTime5ClusterManager.hxx:282
virtual ~ClusterScript()
destructor
Definition: RagTime5ClusterManager.hxx:311
RagTime5Parser & m_mainParser
the main parser
Definition: RagTime5ClusterManager.hxx:400
Type m_type
the cluster type
Definition: RagTime5ClusterManager.hxx:230
std::vector< MWAWVec2f > m_zoneDimensions
list of zone's dimensions
Definition: RagTime5ClusterManager.hxx:260
virtual ~Cluster()
destructor
Definition: RagTime5ClusterManager.hxx:216
bool readCluster(RagTime5Zone &zone, ClusterParser &parser, bool warnForUnparsed=true)
try to read a cluster zone
Definition: RagTime5ClusterManager.cxx:322
Definition: RagTime5ClusterManager.hxx:223
RagTime5ClusterManager & m_parser
the main parser
Definition: RagTime5ClusterManager.hxx:381
Definition: RagTime5ClusterManager.hxx:223
virtual ~ClusterLayout()
destructor
Definition: RagTime5ClusterManager.hxx:258
ClusterRoot()
constructor
Definition: RagTime5ClusterManager.hxx:270
RagTime5ClusterManager operator=(RagTime5ClusterManager const &orig)
Link m_linkUnknown
other link: scripts and field 6
Definition: RagTime5ClusterManager.hxx:298
virtual void endZone()
end of a start zone call
Definition: RagTime5ClusterManager.hxx:357
bool m_hiLoEndian
zone endian
Definition: RagTime5ClusterManager.hxx:385
int m_styleClusterIds[8]
the list of style cluster ( graph, units, unitsbis, text, format, unknown, graphcolor, col/pattern id)
Definition: RagTime5ClusterManager.hxx:279
int m_type
the cluster type
Definition: RagTime5ClusterManager.hxx:383
Definition: RagTime5ClusterManager.hxx:219
the cluster script ( 2/a/4002/400a zone)
Definition: RagTime5ClusterManager.hxx:305
Link m_graphicTypeLink
the graphic type id
Definition: RagTime5ClusterManager.hxx:285
bool isANameHeader(long N) const
return true if N correspond to a file/script name
Definition: RagTime5ClusterManager.hxx:371
Link m_listClusterLink[2]
first the main cluster link, second list of field definition link
Definition: RagTime5ClusterManager.hxx:295
virtual class use to parse the cluster data
Definition: RagTime5ClusterManager.hxx:323
Definition: RagTime5ClusterManager.hxx:225
std::vector< Link > m_conditionFormulaLinks
the conditions formula links
Definition: RagTime5ClusterManager.hxx:242
main zone in a RagTime v5-v6 document
Definition: RagTime5StructManager.hxx:48
Definition: RagTime5ClusterManager.hxx:219
Link m_docInfoLink
the doc info link
Definition: RagTime5ClusterManager.hxx:288
Internal: the structures of a RagTime5ClusterManager.
Definition: RagTime5ClusterManager.cxx:48
the layout cluster ( 4001 zone)
Definition: RagTime5ClusterManager.hxx:252
librevenge::RVNGString m_fileName
the filename if known
Definition: RagTime5ClusterManager.hxx:301
the cluster for root
Definition: RagTime5ClusterManager.hxx:268
ClusterScript()
constructor
Definition: RagTime5ClusterManager.hxx:307
bool m_hiLoEndian
the cluster hiLo endian
Definition: RagTime5ClusterManager.hxx:234
Definition: RagTime5ClusterManager.hxx:220
virtual shared_ptr< Cluster > getCluster()=0
return the current cluster
ClusterParser(RagTime5ClusterManager &parser, int type, std::string const &zoneName)
constructor
Definition: RagTime5ClusterManager.hxx:325
virtual void startZone()
start a new zone
Definition: RagTime5ClusterManager.hxx:348
Link m_pipelineLink
link to a pipeline cluster list
Definition: RagTime5ClusterManager.hxx:262
Definition: RagTime5ClusterManager.hxx:219
Link m_listClusterName
the cluster list id name zone link
Definition: RagTime5ClusterManager.hxx:293
basic class used to manage RagTime 5/6 zones
Definition: RagTime5ClusterManager.hxx:58
Definition: RagTime5ClusterManager.hxx:223
std::vector< Link > m_linksList
the link list
Definition: RagTime5ClusterManager.hxx:246
RagTime5ClusterManager(RagTime5Parser &parser)
constructor
Definition: RagTime5ClusterManager.cxx:143
Link m_link
the actual link
Definition: RagTime5ClusterManager.hxx:391
virtual bool parseZone(MWAWInputStreamPtr &, long, int, int, libmwaw::DebugStream &)
parse a zone
Definition: RagTime5ClusterManager.hxx:352
Cluster()
constructor
Definition: RagTime5ClusterManager.hxx:211
int getClusterType(RagTime5Zone &zone, int fileType)
returns the local zone type
Definition: RagTime5ClusterManager.cxx:2630
the main class to read a RagTime v5 file
Definition: RagTime5Parser.hxx:69
a field of RagTime 5/6 structures
Definition: RagTime5StructManager.hxx:220
virtual std::string getZoneName() const
return the debug name corresponding to a zone
Definition: RagTime5ClusterManager.hxx:334
std::string getClusterName(int id)
returns "data"+id+"A" ( followed by the cluster type and name if know)
Definition: RagTime5ClusterManager.cxx:457
shared_ptr< MWAWInputStream > MWAWInputStreamPtr
a smart pointer of MWAWInputStream
Definition: libmwaw_internal.hxx:439
Link m_listItemLink
link to a zone of fieldSize 8(unknown)
Definition: RagTime5ClusterManager.hxx:264
bool getClusterBasicHeaderInfo(RagTime5Zone &zone, long &N, long &fSz, long &debHeaderPos)
try to return basic information about the header cluster's zone
Definition: RagTime5ClusterManager.cxx:2609
bool readLinkHeader(MWAWInputStreamPtr &input, long fSz, Link &link, long(&values)[4], std::string &message)
try to read a link header
Definition: RagTime5ClusterManager.cxx:462
ClusterLayout()
constructor
Definition: RagTime5ClusterManager.hxx:254
Link m_dataLink
the main data link
Definition: RagTime5ClusterManager.hxx:236
Type
the cluster type
Definition: RagTime5ClusterManager.hxx:218
std::vector< Link > m_settingLinks
the settings links
Definition: RagTime5ClusterManager.hxx:244
int m_listClusterId
the cluster list id
Definition: RagTime5ClusterManager.hxx:291
~RagTime5ClusterManager()
destructor
Definition: RagTime5ClusterManager.cxx:148
Definition: RagTime5ClusterManager.hxx:227
std::vector< int > m_clusterIdsList
the cluster ids
Definition: RagTime5ClusterManager.hxx:248
Definition: RagTime5ClusterManager.hxx:219
shared_ptr< RagTime5ClusterManagerInternal::State > m_state
the state
Definition: RagTime5ClusterManager.hxx:398
Definition: RagTime5ClusterManager.hxx:223
virtual bool parseField(RagTime5StructManager::Field const &, int, libmwaw::DebugStream &)
parse a n_dataId:m
Definition: RagTime5ClusterManager.hxx:361
std::string m_name
the cluster name
Definition: RagTime5ClusterManager.hxx:387
std::stringstream DebugStream
a basic stream (if debug_with_files is not defined, does nothing)
Definition: MWAWDebug.hxx:61
Link m_scriptComment
the script comment zone
Definition: RagTime5ClusterManager.hxx:313
int m_dataId
the actual zone id
Definition: RagTime5ClusterManager.hxx:389
shared_ptr< RagTime5StructManager > m_structManager
the structure manager
Definition: RagTime5ClusterManager.hxx:402
virtual ~ClusterParser()
destructor
Definition: RagTime5ClusterManager.hxx:330
Link m_nameLink
the name link
Definition: RagTime5ClusterManager.hxx:238
ClusterParser & operator=(ClusterParser const &orig)
Definition: RagTime5ClusterManager.hxx:223
basic class used to store RagTime 5/6 structures
Definition: RagTime5StructManager.hxx:158
bool readFieldClusters(Link const &link)
try to read some field cluster
Definition: RagTime5ClusterManager.cxx:283
std::string getClusterName(int id)
returns "data"+id+"A" ( followed by the cluster type and name if know)
Definition: RagTime5ClusterManager.cxx:184
bool readUnknownClusterC(Link const &link)
try to read some unknown cluster
Definition: RagTime5ClusterManager.cxx:301
int getClusterFileType(RagTime5Zone &zone)
try to find a cluster zone type ( heuristic when the cluster type is unknown )
Definition: RagTime5ClusterManager.cxx:2700
Link m_fieldClusterLink
the field cluster links (def and pos)
Definition: RagTime5ClusterManager.hxx:240
bool readFieldHeader(RagTime5Zone &zone, long endPos, std::string const &headerName, long &endDataPos, long expectedLVal=-99999)
try to read a field header, if ok set the endDataPos positions
Definition: RagTime5ClusterManager.cxx:155
virtual std::string getZoneName(int n, int m=-1) const
return the debug name corresponding to a cluster
Definition: RagTime5ClusterManager.hxx:339
int m_zoneId
the zone id
Definition: RagTime5ClusterManager.hxx:232
Definition: RagTime5ClusterManager.hxx:225
the cluster data
Definition: RagTime5ClusterManager.hxx:209
virtual ~ClusterRoot()
destructor
Definition: RagTime5ClusterManager.hxx:277

Generated on Thu Jul 9 2015 20:26:37 for libmwaw by doxygen 1.8.8