1b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner/*
2b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * Copyright (c) 2011-2014, Intel Corporation
3b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * All rights reserved.
4b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
5b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * Redistribution and use in source and binary forms, with or without modification,
6b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * are permitted provided that the following conditions are met:
7b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
8b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 1. Redistributions of source code must retain the above copyright notice, this
9b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * list of conditions and the following disclaimer.
10b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
11b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 2. Redistributions in binary form must reproduce the above copyright notice,
12b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * this list of conditions and the following disclaimer in the documentation and/or
13b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * other materials provided with the distribution.
14b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
15b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 3. Neither the name of the copyright holder nor the names of its contributors
16b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * may be used to endorse or promote products derived from this software without
17b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * specific prior written permission.
18b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
19b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2968a912857707864bbaaff9808717813105072a6ePatrick Benavoli */
3068a912857707864bbaaff9808717813105072a6ePatrick Benavoli#pragma once
3168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3268a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <string>
3368a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <vector>
3468a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <stdint.h>
353629936c927edb75d2529ff82395f735375d4650Kevin Rocard#include <list>
3668a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "XmlSink.h"
3768a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "XmlSource.h"
3868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3968a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "PathNavigator.h"
4068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4168a912857707864bbaaff9808717813105072a6ePatrick Benavoliclass CXmlElementSerializingContext;
4268a912857707864bbaaff9808717813105072a6ePatrick Benavoliclass CErrorContext;
4368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4468a912857707864bbaaff9808717813105072a6ePatrick Benavoliclass CElement : public IXmlSink, public IXmlSource
4568a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
4668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    friend class CAutoLog;
4768a912857707864bbaaff9808717813105072a6ePatrick Benavolipublic:
48d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    CElement(const std::string& strName = "");
4968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    virtual ~CElement();
5068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
5168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Logging
52a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi    void log_info(const char* strMessage, ...) const;
53a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi    void log_warning(const char* strMessage, ...) const;
54d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    void log_table(bool bIsWarning, const std::list<std::string> lstrMessage) const;
5568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
5668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Description
57d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    void setDescription(const std::string& strDescription);
58d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    const std::string& getDescription() const;
5968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
6068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Name / Path
61d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    const std::string& getName() const;
62d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    void setName(const std::string& strName);
63d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    bool rename(const std::string& strName, std::string& strError);
64d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    std::string getPath() const;
65d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    std::string getQualifiedPath() const;
6668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
6768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Creation / build
68d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    virtual bool init(std::string& strError);
6968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    virtual void clean();
7068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
7168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Children management
7268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    void addChild(CElement* pChild);
7368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    bool removeChild(CElement* pChild);
74d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    void listChildren(std::string& strChildList) const;
75d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    std::string listQualifiedPaths(bool bDive, uint32_t uiLevel = 0) const;
76d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    void listChildrenPaths(std::string& strChildPathList) const;
7768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
7868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Hierarchy query
79911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    size_t getNbChildren() const;
80d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    CElement* findChildOfKind(const std::string& strKind);
81d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    const CElement* findChildOfKind(const std::string& strKind) const;
8268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    const CElement* getParent() const;
83911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli
84911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    /**
85911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli     * Get a child element (const)
86911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli     *
87911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli     * Note: this method will assert if given a wrong child index (>= number of children)
88911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli     *
89911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli     * @param[in] uiIndex the index of the child element from 0 to number of children - 1
90911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli     * @return the child element
91911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli     */
92911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    const CElement* getChild(size_t uiIndex) const;
93911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli
94911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    /**
95911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli     * Get a child element
96911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli     *
97911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli     * Note: this method will assert if given a wrong child index (>= number of children)
98911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli     *
99911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli     * @param[in] uiIndex the index of the child element from 0 to number of children - 1
100911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli     * @return the child element
101911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli     */
102911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    CElement* getChild(size_t uiIndex);
103911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli
104d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    const CElement* findChild(const std::string& strName) const;
105d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    CElement* findChild(const std::string& strName);
10668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    const CElement* findDescendant(CPathNavigator& pathNavigator) const;
10768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CElement* findDescendant(CPathNavigator& pathNavigator);
10868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    bool isDescendantOf(const CElement* pCandidateAscendant) const;
10968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
11068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // From IXmlSink
11168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
11268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
11368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // From IXmlSource
11468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
11568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1168cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner    /**
1178cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner     * Serialize the children to XML
1188cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner     *
1198cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner     * This method is virtual, to be derived in case a special treatment is
1208cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner     * needed before doing so.
1218cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner     *
1228cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner     * @param[in,out] xmlElement the XML Element below which the children must
1238cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner     *                be serialized (which may or may not be the CElement
1248cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner     *                object upon which this method is called)
1258cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner     * @param[in,out] serializingContext information about the serialization
1268cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner     */
1278cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner    virtual void childrenToXml(CXmlElement& xmlElement,
1288cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner                               CXmlSerializingContext& serializingContext) const;
1298cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner
13068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Content structure dump
131d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    void dumpContent(std::string& strContent, CErrorContext& errorContext, const uint32_t uiDepth = 0) const;
13268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1332ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli    // Element properties
134d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    virtual void showProperties(std::string& strResult) const;
1352ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli
13668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Checksum for integrity checks
13768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint8_t computeStructureChecksum() const;
13868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
13968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Class kind
140d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    virtual std::string getKind() const = 0;
141a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi
142a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi    /**
143a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi     * Fill the Description field of the Xml Element during XML composing.
144a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi     *
145a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi     * @param[in,out] xmlElement to fill with the description
146a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi     */
147a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi    void setXmlDescriptionAttribute(CXmlElement& xmlElement) const;
148a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi
149a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi    /**
150a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi     * Extract the Description field from the Xml Element during XML decomposing.
151a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi     *
152a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi     * @param[in] xmlElement to extract the description from.
153a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi     *
154a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi     * @return description represented as a string, empty if not found
155a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi     */
156a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi    std::string getXmlDescriptionAttribute(const CXmlElement &xmlElement) const;
157a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi
158a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi    /**
159a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi     * Appends if found human readable description property.
160a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi     *
161a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi     * @param[out] strResult in which the description is wished to be appended.
162a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi     */
163a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi    void showDescriptionProperty(std::string &strResult) const;
164a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi
16568a912857707864bbaaff9808717813105072a6ePatrick Benavoliprotected:
16668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Content dumping
167d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    virtual void logValue(std::string& strValue, CErrorContext& errorContext) const;
16868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
16968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Hierarchy
17068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CElement* getParent();
1713ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin
1723ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin    /**
1733ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin     * Creates a child CElement from a child XML Element
1743ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin     *
1753ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin     * @param[in] childElement the XML element to create CElement from
1763ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin     * @param[in] elementSerializingContext the serializing context
1773ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin     *
1783ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin     * @return child a pointer on the CElement object that has been added to the tree
1793ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin     */
1803ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin    CElement* createChild(const CXmlElement& childElement,
1813ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin                          CXmlSerializingContext& elementSerializingContext);
1823ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin
18368a912857707864bbaaff9808717813105072a6ePatrick Benavoliprivate:
18468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Logging (done by root)
185d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    virtual void doLog(bool bIsWarning, const std::string& strLog) const;
18668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    virtual void nestLog() const;
18768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    virtual void unnestLog() const;
18868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Returns Name or Kind if no Name
189d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    std::string getPathName() const;
19068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Returns true if children dynamic creation is to be dealt with
19168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    virtual bool childrenAreDynamic() const;
19268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // House keeping
19368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    void removeChildren();
19468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // For logging
19568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t getDepth() const;
19668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Fill XmlElement during XML composing
19768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    void setXmlNameAttribute(CXmlElement& xmlElement) const;
19868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
19968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Name
200d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    std::string _strName;
20168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
20268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Description
203d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    std::string _strDescription;
20468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
20568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Child iterators
206d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    typedef std::vector<CElement*>::iterator ChildArrayIterator;
207d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    typedef std::vector<CElement*>::reverse_iterator ChildArrayReverseIterator;
20868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Children
209d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    std::vector<CElement*> _childArray;
21068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Parent
21168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CElement* _pParent;
212a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi
213a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi    static const std::string gDescriptionPropertyName;
21468a912857707864bbaaff9808717813105072a6ePatrick Benavoli};
215