Blame src/cppunit/XmlElement.cpp

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