Vault  4.1
vsettings.h
Go to the documentation of this file.
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 

Copyright ©1997-2014 Trygve Isaacson. All rights reserved. This documentation was generated with Doxygen.