zypp::xml::ParseDef Class Reference

Define a xml node structure to parse. More...

#include <ParseDef.h>

List of all members.

Public Types

enum  Mode { OPTIONAL = Traits::BIT_OPTIONAL | Traits::BIT_ONCE, MANDTAORY = Traits::BIT_MANDTAORY | Traits::BIT_ONCE, MULTIPLE_OPTIONAL = Traits::BIT_OPTIONAL | Traits::BIT_MULTIPLE, MULTIPLE_MANDTAORY = Traits::BIT_MANDTAORY | Traits::BIT_MULTIPLE }

Public Member Functions

 ParseDef (const std::string &name_r, Mode mode_r)
virtual ~ParseDef ()
const std::string & name () const
Mode mode () const
bool isOptional () const
bool isMandatory () const
bool singleDef () const
bool multiDef () const
unsigned visited () const
ParseDefaddNode (ParseDef &subnode_r)
 Add subnode definition.
ParseDefaddNode (const std::string &name_r, Mode mode_r)
ParseDefoperator() (ParseDef &subnode_r)
 Add subnode definition.
ParseDefoperator() (const std::string &name_r, Mode mode_r)
ParseDef operator[] (const std::string &name_r)
 Get subnode by name.
void setConsumer (const shared_ptr< ParseDefConsume > &target_r)
 Set data consumer.
void setConsumer (ParseDefConsume *allocatedTarget_r)
 Set data consumer.
void setConsumer (ParseDefConsume &target_r)
 Set data consumer.
void cancelConsumer ()
 Unset data consumer.
shared_ptr< ParseDefConsumegetConsumer () const
 Get data consumer.
void take (Reader &reader_r)
 Parse the node.

Static Public Attributes

static bool _debug = false

Private Types

typedef ParseDefTraits Traits

Private Member Functions

 ParseDef (const shared_ptr< Impl > &pimpl_r)

Private Attributes

RW_pointer< Impl_pimpl
 Pointer to implementation (shared!).

Friends

std::ostream & operator<< (std::ostream &str, const ParseDef &obj)
std::ostream & operator<< (std::ostream &str, const ParseDef::Impl &obj)

Related Functions

(Note that these are not member functions.)

std::ostream & operator<< (std::ostream &str, ParseDef::Mode obj)

Classes

class  Impl
 ParseDef implementation. More...


Detailed Description

Define a xml node structure to parse.

An xml file like this:

 <?xml version="1.0" encoding="UTF-8"?>
 <syscontent>
   <ident>
     <name>mycollection</name>
     <version epoch="0" ver="1.0" rel="1"/>
     <description>All the cool stuff...</description>
     <created>1165270942</created>
   </ident>
   <onsys>
     <entry kind="package" name="pax" epoch="0" ver="3.4" rel="12" arch="x86_64"/>
     <entry kind="product" name="SUSE_SLES" epoch="0" ver="10" arch="x86_64"/>
     <entry ...
   </onsys>
 </syscontent>

Could be described by:

 using namespace xml;
 struct SycontentNode : public ParseDef
 {
   SycontentNode( Mode mode_r )
   : ParseDef( "syscontent", mode_r )
   {
     (*this)("ident",       OPTIONAL)
            ("onsys",       OPTIONAL)
            ;

     (*this)["ident"]
            ("name",        OPTIONAL)
            ("version",     OPTIONAL)
            ("description", OPTIONAL)
            ("created",     OPTIONAL)
            ;

     (*this)["onsys"]
            ("entry",       MULTIPLE_OPTIONAL)
            ;
   }
 };

To parse it using an xml::Reader:

 xml::Reader reader( input_r );
 SycontentNode rootNode( xml::ParseDef::MANDTAORY );
 // Define data consumers here.
 rootNode.take( reader );

Whithout data consumers this will just parse the file but not retrieve any data. You may attach a consumer derived from xml::ParseDefConsume to each node:

 // Parse Edition from ver/rel/eopch attributes.
 struct ConsumeEdition : public ParseDefConsume
 {
   ConsumeEdition( Edition & value_r )
   : _value( & value_r )
   {}

   virtual void start( const Node & node_r )
   {
     *_value = Edition( node_r.getAttribute("ver").asString(),
                        node_r.getAttribute("rel").asString(),
                        node_r.getAttribute("epoch").asString() );
   }

   Edition *_value;
 };
See also:
xml::ParseDefConsume
 xml::Reader reader( input_r );
 SycontentNode rootNode( xml::ParseDef::MANDTAORY );

 // Define data consumers here.
 Edition _edition;
 rootNode["ident"]["version"].setConsumer
 ( new ConsumeEdition( _edition ) );

 rootNode.take( reader );

That's just one way to collect the data. You could as well use a xml::ParseDefConsumeCallback, and redirect the start call to some arbitrary function or method.

Definition at line 128 of file ParseDef.h.


Member Typedef Documentation

typedef ParseDefTraits zypp::xml::ParseDef::Traits [private]
 

Definition at line 130 of file ParseDef.h.


Member Enumeration Documentation

enum zypp::xml::ParseDef::Mode
 

Enumerator:
OPTIONAL 
MANDTAORY 
MULTIPLE_OPTIONAL 
MULTIPLE_MANDTAORY 

Definition at line 133 of file ParseDef.h.


Constructor & Destructor Documentation

zypp::xml::ParseDef::ParseDef const std::string &  name_r,
Mode  mode_r
 

Definition at line 383 of file ParseDef.cc.

zypp::xml::ParseDef::~ParseDef  )  [virtual]
 

Definition at line 396 of file ParseDef.cc.

zypp::xml::ParseDef::ParseDef const shared_ptr< Impl > &  pimpl_r  )  [private]
 

Definition at line 387 of file ParseDef.cc.


Member Function Documentation

const std::string & zypp::xml::ParseDef::name  )  const
 

Definition at line 399 of file ParseDef.cc.

References _pimpl.

ParseDef::Mode zypp::xml::ParseDef::mode  )  const
 

Definition at line 402 of file ParseDef.cc.

References _pimpl.

bool zypp::xml::ParseDef::isOptional  )  const
 

Definition at line 405 of file ParseDef.cc.

References _pimpl.

bool zypp::xml::ParseDef::isMandatory  )  const
 

Definition at line 408 of file ParseDef.cc.

References _pimpl.

bool zypp::xml::ParseDef::singleDef  )  const
 

Definition at line 411 of file ParseDef.cc.

References _pimpl.

bool zypp::xml::ParseDef::multiDef  )  const
 

Definition at line 414 of file ParseDef.cc.

References _pimpl.

unsigned zypp::xml::ParseDef::visited  )  const
 

Definition at line 417 of file ParseDef.cc.

References _pimpl.

ParseDef & zypp::xml::ParseDef::addNode ParseDef subnode_r  ) 
 

Add subnode definition.

Note:
As ParseDef copies share their implementation you can not add the same subnode to multiple parents.
Returns:
*this.
Exceptions:
ParseDefBuildException if a subnode with the same name is already defined, or if the subnode is already subnode of an other ParseDef.

Definition at line 420 of file ParseDef.cc.

References _pimpl, and zypp::RW_pointer< _D, _Traits >::getPtr().

Referenced by addNode(), and operator()().

ParseDef& zypp::xml::ParseDef::addNode const std::string &  name_r,
Mode  mode_r
[inline]
 

Definition at line 166 of file ParseDef.h.

References addNode().

ParseDef& zypp::xml::ParseDef::operator() ParseDef subnode_r  )  [inline]
 

Add subnode definition.

See also:
addNode.

Definition at line 172 of file ParseDef.h.

References addNode().

ParseDef& zypp::xml::ParseDef::operator() const std::string &  name_r,
Mode  mode_r
[inline]
 

Definition at line 175 of file ParseDef.h.

References addNode().

ParseDef zypp::xml::ParseDef::operator[] const std::string &  name_r  ) 
 

Get subnode by name.

Exceptions:
ParseDefBuildException if no subnode with name_r exists.

Definition at line 423 of file ParseDef.cc.

References _pimpl, and ZYPP_THROW.

void zypp::xml::ParseDef::setConsumer const shared_ptr< ParseDefConsume > &  target_r  ) 
 

Set data consumer.

Definition at line 433 of file ParseDef.cc.

References _pimpl.

void zypp::xml::ParseDef::setConsumer ParseDefConsume allocatedTarget_r  ) 
 

Set data consumer.

Note:
allocatedTarget_r is immediately wraped into a shared_ptr.

Definition at line 436 of file ParseDef.cc.

References _pimpl.

void zypp::xml::ParseDef::setConsumer ParseDefConsume target_r  ) 
 

Set data consumer.

Definition at line 439 of file ParseDef.cc.

References _pimpl.

void zypp::xml::ParseDef::cancelConsumer  ) 
 

Unset data consumer.

Definition at line 442 of file ParseDef.cc.

References _pimpl.

shared_ptr< ParseDefConsume > zypp::xml::ParseDef::getConsumer  )  const
 

Get data consumer.

Definition at line 445 of file ParseDef.cc.

References _pimpl.

void zypp::xml::ParseDef::take Reader reader_r  ) 
 

Parse the node.

This parses the node and all defined subnodes. Unknown subnodes are skipped and leave a warning in the logfile.

Precondition:
Current node must be XML_READER_TYPE_ELEMENT matching this ParseDefs name.
Postcondition:
All data parsed. At the corresponding end node. (XML_READER_TYPE_END_ELEMENT or atill at the same node, if it'a an empty element <node />).
Exceptions:
ParseDefException on error.

Definition at line 449 of file ParseDef.cc.

References _pimpl.


Friends And Related Function Documentation

std::ostream & operator<< std::ostream &  str,
const ParseDef obj
[friend]
 

Stream output.

Definition at line 476 of file ParseDef.cc.

std::ostream& operator<< std::ostream &  str,
const ParseDef::Impl obj
[friend]
 

Definition at line 362 of file ParseDef.cc.

std::ostream & operator<< std::ostream &  str,
ParseDef::Mode  obj
[related]
 

ParseDef::Mode stream output.


Member Data Documentation

RW_pointer<Impl> zypp::xml::ParseDef::_pimpl [private]
 

Pointer to implementation (shared!).

Definition at line 213 of file ParseDef.h.

Referenced by addNode(), cancelConsumer(), getConsumer(), isMandatory(), isOptional(), mode(), multiDef(), name(), zypp::xml::operator<<(), operator[](), setConsumer(), singleDef(), take(), and visited().

bool zypp::xml::ParseDef::_debug = false [static]
 

Definition at line 222 of file ParseDef.h.

Referenced by zypp::xml::ParseDefImplConsume::debuglog().


The documentation for this class was generated from the following files:
Generated on Thu Apr 24 02:25:17 2008 for zypp by  doxygen 1.4.6