libzypp  11.13.5
Reader.h
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #ifndef ZYPP_PARSER_XML_READER_H
13 #define ZYPP_PARSER_XML_READER_H
14 
15 #include <iosfwd>
16 
17 #include "zypp/base/NonCopyable.h"
18 #include "zypp/base/InputStream.h"
19 #include "zypp/base/Function.h"
20 
21 #include "zypp/parser/xml/Node.h"
22 
24 namespace zypp
25 {
26 
27  namespace xml
28  {
29 
31  //
32  // CLASS NAME : Validate
33  //
37  struct Validate
38  {
39  static Validate none()
40  { return Validate(); }
41  };
43 
45  //
46  // CLASS NAME : Reader
47  //
96  {
97  public:
99  Reader( const InputStream & stream_r,
100  const Validate & validate_r = Validate::none() );
101 
103  ~Reader();
104 
105  public:
106 
116 
118  bool nextNode();
119 
121  bool nextNodeAttribute();
122 
125  { return( nextNodeAttribute() || nextNode() ); }
126 
128  bool atEnd() const
129  { return( _node.readState() == XML_TEXTREADER_MODE_CLOSED ); }
130 
132  const Node & operator*() const
133  { return _node; }
134 
136  const Node * operator->() const
137  { return &_node; }
138 
139  public:
141  typedef function<bool( Reader & )> ProcessNode;
142 
144  bool foreachNode( ProcessNode fnc_r )
145  {
146  if ( _node.isAttribute() )
147  nextNode();
148  for ( ; ! atEnd(); nextNode() )
149  {
150  if ( ! fnc_r( *this ) )
151  return false;
152  }
153  return true;
154  }
155 
158  {
159  if ( _node.isAttribute() && ! fnc_r( *this ) )
160  return false;
161  while( nextNodeAttribute() )
162  {
163  if ( ! fnc_r( *this ) )
164  return false;
165  }
166  return true;
167  }
168 
171  {
172  for ( ; ! atEnd(); nextNodeOrAttribute() )
173  {
174  if ( ! fnc_r( *this ) )
175  return false;
176  }
177  return true;
178  }
179 
180  public:
182  bool seekToNode( int depth_r, const std::string & name_r );
183 
185  bool seekToEndNode( int depth_r, const std::string & name_r );
186 
187  private:
188  void close();
189 
190  private:
192  xmlTextReaderPtr _reader;
194  };
196 
198  } // namespace xml
201 } // namespace zypp
203 #endif // ZYPP_PARSER_XML_READER_H