Element.h revision ace81f873b910493ab884dc5a6a38ba6ec3d56d3
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> 3068a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "XmlSink.h" 3168a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "XmlSource.h" 3268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 3368a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "PathNavigator.h" 3468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 3568a912857707864bbaaff9808717813105072a6ePatrick Benavoliusing namespace std; 3668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 3768a912857707864bbaaff9808717813105072a6ePatrick Benavoliclass CXmlElementSerializingContext; 3868a912857707864bbaaff9808717813105072a6ePatrick Benavoliclass CErrorContext; 3968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4068a912857707864bbaaff9808717813105072a6ePatrick Benavoliclass CElement : public IXmlSink, public IXmlSource 4168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 4268a912857707864bbaaff9808717813105072a6ePatrick Benavoli friend class CAutoLog; 4368a912857707864bbaaff9808717813105072a6ePatrick Benavolipublic: 4468a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement(const string& strName = ""); 4568a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual ~CElement(); 4668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Logging 48ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard void log_info(const string& strMessage, ...) const; 49ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard void log_warning(const string& strMessage, ...) const; 5068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 5168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Description 5268a912857707864bbaaff9808717813105072a6ePatrick Benavoli void setDescription(const string& strDescription); 5368a912857707864bbaaff9808717813105072a6ePatrick Benavoli const string& getDescription() const; 5468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 5568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Name / Path 5668a912857707864bbaaff9808717813105072a6ePatrick Benavoli const string& getName() const; 5795ac034b72580306e9246f7efa3f7ba709a02183Patrick Benavoli void setName(const string& strName); 5868a912857707864bbaaff9808717813105072a6ePatrick Benavoli bool rename(const string& strName, string& strError); 5968a912857707864bbaaff9808717813105072a6ePatrick Benavoli string getPath() const; 6068a912857707864bbaaff9808717813105072a6ePatrick Benavoli string getQualifiedPath() const; 6168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 6268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Creation / build 6368a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual bool init(string& strError); 6468a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual void clean(); 6568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 6668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Children management 6768a912857707864bbaaff9808717813105072a6ePatrick Benavoli void addChild(CElement* pChild); 6868a912857707864bbaaff9808717813105072a6ePatrick Benavoli bool removeChild(CElement* pChild); 6968a912857707864bbaaff9808717813105072a6ePatrick Benavoli void listChildren(string& strChildList) const; 7068a912857707864bbaaff9808717813105072a6ePatrick Benavoli string listQualifiedPaths(bool bDive, uint32_t uiLevel = 0) const; 7168a912857707864bbaaff9808717813105072a6ePatrick Benavoli void listChildrenPaths(string& strChildPathList) const; 7268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Hierarchy query 7468a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t getNbChildren() const; 7568a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* findChildOfKind(const string& strKind); 7668a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CElement* findChildOfKind(const string& strKind) const; 7768a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CElement* getParent() const; 7868a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CElement* getChild(uint32_t uiIndex) const; 7968a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* getChild(uint32_t uiIndex); 8068a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CElement* findChild(const string& strName) const; 8168a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* findChild(const string& strName); 8268a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CElement* findDescendant(CPathNavigator& pathNavigator) const; 8368a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* findDescendant(CPathNavigator& pathNavigator); 8468a912857707864bbaaff9808717813105072a6ePatrick Benavoli bool isDescendantOf(const CElement* pCandidateAscendant) const; 8568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 8668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // From IXmlSink 8768a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext); 8868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 8968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // From IXmlSource 9068a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const; 9168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Content structure dump 9368a912857707864bbaaff9808717813105072a6ePatrick Benavoli void dumpContent(string& strContent, CErrorContext& errorContext, const uint32_t uiDepth = 0) const; 9468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 952ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli // Element properties 962ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli virtual void showProperties(string& strResult) const; 972ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli 982ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli // Conversion utilities 992ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli static string toString(uint32_t uiValue); 1009533156ebad9b5989703db70be3f6bd22c9811c4Guillaume Denneulin static string toString(uint64_t uiValue); 1012ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli static string toString(int32_t iValue); 102ee65e6d992e5fd7c81f62ced1cbed532989c09f7Patrick Benavoli static string toString(double dValue); 1032ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli 10468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Checksum for integrity checks 10568a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint8_t computeStructureChecksum() const; 10668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 10768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Class kind 10868a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual string getKind() const = 0; 10968a912857707864bbaaff9808717813105072a6ePatrick Benavoliprotected: 11068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Content dumping 11168a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual void logValue(string& strValue, CErrorContext& errorContext) const; 1126ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli // Utility to underline 1136ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli static void appendTitle(string& strTo, const string& strTitle); 11468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 11568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Hierarchy 11668a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* getLastChild(); 11768a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* getParent(); 11868a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* findAscendantOfKind(const string& strKind); 11968a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* getRoot(); 12068a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CElement* getRoot() const; 12168a912857707864bbaaff9808717813105072a6ePatrick Benavoliprivate: 12268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Logging (done by root) 123ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard virtual void doLog(bool bIsWarning, const string& strLog) const; 12468a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual void nestLog() const; 12568a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual void unnestLog() const; 12668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Returns Name or Kind if no Name 12768a912857707864bbaaff9808717813105072a6ePatrick Benavoli string getPathName() const; 12868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Returns true if children dynamic creation is to be dealt with 12968a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual bool childrenAreDynamic() const; 13068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // House keeping 13168a912857707864bbaaff9808717813105072a6ePatrick Benavoli void removeChildren(); 13268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // For logging 13368a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t getDepth() const; 13468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Fill XmlElement during XML composing 13568a912857707864bbaaff9808717813105072a6ePatrick Benavoli void setXmlNameAttribute(CXmlElement& xmlElement) const; 13668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 13768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Name 13868a912857707864bbaaff9808717813105072a6ePatrick Benavoli string _strName; 13968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 14068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Description 14168a912857707864bbaaff9808717813105072a6ePatrick Benavoli string _strDescription; 14268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 14368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Child iterators 14468a912857707864bbaaff9808717813105072a6ePatrick Benavoli typedef vector<CElement*>::iterator ChildArrayIterator; 14568a912857707864bbaaff9808717813105072a6ePatrick Benavoli typedef vector<CElement*>::reverse_iterator ChildArrayReverseIterator; 14668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Children 14768a912857707864bbaaff9808717813105072a6ePatrick Benavoli vector<CElement*> _childArray; 14868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Parent 14968a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* _pParent; 15068a912857707864bbaaff9808717813105072a6ePatrick Benavoli}; 151