17#include <zypp/base/Logger.h>
18#include <zypp/base/String.h>
19#include <zypp-core/base/DtorReset>
20#include <zypp-core/base/DefaultIntegral>
82 DBG << tag_r << node_r << endl;
99 typedef std::map<std::string, ImplPtr>
SubNodes;
102 Impl(
const std::string & name_r,
Mode mode_r,
const shared_ptr<ParseDefConsume> & target_r = shared_ptr<ParseDefConsume>() )
115 it->second->_parent = NULL;
136 SubNodes::const_iterator it =
_subnodes.find( name_r );
155 std::string
exstr(
const std::string & what_r,
const Impl & impl_r )
const
157 std::ostringstream
str;
158 str << impl_r <<
": " << what_r;
161 std::string
exstr(
const std::string & what_r,
const Impl & impl_r,
const Reader & reader_r )
const
163 std::ostringstream
str;
164 str << impl_r <<
": " << what_r <<
" |reading " << *reader_r;
188 std::pair<SubNodes::iterator, bool> res
189 =
_subnodes.insert( std::make_pair( subnode_r->_name, subnode_r ) );
195 if ( res.first->second->_parent )
199 res.first->second->_parent =
this;
209 if ( reader_r->
nodeType() != XML_READER_TYPE_ELEMENT )
211 if ( reader_r->
depth() == 0 )
220 }
while( reader_r->
nodeType() != XML_READER_TYPE_ELEMENT );
227 if ( reader_r->
name() != _name )
238 _parseDepth = reader_r->
depth();
250 for (
bool done =
false; ! done ; )
260 case XML_READER_TYPE_ELEMENT:
268 sub->take( reader_r );
274 WAR <<
"Skip unknown node " << *reader_r <<
" in "<< *
this << endl;
275 skipNode( reader_r );
280 case XML_READER_TYPE_END_ELEMENT:
282 if ( reader_r->
depth() == _parseDepth
283 && reader_r->
name() == _name )
293 case XML_READER_TYPE_TEXT:
298 case XML_READER_TYPE_CDATA:
312 for ( SubNodes::iterator it = _subnodes.begin(); it != _subnodes.end(); ++it )
314 if ( ! it->second->_visited && it->second->isMandatory() )
318 it->second->_visited = 0;
335 ( exstr(
str::form(
"EOF while looking for [%d] <\\%s>",
350 return str <<
"ParseDef(" << obj.
_name
374 : _pimpl( new
Impl( name_r, mode_r, target_r ) )
396 {
return _pimpl->isOptional(); }
399 {
return _pimpl->isMandatory(); }
402 {
return _pimpl->singleDef(); }
405 {
return _pimpl->multiDef(); }
408 {
return _pimpl->_visited; }
411 {
_pimpl->addNode( subnode_r.
_pimpl.getPtr() );
return *
this; }
415 shared_ptr<Impl> retimpl(
_pimpl->getNode( name_r ) );
424 {
_pimpl->_callback.setRedirect( target_r ); }
427 {
_pimpl->_callback.setRedirect( allocatedTarget_r ); }
430 {
_pimpl->_callback.setRedirect( target_r ); }
433 {
_pimpl->_callback.cancelRedirect(); }
436 {
return _pimpl->_callback.getRedirect(); }
440 {
_pimpl->take( reader_r ); }
451#define X(T) case ParseDef::T: return str << #T
454 X(MULTIPLE_OPTIONAL);
455 X(MULTIPLE_MANDTAORY);
std::unordered_set< sat::detail::IdType > _visited
Integral type with defined initial value when default constructed.
Assign a vaiable a certain value when going out of scope.
xmlTextReader based interface to Reader's current node.
int depth() const
The depth of the node in the tree.
NodeType nodeType() const
Get the node type of the current node.
int isEmptyElement() const
Check if the current node is empty.
XmlString name() const
The qualified name of the node, equal to Prefix :LocalName.
ParseDef consumer redirecting all events to another consumer.
virtual void start(const Node &_node)
virtual void startSubnode(const Node &_node)
virtual void doneSubnode(const Node &_node)
virtual void done(const Node &_node)
virtual void text(const Node &_node)
void setRedirect(const shared_ptr< ParseDefConsume > &target_r)
virtual void cdata(const Node &_node)
bool skipNode(Reader &reader_r)
Skip the current node.
void take(Reader &reader_r)
DefaultIntegral< int,-1 > _parseDepth
std::string exstr(const std::string &what_r, const Impl &impl_r) const
ImplPtr getNode(const std::string &name_r) const
ParseDefImplConsume _callback
void addNode(const ImplPtr &subnode_r)
DefaultIntegral< unsigned, 0 > _visited
shared_ptr< Impl > ImplPtr
friend std::ostream & operator<<(std::ostream &str, const ParseDef::Impl &obj)
Impl(const std::string &name_r, Mode mode_r, const shared_ptr< ParseDefConsume > &target_r=shared_ptr< ParseDefConsume >())
std::map< std::string, ImplPtr > SubNodes
std::string exstr(const std::string &what_r, const Impl &impl_r, const Reader &reader_r) const
Define a xml node structure to parse.
void setConsumer(const shared_ptr< ParseDefConsume > &target_r)
Set data consumer.
const std::string & name() const
void cancelConsumer()
Unset data consumer.
RW_pointer< Impl > _pimpl
Pointer to implementation (shared!)
ParseDef & addNode(ParseDef &subnode_r)
Add subnode definition.
shared_ptr< ParseDefConsume > getConsumer() const
Get data consumer.
friend std::ostream & operator<<(std::ostream &str, const ParseDef &obj)
ParseDef operator[](const std::string &name_r)
Get subnode by name.
void take(Reader &reader_r)
Parse the node.
ParseDef(const std::string &name_r, Mode mode_r)
xmlTextReader based interface to iterate xml streams.
bool seekToEndNode(int depth_r, const std::string &name_r)
std::string asString() const
Explicit conversion to std::string.
const char * c_str() const
Explicit conversion to const char *.
const ProcessCredentials & _callback
String related utilities and Regular expression matching.
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
std::ostream & operator<<(std::ostream &str, const ReadState &obj)
Easy-to use interface to the ZYPP dependency resolver.
Range of bits starting at bit _begin with length _size.
Exceptions when building a ParseDef tree.
Base class for ParseDef consumer.
virtual void text(const Node &node_r)
virtual void startSubnode(const Node &node_r)
virtual void cdata(const Node &node_r)
void debuglog(const char *const tag_r, const Node &node_r)
virtual void doneSubnode(const Node &node_r)
virtual void done(const Node &node_r)
virtual void start(const Node &node_r)
bit::BitField< ModeBitsType > ModeBits
Parse exceptions related to the documents node structure.
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.