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