SET( zypp_parser_susetags_SRCS
parser/susetags/PackagesFileReader.cc
+ parser/susetags/PackagesLangFileReader.cc
+ parser/susetags/PatternFileReader.cc
)
SET( zypp_parser_susetags_HEADERS
+ parser/susetags/FileReaderBase.h
+ parser/susetags/FileReaderBaseImpl.h
parser/susetags/PackagesFileReader.h
+ parser/susetags/PackagesLangFileReader.h
+ parser/susetags/PatternFileReader.h
)
INSTALL( FILES
std::string TagParser::errPrefix( const MultiTagPtr & tag_r,
const std::string & msg_r ) const
{
- return str::form( "%s:%u:+%s (@%ld) | %s",
+ return str::form( "%s:%u:+%s (@%lu) | %s",
_inputname.c_str(),
tag_r->lineNo,
tag_r->asString().c_str(),
--- /dev/null
+/*---------------------------------------------------------------------\
+| ____ _ __ __ ___ |
+| |__ / \ / / . \ . \ |
+| / / \ V /| _/ _/ |
+| / /__ | | | | | | |
+| /_____||_| |_| |_| |
+| |
+\---------------------------------------------------------------------*/
+/** \file zypp/parser/susetags/FileReaderBase.h
+ *
+*/
+#ifndef ZYPP_PARSER_SUSETAGS_FILEREADERBASE_H
+#define ZYPP_PARSER_SUSETAGS_FILEREADERBASE_H
+
+#include <iosfwd>
+
+#include "zypp/base/PtrTypes.h"
+#include "zypp/parser/TagParser.h"
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////
+ namespace parser
+ { /////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////
+ namespace susetags
+ { /////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // CLASS NAME : FileReaderBase
+ //
+ /** Common base for susetags::FileReaders. */
+ class FileReaderBase : public TagParser
+ {
+ protected:
+ class BaseImpl;
+ };
+ ///////////////////////////////////////////////////////////////////
+
+ /////////////////////////////////////////////////////////////////
+ } // namespace susetags
+ ///////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////
+ } // namespace parser
+ ///////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_PARSER_SUSETAGS_FILEREADERBASE_H
--- /dev/null
+/*---------------------------------------------------------------------\
+| ____ _ __ __ ___ |
+| |__ / \ / / . \ . \ |
+| / / \ V /| _/ _/ |
+| / /__ | | | | | | |
+| /_____||_| |_| |_| |
+| |
+\---------------------------------------------------------------------*/
+/** \file zypp/parser/susetags/FileReaderBaseImpl.h
+ *
+*/
+#ifndef ZYPP_PARSER_SUSETAGS_FILEREADERBASEIMPL_H
+#define ZYPP_PARSER_SUSETAGS_FILEREADERBASEIMPL_H
+
+#include <iosfwd>
+
+#include "zypp/base/Logger.h"
+#include "zypp/base/Function.h"
+
+#include "zypp/parser/susetags/FileReaderBase.h"
+#include "zypp/parser/tagfile/ParseException.h"
+#include "zypp/data/ResolvableData.h"
+
+using std::endl;
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////
+ namespace parser
+ { /////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////
+ namespace susetags
+ { /////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // CLASS NAME : FileReaderBase::BaseImpl
+ //
+ /** Common base for susetags::FileReader implementations. */
+ class FileReaderBase::BaseImpl : private base::NonCopyable
+ {
+ public:
+ BaseImpl( const FileReaderBase & parent_r )
+ : _parent( parent_r )
+ {}
+ virtual ~BaseImpl()
+ {}
+
+ public:
+
+ struct CapImplCache
+ {
+ template<class _Res>
+ capability::CapabilityImpl::Ptr get( const std::string & line_r )
+ {
+ return get( line_r, ResTraits<_Res>::kind );
+ }
+
+ capability::CapabilityImpl::Ptr get( const std::string & line_r,
+ ResolvableTraits::KindType refers_r )
+ {
+ capability::CapabilityImpl::Ptr & ret( _cache[refers_r][line_r] );
+ if ( ! ret )
+ {
+ ret = capability::parse( refers_r, line_r );
+ }
+ return ret;
+ }
+
+ private:
+ std::map<ResolvableTraits::KindType, std::map<std::string, capability::CapabilityImpl::Ptr> > _cache;
+ };
+
+ public:
+
+ template<class _Res>
+ void depAddLine( const std::string & line_r,
+ data::DependencyList & deps_r )
+ {
+ depAddLine( line_r, ResTraits<_Res>::kind, deps_r );
+ }
+
+ void depAddLine( const std::string & line_r,
+ ResolvableTraits::KindType refers_r,
+ data::DependencyList & deps_r )
+ {
+ deps_r.insert( _depcache.get( line_r, refers_r ) );
+ }
+
+
+ template<class _Res>
+ void depParse( const MultiTagPtr & tag_r,
+ data::DependencyList & deps_r )
+ {
+ depParse( tag_r, ResTraits<_Res>::kind, deps_r );
+ }
+
+ void depParse( const MultiTagPtr & tag_r,
+ ResolvableTraits::KindType refers_r,
+ data::DependencyList & deps_r )
+ {
+ std::for_each( tag_r->value.begin(),
+ tag_r->value.end(),
+ bind( &BaseImpl::depAddLine, this, _1, refers_r, ref(deps_r) ) );
+ }
+
+ public:
+ ParseException error( const SingleTagPtr & tag_r,
+ const std::string & msg_r = std::string() ) const
+ { return ParseException( _parent.errPrefix( tag_r, msg_r ) ); }
+
+ ParseException error( const MultiTagPtr & tag_r,
+ const std::string & msg_r = std::string() ) const
+ { return ParseException( _parent.errPrefix( tag_r, msg_r ) ); }
+
+ private:
+ const FileReaderBase & _parent;
+ CapImplCache _depcache;
+ };
+ ///////////////////////////////////////////////////////////////////
+
+ /////////////////////////////////////////////////////////////////
+ } // namespace susetags
+ ///////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////
+ } // namespace parser
+ ///////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_PARSER_SUSETAGS_FILEREADERBASEIMPL_H
#include "zypp/base/Logger.h"
#include "zypp/parser/susetags/PackagesFileReader.h"
-#include "zypp/data/ResolvableData.h"
+#include "zypp/parser/susetags/FileReaderBaseImpl.h"
using std::endl;
// CLASS NAME : PackagesFileReader::Impl
//
/** PackagesFileReader implementation. */
- struct PackagesFileReader::Impl
+ class PackagesFileReader::Impl : public BaseImpl
{
- ///data::Package
- Impl() { SEC << endl; }
- ~Impl() { SEC << endl; }
+ public:
+ Impl( const PackagesFileReader & parent_r )
+ : BaseImpl( parent_r )
+ {}
+
+ virtual ~Impl()
+ {}
+
+ bool hasPackage() const
+ { return _pkgData; }
+
+ bool hasSourcepackage() const
+ { return _srcpkgData; }
+
+ data::Package_Ptr handoutPackage()
+ {
+ data::Package_Ptr ret;
+ ret.swap( _pkgData );
+ _srcpkgData = 0;
+ _data = 0;
+ return ret;
+ }
+
+ data::SrcPackage_Ptr handoutSourcepackage()
+ {
+ data::SrcPackage_Ptr ret;
+ ret.swap( _srcpkgData );
+ _pkgData = 0;
+ _data = 0;
+ return ret;
+ }
+
+ public: // single tags
+ /** Consume =Ver:. */
+ void consumeVer( const SingleTagPtr & tag_r )
+ { /* NOP */; }
+
+ /** Consume =Pkg:. */
+ void consumePkg( const SingleTagPtr & tag_r )
+ {
+ std::vector<std::string> words;
+ if ( str::split( tag_r->value, std::back_inserter(words) ) != 4 )
+ {
+ ZYPP_THROW( error( tag_r, "Expected [name version release arch]") );
+ }
+
+ if ( words[3] == "src" || words[3] == "nosrc")
+ {
+ ++_c_srcpkg;
+ _data = _srcpkgData = new data::SrcPackage;
+ _pkgData = 0;
+ // _data->arch is arch_noarch per default
+ }
+ else
+ {
+ ++_c_pkg;
+ _data = _pkgData = new data::Package;
+ _srcpkgData = 0;
+ _data->arch = Arch( words[3] );
+ }
+ _data->name = words[0];
+ _data->edition = Edition( words[1],words[2] );
+ }
+
+ /** Consume =Cks:. */
+ void consumeCks( const SingleTagPtr & tag_r )
+ {
+ std::vector<std::string> words;
+ if ( str::split( tag_r->value, std::back_inserter(words) ) != 2 )
+ {
+ ZYPP_THROW( error( tag_r, "Expected [type checksum]") );
+ }
+ _data->checksum = CheckSum( words[0], words[1] );
+ }
+
+ /** Consume =Grp:. */
+ void consumeGrp( const SingleTagPtr & tag_r )
+ {
+ _data->group = tag_r->value;
+ }
+
+ /** Consume =Vnd:. */
+ void consumeVnd( const SingleTagPtr & tag_r )
+ {
+ _data->vendor = tag_r->value;
+ }
+
+ /** Consume =Lic:. */
+ void consumeLic( const SingleTagPtr & tag_r )
+ {
+ _data->license = tag_r->value;
+ }
+
+ /** Consume =Src:. */
+ void consumeSrc( const SingleTagPtr & tag_r )
+ {
+ if ( ! _pkgData )
+ {
+ ZYPP_THROW( error( tag_r, "Unexpected sourcepackage definition for sourcepackage") );
+ }
+
+ std::vector<std::string> words;
+ if ( str::split( tag_r->value, std::back_inserter(words) ) != 4 )
+ {
+ ZYPP_THROW( error( tag_r, "Expected sourcepackages [name version release arch]") );
+ }
+
+ _pkgData->srcPackageIdent.reset( new NVR( words[0], Edition( words[1],words[2] ) ) );
+ }
+
+ /** Consume =Tim:. */
+ void consumeTim( const SingleTagPtr & tag_r )
+ {
+ _data->build_time = str::strtonum<Date::ValueType>( tag_r->value );
+ }
+
+ /** Consume =Loc:. */
+ void consumeLoc( const SingleTagPtr & tag_r )
+ {
+ std::vector<std::string> words;
+ switch ( str::split( tag_r->value, std::back_inserter(words) ) )
+ {
+ case 2: // [medianr filename]
+ str::strtonum( words[0], _data->source_media_nr );
+ _data->location = _data->arch.asString();
+ _data->location /= words[1];
+ break;
+
+ case 3: // [medianr filename dir]
+ str::strtonum( words[0], _data->source_media_nr );
+ _data->location = words[2];
+ _data->location /= words[1];
+ break;
+
+ default:
+ ZYPP_THROW( error( tag_r, "Expected [medianr filename dir]") );
+ break;
+ }
+ }
+
+ /** Consume =Siz:. */
+ void consumeSiz( const SingleTagPtr & tag_r )
+ {
+ std::vector<std::string> words;
+ if ( str::split( tag_r->value, std::back_inserter(words) ) != 2 )
+ {
+ ZYPP_THROW( error( tag_r, "Expected [archivesize size]") );
+ }
+ _data->archive_size = str::strtonum<ByteCount::SizeType>( words[0] );
+ _data->size = str::strtonum<ByteCount::SizeType>( words[1] );
+ }
+
+ /** Consume =Shr:. */
+ void consumeShr( const SingleTagPtr & tag_r )
+ {
+#warning TBD
+ }
+
+ public: // multi tags
+ /** Consume +Req:. */
+ void consumeReq( const MultiTagPtr & tag_r )
+ {
+ depParse<Package>( tag_r, _data->deps[Dep::REQUIRES] );
+ }
+
+ /** Consume +Prq:. */
+ void consumePrq( const MultiTagPtr & tag_r )
+ {
+ depParse<Package>( tag_r, _data->deps[Dep::PREREQUIRES] );
+ }
+
+ /** Consume +Prv:. */
+ void consumePrv( const MultiTagPtr & tag_r )
+ {
+ depParse<Package>( tag_r, _data->deps[Dep::PROVIDES] );
+ }
+
+ /** Consume +Con:. */
+ void consumeCon( const MultiTagPtr & tag_r )
+ {
+ depParse<Package>( tag_r, _data->deps[Dep::CONFLICTS] );
+ }
+
+ /** Consume +Obs:. */
+ void consumeObs( const MultiTagPtr & tag_r )
+ {
+ depParse<Package>( tag_r, _data->deps[Dep::OBSOLETES] );
+ }
+
+ /** Consume +Rec:. */
+ void consumeRec( const MultiTagPtr & tag_r )
+ {
+ depParse<Package>( tag_r, _data->deps[Dep::RECOMMENDS] );
+ }
+
+ /** Consume +Fre:. */
+ void consumeFre( const MultiTagPtr & tag_r )
+ {
+ depParse<Package>( tag_r, _data->deps[Dep::FRESHENS] );
+ }
+
+ /** Consume +Enh:. */
+ void consumeEnh( const MultiTagPtr & tag_r )
+ {
+ depParse<Package>( tag_r, _data->deps[Dep::ENHANCES] );
+ }
+
+ /** Consume +Sug:. */
+ void consumeSug( const MultiTagPtr & tag_r )
+ {
+ depParse<Package>( tag_r, _data->deps[Dep::SUGGESTS] );
+ }
+
+ /** Consume +Sup:. */
+ void consumeSup( const MultiTagPtr & tag_r )
+ {
+ depParse<Package>( tag_r, _data->deps[Dep::SUPPLEMENTS] );
+ }
+
+ /** Consume +Kwd:. */
+ void consumeKwd( const MultiTagPtr & tag_r )
+ {
+ _data->authors.swap( tag_r->value );
+ }
+
+ /** Consume +Aut:. */
+ void consumeAut( const MultiTagPtr & tag_r )
+ {
+ _data->authors.swap( tag_r->value );
+ }
+
+ public:
+ DefaultIntegral<unsigned,0> _c_pkg;
+ DefaultIntegral<unsigned,0> _c_srcpkg;
+
+ private:
+ data::Packagebase_Ptr _data;
+ data::Package_Ptr _pkgData;
+ data::SrcPackage_Ptr _srcpkgData;
};
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
//
- // METHOD NAME : PackagesFileReader::
+ // METHOD NAME : PackagesFileReader::beginParse
// METHOD TYPE : void
//
void PackagesFileReader::beginParse()
{
- _pimpl.reset( new Impl );
+ _pimpl.reset( new Impl(*this) );
}
///////////////////////////////////////////////////////////////////
//
- // METHOD NAME : PackagesFileReader::
+ // METHOD NAME : PackagesFileReader::consume
// METHOD TYPE : void
//
void PackagesFileReader::consume( const SingleTagPtr & tag_r )
{
-#define TAGN(V) tag_r->name == #V
+#define TAGN(V) tag_r->name == #V
+#define TAGFWD(V) ( TAGN(V) ) _pimpl->consume##V( tag_r )
if ( TAGN( Pkg ) )
- {}
- else if ( TAGN( Cks ) )
- {}
- else if ( TAGN( Grp ) )
- {}
- else if ( TAGN( Vnd ) )
- {}
- else if ( TAGN( Lic ) )
- {}
- else if ( TAGN( Src ) )
- {}
- else if ( TAGN( Tim ) )
- {}
- else if ( TAGN( Loc ) )
- {}
- else if ( TAGN( Siz ) )
- {}
- else if ( TAGN( Shr ) )
- {}
- else if ( TAGN( Ver ) )
- {}
+ {
+ // consume old data
+ if ( _pimpl->hasPackage() )
+ {
+ if ( _pkgConsumer )
+ _pkgConsumer( _pimpl->handoutPackage() );
+ }
+ else if ( _pimpl->hasSourcepackage() )
+ {
+ if ( _srcPkgConsumer )
+ _srcPkgConsumer( _pimpl->handoutSourcepackage() );
+ }
+ // start new data
+ _pimpl->consumePkg( tag_r );
+ }
+ else if TAGFWD( Cks );
+ else if TAGFWD( Grp );
+ else if TAGFWD( Vnd );
+ else if TAGFWD( Lic );
+ else if TAGFWD( Src );
+ else if TAGFWD( Tim );
+ else if TAGFWD( Loc );
+ else if TAGFWD( Siz );
+ else if TAGFWD( Shr );
+ else if TAGFWD( Ver );
else
{ ERR << tag_r << endl; }
}
///////////////////////////////////////////////////////////////////
//
- // METHOD NAME : PackagesFileReader::
+ // METHOD NAME : PackagesFileReader::consume
// METHOD TYPE : void
//
void PackagesFileReader::consume( const MultiTagPtr & tag_r )
{
- if ( TAGN( Req ) )
- {}
- else if ( TAGN( Prq ) )
- {}
- else if ( TAGN( Prv ) )
- {}
- else if ( TAGN( Con ) )
- {}
- else if ( TAGN( Obs ) )
- {}
- else if ( TAGN( Rec ) )
- {}
- else if ( TAGN( Fre ) )
- {}
- else if ( TAGN( Enh ) )
- {}
- else if ( TAGN( Sug ) )
- {}
- else if ( TAGN( Sup ) )
- {}
- else if ( TAGN( Kwd ) )
- {}
- else if ( TAGN( Aut ) )
- {}
+ if TAGFWD( Req );
+ else if TAGFWD( Prq );
+ else if TAGFWD( Prv );
+ else if TAGFWD( Con );
+ else if TAGFWD( Obs );
+ else if TAGFWD( Rec );
+ else if TAGFWD( Fre );
+ else if TAGFWD( Enh );
+ else if TAGFWD( Sug );
+ else if TAGFWD( Sup );
+ else if TAGFWD( Kwd );
+ else if TAGFWD( Aut );
else
{ ERR << tag_r << endl; }
}
///////////////////////////////////////////////////////////////////
//
- // METHOD NAME : PackagesFileReader::
+ // METHOD NAME : PackagesFileReader::lastData
// METHOD TYPE : void
//
void PackagesFileReader::endParse()
{
+ // consume oldData
+ if ( _pimpl->hasPackage() )
+ {
+ if ( _pkgConsumer )
+ _pkgConsumer( _pimpl->handoutPackage() );
+ }
+ else if ( _pimpl->hasSourcepackage() )
+ {
+ if ( _srcPkgConsumer )
+ _srcPkgConsumer( _pimpl->handoutSourcepackage() );
+ }
+ MIL << "[Packages]" << "(" << _pimpl->_c_pkg << "|" << _pimpl->_c_srcpkg << ")" << endl;
_pimpl.reset();
}
#include <iosfwd>
-#include "zypp/base/PtrTypes.h"
-#include "zypp/parser/TagParser.h"
+#include "zypp/parser/susetags/FileReaderBase.h"
///////////////////////////////////////////////////////////////////
namespace zypp
{ /////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////
+ namespace data
+ { /////////////////////////////////////////////////////////////////
+ class Package;
+ DEFINE_PTR_TYPE(Package);
+ class SrcPackage;
+ DEFINE_PTR_TYPE(SrcPackage);
+ /////////////////////////////////////////////////////////////////
+ } // namespace data
+ ///////////////////////////////////////////////////////////////////
+
///////////////////////////////////////////////////////////////////
namespace parser
{ /////////////////////////////////////////////////////////////////
// CLASS NAME : PackagesFileReader
//
/** */
- class PackagesFileReader : public TagParser
+ class PackagesFileReader : public FileReaderBase
{
+ public:
+ typedef function<void(const data::Package_Ptr &)> PkgConsumer;
+ typedef function<void(const data::SrcPackage_Ptr &)> SrcPkgConsumer;
+
public:
/** Default ctor */
PackagesFileReader();
/** Dtor */
virtual ~PackagesFileReader();
+ public:
+ /** Consumer to call when a (binary) package entry was parsed. */
+ void setPkgConsumer( const PkgConsumer & fnc_r )
+ { _pkgConsumer = fnc_r; }
+
+ /** Consumer to call when a (source) package entry was parsed. */
+ void setSrcPkgConsumer( const SrcPkgConsumer & fnc_r )
+ { _srcPkgConsumer = fnc_r; }
+
private:
/** Called when start parsing. */
virtual void beginParse();
private:
class Impl;
scoped_ptr<Impl> _pimpl;
+ PkgConsumer _pkgConsumer;
+ SrcPkgConsumer _srcPkgConsumer;
};
///////////////////////////////////////////////////////////////////
--- /dev/null
+/*---------------------------------------------------------------------\
+| ____ _ __ __ ___ |
+| |__ / \ / / . \ . \ |
+| / / \ V /| _/ _/ |
+| / /__ | | | | | | |
+| /_____||_| |_| |_| |
+| |
+\---------------------------------------------------------------------*/
+/** \file zypp/parser/susetags/PackagesLangFileReader.cc
+ *
+*/
+#include <iostream>
+#include "zypp/base/Logger.h"
+
+#include "zypp/parser/susetags/PackagesLangFileReader.h"
+#include "zypp/parser/susetags/FileReaderBaseImpl.h"
+
+using std::endl;
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////
+ namespace parser
+ { /////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////
+ namespace susetags
+ { /////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // CLASS NAME : PackagesLangFileReader::Impl
+ //
+ /** PackagesLangFileReader implementation. */
+ class PackagesLangFileReader::Impl : public BaseImpl
+ {
+ public:
+ Impl( const PackagesLangFileReader & parent_r,
+ const Locale & locale_r )
+ : BaseImpl( parent_r ), _locale( locale_r )
+ {}
+
+ virtual ~Impl()
+ {}
+
+ bool hasPackage() const
+ { return _pkgData; }
+
+ bool hasSourcepackage() const
+ { return _srcpkgData; }
+
+ data::Package_Ptr handoutPackage()
+ {
+ data::Package_Ptr ret;
+ ret.swap( _pkgData );
+ _srcpkgData = 0;
+ _data = 0;
+ return ret;
+ }
+
+ data::SrcPackage_Ptr handoutSourcepackage()
+ {
+ data::SrcPackage_Ptr ret;
+ ret.swap( _srcpkgData );
+ _pkgData = 0;
+ _data = 0;
+ return ret;
+ }
+
+ public: // single tags
+ /** Consume =Ver:. */
+ void consumeVer( const SingleTagPtr & tag_r )
+ { /*NOP*/ }
+
+ /** Consume =:Pkg. */
+ void consumePkg( const SingleTagPtr & tag_r )
+ {
+ std::vector<std::string> words;
+ if ( str::split( tag_r->value, std::back_inserter(words) ) != 4 )
+ {
+ ZYPP_THROW( error( tag_r, "Expected [name version release arch]") );
+ }
+
+ if ( words[3] == "src" || words[3] == "nosrc")
+ {
+ ++_c_srcpkg;
+ _data = _srcpkgData = new data::SrcPackage;
+ _pkgData = 0;
+ // _data->arch is arch_noarch per default
+ }
+ else
+ {
+ ++_c_pkg;
+ _data = _pkgData = new data::Package;
+ _srcpkgData = 0;
+ _data->arch = Arch( words[3] );
+ }
+ _data->name = words[0];
+ _data->edition = Edition( words[1],words[2] );
+ }
+
+ /** Consume =Sum:. */
+ void consumeSum( const SingleTagPtr & tag_r )
+ {
+ _data->summary.setText( tag_r->value, _locale );
+ }
+
+ public: // multi tags
+ /** Consume +Des:. */
+ void consumeDes( const MultiTagPtr & tag_r )
+ {
+ _data->description.setText( tag_r->value, _locale );
+ }
+
+ /** Consume +Eul:. */
+ void consumeEul( const MultiTagPtr & tag_r )
+ {
+ _data->license_to_confirm.setText( tag_r->value, _locale );
+ }
+
+ /** Consume +Ins:. */
+ void consumeIns( const MultiTagPtr & tag_r )
+ {
+ _data->insnotify.setText( tag_r->value, _locale );
+ }
+
+ /** Consume +Del:. */
+ void consumeDel( const MultiTagPtr & tag_r )
+ {
+ _data->delnotify.setText( tag_r->value, _locale );
+ }
+
+ public:
+ DefaultIntegral<unsigned,0> _c_pkg;
+ DefaultIntegral<unsigned,0> _c_srcpkg;
+
+ private:
+ Locale _locale;
+ data::Packagebase_Ptr _data;
+ data::Package_Ptr _pkgData;
+ data::SrcPackage_Ptr _srcpkgData;
+ };
+ ///////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // CLASS NAME : PackagesLangFileReader
+ //
+ ///////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // METHOD NAME : PackagesLangFileReader::PackagesLangFileReader
+ // METHOD TYPE : Ctor
+ //
+ PackagesLangFileReader::PackagesLangFileReader()
+ {}
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // METHOD NAME : PackagesLangFileReader::~PackagesLangFileReader
+ // METHOD TYPE : Dtor
+ //
+ PackagesLangFileReader::~PackagesLangFileReader()
+ {}
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // METHOD NAME : PackagesLangFileReader::beginParse
+ // METHOD TYPE : void
+ //
+ void PackagesLangFileReader::beginParse()
+ {
+ _pimpl.reset( new Impl( *this, _locale ) );
+ }
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // METHOD NAME : PackagesLangFileReader::consume
+ // METHOD TYPE : void
+ //
+ void PackagesLangFileReader::consume( const SingleTagPtr & tag_r )
+ {
+#define TAGN(V) tag_r->name == #V
+#define TAGFWD(V) ( TAGN(V) ) _pimpl->consume##V( tag_r )
+
+ if ( TAGN( Pkg ) )
+ {
+ // consume old data
+ if ( _pimpl->hasPackage() )
+ {
+ if ( _pkgConsumer )
+ _pkgConsumer( _pimpl->handoutPackage() );
+ }
+ else if ( _pimpl->hasSourcepackage() )
+ {
+ if ( _srcPkgConsumer )
+ _srcPkgConsumer( _pimpl->handoutSourcepackage() );
+ }
+ // start new data
+ _pimpl->consumePkg( tag_r );
+ }
+ else if TAGFWD( Sum );
+ else if TAGFWD( Ver );
+ else
+ { ERR << tag_r << endl; }
+ }
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // METHOD NAME : PackagesLangFileReader::consume
+ // METHOD TYPE : void
+ //
+ void PackagesLangFileReader::consume( const MultiTagPtr & tag_r )
+ {
+ if TAGFWD( Des );
+ else if TAGFWD( Eul );
+ else if TAGFWD( Ins );
+ else if TAGFWD( Del );
+ else
+ { ERR << tag_r << endl; }
+ }
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // METHOD NAME : PackagesLangFileReader::lastData
+ // METHOD TYPE : void
+ //
+ void PackagesLangFileReader::endParse()
+ {
+ // consume oldData
+ if ( _pimpl->hasPackage() )
+ {
+ if ( _pkgConsumer )
+ _pkgConsumer( _pimpl->handoutPackage() );
+ }
+ else if ( _pimpl->hasSourcepackage() )
+ {
+ if ( _srcPkgConsumer )
+ _srcPkgConsumer( _pimpl->handoutSourcepackage() );
+ }
+ MIL << "[PackagesLang]" << "(" << _pimpl->_c_pkg << "|" << _pimpl->_c_srcpkg << ")" << endl;
+ _pimpl.reset();
+ }
+
+ /////////////////////////////////////////////////////////////////
+ } // namespace susetags
+ ///////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////
+ } // namespace parser
+ ///////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
--- /dev/null
+/*---------------------------------------------------------------------\
+| ____ _ __ __ ___ |
+| |__ / \ / / . \ . \ |
+| / / \ V /| _/ _/ |
+| / /__ | | | | | | |
+| /_____||_| |_| |_| |
+| |
+\---------------------------------------------------------------------*/
+/** \file zypp/parser/susetags/PackagesLangFileReader.h
+ *
+*/
+#ifndef ZYPP_PARSER_SUSETAGS_PACKAGESLANGFILEREADER_H
+#define ZYPP_PARSER_SUSETAGS_PACKAGESLANGFILEREADER_H
+
+#include <iosfwd>
+
+#include "zypp/parser/susetags/FileReaderBase.h"
+#include "zypp/Locale.h"
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////
+ namespace data
+ { /////////////////////////////////////////////////////////////////
+ class Package;
+ DEFINE_PTR_TYPE(Package);
+ class SrcPackage;
+ DEFINE_PTR_TYPE(SrcPackage);
+ /////////////////////////////////////////////////////////////////
+ } // namespace data
+ ///////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////
+ namespace parser
+ { /////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////
+ namespace susetags
+ { /////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // CLASS NAME : PackagesLangFileReader
+ //
+ /** */
+ class PackagesLangFileReader : public FileReaderBase
+ {
+ public:
+ typedef function<void(const data::Package_Ptr &)> PkgConsumer;
+ typedef function<void(const data::SrcPackage_Ptr &)> SrcPkgConsumer;
+
+ public:
+ /** Default ctor */
+ PackagesLangFileReader();
+ /** Dtor */
+ virtual ~PackagesLangFileReader();
+
+ public:
+ /** Locale to parse. */
+ void setLocale( const Locale & locale_r )
+ { _locale = locale_r; }
+
+ /** Consumer to call when a (binary) package entry was parsed. */
+ void setPkgConsumer( const PkgConsumer & fnc_r )
+ { _pkgConsumer = fnc_r; }
+
+ /** Consumer to call when a (source) package entry was parsed. */
+ void setSrcPkgConsumer( const SrcPkgConsumer & fnc_r )
+ { _srcPkgConsumer = fnc_r; }
+
+ private:
+ /** Called when start parsing. */
+ virtual void beginParse();
+ /** Called when a single-tag is found. */
+ virtual void consume( const SingleTagPtr & tag_r );
+ /** Called when a multi-tag is found. */
+ virtual void consume( const MultiTagPtr & tag_r );
+ /** Called when the parse is done. */
+ virtual void endParse();
+
+ private:
+ class Impl;
+ scoped_ptr<Impl> _pimpl;
+ Locale _locale;
+ PkgConsumer _pkgConsumer;
+ SrcPkgConsumer _srcPkgConsumer;
+ };
+ ///////////////////////////////////////////////////////////////////
+
+ /////////////////////////////////////////////////////////////////
+ } // namespace susetags
+ ///////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////
+ } // namespace parser
+ ///////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_PARSER_SUSETAGS_PACKAGESLANGFILEREADER_H
--- /dev/null
+/*---------------------------------------------------------------------\
+| ____ _ __ __ ___ |
+| |__ / \ / / . \ . \ |
+| / / \ V /| _/ _/ |
+| / /__ | | | | | | |
+| /_____||_| |_| |_| |
+| |
+\---------------------------------------------------------------------*/
+/** \file zypp/parser/susetags/PatternFileReader.cc
+ *
+*/
+#include <iostream>
+#include "zypp/base/Logger.h"
+
+#include "zypp/parser/susetags/PatternFileReader.h"
+#include "zypp/parser/susetags/FileReaderBaseImpl.h"
+
+using std::endl;
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////
+ namespace parser
+ { /////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////
+ namespace susetags
+ { /////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // CLASS NAME : PatternFileReader::Impl
+ //
+ /** PatternFileReader implementation. */
+ class PatternFileReader::Impl : public BaseImpl
+ {
+ public:
+ Impl( const PatternFileReader & parent_r )
+ : BaseImpl( parent_r )
+ {}
+
+ virtual ~Impl()
+ {}
+
+ bool hasData() const
+ { return _data; }
+
+ data::Pattern_Ptr handoutData()
+ {
+ data::Pattern_Ptr ret;
+ ret.swap( _data );
+ return ret;
+ }
+
+ public: // single tags
+ /** Consume =Ver:. */
+ void consumeVer( const SingleTagPtr & tag_r )
+ { /* NOP */; }
+
+ /** Consume =Pat:. */
+ void consumePat( const SingleTagPtr & tag_r )
+ {
+ std::vector<std::string> words;
+ if ( str::split( tag_r->value, std::back_inserter(words) ) != 4 )
+ {
+ ZYPP_THROW( error( tag_r, "Expected [name version release arch]") );
+ }
+
+ _data = new data::Pattern;
+ _data->name = words[0];
+ _data->edition = Edition( words[1],words[2] );
+ _data->arch = Arch( words[3] );
+ }
+
+ /** Consume =Sum:. */
+ void consumeSum( const SingleTagPtr & tag_r )
+ {
+ _data->summary.setText( tag_r->value, Locale(tag_r->modifier) );
+ }
+
+ /** Consume =Vis:. */
+ void consumeVis( const SingleTagPtr & tag_r )
+ {
+ _data->user_visible = ( tag_r->value == "true" );
+ }
+
+ /** Consume =Cat:. */
+ void consumeCat( const SingleTagPtr & tag_r )
+ {
+ _data->category.setText( tag_r->value, Locale(tag_r->modifier) );
+ }
+
+ /** Consume =Ico:. */
+ void consumeIco( const SingleTagPtr & tag_r )
+ {
+ _data->icon = tag_r->value;
+ }
+
+ /** Consume =Ord:. */
+ void consumeOrd( const SingleTagPtr & tag_r )
+ {
+ _data->order = tag_r->value;
+ }
+
+ public: // multi tags
+ /** Consume +Req:. */
+ void consumeReq( const MultiTagPtr & tag_r )
+ {
+ depParse<Pattern>( tag_r, _data->deps[Dep::REQUIRES] );
+ }
+
+ /** Consume +Prv:. */
+ void consumePrv( const MultiTagPtr & tag_r )
+ {
+ depParse<Pattern>( tag_r, _data->deps[Dep::PROVIDES] );
+ }
+
+ /** Consume +Con:. */
+ void consumeCon( const MultiTagPtr & tag_r )
+ {
+ depParse<Pattern>( tag_r, _data->deps[Dep::CONFLICTS] );
+ }
+
+ /** Consume +Obs:. */
+ void consumeObs( const MultiTagPtr & tag_r )
+ {
+ depParse<Pattern>( tag_r, _data->deps[Dep::OBSOLETES] );
+ }
+
+ /** Consume +Rec:. */
+ void consumeRec( const MultiTagPtr & tag_r )
+ {
+ depParse<Pattern>( tag_r, _data->deps[Dep::RECOMMENDS] );
+ }
+
+ /** Consume +Fre:. */
+ void consumeFre( const MultiTagPtr & tag_r )
+ {
+ depParse<Pattern>( tag_r, _data->deps[Dep::FRESHENS] );
+ }
+
+ /** Consume +Enh:. */
+ void consumeEnh( const MultiTagPtr & tag_r )
+ {
+ depParse<Pattern>( tag_r, _data->deps[Dep::ENHANCES] );
+ }
+
+ /** Consume +Sug:. */
+ void consumeSug( const MultiTagPtr & tag_r )
+ {
+ depParse<Pattern>( tag_r, _data->deps[Dep::SUGGESTS] );
+ }
+
+ /** Consume +Sup:. */
+ void consumeSup( const MultiTagPtr & tag_r )
+ {
+ depParse<Pattern>( tag_r, _data->deps[Dep::SUPPLEMENTS] );
+ }
+
+ // package related dependencies:
+
+ /** Consume +Prq:. */
+ void consumePrq( const MultiTagPtr & tag_r )
+ {
+ depParse<Package>( tag_r, _data->deps[Dep::REQUIRES] );
+ }
+
+ /** Consume +Pcn:. */
+ void consumePcn( const MultiTagPtr & tag_r )
+ {
+ depParse<Package>( tag_r, _data->deps[Dep::CONFLICTS] );
+ }
+
+ /** Consume +Pob:. */
+ void consumePob( const MultiTagPtr & tag_r )
+ {
+ depParse<Package>( tag_r, _data->deps[Dep::OBSOLETES] );
+ }
+
+ /** Consume +Prc:. */
+ void consumePrc( const MultiTagPtr & tag_r )
+ {
+ depParse<Package>( tag_r, _data->deps[Dep::RECOMMENDS] );
+ }
+
+ /** Consume +Pfr:. */
+ void consumePfr( const MultiTagPtr & tag_r )
+ {
+ depParse<Package>( tag_r, _data->deps[Dep::FRESHENS] );
+ }
+
+ /** Consume +Pen:. */
+ void consumePen( const MultiTagPtr & tag_r )
+ {
+ depParse<Package>( tag_r, _data->deps[Dep::ENHANCES] );
+ }
+
+ /** Consume +Psg:. */
+ void consumePsg( const MultiTagPtr & tag_r )
+ {
+ depParse<Package>( tag_r, _data->deps[Dep::SUGGESTS] );
+ }
+
+ /** Consume +Psp:. */
+ void consumePsp( const MultiTagPtr & tag_r )
+ {
+ depParse<Package>( tag_r, _data->deps[Dep::SUPPLEMENTS] );
+ }
+
+ // non dependency tags
+
+ /** Consume +Des:. */
+ void consumeDes( const MultiTagPtr & tag_r )
+ {
+ _data->description.setText( tag_r->value, Locale(tag_r->modifier) );
+ }
+
+ /** Consume +Inc:. */
+ void consumeInc( const MultiTagPtr & tag_r )
+ {
+ depParse<Pattern>( tag_r, _data->includes );
+ }
+
+ /** Consume +Ext:. */
+ void consumeExt( const MultiTagPtr & tag_r )
+ {
+ depParse<Pattern>( tag_r, _data->extends );
+ }
+
+ private:
+ data::Pattern_Ptr _data;
+ };
+ ///////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // CLASS NAME : PatternFileReader
+ //
+ ///////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // METHOD NAME : PatternFileReader::PatternFileReader
+ // METHOD TYPE : Ctor
+ //
+ PatternFileReader::PatternFileReader()
+ {}
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // METHOD NAME : PatternFileReader::~PatternFileReader
+ // METHOD TYPE : Dtor
+ //
+ PatternFileReader::~PatternFileReader()
+ {}
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // METHOD NAME : PatternFileReader::beginParse
+ // METHOD TYPE : void
+ //
+ void PatternFileReader::beginParse()
+ {
+ _pimpl.reset( new Impl(*this) );
+ }
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // METHOD NAME : PatternFileReader::consume
+ // METHOD TYPE : void
+ //
+ void PatternFileReader::consume( const SingleTagPtr & tag_r )
+ {
+#define TAGN(V) tag_r->name == #V
+#define TAGFWD(V) ( TAGN(V) ) _pimpl->consume##V( tag_r )
+
+ if ( TAGN( Pat ) )
+ {
+ // consume old data
+ if ( _pimpl->hasData() )
+ {
+ if ( _consumer )
+ _consumer( _pimpl->handoutData() );
+ }
+ // start new data
+ _pimpl->consumePat( tag_r );
+ }
+ else if TAGFWD( Sum );
+ else if TAGFWD( Vis );
+ else if TAGFWD( Cat );
+ else if TAGFWD( Ico );
+ else if TAGFWD( Ord );
+ else if TAGFWD( Ver );
+ else
+ { ERR << tag_r << endl; }
+ }
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // METHOD NAME : PatternFileReader::consume
+ // METHOD TYPE : void
+ //
+ void PatternFileReader::consume( const MultiTagPtr & tag_r )
+ {
+ if TAGFWD( Req );
+ else if TAGFWD( Prq );
+ else if TAGFWD( Prv );
+ else if TAGFWD( Con );
+ else if TAGFWD( Obs );
+ else if TAGFWD( Rec );
+ else if TAGFWD( Fre );
+ else if TAGFWD( Enh );
+ else if TAGFWD( Sug );
+ else if TAGFWD( Sup );
+ // package related dependencies
+ else if TAGFWD( Prq ); // requires
+ else if TAGFWD( Pcn ); // conflicts
+ else if TAGFWD( Pob ); // obsoletes
+ else if TAGFWD( Prc ); // recommends
+ else if TAGFWD( Pfr ); // freshens
+ else if TAGFWD( Pen ); // enhances
+ else if TAGFWD( Psg ); // suggests
+ else if TAGFWD( Psp ); // supplements
+ //
+ else if TAGFWD( Des );
+ else if TAGFWD( Inc ); // UI hint: includes
+ else if TAGFWD( Ext ); // UI hint: extends
+ else
+ { ERR << tag_r << endl; }
+ }
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // METHOD NAME : PatternFileReader::lastData
+ // METHOD TYPE : void
+ //
+ void PatternFileReader::endParse()
+ {
+ // consume data
+ if ( _pimpl->hasData() )
+ {
+ if ( _consumer )
+ _consumer( _pimpl->handoutData() );
+ }
+ _pimpl.reset();
+ }
+
+ /////////////////////////////////////////////////////////////////
+ } // namespace susetags
+ ///////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////
+ } // namespace parser
+ ///////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
--- /dev/null
+/*---------------------------------------------------------------------\
+| ____ _ __ __ ___ |
+| |__ / \ / / . \ . \ |
+| / / \ V /| _/ _/ |
+| / /__ | | | | | | |
+| /_____||_| |_| |_| |
+| |
+\---------------------------------------------------------------------*/
+/** \file zypp/parser/susetags/PatternFileReader.h
+ *
+*/
+#ifndef ZYPP_PARSER_SUSETAGS_PATTERNFILEREADER_H
+#define ZYPP_PARSER_SUSETAGS_PATTERNFILEREADER_H
+
+#include <iosfwd>
+
+#include "zypp/parser/susetags/FileReaderBase.h"
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////
+ namespace data
+ { /////////////////////////////////////////////////////////////////
+ class Pattern;
+ DEFINE_PTR_TYPE(Pattern);
+ /////////////////////////////////////////////////////////////////
+ } // namespace data
+ ///////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////
+ namespace parser
+ { /////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////
+ namespace susetags
+ { /////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // CLASS NAME : PatternFileReader
+ //
+ /** */
+ class PatternFileReader : public FileReaderBase
+ {
+ public:
+ typedef function<void(const data::Pattern_Ptr &)> Consumer;
+
+ public:
+ /** Default ctor */
+ PatternFileReader();
+ /** Dtor */
+ virtual ~PatternFileReader();
+
+ public:
+ /** Consumer to call when a pattern was parsed. */
+ void setConsumer( const Consumer & fnc_r )
+ { _consumer = fnc_r; }
+
+ private:
+ /** Called when start parsing. */
+ virtual void beginParse();
+ /** Called when a single-tag is found. */
+ virtual void consume( const SingleTagPtr & tag_r );
+ /** Called when a multi-tag is found. */
+ virtual void consume( const MultiTagPtr & tag_r );
+ /** Called when the parse is done. */
+ virtual void endParse();
+
+ private:
+ class Impl;
+ scoped_ptr<Impl> _pimpl;
+ Consumer _consumer;
+ };
+ ///////////////////////////////////////////////////////////////////
+
+ /////////////////////////////////////////////////////////////////
+ } // namespace susetags
+ ///////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////
+ } // namespace parser
+ ///////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_PARSER_SUSETAGS_PATTERNFILEREADER_H