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