1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/SysContent.cc
13 #include "zypp/base/Logger.h"
15 #include "zypp/SysContent.h"
16 #include "zypp/parser/xml/Reader.h"
17 #include "zypp/parser/xml/ParseDef.h"
18 #include "zypp/parser/xml/ParseDefConsume.h"
22 ///////////////////////////////////////////////////////////////////
24 { /////////////////////////////////////////////////////////////////
25 ///////////////////////////////////////////////////////////////////
27 { /////////////////////////////////////////////////////////////////
29 ///////////////////////////////////////////////////////////////////
30 namespace // Writer helpers
31 { /////////////////////////////////////////////////////////////////
34 * \return <tt>tag="value"</tt> if value not empty, else
37 inline std::string attrIf( const std::string & tag_r,
38 const std::string & value_r )
41 if ( ! value_r.empty() )
52 /////////////////////////////////////////////////////////////////
54 ///////////////////////////////////////////////////////////////////
56 ///////////////////////////////////////////////////////////////////
58 // CLASS NAME : Writer::Impl
64 std::ostream & writeXml( std::ostream & str ) const;
69 std::string _description;
73 /** Offer default Impl. */
74 static shared_ptr<Impl> nullimpl()
76 static shared_ptr<Impl> _nullimpl( new Impl );
81 friend Impl * rwcowClone<Impl>( const Impl * rhs );
82 /** clone for RWCOW_pointer */
84 { return new Impl( *this ); }
86 ///////////////////////////////////////////////////////////////////
88 ///////////////////////////////////////////////////////////////////
90 // METHOD NAME : Writer::Impl::writeXml
91 // METHOD TYPE : std::ostream &
93 std::ostream & Writer::Impl::writeXml( std::ostream & str ) const
96 str << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
97 str << "<syscontent>\n";
100 str << " <name>" << _name << "</name>\n";
102 << attrIf( "epoch", str::numstring(_edition.epoch()) )
103 << attrIf( "ver", _edition.version() )
104 << attrIf( "rel", _edition.release() )
106 str << " <description>" << _description << "</description>\n";
107 str << " <created>" << Date::now().asSeconds() << "</created>\n";
108 str << " </ident>\n";
111 for ( iterator it = _onsys.begin(); it != _onsys.end(); ++it )
114 << attrIf( "kind", (*it)->kind().asString() )
115 << attrIf( "name", (*it)->name() )
116 << attrIf( "epoch", str::numstring((*it)->edition().epoch()) )
117 << attrIf( "ver", (*it)->edition().version() )
118 << attrIf( "rel", (*it)->edition().release() )
119 << attrIf( "arch", (*it)->arch().asString() )
122 str << " </onsys>\n";
124 str << "</syscontent>" << endl;
128 ///////////////////////////////////////////////////////////////////
130 // CLASS NAME : Writer
132 ///////////////////////////////////////////////////////////////////
135 : _pimpl( Impl::nullimpl() )
138 const std::string & Writer::name() const
139 { return _pimpl->_name; }
141 Writer & Writer::name( const std::string & val_r )
142 { _pimpl->_name = val_r; return *this; }
144 const Edition & Writer::edition() const
145 { return _pimpl->_edition; }
147 Writer & Writer::edition( const Edition & val_r )
148 { _pimpl->_edition = val_r; return *this; }
150 const std::string & Writer::description() const
151 { return _pimpl->_description; }
153 Writer & Writer::description( const std::string & val_r )
154 { _pimpl->_description = val_r; return *this; }
156 void Writer::addInstalled( const PoolItem & obj_r )
158 if ( obj_r.status().isInstalled() )
160 _pimpl->_onsys.insert( obj_r.resolvable() );
164 void Writer::addIf( const PoolItem & obj_r )
166 if ( obj_r.status().isInstalled() != obj_r.status().transacts()
167 && ! ( obj_r.status().transacts() && obj_r.status().isBySolver() ) )
169 _pimpl->_onsys.insert( obj_r.resolvable() );
173 void Writer::add( const ResObject::constPtr & obj_r )
174 { _pimpl->_onsys.insert( obj_r ); }
176 bool Writer::empty() const
177 { return _pimpl->_onsys.empty(); }
179 Writer::size_type Writer::size() const
180 { return _pimpl->_onsys.size(); }
182 Writer::const_iterator Writer::begin() const
183 { return _pimpl->_onsys.begin(); }
185 Writer::const_iterator Writer::end() const
186 { return _pimpl->_onsys.end(); }
188 std::ostream & Writer::writeXml( std::ostream & str ) const
189 { return _pimpl->writeXml( str ); }
191 ///////////////////////////////////////////////////////////////////
193 // CLASS NAME : Reader::Entry::Impl
195 class Reader::Entry::Impl
203 ///////////////////////////////////////////////////////////////////
205 ///////////////////////////////////////////////////////////////////
207 // CLASS NAME : Reader::Entry
209 ///////////////////////////////////////////////////////////////////
211 Reader::Entry::Entry()
215 Reader::Entry::Entry( const shared_ptr<Impl> & pimpl_r )
219 const std::string & Reader::Entry::kind() const
220 { return _pimpl->_kind; }
222 const std::string & Reader::Entry::name() const
223 { return _pimpl->_name; }
225 const Edition & Reader::Entry::edition() const
226 { return _pimpl->_edition; }
228 const Arch & Reader::Entry::arch() const
229 { return _pimpl->_arch; }
231 ///////////////////////////////////////////////////////////////////
233 // CLASS NAME : Reader::Impl
242 Impl( std::istream & input_r );
247 std::string _description;
250 std::list<Entry> _content;
253 /** Offer default Impl. */
254 static shared_ptr<Impl> nullimpl()
256 static shared_ptr<Impl> _nullimpl( new Impl );
261 friend Impl * rwcowClone<Impl>( const Impl * rhs );
262 /** clone for RWCOW_pointer */
264 { return new Impl( *this ); }
266 ///////////////////////////////////////////////////////////////////
268 ///////////////////////////////////////////////////////////////////
269 namespace // Reader helpers
270 { /////////////////////////////////////////////////////////////////
274 /** Sycontent xml node structure. */
275 struct SycontentNode : public ParseDef
277 SycontentNode( Mode mode_r )
278 : ParseDef( "syscontent", mode_r )
280 (*this)("ident", OPTIONAL)
286 ("version", OPTIONAL)
287 ("description", OPTIONAL)
288 ("created", OPTIONAL)
292 ("entry", MULTIPLE_OPTIONAL)
297 /** Parse Edition from ver/rel/eopch attributes. */
298 struct ConsumeEdition : public ParseDefConsume
300 ConsumeEdition( Edition & value_r )
301 : _value( & value_r )
304 virtual void start( const Node & node_r )
306 *_value = Edition( node_r.getAttribute("ver").asString(),
307 node_r.getAttribute("rel").asString(),
308 node_r.getAttribute("epoch").asString() );
314 /** Parse std::string from node value. */
315 struct ConsumeString : public ParseDefConsume
317 ConsumeString( std::string & value_r )
318 : _value( & value_r )
321 virtual void text( const Node & node_r )
323 *_value = node_r.value().asString();
329 /** Parse Date from node value. */
330 struct ConsumeDate : public ParseDefConsume
332 ConsumeDate( Date & value_r )
333 : _value( & value_r )
336 virtual void text( const Node & node_r )
338 *_value = node_r.value().asString();
344 /** Parse entry list. */
345 struct ConsumeEntries : public ParseDefConsume
347 ConsumeEntries( std::list<Reader::Entry> & value_r )
348 : _value( & value_r )
351 virtual void start( const Node & node_r )
353 shared_ptr<Reader::Entry::Impl> centry( new Reader::Entry::Impl );
355 centry->_kind = node_r.getAttribute("kind").asString();
356 centry->_name = node_r.getAttribute("name").asString();
357 centry->_edition = Edition( node_r.getAttribute("ver").asString(),
358 node_r.getAttribute("rel").asString(),
359 node_r.getAttribute("epoch").asString() );
360 centry->_arch = Arch( node_r.getAttribute("arch").asString() );
362 _value->push_back( Reader::Entry( centry ) );
365 std::list<Reader::Entry> *_value;
368 /////////////////////////////////////////////////////////////////
370 ///////////////////////////////////////////////////////////////////
372 ///////////////////////////////////////////////////////////////////
374 // METHOD NAME : Reader::Impl::Impl
375 // METHOD TYPE : Constructor
377 Reader::Impl::Impl( std::istream & input_r )
379 xml::Reader reader( input_r );
380 SycontentNode rootNode( xml::ParseDef::MANDTAORY );
382 rootNode["ident"]["name"].setConsumer
383 ( new ConsumeString( _name ) );
385 rootNode["ident"]["version"].setConsumer
386 ( new ConsumeEdition( _edition ) );
388 rootNode["ident"]["description"].setConsumer
389 ( new ConsumeString( _description ) );
391 rootNode["ident"]["created"].setConsumer
392 ( new ConsumeDate( _created ) );
394 rootNode["onsys"]["entry"].setConsumer
395 ( new ConsumeEntries( _content ) );
398 rootNode.take( reader );
401 ///////////////////////////////////////////////////////////////////
403 // CLASS NAME : Reader
405 ///////////////////////////////////////////////////////////////////
408 : _pimpl( Impl::nullimpl() )
411 Reader::Reader( std::istream & input_r )
412 : _pimpl( new Impl( input_r ) )
415 const std::string & Reader::name() const
416 { return _pimpl->_name; }
418 const Edition & Reader::edition() const
419 { return _pimpl->_edition; }
421 const std::string & Reader::description() const
422 { return _pimpl->_description; }
424 const Date & Reader::ctime() const
425 { return _pimpl->_created; }
427 bool Reader::empty() const
428 { return _pimpl->_content.empty(); }
430 Reader::size_type Reader::size() const
431 { return _pimpl->_content.size(); }
433 Reader::const_iterator Reader::begin() const
434 { return _pimpl->_content.begin(); }
436 Reader::const_iterator Reader::end() const
437 { return _pimpl->_content.end(); }
439 /******************************************************************
441 ** FUNCTION NAME : operator<<
442 ** FUNCTION TYPE : inline std::ostream &
444 std::ostream & operator<<( std::ostream & str, const Reader & obj )
446 return str << "syscontent(" << obj.name() << "-" << obj.edition()
447 << ", " << obj.size() << " entries"
448 << ", created " << obj.ctime()
452 /////////////////////////////////////////////////////////////////
453 } // namespace syscontent
454 ///////////////////////////////////////////////////////////////////
455 /////////////////////////////////////////////////////////////////
457 ///////////////////////////////////////////////////////////////////