00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00027
00028 #ifndef ICL_CORE_CONFIG_ATTRIBUTE_TREE_H_INCLUDED
00029 #define ICL_CORE_CONFIG_ATTRIBUTE_TREE_H_INCLUDED
00030
00031 #include <fstream>
00032 #include <string>
00033
00034 #include "icl_core/BaseTypes.h"
00035 #include "icl_core_config/ImportExport.h"
00036
00037 #ifdef _IC_BUILDER_DEPRECATED_STYLE_
00038 # include "icl_core/Deprecate.h"
00039 #endif
00040
00041 namespace icl_core {
00042 namespace config {
00043
00044 class AttributeTree;
00045
00046 class FilePath
00047 {
00048 public:
00049 FilePath(const char *filename = "")
00050 {
00051 init(filename);
00052 }
00053 FilePath(const icl_core::String& filename)
00054 {
00055 init(filename.c_str());
00056 }
00057
00058 ~FilePath()
00059 { }
00060
00063 icl_core::String path() const
00064 {
00065 return icl_core::String(m_file, 0, m_file_path_name_split);
00066 }
00067
00070 icl_core::String name() const
00071 {
00072 return icl_core::String(m_file, m_file_path_name_split, icl_core::String::npos);
00073 }
00074
00077 icl_core::String absoluteName() const
00078 {
00079 return m_file;
00080 }
00081
00085 icl_core::String currentDir() const
00086 {
00087 return m_pwd;
00088 }
00089
00092 icl_core::String extension() const
00093 {
00094 return icl_core::String(m_file, m_file_name_extension_split, icl_core::String::npos);
00095 }
00096
00100 icl_core::String absolutePath(const icl_core::String& filename) const;
00101
00105 static bool isRelativePath(const icl_core::String& filename);
00106
00109 bool isRelativePath() const
00110 {
00111 return FilePath::isRelativePath(m_file);
00112 }
00113
00118 static icl_core::String normalizePath(const icl_core::String& filename);
00119
00127 static icl_core::String exchangeSeparators(const icl_core::String& filename);
00128
00131 static icl_core::String getEnvironment(const icl_core::String& var_name);
00132
00137 static icl_core::String replaceEnvironment(const icl_core::String& filename);
00138
00140 #ifdef _IC_BUILDER_DEPRECATED_STYLE_
00141
00145 ICL_CORE_VC_DEPRECATE_STYLE icl_core::String Path() const ICL_CORE_GCC_DEPRECATE_STYLE;
00149 ICL_CORE_VC_DEPRECATE_STYLE icl_core::String Name() const ICL_CORE_GCC_DEPRECATE_STYLE;
00150
00154 ICL_CORE_VC_DEPRECATE_STYLE icl_core::String AbsoluteName() const ICL_CORE_GCC_DEPRECATE_STYLE;
00155
00159 ICL_CORE_VC_DEPRECATE_STYLE icl_core::String CurrentDir() const ICL_CORE_GCC_DEPRECATE_STYLE;
00160
00164 ICL_CORE_VC_DEPRECATE_STYLE icl_core::String Extension() const ICL_CORE_GCC_DEPRECATE_STYLE;
00165
00169 ICL_CORE_VC_DEPRECATE_STYLE icl_core::String AbsolutePath(const icl_core::String& filename) const
00170 ICL_CORE_GCC_DEPRECATE_STYLE;
00171
00175 ICL_CORE_VC_DEPRECATE_STYLE static bool IsRelativePath(const icl_core::String& filename)
00176 ICL_CORE_GCC_DEPRECATE_STYLE;
00177
00181 ICL_CORE_VC_DEPRECATE_STYLE bool IsRelativePath() const ICL_CORE_GCC_DEPRECATE_STYLE;
00182
00186 ICL_CORE_VC_DEPRECATE_STYLE static icl_core::String NormalizePath(const icl_core::String& filename)
00187 ICL_CORE_GCC_DEPRECATE_STYLE;
00188
00194 ICL_CORE_VC_DEPRECATE_STYLE static icl_core::String ExchangeSeparators(const icl_core::String& filename)
00195 ICL_CORE_GCC_DEPRECATE_STYLE;
00196
00200 ICL_CORE_VC_DEPRECATE_STYLE static icl_core::String GetEnvironment(const icl_core::String& var_name)
00201 ICL_CORE_GCC_DEPRECATE_STYLE;
00202
00206 ICL_CORE_VC_DEPRECATE_STYLE static icl_core::String ReplaceEnvironment(const icl_core::String& filename)
00207 ICL_CORE_GCC_DEPRECATE_STYLE;
00208
00209 #endif
00210
00211
00212 private:
00213 void init(const char *filename);
00214
00215 icl_core::String m_pwd;
00216 icl_core::String m_file;
00217 icl_core::String::size_type m_file_path_name_split;
00218 icl_core::String::size_type m_file_name_extension_split;
00219 };
00220
00221
00225 class ICL_CORE_CONFIG_IMPORT_EXPORT SubTreeList
00226 {
00227 friend class AttributeTree;
00228
00229 public:
00230 SubTreeList(AttributeTree *sub_tree = 0, SubTreeList *next = 0);
00231 ~SubTreeList();
00232 void copy(AttributeTree *parent);
00233 void unlinkParent();
00234 void unlink(AttributeTree *obsolete_tree);
00235 AttributeTree *subTree(const char *description);
00236 int contains();
00237 void printSubTree(std::ostream& out, int change_style_depth, char *upper_description);
00238 void printXmlSubTree(std::ostream& out, const std::string& upper_description);
00239 bool changed();
00240 AttributeTree *search(const char *description, const char *attribute);
00241 AttributeTree *next(AttributeTree *prev);
00242 void unmarkChanges();
00243
00246 SubTreeList *revertOrder(SubTreeList *new_next = NULL);
00247
00251 void newSubTreeList(AttributeTree *new_tree, AttributeTree *after);
00252
00254 #ifdef _IC_BUILDER_DEPRECATED_STYLE_
00255
00259 ICL_CORE_VC_DEPRECATE_STYLE SubTreeList *RevertOrder(SubTreeList *new_next = NULL)
00260 ICL_CORE_GCC_DEPRECATE_STYLE;
00261
00266 ICL_CORE_VC_DEPRECATE_STYLE void NewSubTreeList(AttributeTree *new_tree, AttributeTree *after)
00267 ICL_CORE_GCC_DEPRECATE_STYLE;
00268
00269 #endif
00270
00271
00272 private:
00273
00274 SubTreeList(const SubTreeList&);
00275 SubTreeList& operator = (const SubTreeList&);
00276
00277 SubTreeList *m_next;
00278 AttributeTree *m_sub_tree;
00279 };
00280
00307 class ICL_CORE_CONFIG_IMPORT_EXPORT AttributeTree
00308 {
00309 friend class SubTreeList;
00310
00311 public:
00314 enum
00315 {
00316 eOK,
00317 eEMPTY_TREE,
00318 eFILE_SAVE_ERROR,
00319 eFILE_LOAD_ERROR
00320 };
00323 AttributeTree(const char *description = 0, AttributeTree *parent = 0);
00324
00328 AttributeTree(const AttributeTree& other);
00329
00337 AttributeTree(const AttributeTree& other, AttributeTree *parent);
00338
00342 ~AttributeTree();
00343
00347 void unlink();
00348
00352 void unlinkSub();
00353
00358
00359
00360
00367 AttributeTree *setAttribute(const char *description, const char *attribute);
00368
00372 AttributeTree *setAttribute(const char *description, const char *subdescription, const char *attribute);
00373
00378
00379
00380
00383 char *getAttribute()
00384 {
00385 return m_this_attribute;
00386 }
00387
00392 char *getAttribute(const char *description, const char *default_attribute = 0,
00393 AttributeTree **subtree = 0);
00394
00398 char *getOrSetDefault(const char *description, const char *default_attribute);
00399
00403 int save(const char *filename, int change_style_depth = 3, bool unmark_changes = true);
00404
00422 int load(const char *filename, bool unmark_changes = true, bool process_include = true,
00423 bool load_comments = false, bool preserve_order = false);
00424
00427 int get(std::istream &in, bool process_include = true, bool load_comments = false,
00428 const FilePath *file_path = NULL);
00429
00441 char *newSubNodeDescription(const char *base_description = "");
00442
00445 AttributeTree *addNewSubTree();
00446
00451 void printSubTree(std::ostream &out, int change_style_depth = 3, const char *upper_description = 0);
00452
00455 const char *getDescription() const
00456 {
00457 return m_this_description;
00458 }
00459
00462 const char *attribute() const
00463 {
00464 return m_this_attribute;
00465 }
00466
00469 void setDescription(const char *description);
00470
00473 void setAttribute(const char *attribute);
00474
00477 void setComment(const char *comment);
00478
00482 AttributeTree *subTree(const char *description);
00483
00487 AttributeTree *getSubTree(const char *description);
00488
00492 AttributeTree *firstSubTree()
00493 {
00494 if (m_subtree_list)
00495 {
00496 return m_subtree_list->m_sub_tree;
00497 }
00498 else
00499 {
00500 return NULL;
00501 }
00502 }
00503
00507 AttributeTree *nextSubTree(AttributeTree *subtree)
00508 {
00509 if (m_subtree_list)
00510 {
00511 return m_subtree_list->next(subtree);
00512 }
00513 else
00514 {
00515 return NULL;
00516 }
00517 }
00518
00522 AttributeTree *parentTree()
00523 {
00524 return m_parent;
00525 }
00526
00532 AttributeTree *addSubTree(AttributeTree *subtree)
00533 {
00534 return addSubTree(subtree, NULL);
00535 }
00536
00544 AttributeTree *addNextTree(AttributeTree *nexttree)
00545 {
00546 if (m_parent)
00547 {
00548 return m_parent->addSubTree(nexttree, this);
00549 }
00550 else
00551 {
00552 return NULL;
00553 }
00554 }
00555
00562 AttributeTree *search(const char *description, const char *attribute);
00563
00567 bool isAttribute(const char *description, const char *attribute = 0);
00568
00572 bool changed();
00573
00576 void unmarkChanges();
00577
00580 int contains();
00581
00584 AttributeTree *parent()
00585 {
00586 return m_parent;
00587 }
00588
00591 AttributeTree *root()
00592 {
00593 AttributeTree *at = this;
00594 for (; at->m_parent; at = at->m_parent) {}
00595 return at;
00596 }
00597
00601 const char *comment();
00602
00605 bool hasComment()
00606 {
00607 return commentAttributeTree() != NULL;
00608 }
00609
00612 bool isComment();
00613
00616 bool hasMultilineComment();
00617
00620 bool isMultilineComment();
00621
00624 AttributeTree *commentAttributeTree();
00625
00631 void appendAttribute(const char *attribute, const char *separator = "")
00632 {
00633 appendString(m_this_attribute, attribute, separator);
00634 }
00635
00641 void appendDescription(const char *description, const char *separator = "")
00642 {
00643 appendString(m_this_description, description, separator);
00644 }
00645
00648 void revertOrder()
00649 {
00650 if (m_subtree_list)
00651 {
00652 m_subtree_list = m_subtree_list->revertOrder();
00653 }
00654 }
00655
00664 static const char *m_file_path_str;
00665
00669 const char *getFilePath()
00670 {
00671 const char *ret = root()->getSpecialAttribute(m_file_path_str);
00672 if (!ret)
00673 {
00674 ret = "";
00675 }
00676 return ret;
00677 }
00678
00687 static const char *m_file_name_str;
00688
00693 const char *fileName()
00694 {
00695 const char *ret = root()->getSpecialAttribute(m_file_name_str);
00696 if (!ret)
00697 {
00698 ret = "";
00699 }
00700 return ret;
00701 }
00702
00704 #ifdef _IC_BUILDER_DEPRECATED_STYLE_
00705
00709 ICL_CORE_VC_DEPRECATE_STYLE void Unlink() ICL_CORE_GCC_DEPRECATE_STYLE;
00710
00714 ICL_CORE_VC_DEPRECATE_STYLE void UnlinkSub() ICL_CORE_GCC_DEPRECATE_STYLE;
00715
00719 ICL_CORE_VC_DEPRECATE_STYLE AttributeTree *SetAttribute(const char *description,
00720 const char *attribute)
00721 ICL_CORE_GCC_DEPRECATE_STYLE;
00722
00727 ICL_CORE_VC_DEPRECATE_STYLE AttributeTree *SetAttribute(const char *description,
00728 const char *subdescription,
00729 const char *attribute)
00730 ICL_CORE_GCC_DEPRECATE_STYLE;
00731
00735 ICL_CORE_VC_DEPRECATE_STYLE char *GetAttribute() ICL_CORE_GCC_DEPRECATE_STYLE;
00736
00740 ICL_CORE_VC_DEPRECATE_STYLE char *GetAttribute(const char *description,
00741 const char *default_attribute = 0,
00742 AttributeTree **subtree = 0)
00743 ICL_CORE_GCC_DEPRECATE_STYLE;
00744
00748 ICL_CORE_VC_DEPRECATE_STYLE char *GetOrSetDefault(const char *description,
00749 const char *default_attribute)
00750 ICL_CORE_GCC_DEPRECATE_STYLE;
00751
00755 ICL_CORE_VC_DEPRECATE_STYLE int Save(const char *filename, int change_style_depth = 3,
00756 bool unmark_changes = true)
00757 ICL_CORE_GCC_DEPRECATE_STYLE;
00758
00762 ICL_CORE_VC_DEPRECATE_STYLE int Load(const char *filename, bool unmark_changes = true,
00763 bool process_include = true,
00764 bool load_comments = false,
00765 bool preserve_order = false)
00766 ICL_CORE_GCC_DEPRECATE_STYLE;
00767
00771 ICL_CORE_VC_DEPRECATE_STYLE int Get(std::istream &in, bool process_include = true,
00772 bool load_comments = false,
00773 const FilePath *file_path = NULL)
00774 ICL_CORE_GCC_DEPRECATE_STYLE;
00775
00779 ICL_CORE_VC_DEPRECATE_STYLE char *NewSubNodeDescription(const char *base_description = "")
00780 ICL_CORE_GCC_DEPRECATE_STYLE;
00781
00785 ICL_CORE_VC_DEPRECATE_STYLE AttributeTree *AddNewSubTree() ICL_CORE_GCC_DEPRECATE_STYLE;
00786
00790 ICL_CORE_VC_DEPRECATE_STYLE void PrintSubTree(std::ostream &out,
00791 int change_style_depth = 3,
00792 const char *upper_description = 0)
00793 ICL_CORE_GCC_DEPRECATE_STYLE;
00794
00798 ICL_CORE_VC_DEPRECATE_STYLE const char *Description() const ICL_CORE_GCC_DEPRECATE_STYLE;
00799
00803 ICL_CORE_VC_DEPRECATE_STYLE const char *Attribute() const ICL_CORE_GCC_DEPRECATE_STYLE;
00804
00808 ICL_CORE_VC_DEPRECATE_STYLE void SetDescription(const char *description)
00809 ICL_CORE_GCC_DEPRECATE_STYLE;
00810
00814 ICL_CORE_VC_DEPRECATE_STYLE void SetAttribute(const char *attribute) ICL_CORE_GCC_DEPRECATE_STYLE;
00815
00819 ICL_CORE_VC_DEPRECATE_STYLE void SetComment(const char *comment) ICL_CORE_GCC_DEPRECATE_STYLE;
00820
00824 ICL_CORE_VC_DEPRECATE_STYLE AttributeTree *SubTree(const char *description)
00825 ICL_CORE_GCC_DEPRECATE_STYLE;
00826
00830 ICL_CORE_VC_DEPRECATE_STYLE AttributeTree *GetSubTree(const char *description)
00831 ICL_CORE_GCC_DEPRECATE_STYLE;
00832
00836 ICL_CORE_VC_DEPRECATE_STYLE AttributeTree *FirstSubTree() ICL_CORE_GCC_DEPRECATE_STYLE;
00837
00841 ICL_CORE_VC_DEPRECATE_STYLE AttributeTree *NextSubTree(AttributeTree *subtree)
00842 ICL_CORE_GCC_DEPRECATE_STYLE;
00843
00847 ICL_CORE_VC_DEPRECATE_STYLE AttributeTree *ParentTree() ICL_CORE_GCC_DEPRECATE_STYLE;
00848
00852 ICL_CORE_VC_DEPRECATE_STYLE AttributeTree *AddSubTree(AttributeTree *subtree)
00853 ICL_CORE_GCC_DEPRECATE_STYLE;
00854
00858 ICL_CORE_VC_DEPRECATE_STYLE AttributeTree *AddNextTree(AttributeTree *nexttree)
00859 ICL_CORE_GCC_DEPRECATE_STYLE;
00860
00866 ICL_CORE_VC_DEPRECATE_STYLE AttributeTree *Search(const char *description, const char *attribute)
00867 ICL_CORE_GCC_DEPRECATE_STYLE;
00868
00873 ICL_CORE_VC_DEPRECATE_STYLE bool IsAttribute(const char *description, const char *attribute = 0)
00874 ICL_CORE_GCC_DEPRECATE_STYLE;
00875
00880 ICL_CORE_VC_DEPRECATE_STYLE bool Changed() ICL_CORE_GCC_DEPRECATE_STYLE;
00881
00885 ICL_CORE_VC_DEPRECATE_STYLE void UnmarkChanges() ICL_CORE_GCC_DEPRECATE_STYLE;
00886
00890 ICL_CORE_VC_DEPRECATE_STYLE int Contains() ICL_CORE_GCC_DEPRECATE_STYLE;
00891
00895 ICL_CORE_VC_DEPRECATE_STYLE AttributeTree *Parent() ICL_CORE_GCC_DEPRECATE_STYLE;
00896
00900 ICL_CORE_VC_DEPRECATE_STYLE AttributeTree *Root() ICL_CORE_GCC_DEPRECATE_STYLE;
00901
00905 ICL_CORE_VC_DEPRECATE_STYLE const char *Comment() ICL_CORE_GCC_DEPRECATE_STYLE;
00906
00910 ICL_CORE_VC_DEPRECATE_STYLE bool HasComment() ICL_CORE_GCC_DEPRECATE_STYLE;
00911
00915 ICL_CORE_VC_DEPRECATE_STYLE bool IsComment() ICL_CORE_GCC_DEPRECATE_STYLE;
00916
00920 ICL_CORE_VC_DEPRECATE_STYLE bool HasMultilineComment() ICL_CORE_GCC_DEPRECATE_STYLE;
00921
00925 ICL_CORE_VC_DEPRECATE_STYLE bool IsMultilineComment() ICL_CORE_GCC_DEPRECATE_STYLE;
00926
00930 ICL_CORE_VC_DEPRECATE_STYLE AttributeTree *CommentAttributeTree() ICL_CORE_GCC_DEPRECATE_STYLE;
00931
00935 ICL_CORE_VC_DEPRECATE_STYLE void AppendAttribute(const char *attribute, const char *separator = "")
00936 ICL_CORE_GCC_DEPRECATE_STYLE;
00937
00941 ICL_CORE_VC_DEPRECATE_STYLE void AppendDescription(const char *description, const char *separator = "")
00942 ICL_CORE_GCC_DEPRECATE_STYLE;
00943
00947 ICL_CORE_VC_DEPRECATE_STYLE void RevertOrder() ICL_CORE_GCC_DEPRECATE_STYLE;
00948
00953 ICL_CORE_VC_DEPRECATE_STYLE const char *GetFilePath() ICL_CORE_GCC_DEPRECATE_STYLE;
00954
00959 ICL_CORE_VC_DEPRECATE_STYLE const char *FileName() ICL_CORE_GCC_DEPRECATE_STYLE;
00960
00961 #endif
00962
00963
00964
00965 private:
00966 void split(char *&description, char *&sub_description);
00967 void appendString(char * &dest, const char *src, const char *separator);
00968
00969
00970 AttributeTree& operator = (const AttributeTree&);
00971
00974 char *getSpecialAttribute(const char *description, AttributeTree **subtree = NULL);
00975
00978 AttributeTree *addSubTree(AttributeTree *subtree, AttributeTree *after_node);
00979
00980 AttributeTree *m_parent;
00981 SubTreeList *m_subtree_list;
00982
00983 char *m_this_description;
00984 char *m_this_attribute;
00985
00986 bool m_changed;
00987 };
00988
00989 }
00990 }
00991
00992 #endif