llxmltree.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:8k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llxmltree.h
  3.  * @author Aaron Yonas, Richard Nelson
  4.  * @brief LLXmlTree class definition
  5.  *
  6.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2001-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. #ifndef LL_LLXMLTREE_H
  34. #define LL_LLXMLTREE_H
  35. #include <map>
  36. #include <list>
  37. #include "llstring.h"
  38. #include "llxmlparser.h"
  39. #include "string_table.h"
  40. class LLColor4;
  41. class LLColor4U;
  42. class LLQuaternion;
  43. class LLUUID;
  44. class LLVector3;
  45. class LLVector3d;
  46. class LLXmlTreeNode;
  47. class LLXmlTreeParser;
  48. //////////////////////////////////////////////////////////////
  49. // LLXmlTree
  50. class LLXmlTree
  51. {
  52. friend class LLXmlTreeNode;
  53. public:
  54. LLXmlTree();
  55. virtual ~LLXmlTree();
  56. void cleanup();
  57. virtual BOOL parseFile(const std::string &path, BOOL keep_contents = TRUE);
  58. LLXmlTreeNode* getRoot() { return mRoot; }
  59. void dump();
  60. void dumpNode( LLXmlTreeNode* node, const std::string& prefix );
  61. static LLStdStringHandle addAttributeString( const std::string& name)
  62. {
  63. return sAttributeKeys.addString( name );
  64. }
  65. public:
  66. // global
  67. static LLStdStringTable sAttributeKeys;
  68. protected:
  69. LLXmlTreeNode* mRoot;
  70. // local
  71. LLStdStringTable mNodeNames;
  72. };
  73. //////////////////////////////////////////////////////////////
  74. // LLXmlTreeNode
  75. class LLXmlTreeNode
  76. {
  77. friend class LLXmlTree;
  78. friend class LLXmlTreeParser;
  79. protected:
  80. // Protected since nodes are only created and destroyed by friend classes and other LLXmlTreeNodes
  81. LLXmlTreeNode( const std::string& name, LLXmlTreeNode* parent, LLXmlTree* tree );
  82. public:
  83. virtual ~LLXmlTreeNode();
  84. const std::string& getName()
  85. {
  86. return mName;
  87. }
  88. BOOL hasName( const std::string& name )
  89. {
  90. return mName == name;
  91. }
  92. BOOL hasAttribute( const std::string& name );
  93. // Fast versions use cannonical_name handlee to entru in LLXmlTree::sAttributeKeys string table
  94. BOOL getFastAttributeBOOL( LLStdStringHandle cannonical_name, BOOL& value );
  95. BOOL getFastAttributeU8( LLStdStringHandle cannonical_name, U8& value );
  96. BOOL getFastAttributeS8( LLStdStringHandle cannonical_name, S8& value );
  97. BOOL getFastAttributeU16( LLStdStringHandle cannonical_name, U16& value );
  98. BOOL getFastAttributeS16( LLStdStringHandle cannonical_name, S16& value );
  99. BOOL getFastAttributeU32( LLStdStringHandle cannonical_name, U32& value );
  100. BOOL getFastAttributeS32( LLStdStringHandle cannonical_name, S32& value );
  101. BOOL getFastAttributeF32( LLStdStringHandle cannonical_name, F32& value );
  102. BOOL getFastAttributeF64( LLStdStringHandle cannonical_name, F64& value );
  103. BOOL getFastAttributeColor( LLStdStringHandle cannonical_name, LLColor4& value );
  104. BOOL getFastAttributeColor4( LLStdStringHandle cannonical_name, LLColor4& value );
  105. BOOL getFastAttributeColor4U( LLStdStringHandle cannonical_name, LLColor4U& value );
  106. BOOL getFastAttributeVector3( LLStdStringHandle cannonical_name, LLVector3& value );
  107. BOOL getFastAttributeVector3d( LLStdStringHandle cannonical_name, LLVector3d& value );
  108. BOOL getFastAttributeQuat( LLStdStringHandle cannonical_name, LLQuaternion& value );
  109. BOOL getFastAttributeUUID( LLStdStringHandle cannonical_name, LLUUID& value );
  110. BOOL getFastAttributeString( LLStdStringHandle cannonical_name, std::string& value );
  111. // Normal versions find 'name' in LLXmlTree::sAttributeKeys then call fast versions
  112. virtual BOOL getAttributeBOOL( const std::string& name, BOOL& value );
  113. virtual BOOL getAttributeU8( const std::string& name, U8& value );
  114. virtual BOOL getAttributeS8( const std::string& name, S8& value );
  115. virtual BOOL getAttributeU16( const std::string& name, U16& value );
  116. virtual BOOL getAttributeS16( const std::string& name, S16& value );
  117. virtual BOOL getAttributeU32( const std::string& name, U32& value );
  118. virtual BOOL getAttributeS32( const std::string& name, S32& value );
  119. virtual BOOL getAttributeF32( const std::string& name, F32& value );
  120. virtual BOOL getAttributeF64( const std::string& name, F64& value );
  121. virtual BOOL getAttributeColor( const std::string& name, LLColor4& value );
  122. virtual BOOL getAttributeColor4( const std::string& name, LLColor4& value );
  123. virtual BOOL getAttributeColor4U( const std::string& name, LLColor4U& value );
  124. virtual BOOL getAttributeVector3( const std::string& name, LLVector3& value );
  125. virtual BOOL getAttributeVector3d( const std::string& name, LLVector3d& value );
  126. virtual BOOL getAttributeQuat( const std::string& name, LLQuaternion& value );
  127. virtual BOOL getAttributeUUID( const std::string& name, LLUUID& value );
  128. virtual BOOL getAttributeString( const std::string& name, std::string& value );
  129. const std::string& getContents()
  130. {
  131. return mContents;
  132. }
  133. std::string getTextContents();
  134. LLXmlTreeNode* getParent() { return mParent; }
  135. LLXmlTreeNode* getFirstChild();
  136. LLXmlTreeNode* getNextChild();
  137. S32 getChildCount() { return (S32)mChildList.size(); }
  138. LLXmlTreeNode*  getChildByName( const std::string& name ); // returns first child with name, NULL if none
  139. LLXmlTreeNode*  getNextNamedChild(); // returns next child with name, NULL if none
  140. protected:
  141. const std::string* getAttribute( LLStdStringHandle name)
  142. {
  143. attribute_map_t::iterator iter = mAttributes.find(name);
  144. return (iter == mAttributes.end()) ? 0 : iter->second;
  145. }
  146. private:
  147. void addAttribute( const std::string& name, const std::string& value );
  148. void appendContents( const std::string& str );
  149. void addChild( LLXmlTreeNode* child );
  150. void dump( const std::string& prefix );
  151. protected:
  152. typedef std::map<LLStdStringHandle, const std::string*> attribute_map_t;
  153. attribute_map_t mAttributes;
  154. private:
  155. std::string mName;
  156. std::string mContents;
  157. typedef std::list<class LLXmlTreeNode *> child_list_t;
  158. child_list_t mChildList;
  159. child_list_t::iterator mChildListIter;
  160. typedef std::multimap<LLStdStringHandle, LLXmlTreeNode *> child_map_t;
  161. child_map_t mChildMap; // for fast name lookups
  162. child_map_t::iterator mChildMapIter;
  163. child_map_t::iterator mChildMapEndIter;
  164. LLXmlTreeNode* mParent;
  165. LLXmlTree* mTree;
  166. };
  167. //////////////////////////////////////////////////////////////
  168. // LLXmlTreeParser
  169. class LLXmlTreeParser : public LLXmlParser
  170. {
  171. public:
  172. LLXmlTreeParser(LLXmlTree* tree);
  173. virtual ~LLXmlTreeParser();
  174. BOOL parseFile(const std::string &path, LLXmlTreeNode** root, BOOL keep_contents );
  175. protected:
  176. const std::string& tabs();
  177. // Overrides from LLXmlParser
  178. virtual void startElement(const char *name, const char **attributes); 
  179. virtual void endElement(const char *name);
  180. virtual void characterData(const char *s, int len);
  181. virtual void processingInstruction(const char *target, const char *data);
  182. virtual void comment(const char *data);
  183. virtual void startCdataSection();
  184. virtual void endCdataSection();
  185. virtual void defaultData(const char *s, int len);
  186. virtual void unparsedEntityDecl(
  187. const char* entity_name,
  188. const char* base,
  189. const char* system_id,
  190. const char* public_id,
  191. const char* notation_name);
  192. //template method pattern
  193. virtual LLXmlTreeNode* CreateXmlTreeNode(const std::string& name, LLXmlTreeNode* parent);
  194. protected:
  195. LLXmlTree* mTree;
  196. LLXmlTreeNode* mRoot;
  197. LLXmlTreeNode*  mCurrent;
  198. BOOL mDump; // Dump parse tree to llinfos as it is read.
  199. BOOL mKeepContents;
  200. };
  201. #endif  // LL_LLXMLTREE_H