libzypp  15.28.6
ParseDefConsume.h
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #ifndef ZYPP_PARSER_XML_PARSEDEFCONSUME_H
13 #define ZYPP_PARSER_XML_PARSEDEFCONSUME_H
14 
15 #include "zypp/base/PtrTypes.h"
16 #include "zypp/base/Function.h"
17 #include "zypp/base/Hash.h"
18 #include "zypp/base/String.h"
20 
21 #include "zypp/parser/xml/Node.h"
22 
24 namespace zypp
25 {
26  namespace xml
28  {
29 
30  class Node;
31 
33  //
34  // CLASS NAME : ParseDefConsume
35  //
39  {
40  virtual ~ParseDefConsume();
41 
42  virtual void start( const Node & _node );
43  virtual void text ( const Node & _node );
44  virtual void cdata( const Node & _node );
45  virtual void done ( const Node & _node );
46 
47  virtual void startSubnode( const Node & _node );
48  virtual void doneSubnode ( const Node & _node );
49  };
51 
53  //
54  // CLASS NAME : ParseDefConsumeRedirect
55  //
61  {
62  public:
64  ParseDefConsumeRedirect( const shared_ptr<ParseDefConsume> & target_r );
65  ParseDefConsumeRedirect( ParseDefConsume * allocatedTarget_r );
67 
68  virtual ~ParseDefConsumeRedirect();
69 
70  public:
71  void setRedirect( const shared_ptr<ParseDefConsume> & target_r );
72  void setRedirect( ParseDefConsume * allocatedTarget_r );
73  void setRedirect( ParseDefConsume & target_r );
74  void cancelRedirect();
75 
76  shared_ptr<ParseDefConsume> getRedirect() const;
77 
78  public:
79  virtual void start( const Node & _node );
80  virtual void text ( const Node & _node );
81  virtual void cdata( const Node & _node );
82  virtual void done ( const Node & _node );
83  virtual void startSubnode( const Node & _node );
84  virtual void doneSubnode ( const Node & _node );
85 
86  private:
87  shared_ptr<ParseDefConsume> _target;
88  };
90 
92  //
93  // CLASS NAME : ParseDefConsumeCallback
94  //
98  {
99  public:
100  typedef function<void(const Node &)> Callback;
101 
103 
104  virtual ~ParseDefConsumeCallback();
105 
106  public:
107  virtual void start( const Node & node_r );
108  virtual void text( const Node & node_r );
109  virtual void cdata( const Node & node_r );
110  virtual void done( const Node & node_r );
111  virtual void startSubnode( const Node & node_r );
112  virtual void doneSubnode( const Node & node_r );
113 
114  public:
121  };
123 
125 
126  namespace parse_def_assign
127  {
128  template <class Tp> struct Assigner;
129 
130  typedef shared_ptr<Assigner<void> > AssignerRef;
131 
133  template <>
134  struct Assigner<void>
135  {
136  virtual ~Assigner()
137  {}
138  virtual void assign( const char * text_r )
139  {}
140  };
141 
145  template <class Tp>
146  struct Assigner : public Assigner<void>
147  {
148  Assigner( Tp & value_r )
149  : _value( &value_r )
150  {}
151 
152  virtual void assign( const char * text_r )
153  { *_value = Tp( text_r ); }
154 
155  private:
156  Tp * _value;
157  };
158 
163  template <>
164  inline void Assigner<short>::assign( const char * text_r ) { str::strtonum( text_r, *_value ); }
165  template <>
166  inline void Assigner<int>::assign( const char * text_r ) { str::strtonum( text_r, *_value ); }
167  template <>
168  inline void Assigner<long>::assign( const char * text_r ) { str::strtonum( text_r, *_value ); }
169  template <>
170  inline void Assigner<long long>::assign( const char * text_r ) { str::strtonum( text_r, *_value ); }
171  template <>
172  inline void Assigner<unsigned short>::assign( const char * text_r ) { str::strtonum( text_r, *_value ); }
173  template <>
174  inline void Assigner<unsigned>::assign( const char * text_r ) { str::strtonum( text_r, *_value ); }
175  template <>
176  inline void Assigner<unsigned long>::assign( const char * text_r ) { str::strtonum( text_r, *_value ); }
177  template <>
178  inline void Assigner<unsigned long long>::assign( const char * text_r ) { str::strtonum( text_r, *_value ); }
179  template <>
180  inline void Assigner<bool>::assign( const char * text_r ) { str::strToBoolNodefault( text_r, *_value ); }
182 
185  template <class Tp>
186  inline AssignerRef assigner( Tp & value_r )
187  { return AssignerRef( new Assigner<Tp>( value_r ) ); }
188 
189  template <class Tp, Tp TInitial>
190  inline AssignerRef assigner( DefaultIntegral<Tp,TInitial> & value_r )
191  { return AssignerRef( new Assigner<Tp>( value_r.get() ) ); }
193 
194 
212  struct Consumer : public ParseDefConsume
213  {
215  void add( const AssignerRef & assigner_r )
216  { _text.push_back( assigner_r ); }
217 
219  void add( const std::string & attr_r, const AssignerRef & assigner_r )
220  { _attr[attr_r].push_back( assigner_r ); }
221 
223  void prenotify( function<void ( const Node & )> pre_r )
224  { _pre = pre_r; }
225 
227  void postnotify( function<void ( const Node & )> post_r )
228  { _post = post_r; }
229 
230  virtual void start( const xml::Node & node_r )
231  {
232  if ( _pre )
233  _pre( node_r );
234 
235  if ( ! _attr.empty() )
236  for_( it, _attr.begin(), _attr.end() )
237  assign( it->second, node_r.getAttribute( it->first.c_str() ).c_str() );
238  }
239 
240  virtual void text( const xml::Node & node_r )
241  {
242  if ( ! _text.empty() )
243  assign( _text, node_r.value().c_str() );
244  }
245 
246  virtual void done( const xml::Node & node_r )
247  {
248  if ( _post )
249  _post( node_r );
250  }
251 
252  private:
253  void assign( const std::vector<AssignerRef> & vec_r, const char * value_r )
254  {
255  if ( value_r )
256  for_( it, vec_r.begin(), vec_r.end() )
257  (*it)->assign( value_r );
258  }
259 
260  private:
261  std::unordered_map<std::string, std::vector<AssignerRef> > _attr;
262  std::vector<AssignerRef> _text;
263  function<void ( const Node & )> _pre;
264  function<void ( const Node & )> _post;
265  };
266 
280  struct Builder
281  {
284  : _ptr( new Consumer )
285  {}
286 
288  template <class Tp>
289  Builder( Tp & value_r )
290  : _ptr( new Consumer )
291  { operator()( value_r ); }
292 
294  template <class Tp>
295  Builder( const std::string & attr_r, Tp & value_r )
296  : _ptr( new Consumer )
297  { operator()( attr_r, value_r ); }
298 
300  template <class Tp>
301  Builder & operator()( Tp & value_r )
302  { _ptr->add( assigner( value_r ) ); return *this; }
303 
305  template <class Tp>
306  Builder & operator()( const std::string & attr_r, Tp & value_r )
307  { _ptr->add( attr_r, assigner( value_r ) ); return *this; }
308 
310  Builder & operator<<( function<void ( const Node & )> done_r )
311  { _ptr->prenotify( done_r ); return *this; }
312 
314  Builder & operator>>( function<void ( const Node & )> done_r )
315  { _ptr->postnotify( done_r ); return *this; }
316 
318  operator shared_ptr<ParseDefConsume> () const
319  { return _ptr; }
320 
321  private:
322  shared_ptr<Consumer> _ptr;
323  };
325  } // namespace parse_def_assign
327 
355  inline parse_def_assign::Builder parseDefAssign()
356  { return parse_def_assign::Builder(); }
357 
358  template <class Tp>
359  inline parse_def_assign::Builder parseDefAssign( Tp & value_r )
360  { return parse_def_assign::Builder( value_r ); }
361 
362  template <class Tp>
363  inline parse_def_assign::Builder parseDefAssign( const std::string & attr_r, Tp & value_r )
364  { return parse_def_assign::Builder( attr_r, value_r ); }
366 
368  } // namespace xml
371 } // namespace zypp
373 #endif // ZYPP_PARSER_XML_PARSEDEFCONSUME_H
Builder(const std::string &attr_r, Tp &value_r)
Contruct Consumer.
function< void(const Node &)> _post
virtual void start(const Node &node_r)
void add(const std::string &attr_r, const AssignerRef &assigner_r)
Extend Consumer.
bool strToBoolNodefault(const C_Str &str, bool &return_r)
Parse str into a bool if it's a legal true or false string.
Definition: String.h:451
virtual void done(const Node &_node)
virtual void text(const Node &node_r)
virtual void doneSubnode(const Node &_node)
virtual void startSubnode(const Node &_node)
virtual void text(const Node &_node)
shared_ptr< ParseDefConsume > _target
shared_ptr< Assigner< void > > AssignerRef
virtual void text(const xml::Node &node_r)
virtual void doneSubnode(const Node &_node)
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
Definition: Easy.h:27
Builder & operator()(Tp &value_r)
Extend Consumer.
virtual void assign(const char *text_r)
Edition * _value
Definition: SysContent.cc:311
ParseDef consumer that invokes callbacks.
Helper class to build a Consumer.
void postnotify(function< void(const Node &)> post_r)
Set post notification callback.
virtual void cdata(const Node &_node)
virtual void cdata(const Node &_node)
XmlString value() const
Provides the text value of the node if present.
Definition: Node.h:143
xmlTextReader based interface to Reader's current node.
Definition: Node.h:35
virtual void assign(const char *text_r)
virtual void cdata(const Node &node_r)
virtual void text(const Node &_node)
virtual void done(const Node &node_r)
void assign(const std::vector< AssignerRef > &vec_r, const char *value_r)
function< void(const Node &)> Callback
virtual void start(const xml::Node &node_r)
TInt strtonum(const C_Str &str)
Parsing numbers from string.
Definition: String.h:403
Base class for ParseDef consumer.
ParseDef consumer assigning Node text and attribues values to variables.
const char * c_str() const
Explicit conversion to const char *.
Definition: XmlString.h:73
Builder(Tp &value_r)
Contruct Consumer.
std::vector< AssignerRef > _text
void prenotify(function< void(const Node &)> pre_r)
Set pre notification callback.
virtual void doneSubnode(const Node &node_r)
shared_ptr< ParseDefConsume > getRedirect() const
XmlString getAttribute(const char *name_r) const
Provides a copy of the attribute value with the specified qualified name.
Definition: Node.h:71
function< void(const Node &)> _pre
ParseDef consumer redirecting all events to another consumer.
virtual void done(const xml::Node &node_r)
virtual void start(const Node &_node)
virtual void startSubnode(const Node &node_r)
virtual void done(const Node &_node)
virtual void startSubnode(const Node &_node)
virtual void start(const Node &_node)
Builder & operator()(const std::string &attr_r, Tp &value_r)
Extend Consumer.
void add(const AssignerRef &assigner_r)
Extend Consumer.
Builder & operator>>(function< void(const Node &)> done_r)
Set post notification callback.
void setRedirect(const shared_ptr< ParseDefConsume > &target_r)
Assigner assigns text to types constructible from char*.
std::unordered_map< std::string, std::vector< AssignerRef > > _attr