Vault
4.1
|
00001 /* 00002 Copyright c1997-2014 Trygve Isaacson. All rights reserved. 00003 This file is part of the Code Vault version 4.1 00004 http://www.bombaydigital.com/ 00005 License: MIT. See LICENSE.md in the Vault top level directory. 00006 */ 00007 00008 #ifndef vsettings_h 00009 #define vsettings_h 00010 00013 #include "vstring.h" 00014 #include "vgeometry.h" 00015 #include "vcolor.h" 00016 00017 class VBentoNode; 00018 class VTextIOStream; 00019 00024 class VSettingsNode; 00025 typedef std::vector<VSettingsNode*> VSettingsNodePtrVector; 00026 00027 class VSettingsAttribute; 00028 typedef std::vector<VSettingsAttribute*> VSettingsAttributePtrVector; 00029 00030 class VSettingsTag; 00031 00051 class VSettingsNode { 00052 public: 00053 00054 VSettingsNode(VSettingsTag* parent, const VString& name); 00055 VSettingsNode(const VSettingsNode& other); 00056 virtual ~VSettingsNode() {} 00057 00058 VSettingsNode& operator=(const VSettingsNode& other); 00059 00060 virtual void writeToStream(VTextIOStream& outputStream, int indentLevel = 0) const = 0; 00061 virtual VBentoNode* writeToBento() const = 0; 00062 00063 virtual const VSettingsNode* findNode(const VString& path) const; 00064 virtual VSettingsNode* findMutableNode(const VString& path); 00065 virtual int countNodes(const VString& path) const; 00066 virtual int countNamedChildren(const VString& /*name*/) const { return 0; } 00067 virtual const VSettingsNode* getNamedChild(const VString& /*name*/, int /*index*/) const { return NULL; } 00068 virtual void deleteNode(const VString& path); 00069 virtual void deleteNamedChildren(const VString& /*name*/) {} 00070 00071 const VString& getName() const; 00072 VString getPath() const; 00073 bool isNamed(const VString& name) const; 00074 00075 virtual int getInt(const VString& path, int defaultValue) const; 00076 virtual int getInt(const VString& path) const; 00077 int getIntValue() const; // Because it all comes from text, int is just cast from getS64() parsed value. 00078 virtual Vs64 getS64(const VString& path, Vs64 defaultValue) const; 00079 virtual Vs64 getS64(const VString& path) const; 00080 virtual Vs64 getS64Value() const = 0; 00081 virtual bool getBoolean(const VString& path, bool defaultValue) const; 00082 virtual bool getBoolean(const VString& path) const; 00083 virtual bool getBooleanValue() const = 0; 00084 virtual VString getString(const VString& path, const VString& defaultValue) const; 00085 virtual VString getString(const VString& path) const; 00086 virtual VString getStringValue() const = 0; 00087 virtual VDouble getDouble(const VString& path, VDouble defaultValue) const; 00088 virtual VDouble getDouble(const VString& path) const; 00089 virtual VDouble getDoubleValue() const = 0; 00090 virtual VSize getSize(const VString& path, const VSize& defaultValue) const; 00091 virtual VSize getSize(const VString& path) const; 00092 virtual VSize getSizeValue() const = 0; 00093 virtual VPoint getPoint(const VString& path, const VPoint& defaultValue) const; 00094 virtual VPoint getPoint(const VString& path) const; 00095 virtual VPoint getPointValue() const = 0; 00096 virtual VRect getRect(const VString& path, const VRect& defaultValue) const; 00097 virtual VRect getRect(const VString& path) const; 00098 virtual VRect getRectValue() const = 0; 00099 virtual VPolygon getPolygon(const VString& path, const VPolygon& defaultValue) const; 00100 virtual VPolygon getPolygon(const VString& path) const; 00101 virtual VPolygon getPolygonValue() const = 0; 00102 virtual VColor getColor(const VString& path, const VColor& defaultValue) const; 00103 virtual VColor getColor(const VString& path) const; 00104 virtual VColor getColorValue() const = 0; 00105 virtual VDuration getDuration(const VString& path, const VDuration& defaultValue) const; 00106 virtual VDuration getDuration(const VString& path) const; 00107 virtual VDuration getDurationValue() const = 0; 00108 virtual VDate getDate(const VString& path, const VDate& defaultValue) const; 00109 virtual VDate getDate(const VString& path) const; 00110 virtual VDate getDateValue() const = 0; 00111 virtual VInstant getInstant(const VString& path, const VInstant& defaultValue) const; 00112 virtual VInstant getInstant(const VString& path) const; 00113 virtual VInstant getInstantValue() const = 0; 00114 virtual bool nodeExists(const VString& path) const; 00115 00116 virtual void addIntValue(const VString& path, int value); 00117 virtual void addS64Value(const VString& path, Vs64 value); 00118 virtual void addBooleanValue(const VString& path, bool value); 00119 virtual void addStringValue(const VString& path, const VString& value); 00120 virtual void addDoubleValue(const VString& path, VDouble value); 00121 virtual void addSizeValue(const VString& path, const VSize& value); 00122 virtual void addPointValue(const VString& path, const VPoint& value); 00123 virtual void addRectValue(const VString& path, const VRect& value); 00124 virtual void addPolygonValue(const VString& path, const VPolygon& value); 00125 virtual void addColorValue(const VString& path, const VColor& value); 00126 virtual void addDurationValue(const VString& path, const VDuration& value); 00127 virtual void addItem(const VString& path); 00128 virtual void setIntValue(const VString& path, int value); 00129 virtual void setBooleanValue(const VString& path, bool value); 00130 virtual void setStringValue(const VString& path, const VString& value); 00131 virtual void setDoubleValue(const VString& path, VDouble value); 00132 virtual void setSizeValue(const VString& path, const VSize& value); 00133 virtual void setPointValue(const VString& path, const VPoint& value); 00134 virtual void setRectValue(const VString& path, const VRect& value); 00135 virtual void setPolygonValue(const VString& path, const VPolygon& value); 00136 virtual void setColorValue(const VString& path, const VColor& value); 00137 virtual void setDurationValue(const VString& path, const VDuration& value); 00138 virtual void setLiteral(const VString& /*value*/) {}; 00139 00140 virtual void add(const VString& path, bool hasValue, const VString& value); 00141 00142 virtual void addValue(const VString& value); 00143 00144 virtual void addChildNode(VSettingsNode* node); 00145 00146 VSettingsTag* getParent(); 00147 00148 protected: 00149 00150 virtual VSettingsAttribute* _findAttribute(const VString& /*name*/) const { return NULL; } 00151 virtual VSettingsTag* _findChildTag(const VString& /*name*/) const { return NULL; } 00152 virtual void _addLeafValue(const VString& name, bool hasValue, const VString& value); 00153 virtual void _removeAttribute(VSettingsAttribute* /*attribute*/) {} 00154 virtual void _removeChildNode(VSettingsNode* /*child*/) {} 00155 00156 void throwNotFound(const VString& dataKind, const VString& missingTrail) const; 00157 00158 static const char kPathDelimiterChar; 00159 00160 VSettingsTag* mParent; 00161 VString mName; 00162 }; 00163 00168 class VSettings : public VSettingsNode { 00169 public: 00170 00171 VSettings(); 00172 VSettings(const VFSNode& file); 00173 VSettings(VTextIOStream& inputStream); 00174 virtual ~VSettings(); 00175 00176 void readFromFile(const VFSNode& file); 00177 void writeToFile(const VFSNode& file) const; 00178 void readFromStream(VTextIOStream& inputStream); 00179 virtual void writeToStream(VTextIOStream& outputStream, int indentLevel = 0) const; 00180 virtual VBentoNode* writeToBento() const; 00181 void debugPrint() const; 00182 00183 virtual const VSettingsNode* findNode(const VString& path) const; 00184 virtual int countNamedChildren(const VString& name) const; 00185 virtual const VSettingsNode* getNamedChild(const VString& name, int index) const; 00186 virtual void deleteNamedChildren(const VString& name); 00187 00188 virtual Vs64 getS64Value() const; 00189 virtual bool getBooleanValue() const; 00190 virtual VString getStringValue() const; 00191 virtual VDouble getDoubleValue() const; 00192 virtual VSize getSizeValue() const; 00193 virtual VPoint getPointValue() const; 00194 virtual VRect getRectValue() const; 00195 virtual VPolygon getPolygonValue() const; 00196 virtual VColor getColorValue() const; 00197 virtual VDuration getDurationValue() const; 00198 virtual VDate getDateValue() const; 00199 virtual VInstant getInstantValue() const; 00200 00201 virtual void addChildNode(VSettingsNode* node); 00202 00203 // String value converters. 00204 static bool stringToBoolean(const VString& value); 00205 00206 // Path navigation utilities. 00207 static bool isPathLeaf(const VString& path); 00208 static void splitPathFirst(const VString& path, VString& nextNodeName, VString& outRemainder); 00209 static void splitPathLast(const VString& path, VString& leadingPath, VString& lastNode); 00210 00211 protected: 00212 00213 virtual VSettingsTag* _findChildTag(const VString& /*name*/) const; 00214 virtual void _addLeafValue(const VString& name, bool hasValue, const VString& value); 00215 00216 private: 00217 00218 VSettingsNodePtrVector mNodes; 00219 00220 }; 00221 00225 class VSettingsTag : public VSettingsNode { 00226 public: 00227 00228 // In reality, the parent can be a VSettings object; but no other kind of VSettings Node (i.e., attributes). 00229 VSettingsTag(VSettingsTag* parent, const VString& name); 00230 virtual ~VSettingsTag(); 00231 00232 virtual void writeToStream(VTextIOStream& outputStream, int indentLevel = 0) const; 00233 virtual VBentoNode* writeToBento() const; 00234 00235 virtual int countNamedChildren(const VString& name) const; 00236 virtual const VSettingsNode* getNamedChild(const VString& name, int index) const; 00237 virtual void deleteNamedChildren(const VString& name); 00238 00239 void addAttribute(VSettingsAttribute* attribute); 00240 virtual void addChildNode(VSettingsNode* node); 00241 00242 virtual Vs64 getS64Value() const; 00243 virtual bool getBooleanValue() const; 00244 virtual VString getStringValue() const; 00245 virtual VDouble getDoubleValue() const; 00246 virtual VSize getSizeValue() const; 00247 virtual VPoint getPointValue() const; 00248 virtual VRect getRectValue() const; 00249 virtual VPolygon getPolygonValue() const; 00250 virtual VColor getColorValue() const; 00251 virtual VDuration getDurationValue() const; 00252 virtual VDate getDateValue() const; 00253 virtual VInstant getInstantValue() const; 00254 00255 virtual void setLiteral(const VString& value); 00256 00257 protected: 00258 00259 virtual VSettingsAttribute* _findAttribute(const VString& name) const; 00260 virtual VSettingsTag* _findChildTag(const VString& name) const; 00261 virtual void _addLeafValue(const VString& name, bool hasValue, const VString& value); 00262 virtual void _removeAttribute(VSettingsAttribute* attribute); 00263 virtual void _removeChildNode(VSettingsNode* child); 00264 00265 private: 00266 00267 VSettingsAttributePtrVector mAttributes; 00268 VSettingsNodePtrVector mChildNodes; 00269 00270 }; 00271 00278 class VSettingsAttribute : public VSettingsNode { 00279 public: 00280 00281 VSettingsAttribute(VSettingsTag* parent, const VString& name, const VString& value); 00282 VSettingsAttribute(VSettingsTag* parent, const VString& name); 00283 virtual ~VSettingsAttribute() {} 00284 00285 virtual void writeToStream(VTextIOStream& outputStream, int indentLevel = 0) const; 00286 virtual VBentoNode* writeToBento() const; 00287 00288 virtual Vs64 getS64Value() const; 00289 virtual bool getBooleanValue() const; 00290 virtual VString getStringValue() const; 00291 virtual VDouble getDoubleValue() const; 00292 virtual VSize getSizeValue() const; 00293 virtual VPoint getPointValue() const; 00294 virtual VRect getRectValue() const; 00295 virtual VPolygon getPolygonValue() const; 00296 virtual VColor getColorValue() const; 00297 virtual VDuration getDurationValue() const; 00298 virtual VDate getDateValue() const; 00299 virtual VInstant getInstantValue() const; 00300 00301 virtual void setLiteral(const VString& value); 00302 00303 bool hasValue() const; 00304 00305 private: 00306 00307 bool mHasValue; 00308 VString mValue; 00309 }; 00310 00318 class VSettingsCDATA : public VSettingsNode { 00319 public: 00320 00321 VSettingsCDATA(VSettingsTag* parent, const VString& cdata); 00322 virtual ~VSettingsCDATA() {} 00323 00324 virtual void writeToStream(VTextIOStream& outputStream, int indentLevel = 0) const; 00325 virtual VBentoNode* writeToBento() const; 00326 00327 virtual Vs64 getS64Value() const; 00328 virtual bool getBooleanValue() const; 00329 virtual VString getStringValue() const; 00330 virtual VDouble getDoubleValue() const; 00331 virtual VSize getSizeValue() const; 00332 virtual VPoint getPointValue() const; 00333 virtual VRect getRectValue() const; 00334 virtual VPolygon getPolygonValue() const; 00335 virtual VColor getColorValue() const; 00336 virtual VDuration getDurationValue() const; 00337 virtual VDate getDateValue() const; 00338 virtual VInstant getInstantValue() const; 00339 00340 virtual void setLiteral(const VString& value); 00341 00342 private: 00343 00344 VString mCDATA; 00345 }; 00346 00350 class VSettingsXMLParser { 00351 public: 00352 00353 VSettingsXMLParser(VTextIOStream& inputStream, VSettingsNodePtrVector* nodes); 00354 virtual ~VSettingsXMLParser() {} 00355 00356 void parse(); 00357 00358 protected: 00359 00360 enum ParserState { 00361 kReady, 00362 kComment1_bang, 00363 kComment2_bang_dash, 00364 kComment3_in_comment, 00365 kComment4_traildash, 00366 kComment5_traildash_dash, 00367 kTag1_open, 00368 kTag2_in_name, 00369 kTag3_post_name, 00370 kTag4_in_attribute_name, 00371 kTag5_attribute_equals, 00372 kTag6_attribute_quoted, 00373 kTag7_attribute_unquoted, 00374 kTag8_solo_close_slash, 00375 kCloseTag1_open_slash, 00376 kCloseTag2_in_name, 00377 kCloseTag3_trailing_whitespace 00378 }; 00379 00380 void parseLine(); 00381 void resetElement(); 00382 void accumulate(const VCodePoint& c); 00383 void changeState(ParserState newState); 00384 void stateError(const VString& errorMessage); 00385 00386 void emitCDATA(); 00387 void emitOpenTagName(); 00388 void emitAttributeName(); 00389 void emitAttributeNameOnly(); 00390 void emitAttributeValue(); 00391 void emitCloseTagName(); 00392 void emitEndSoloTag(); 00393 00394 VTextIOStream& mInputStream; 00395 VSettingsNodePtrVector* mNodes; 00396 VString mCurrentLine; 00397 int mCurrentLineNumber; 00398 int mCurrentColumnNumber; 00399 ParserState mParserState; 00400 VString mElement; 00401 VSettingsTag* mCurrentTag; 00402 VString mPendingAttributeName; 00403 00404 static bool isValidTagNameChar(const VCodePoint& c); 00405 static bool isValidAttributeNameChar(const VCodePoint& c); 00406 static bool isValidAttributeValueChar(const VCodePoint& c); 00407 00408 private: 00409 00410 // Prevent copy construction and assignment since there is no provision for sharing pointer data. 00411 VSettingsXMLParser(const VSettingsXMLParser& other); 00412 VSettingsXMLParser& operator=(const VSettingsXMLParser& other); 00413 00414 }; 00415 00416 #endif /* vsettings_h */ 00417