Element.h revision 3ba083ee0b0ff7e01caeb3bc7395377071e20fe6
193250d172612c405135d56ffd306deae5ebc6df1Kevin Rocard/* 268a912857707864bbaaff9808717813105072a6ePatrick Benavoli * INTEL CONFIDENTIAL 368a912857707864bbaaff9808717813105072a6ePatrick Benavoli * Copyright © 2011 Intel 468a912857707864bbaaff9808717813105072a6ePatrick Benavoli * Corporation All Rights Reserved. 568a912857707864bbaaff9808717813105072a6ePatrick Benavoli * 668a912857707864bbaaff9808717813105072a6ePatrick Benavoli * The source code contained or described herein and all documents related to 768a912857707864bbaaff9808717813105072a6ePatrick Benavoli * the source code ("Material") are owned by Intel Corporation or its suppliers 868a912857707864bbaaff9808717813105072a6ePatrick Benavoli * or licensors. Title to the Material remains with Intel Corporation or its 968a912857707864bbaaff9808717813105072a6ePatrick Benavoli * suppliers and licensors. The Material contains trade secrets and proprietary 1068a912857707864bbaaff9808717813105072a6ePatrick Benavoli * and confidential information of Intel or its suppliers and licensors. The 1168a912857707864bbaaff9808717813105072a6ePatrick Benavoli * Material is protected by worldwide copyright and trade secret laws and 1268a912857707864bbaaff9808717813105072a6ePatrick Benavoli * treaty provisions. No part of the Material may be used, copied, reproduced, 1368a912857707864bbaaff9808717813105072a6ePatrick Benavoli * modified, published, uploaded, posted, transmitted, distributed, or 1468a912857707864bbaaff9808717813105072a6ePatrick Benavoli * disclosed in any way without Intel’s prior express written permission. 1568a912857707864bbaaff9808717813105072a6ePatrick Benavoli * 1668a912857707864bbaaff9808717813105072a6ePatrick Benavoli * No license under any patent, copyright, trade secret or other intellectual 1768a912857707864bbaaff9808717813105072a6ePatrick Benavoli * property right is granted to or conferred upon you by disclosure or delivery 1868a912857707864bbaaff9808717813105072a6ePatrick Benavoli * of the Materials, either expressly, by implication, inducement, estoppel or 1968a912857707864bbaaff9808717813105072a6ePatrick Benavoli * otherwise. Any license under such intellectual property rights must be 2068a912857707864bbaaff9808717813105072a6ePatrick Benavoli * express and approved by Intel in writing. 2168a912857707864bbaaff9808717813105072a6ePatrick Benavoli * 2268a912857707864bbaaff9808717813105072a6ePatrick Benavoli * CREATED: 2011-06-01 2368a912857707864bbaaff9808717813105072a6ePatrick Benavoli * UPDATED: 2011-07-27 2468a912857707864bbaaff9808717813105072a6ePatrick Benavoli */ 2568a912857707864bbaaff9808717813105072a6ePatrick Benavoli#pragma once 2668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 2768a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <string> 2868a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <vector> 2968a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <stdint.h> 303629936c927edb75d2529ff82395f735375d4650Kevin Rocard#include <list> 3168a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "XmlSink.h" 3268a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "XmlSource.h" 3368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 3468a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "PathNavigator.h" 3568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 3668a912857707864bbaaff9808717813105072a6ePatrick Benavoliusing namespace std; 3768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 3868a912857707864bbaaff9808717813105072a6ePatrick Benavoliclass CXmlElementSerializingContext; 3968a912857707864bbaaff9808717813105072a6ePatrick Benavoliclass CErrorContext; 4068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4168a912857707864bbaaff9808717813105072a6ePatrick Benavoliclass CElement : public IXmlSink, public IXmlSource 4268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 4368a912857707864bbaaff9808717813105072a6ePatrick Benavoli friend class CAutoLog; 4468a912857707864bbaaff9808717813105072a6ePatrick Benavolipublic: 4568a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement(const string& strName = ""); 4668a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual ~CElement(); 4768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Logging 49ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard void log_info(const string& strMessage, ...) const; 50ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard void log_warning(const string& strMessage, ...) const; 513629936c927edb75d2529ff82395f735375d4650Kevin Rocard void log_table(bool bIsWarning, const list<string> lstrMessage) const; 5268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 5368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Description 5468a912857707864bbaaff9808717813105072a6ePatrick Benavoli void setDescription(const string& strDescription); 5568a912857707864bbaaff9808717813105072a6ePatrick Benavoli const string& getDescription() const; 5668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 5768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Name / Path 5868a912857707864bbaaff9808717813105072a6ePatrick Benavoli const string& getName() const; 5995ac034b72580306e9246f7efa3f7ba709a02183Patrick Benavoli void setName(const string& strName); 6068a912857707864bbaaff9808717813105072a6ePatrick Benavoli bool rename(const string& strName, string& strError); 6168a912857707864bbaaff9808717813105072a6ePatrick Benavoli string getPath() const; 6268a912857707864bbaaff9808717813105072a6ePatrick Benavoli string getQualifiedPath() const; 6368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 6468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Creation / build 6568a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual bool init(string& strError); 6668a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual void clean(); 6768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 6868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Children management 6968a912857707864bbaaff9808717813105072a6ePatrick Benavoli void addChild(CElement* pChild); 7068a912857707864bbaaff9808717813105072a6ePatrick Benavoli bool removeChild(CElement* pChild); 7168a912857707864bbaaff9808717813105072a6ePatrick Benavoli void listChildren(string& strChildList) const; 7268a912857707864bbaaff9808717813105072a6ePatrick Benavoli string listQualifiedPaths(bool bDive, uint32_t uiLevel = 0) const; 7368a912857707864bbaaff9808717813105072a6ePatrick Benavoli void listChildrenPaths(string& strChildPathList) const; 7468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Hierarchy query 7668a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t getNbChildren() const; 7768a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* findChildOfKind(const string& strKind); 7868a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CElement* findChildOfKind(const string& strKind) const; 7968a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CElement* getParent() const; 8068a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CElement* getChild(uint32_t uiIndex) const; 8168a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* getChild(uint32_t uiIndex); 8268a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CElement* findChild(const string& strName) const; 8368a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* findChild(const string& strName); 8468a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CElement* findDescendant(CPathNavigator& pathNavigator) const; 8568a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* findDescendant(CPathNavigator& pathNavigator); 8668a912857707864bbaaff9808717813105072a6ePatrick Benavoli bool isDescendantOf(const CElement* pCandidateAscendant) const; 8768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 8868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // From IXmlSink 8968a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext); 9068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // From IXmlSource 9268a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const; 9368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Content structure dump 9568a912857707864bbaaff9808717813105072a6ePatrick Benavoli void dumpContent(string& strContent, CErrorContext& errorContext, const uint32_t uiDepth = 0) const; 9668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 972ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli // Element properties 982ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli virtual void showProperties(string& strResult) const; 992ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli 1002ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli // Conversion utilities 1012ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli static string toString(uint32_t uiValue); 1029533156ebad9b5989703db70be3f6bd22c9811c4Guillaume Denneulin static string toString(uint64_t uiValue); 1032ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli static string toString(int32_t iValue); 104ee65e6d992e5fd7c81f62ced1cbed532989c09f7Patrick Benavoli static string toString(double dValue); 1052ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli 10668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Checksum for integrity checks 10768a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint8_t computeStructureChecksum() const; 10868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 10968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Class kind 11068a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual string getKind() const = 0; 11168a912857707864bbaaff9808717813105072a6ePatrick Benavoliprotected: 11268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Content dumping 11368a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual void logValue(string& strValue, CErrorContext& errorContext) const; 1146ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli // Utility to underline 1156ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli static void appendTitle(string& strTo, const string& strTitle); 11668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 11768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Hierarchy 11868a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* getLastChild(); 11968a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* getParent(); 12068a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* findAscendantOfKind(const string& strKind); 12168a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* getRoot(); 12268a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CElement* getRoot() const; 1233ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin 1243ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin /** 1253ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin * Creates a child CElement from a child XML Element 1263ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin * 1273ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin * @param[in] childElement the XML element to create CElement from 1283ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin * @param[in] elementSerializingContext the serializing context 1293ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin * 1303ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin * @return child a pointer on the CElement object that has been added to the tree 1313ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin */ 1323ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin CElement* createChild(const CXmlElement& childElement, 1333ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin CXmlSerializingContext& elementSerializingContext); 1343ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin 13568a912857707864bbaaff9808717813105072a6ePatrick Benavoliprivate: 13668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Logging (done by root) 137ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard virtual void doLog(bool bIsWarning, const string& strLog) const; 13868a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual void nestLog() const; 13968a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual void unnestLog() const; 14068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Returns Name or Kind if no Name 14168a912857707864bbaaff9808717813105072a6ePatrick Benavoli string getPathName() const; 14268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Returns true if children dynamic creation is to be dealt with 14368a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual bool childrenAreDynamic() const; 14468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // House keeping 14568a912857707864bbaaff9808717813105072a6ePatrick Benavoli void removeChildren(); 14668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // For logging 14768a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t getDepth() const; 14868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Fill XmlElement during XML composing 14968a912857707864bbaaff9808717813105072a6ePatrick Benavoli void setXmlNameAttribute(CXmlElement& xmlElement) const; 15068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 15168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Name 15268a912857707864bbaaff9808717813105072a6ePatrick Benavoli string _strName; 15368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 15468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Description 15568a912857707864bbaaff9808717813105072a6ePatrick Benavoli string _strDescription; 15668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 15768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Child iterators 15868a912857707864bbaaff9808717813105072a6ePatrick Benavoli typedef vector<CElement*>::iterator ChildArrayIterator; 15968a912857707864bbaaff9808717813105072a6ePatrick Benavoli typedef vector<CElement*>::reverse_iterator ChildArrayReverseIterator; 16068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Children 16168a912857707864bbaaff9808717813105072a6ePatrick Benavoli vector<CElement*> _childArray; 16268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Parent 16368a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* _pParent; 16468a912857707864bbaaff9808717813105072a6ePatrick Benavoli}; 165