RagTime5StructManager.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_STRUCT_MANAGER
35# define RAG_TIME_5_STRUCT_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
51{
52public:
55 : m_level(-1)
56 , m_parentName("")
57 , m_defPosition(0)
58 , m_entry()
59 , m_name("")
60 , m_hiLoEndian(true)
63 , m_isInitialised(false)
64 , m_isParsed(false)
65 , m_extra("")
66 , m_input()
67 , m_defaultInput(input)
68 , m_asciiName("")
69 , m_asciiFile(&asc)
70 , m_mainAsciiFile(&asc)
72 {
73 for (auto &id : m_ids) id=0;
74 for (auto &idFlag : m_idsFlag) idFlag=0;
75 for (auto &kind : m_kinds) kind="";
76 for (auto &variableD : m_variableD) variableD=0;
77 }
79 virtual ~RagTime5Zone();
81 std::string getZoneName() const;
83 std::string getKindLastPart(bool main=true) const
84 {
85 std::string res(m_kinds[main ? 0 : 1]);
86 std::string::size_type pos = res.find_last_of(':');
87 if (pos == std::string::npos) return res;
88 return res.substr(pos+1);
89 }
90
92 friend std::ostream &operator<<(std::ostream &o, RagTime5Zone const &z);
95 {
96 return m_input;
97 }
99 void setInput(MWAWInputStreamPtr const &input)
100 {
101 m_input = input;
102 }
104 bool isMainInput() const
105 {
106 return m_input.get()==m_defaultInput.get();
107 }
110 {
111 if (!isMainInput() && !m_localAsciiFile)
113 return *m_asciiFile;
114 }
116 void setAsciiFileName(std::string const &name)
117 {
118 m_asciiName = name;
119 }
121 void createAsciiFile();
123 void addErrorInDebugFile(std::string const &zoneName);
124
128 std::string m_parentName;
132 std::string m_kinds[2];
136 std::string m_name;
140 int m_ids[3];
142 int m_idsFlag[3];
144 std::vector<MWAWEntry> m_entriesList;
146 std::map<int,std::shared_ptr<RagTime5Zone> > m_childIdToZoneMap;
150 mutable bool m_isInitialised;
152 mutable bool m_isParsed;
154 std::string m_extra;
155protected:
161 std::string m_asciiName;
167 std::shared_ptr<libmwaw::DebugFile> m_localAsciiFile;
168private:
169 RagTime5Zone(RagTime5Zone const &orig) = delete;
170 RagTime5Zone &operator=(RagTime5Zone const &orig) = delete;
171};
172
175{
176public:
177 struct Field;
182
186 bool readField(MWAWInputStreamPtr input, long endPos, libmwaw::DebugFile &ascFile,
187 Field &field, long fSz=0);
189 static bool readCompressedLong(MWAWInputStreamPtr &input, long endPos, long &val);
191 static bool readUnicodeString(MWAWInputStreamPtr input, long endPos, librevenge::RVNGString &string);
193 static bool readDataIdList(MWAWInputStreamPtr input, int n, std::vector<int> &listIds);
194
196 static std::string printType(unsigned long fileType);
197
199 struct TabStop {
202 : m_position(0)
203 , m_type(1)
204 , m_leaderChar(0)
205 {
206 }
208 friend std::ostream &operator<<(std::ostream &o, TabStop const &tab)
209 {
210 o << tab.m_position;
211 switch (tab.m_type) {
212 case 1:
213 break;
214 case 2:
215 o << "R";
216 break;
217 case 3:
218 o << "C";
219 break;
220 case 4:
221 o << "D";
222 break;
223 case 5: // Kintou Waritsuke: sort of center
224 o << "K";
225 break;
226 default:
227 o << ":#type=" << tab.m_type;
228 break;
229 }
230 if (tab.m_leaderChar>0)
231 o << ":leader=" << char(tab.m_leaderChar);
232 return o;
233 }
239 uint16_t m_leaderChar;
240 };
242 struct Field {
246 };
247
251 , m_fileType(0)
252 , m_name("")
253 , m_doubleValue(0)
254 , m_color()
255 , m_string("")
256 , m_longList()
257 , m_doubleList()
258 , m_numLongByData(1)
259 , m_tabList()
260 , m_fieldList()
261 , m_entry()
262 , m_extra("")
263 {
264 for (auto &val : m_longValue) val=0;
265 }
266 Field(Field const &)=default;
269 {
270 }
272 friend std::ostream &operator<<(std::ostream &o, Field const &field);
276 unsigned long m_fileType;
278 std::string m_name;
280 long m_longValue[2];
286 librevenge::RVNGString m_string;
288 std::vector<long> m_longList;
290 std::vector<double> m_doubleList;
294 std::vector<TabStop> m_tabList;
296 std::vector<Field> m_fieldList;
300 std::string m_extra;
301 };
303 struct ZoneLink {
306 : m_dataId(0)
307 , m_valuesList()
308 , m_extra("")
309 {
310 for (auto &id : m_subZoneId) id=0;
311 }
313 int getSubZoneId(int i) const
314 {
315 if (i<0 || i>=2) {
316 MWAW_DEBUG_MSG(("RagTime5StructManager::ZoneLink::getSubZoneId: called with bad value=%d\n", i));
317 return 0;
318 }
319 return (m_subZoneId[0]&0x3fffffff);
320 }
322 friend std::ostream &operator<<(std::ostream &o, ZoneLink const &link)
323 {
324 if (link.m_dataId) o << "data" << link.m_dataId << "A,";
325 if (link.m_subZoneId[0]) {
326 if (link.m_subZoneId[0]> 0&& (static_cast<unsigned long>(link.m_subZoneId[0])&0xc0000000)==0)
327 o << "data[subId]=" << link.m_subZoneId[0] << ",";
328 else
329 o << "data[subId]=" << (link.m_subZoneId[0]&0x3fffffff) << "[" << (link.m_subZoneId[0]>>30) << "],";
330 }
331 if (link.m_subZoneId[1]) {
332 if (link.m_subZoneId[1]>0 && (static_cast<unsigned long>(link.m_subZoneId[1])&0xff000000)==0)
333 o << "orig[subId]=" << link.m_subZoneId[1] << ",";
334 else
335 o << "orig[subId]=" << (link.m_subZoneId[1]&0x00ffffff) << "[" << (link.m_subZoneId[1]>>24) << "],";
336 }
337 for (size_t i=0; i<link.m_valuesList.size(); ++i) {
338 if (!link.m_valuesList[i]) continue;
339 o << "f" << i << "=" << link.m_valuesList[i] << ",";
340 }
341 return o;
342 }
346 long m_subZoneId[2];
348 std::vector<long> m_valuesList;
350 std::string m_extra;
351 };
353 struct FieldParser {
355 explicit FieldParser(std::string const &zoneName)
356 : m_regroupFields(false)
357 , m_name(zoneName)
358 {
359 }
361 virtual ~FieldParser();
363 virtual std::string getZoneName() const
364 {
365 return m_name;
366 }
368 virtual std::string getZoneName(int n) const
369 {
370 std::stringstream s;
371 s << m_name << "-" << n;
372 return s.str();
373 }
375 virtual bool parseHeaderField(Field &field, RagTime5Zone &/*zone*/, int /*n*/, libmwaw::DebugStream &f)
376 {
377 f << field;
378 return true;
379 }
381 virtual bool parseField(Field &field, RagTime5Zone &/*zone*/, int /*n*/, libmwaw::DebugStream &f)
382 {
383 f << field;
384 return true;
385 }
388 protected:
390 std::string m_name;
391 private:
392 FieldParser(FieldParser const &orig) = delete;
393 FieldParser &operator=(FieldParser const &orig) = delete;
394 };
396 struct DataParser {
398 explicit DataParser(std::string const &zoneName);
400 virtual ~DataParser();
402 virtual std::string getZoneName() const
403 {
404 return m_name;
405 }
407 virtual std::string getZoneName(int n) const
408 {
409 std::stringstream s;
410 s << m_name << "-" << n;
411 return s.str();
412 }
414 virtual bool parseData(MWAWInputStreamPtr &/*input*/, long /*endPos*/, RagTime5Zone &/*zone*/, int /*n*/, libmwaw::DebugStream &/*f*/)
415 {
416 return true;
417 }
418 protected:
420 std::string m_name;
421 private:
422 DataParser(DataParser const &orig) = delete;
423 DataParser &operator=(DataParser const &orig) = delete;
424 };
425
427 struct GObjPropFieldParser final : public FieldParser {
429 explicit GObjPropFieldParser(std::string const &name)
430 : FieldParser(name)
431 , m_clusterId(0)
432 {
433 }
435 bool parseField(Field &field, RagTime5Zone &zone, int n, libmwaw::DebugStream &f) final;
436
439 };
440
441private:
444
447};
448
449#endif
450// vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab:
basic class to store an entry in a file This contained :
Definition: MWAWEntry.hxx:47
the main class to read a RagTime v5 file
Definition: RagTime5Document.hxx:77
basic class used to store RagTime 5/6 structures
Definition: RagTime5StructManager.hxx:175
RagTime5StructManager(RagTime5StructManager const &orig)=delete
RagTime5Document & m_document
the main document
Definition: RagTime5StructManager.hxx:443
bool readTypeDefinitions(RagTime5Zone &zone)
try to read a list of type definition
Definition: RagTime5StructManager.cxx:133
RagTime5StructManager operator=(RagTime5StructManager const &orig)=delete
static std::string printType(unsigned long fileType)
debug: print a file type
Definition: RagTime5StructManager.cxx:94
~RagTime5StructManager()
destructor
Definition: RagTime5StructManager.cxx:57
bool readField(MWAWInputStreamPtr input, long endPos, libmwaw::DebugFile &ascFile, Field &field, long fSz=0)
try to read a field
Definition: RagTime5StructManager.cxx:357
static bool readUnicodeString(MWAWInputStreamPtr input, long endPos, librevenge::RVNGString &string)
try to read a unicode string
Definition: RagTime5StructManager.cxx:307
static bool readCompressedLong(MWAWInputStreamPtr &input, long endPos, long &val)
try to read a compressed long
Definition: RagTime5StructManager.cxx:78
static bool readDataIdList(MWAWInputStreamPtr input, int n, std::vector< int > &listIds)
try to read n data id
Definition: RagTime5StructManager.cxx:336
main zone in a RagTime v5-v6 document
Definition: RagTime5StructManager.hxx:51
std::string m_extra
extra data
Definition: RagTime5StructManager.hxx:154
MWAWInputStreamPtr m_input
the main input
Definition: RagTime5StructManager.hxx:157
MWAWInputStreamPtr getInput()
returns the current input
Definition: RagTime5StructManager.hxx:94
friend std::ostream & operator<<(std::ostream &o, RagTime5Zone const &z)
operator<<
Definition: RagTime5StructManager.cxx:1704
std::string m_name
the zone name ( mainly used for debugging)
Definition: RagTime5StructManager.hxx:136
std::string m_parentName
the parent name
Definition: RagTime5StructManager.hxx:128
std::vector< MWAWEntry > m_entriesList
the list of original entries
Definition: RagTime5StructManager.hxx:144
std::string m_asciiName
the ascii file name ( used if we need to create a ascii file)
Definition: RagTime5StructManager.hxx:161
MWAWEntry m_entry
the zone entry
Definition: RagTime5StructManager.hxx:134
void setInput(MWAWInputStreamPtr const &input)
reset the current input
Definition: RagTime5StructManager.hxx:99
int m_level
the zone level
Definition: RagTime5StructManager.hxx:126
bool m_hiLoEndian
true if the endian is hilo
Definition: RagTime5StructManager.hxx:138
long m_defPosition
the position of the definition in the main zones
Definition: RagTime5StructManager.hxx:130
std::string getZoneName() const
returns the zone name
Definition: RagTime5StructManager.cxx:1667
virtual ~RagTime5Zone()
destructor
Definition: RagTime5StructManager.cxx:1647
libmwaw::DebugFile & ascii()
returns the current ascii file
Definition: RagTime5StructManager.hxx:109
int m_idsFlag[3]
the zone flag
Definition: RagTime5StructManager.hxx:142
std::shared_ptr< libmwaw::DebugFile > m_localAsciiFile
the local ascii file ( if we need to create a new input)
Definition: RagTime5StructManager.hxx:167
std::string getKindLastPart(bool main=true) const
returns the main type
Definition: RagTime5StructManager.hxx:83
int m_ids[3]
the zone id
Definition: RagTime5StructManager.hxx:140
RagTime5Zone(MWAWInputStreamPtr const &input, libmwaw::DebugFile &asc)
constructor
Definition: RagTime5StructManager.hxx:54
bool isMainInput() const
returns true if the input correspond to the basic file
Definition: RagTime5StructManager.hxx:104
int m_variableD[2]
the content of the zone D if it exists
Definition: RagTime5StructManager.hxx:148
bool m_isParsed
a flag to know if the zone is parsed
Definition: RagTime5StructManager.hxx:152
libmwaw::DebugFile * m_mainAsciiFile
the main ascii file (used to print error)
Definition: RagTime5StructManager.hxx:165
RagTime5Zone & operator=(RagTime5Zone const &orig)=delete
std::map< int, std::shared_ptr< RagTime5Zone > > m_childIdToZoneMap
the child zones
Definition: RagTime5StructManager.hxx:146
libmwaw::DebugFile * m_asciiFile
the ascii file corresponding to an input
Definition: RagTime5StructManager.hxx:163
void addErrorInDebugFile(std::string const &zoneName)
mark a zone as bad
Definition: RagTime5StructManager.cxx:1687
void createAsciiFile()
creates the ascii file
Definition: RagTime5StructManager.cxx:1651
MWAWInputStreamPtr m_defaultInput
the main file input
Definition: RagTime5StructManager.hxx:159
void setAsciiFileName(std::string const &name)
defines the ascii name
Definition: RagTime5StructManager.hxx:116
std::string m_kinds[2]
the zone types: normal and packing
Definition: RagTime5StructManager.hxx:132
bool m_isInitialised
a flag to know if the zone is initialised (stream, hiLoEndian)
Definition: RagTime5StructManager.hxx:150
RagTime5Zone(RagTime5Zone const &orig)=delete
an interface used to insert comment in a binary file, written in ascii form (if debug_with_files is n...
Definition: MWAWDebug.hxx:66
#define MWAW_DEBUG_MSG(M)
Definition: libmwaw_internal.hxx:129
std::shared_ptr< MWAWInputStream > MWAWInputStreamPtr
a smart pointer of MWAWInputStream
Definition: libmwaw_internal.hxx:551
std::stringstream DebugStream
a basic stream (if debug_with_files is not defined, does nothing)
Definition: MWAWDebug.hxx:61
the class to store a color
Definition: libmwaw_internal.hxx:192
virtual class use to parse the unstructured data
Definition: RagTime5StructManager.hxx:396
DataParser(DataParser const &orig)=delete
virtual std::string getZoneName(int n) const
return the debug name corresponding to a field
Definition: RagTime5StructManager.hxx:407
virtual ~DataParser()
destructor
Definition: RagTime5StructManager.cxx:68
DataParser & operator=(DataParser const &orig)=delete
virtual bool parseData(MWAWInputStreamPtr &, long, RagTime5Zone &, int, libmwaw::DebugStream &)
parse a data
Definition: RagTime5StructManager.hxx:414
virtual std::string getZoneName() const
return the debug name corresponding to a zone
Definition: RagTime5StructManager.hxx:402
std::string m_name
the field name
Definition: RagTime5StructManager.hxx:420
virtual class use to parse the field data
Definition: RagTime5StructManager.hxx:353
virtual bool parseHeaderField(Field &field, RagTime5Zone &, int, libmwaw::DebugStream &f)
parse a header field
Definition: RagTime5StructManager.hxx:375
virtual bool parseField(Field &field, RagTime5Zone &, int, libmwaw::DebugStream &f)
parse a field
Definition: RagTime5StructManager.hxx:381
std::string m_name
the field name
Definition: RagTime5StructManager.hxx:390
bool m_regroupFields
a flag use to decide if we output one debug message by field or not
Definition: RagTime5StructManager.hxx:387
FieldParser(std::string const &zoneName)
constructor
Definition: RagTime5StructManager.hxx:355
FieldParser(FieldParser const &orig)=delete
FieldParser & operator=(FieldParser const &orig)=delete
virtual ~FieldParser()
destructor
Definition: RagTime5StructManager.cxx:72
virtual std::string getZoneName() const
return the debug name corresponding to a zone
Definition: RagTime5StructManager.hxx:363
virtual std::string getZoneName(int n) const
return the debug name corresponding to a field
Definition: RagTime5StructManager.hxx:368
a field of RagTime 5/6 structures
Definition: RagTime5StructManager.hxx:242
long m_longValue[2]
the long value
Definition: RagTime5StructManager.hxx:280
unsigned long m_fileType
the file type
Definition: RagTime5StructManager.hxx:276
Field()
constructor
Definition: RagTime5StructManager.hxx:249
std::vector< Field > m_fieldList
the list of field
Definition: RagTime5StructManager.hxx:296
std::string m_extra
extra data
Definition: RagTime5StructManager.hxx:300
std::vector< long > m_longList
the list of long value
Definition: RagTime5StructManager.hxx:288
Type
the different type
Definition: RagTime5StructManager.hxx:244
@ T_LongList
Definition: RagTime5StructManager.hxx:244
@ T_FieldList
Definition: RagTime5StructManager.hxx:244
@ T_String
Definition: RagTime5StructManager.hxx:245
@ T_2Long
Definition: RagTime5StructManager.hxx:244
@ T_Unknown
Definition: RagTime5StructManager.hxx:244
@ T_CondColor
Definition: RagTime5StructManager.hxx:245
@ T_DoubleList
Definition: RagTime5StructManager.hxx:244
@ T_LongDouble
Definition: RagTime5StructManager.hxx:245
@ T_Code
Definition: RagTime5StructManager.hxx:245
@ T_Unicode
Definition: RagTime5StructManager.hxx:245
@ T_Bool
Definition: RagTime5StructManager.hxx:244
@ T_Unstructured
Definition: RagTime5StructManager.hxx:245
@ T_Double
Definition: RagTime5StructManager.hxx:244
@ T_Long
Definition: RagTime5StructManager.hxx:244
@ T_PrintInfo
Definition: RagTime5StructManager.hxx:245
@ T_ZoneId
Definition: RagTime5StructManager.hxx:245
@ T_TabList
Definition: RagTime5StructManager.hxx:244
@ T_Color
Definition: RagTime5StructManager.hxx:245
double m_doubleValue
the double value
Definition: RagTime5StructManager.hxx:282
friend std::ostream & operator<<(std::ostream &o, Field const &field)
operator<<
Definition: RagTime5StructManager.cxx:1405
Type m_type
the field type
Definition: RagTime5StructManager.hxx:274
~Field()
destructor
Definition: RagTime5StructManager.hxx:268
std::string m_name
the field type name
Definition: RagTime5StructManager.hxx:278
MWAWEntry m_entry
entry to defined the position of a String or Unstructured data
Definition: RagTime5StructManager.hxx:298
int m_numLongByData
the number of long by data (in m_longList)
Definition: RagTime5StructManager.hxx:292
Field(Field const &)=default
MWAWColor m_color
the color
Definition: RagTime5StructManager.hxx:284
std::vector< TabStop > m_tabList
the list of tabStop
Definition: RagTime5StructManager.hxx:294
librevenge::RVNGString m_string
small string use to store a string or a 4 char code
Definition: RagTime5StructManager.hxx:286
std::vector< double > m_doubleList
the list of double value
Definition: RagTime5StructManager.hxx:290
basic parser to read image/main graphic position properties
Definition: RagTime5StructManager.hxx:427
bool parseField(Field &field, RagTime5Zone &zone, int n, libmwaw::DebugStream &f) final
parse a field
Definition: RagTime5StructManager.cxx:1521
int m_clusterId
the id of the zone corresponding to this property (always a clust graph ?)
Definition: RagTime5StructManager.hxx:438
GObjPropFieldParser(std::string const &name)
constructor
Definition: RagTime5StructManager.hxx:429
a tabulation in RagTime 5/6 structures
Definition: RagTime5StructManager.hxx:199
friend std::ostream & operator<<(std::ostream &o, TabStop const &tab)
operator<<
Definition: RagTime5StructManager.hxx:208
TabStop()
constructor
Definition: RagTime5StructManager.hxx:201
int m_type
the type
Definition: RagTime5StructManager.hxx:237
uint16_t m_leaderChar
the unicode leader char
Definition: RagTime5StructManager.hxx:239
float m_position
the position
Definition: RagTime5StructManager.hxx:235

Generated on Thu Jan 19 2023 00:00:00 for libmwaw by doxygen 1.9.6