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