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_RSRC_PARSER_H 35 #define MWAW_RSRC_PARSER_H 36 37 #include <map> 38 #include <string> 39 #include <vector> 40 41 #include "libmwaw_internal.hxx" 42 #include "MWAWDebug.hxx" 43 44 /** \brief the main class to read a Mac resource fork 45 */ 46 class MWAWRSRCParser 47 { 48 public: 49 struct Version; 50 51 //! the constructor 52 explicit MWAWRSRCParser(MWAWInputStreamPtr const &input); 53 //! the destructor 54 ~MWAWRSRCParser(); 55 56 //! try to parse the document 57 bool parse(); 58 59 //! return the rsrc input getInput()60 MWAWInputStreamPtr getInput() 61 { 62 return m_input; 63 } 64 65 //! returns a entry corresponding to a type and an id (if possible) 66 MWAWEntry getEntry(std::string type, int id) const; 67 68 //! returns the entry map (this map is filled by parse) getEntriesMap()69 std::multimap<std::string, MWAWEntry> &getEntriesMap() 70 { 71 if (!m_parsed) 72 parse(); 73 return m_entryMap; 74 } 75 //! returns the entry map (this map is filled by parse) getEntriesMap() const76 std::multimap<std::string, MWAWEntry> const &getEntriesMap() const 77 { 78 if (!m_parsed) 79 const_cast<MWAWRSRCParser *>(this)->parse(); 80 return m_entryMap; 81 } 82 83 //! try to parse a STR entry 84 bool parseSTR(MWAWEntry const &entry, std::string &str); 85 86 //! try to parse a STR# entry 87 bool parseSTRList(MWAWEntry const &entry, std::vector<std::string> &list); 88 89 //! try to parse a PICT entry 90 bool parsePICT(MWAWEntry const &entry, librevenge::RVNGBinaryData &pict); 91 92 //! try to color map (clut entry) 93 bool parseClut(MWAWEntry const &entry, std::vector<MWAWColor> &list); 94 95 //! try to parse a version entry 96 bool parseVers(MWAWEntry const &entry, Version &vers); 97 98 //! Debugging: change the default ascii file setAsciiName(char const * name)99 void setAsciiName(char const *name) 100 { 101 m_asciiName = name; 102 } 103 //! return the ascii file name asciiName() const104 std::string const &asciiName() const 105 { 106 return m_asciiName; 107 } 108 //! a DebugFile used to write what we recognize when we parse the document ascii()109 libmwaw::DebugFile &ascii() 110 { 111 return m_asciiFile; 112 } 113 protected: 114 //! try to parse the map 115 bool parseMap(MWAWEntry const &entry, long dataBegin); 116 117 //! the input stream 118 MWAWInputStreamPtr m_input; 119 //! the list of entries, name->entry 120 std::multimap<std::string, MWAWEntry> m_entryMap; 121 //! the debug file name 122 std::string m_asciiName; 123 //! the debug file 124 libmwaw::DebugFile m_asciiFile; 125 //! an internal flag used to know if the parsing was done 126 bool m_parsed; 127 private: 128 MWAWRSRCParser(MWAWRSRCParser const &orig) = delete; 129 MWAWRSRCParser &operator=(MWAWRSRCParser const &orig) = delete; 130 131 public: 132 /** a public structure used to return the version */ 133 struct Version { VersionMWAWRSRCParser::Version134 Version() 135 : m_majorVersion(-1) 136 , m_minorVersion(0) 137 , m_string("") 138 , m_versionString("") 139 , m_extra("") 140 , m_countryCode(0) 141 { 142 } 143 //! operator<< 144 friend std::ostream &operator<< (std::ostream &o, Version const &vers); 145 /** the major number */ 146 int m_majorVersion; 147 /** the minor number */ 148 int m_minorVersion; 149 /** the major string */ 150 std::string m_string; 151 /** the version string */ 152 std::string m_versionString; 153 /** extra data */ 154 std::string m_extra; 155 /** the country code */ 156 int m_countryCode; 157 }; 158 159 }; 160 161 #endif 162 // vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab: 163