20#include <zypp-core/base/DtorReset>
21#include <zypp-core/base/DefaultIntegral>
83 DBG << tag_r << node_r << endl;
104 shared_ptr<ParseDefConsume> &&target_r =
105 shared_ptr<ParseDefConsume>())
120 it->second->_parent = NULL;
141 SubNodes::const_iterator it =
_subnodes.find( name_r );
160 std::string
exstr(
const std::string & what_r,
const Impl & impl_r )
const
162 std::ostringstream
str;
163 str << impl_r <<
": " << what_r;
166 std::string
exstr(
const std::string & what_r,
const Impl & impl_r,
const Reader & reader_r )
const
168 std::ostringstream
str;
169 str << impl_r <<
": " << what_r <<
" |reading " << *reader_r;
193 std::pair<SubNodes::iterator, bool> res
194 =
_subnodes.insert( std::make_pair( subnode_r->_name, subnode_r ) );
200 if ( res.first->second->_parent )
204 res.first->second->_parent =
this;
214 if ( reader_r->
nodeType() != XML_READER_TYPE_ELEMENT )
216 if ( reader_r->
depth() == 0 )
225 }
while( reader_r->
nodeType() != XML_READER_TYPE_ELEMENT );
232 if ( reader_r->
name() != _name )
243 _parseDepth = reader_r->
depth();
255 for (
bool done =
false; ! done ; )
265 case XML_READER_TYPE_ELEMENT:
273 sub->take( reader_r );
279 WAR <<
"Skip unknown node " << *reader_r <<
" in "<< *
this << endl;
280 skipNode( reader_r );
285 case XML_READER_TYPE_END_ELEMENT:
287 if ( reader_r->
depth() == _parseDepth
288 && reader_r->
name() == _name )
298 case XML_READER_TYPE_TEXT:
303 case XML_READER_TYPE_CDATA:
317 for ( SubNodes::iterator it = _subnodes.begin(); it != _subnodes.end(); ++it )
319 if ( ! it->second->_visited && it->second->isMandatory() )
323 it->second->_visited = 0;
340 ( exstr(
str::form(
"EOF while looking for [%d] <\\%s>",
355 return str <<
"ParseDef(" << obj.
_name
379 : _pimpl( new
Impl(
std::move(name_r), mode_r,
std::move(target_r) ) )
456#define X(T) case ParseDef::T: return str << #T
459 X(MULTIPLE_OPTIONAL);
460 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.
void text(const Node &_node) override
void cdata(const Node &_node) override
void startSubnode(const Node &_node) override
shared_ptr< ParseDefConsume > getRedirect() const
void doneSubnode(const Node &_node) override
void setRedirect(shared_ptr< ParseDefConsume > target_r)
void done(const Node &_node) override
void start(const Node &_node) override
bool skipNode(Reader &reader_r)
Skip the current node.
void take(Reader &reader_r)
Impl(std::string &&name_r, Mode mode_r, shared_ptr< ParseDefConsume > &&target_r=shared_ptr< ParseDefConsume >())
DefaultIntegral< int,-1 > _parseDepth
std::string exstr(const std::string &what_r, const Impl &impl_r) const
Impl(const Impl &)=default
std::map< std::string, ImplPtr > SubNodes
ImplPtr getNode(const std::string &name_r) const
ParseDefImplConsume _callback
void addNode(const ImplPtr &subnode_r)
shared_ptr< Impl > ImplPtr
DefaultIntegral< unsigned, 0 > _visited
Impl & operator=(const Impl &)=delete
friend std::ostream & operator<<(std::ostream &str, const ParseDef::Impl &obj)
Impl & operator=(Impl &&)=delete
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
ParseDef(std::string name_r, Mode mode_r)
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.
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.
constPtrType getPtr() const
Range of bits starting at bit _begin with length _size.
Exceptions when building a ParseDef tree.
Base class for ParseDef consumer.
void done(const Node &node_r) override
void doneSubnode(const Node &node_r) override
void startSubnode(const Node &node_r) override
void debuglog(const char *const tag_r, const Node &node_r)
void cdata(const Node &node_r) override
void start(const Node &node_r) override
void text(const Node &node_r) override
bit::BitField< ModeBitsType > ModeBits
Parse exceptions related to the documents node structure.
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.