|
Packit |
8c9aa0 |
#include <cppunit/tools/StringTools.h>
|
|
Packit |
8c9aa0 |
#include <cppunit/tools/XmlElement.h>
|
|
Packit |
8c9aa0 |
#include <stdexcept>
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
CPPUNIT_NS_BEGIN
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
XmlElement::XmlElement( std::string elementName,
|
|
Packit |
8c9aa0 |
std::string content )
|
|
Packit |
8c9aa0 |
: m_name( elementName )
|
|
Packit |
8c9aa0 |
, m_content( content )
|
|
Packit |
8c9aa0 |
, m_attributes()
|
|
Packit |
8c9aa0 |
, m_elements()
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
XmlElement::XmlElement( std::string elementName,
|
|
Packit |
8c9aa0 |
int numericContent )
|
|
Packit |
8c9aa0 |
: m_name( elementName )
|
|
Packit |
8c9aa0 |
, m_content()
|
|
Packit |
8c9aa0 |
, m_attributes()
|
|
Packit |
8c9aa0 |
, m_elements()
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
setContent( numericContent );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
XmlElement::~XmlElement()
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
Elements::iterator itNode = m_elements.begin();
|
|
Packit |
8c9aa0 |
while ( itNode != m_elements.end() )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
XmlElement *element = *itNode++;
|
|
Packit |
8c9aa0 |
delete element;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
std::string
|
|
Packit |
8c9aa0 |
XmlElement::name() const
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
return m_name;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
std::string
|
|
Packit |
8c9aa0 |
XmlElement::content() const
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
return m_content;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
void
|
|
Packit |
8c9aa0 |
XmlElement::setName( const std::string &name )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
m_name = name;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
void
|
|
Packit |
8c9aa0 |
XmlElement::setContent( const std::string &content )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
m_content = content;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
void
|
|
Packit |
8c9aa0 |
XmlElement::setContent( int numericContent )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
m_content = StringTools::toString( numericContent );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
void
|
|
Packit |
8c9aa0 |
XmlElement::addAttribute( std::string attributeName,
|
|
Packit |
8c9aa0 |
std::string value )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
m_attributes.push_back( Attribute( attributeName, value ) );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
void
|
|
Packit |
8c9aa0 |
XmlElement::addAttribute( std::string attributeName,
|
|
Packit |
8c9aa0 |
int numericValue )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
addAttribute( attributeName, StringTools::toString( numericValue ) );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
void
|
|
Packit |
8c9aa0 |
XmlElement::addElement( XmlElement *node )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
m_elements.push_back( node );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
int
|
|
Packit |
8c9aa0 |
XmlElement::elementCount() const
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
return m_elements.size();
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
XmlElement *
|
|
Packit |
8c9aa0 |
XmlElement::elementAt( int index ) const
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
if ( index < 0 || index >= elementCount() )
|
|
Packit |
8c9aa0 |
throw std::invalid_argument( "XmlElement::elementAt(), out of range index" );
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
return m_elements[ index ];
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
XmlElement *
|
|
Packit |
8c9aa0 |
XmlElement::elementFor( const std::string &name ) const
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
Elements::const_iterator itElement = m_elements.begin();
|
|
Packit |
8c9aa0 |
for ( ; itElement != m_elements.end(); ++itElement )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
if ( (*itElement)->name() == name )
|
|
Packit |
8c9aa0 |
return *itElement;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
throw std::invalid_argument( "XmlElement::elementFor(), not matching child element found" );
|
|
Packit |
8c9aa0 |
return NULL; // make some compilers happy.
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
std::string
|
|
Packit |
8c9aa0 |
XmlElement::toString( const std::string &indent ) const
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
std::string element( indent );
|
|
Packit |
8c9aa0 |
element += "<";
|
|
Packit |
8c9aa0 |
element += m_name;
|
|
Packit |
8c9aa0 |
if ( !m_attributes.empty() )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
element += " ";
|
|
Packit |
8c9aa0 |
element += attributesAsString();
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
element += ">";
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
if ( !m_elements.empty() )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
element += "\n";
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
std::string subNodeIndent( indent + " " );
|
|
Packit |
8c9aa0 |
Elements::const_iterator itNode = m_elements.begin();
|
|
Packit |
8c9aa0 |
while ( itNode != m_elements.end() )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
const XmlElement *node = *itNode++;
|
|
Packit |
8c9aa0 |
element += node->toString( subNodeIndent );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
element += indent;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
if ( !m_content.empty() )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
element += escape( m_content );
|
|
Packit |
8c9aa0 |
if ( !m_elements.empty() )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
element += "\n";
|
|
Packit |
8c9aa0 |
element += indent;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
element += "</";
|
|
Packit |
8c9aa0 |
element += m_name;
|
|
Packit |
8c9aa0 |
element += ">\n";
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
return element;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
std::string
|
|
Packit |
8c9aa0 |
XmlElement::attributesAsString() const
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
std::string attributes;
|
|
Packit |
8c9aa0 |
Attributes::const_iterator itAttribute = m_attributes.begin();
|
|
Packit |
8c9aa0 |
while ( itAttribute != m_attributes.end() )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
if ( !attributes.empty() )
|
|
Packit |
8c9aa0 |
attributes += " ";
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
const Attribute &attribute = *itAttribute++;
|
|
Packit |
8c9aa0 |
attributes += attribute.first;
|
|
Packit |
8c9aa0 |
attributes += "=\"";
|
|
Packit |
8c9aa0 |
attributes += escape( attribute.second );
|
|
Packit |
8c9aa0 |
attributes += "\"";
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
return attributes;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
std::string
|
|
Packit |
8c9aa0 |
XmlElement::escape( std::string value ) const
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
std::string escaped;
|
|
Packit |
8c9aa0 |
for ( unsigned int index =0; index < value.length(); ++index )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
char c = value[index ];
|
|
Packit |
8c9aa0 |
switch ( c ) // escape all predefined XML entity (safe?)
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
case '<':
|
|
Packit |
8c9aa0 |
escaped += "<";
|
|
Packit |
8c9aa0 |
break;
|
|
Packit |
8c9aa0 |
case '>':
|
|
Packit |
8c9aa0 |
escaped += ">";
|
|
Packit |
8c9aa0 |
break;
|
|
Packit |
8c9aa0 |
case '&':
|
|
Packit |
8c9aa0 |
escaped += "&";
|
|
Packit |
8c9aa0 |
break;
|
|
Packit |
8c9aa0 |
case '\'':
|
|
Packit |
8c9aa0 |
escaped += "'";
|
|
Packit |
8c9aa0 |
break;
|
|
Packit |
8c9aa0 |
case '"':
|
|
Packit |
8c9aa0 |
escaped += """;
|
|
Packit |
8c9aa0 |
break;
|
|
Packit |
8c9aa0 |
default:
|
|
Packit |
8c9aa0 |
escaped += c;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
return escaped;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
CPPUNIT_NS_END
|
|
Packit |
8c9aa0 |
|