Tagparser backup
authorMichael Andres <ma@suse.de>
Tue, 8 May 2007 18:48:58 +0000 (18:48 +0000)
committerMichael Andres <ma@suse.de>
Tue, 8 May 2007 18:48:58 +0000 (18:48 +0000)
zypp/CMakeLists.txt
zypp/parser/TagParser.cc
zypp/parser/susetags/FileReaderBase.h [new file with mode: 0644]
zypp/parser/susetags/FileReaderBaseImpl.h [new file with mode: 0644]
zypp/parser/susetags/PackagesFileReader.cc
zypp/parser/susetags/PackagesFileReader.h
zypp/parser/susetags/PackagesLangFileReader.cc [new file with mode: 0644]
zypp/parser/susetags/PackagesLangFileReader.h [new file with mode: 0644]
zypp/parser/susetags/PatternFileReader.cc [new file with mode: 0644]
zypp/parser/susetags/PatternFileReader.h [new file with mode: 0644]

index 3176d0ae2a31aa548a71fbe2083e231971b87772..cde42cce15cff77151eb6560e714afdc2748e1e1 100644 (file)
@@ -449,10 +449,16 @@ INSTALL(  FILES
 
 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
index 64b2cc547a2c4d03a6bff062e3849f778c1ff9fb..76e73b489e8c151af28f573a42e23018706a68fb 100644 (file)
@@ -126,7 +126,7 @@ namespace zypp
     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(),
diff --git a/zypp/parser/susetags/FileReaderBase.h b/zypp/parser/susetags/FileReaderBase.h
new file mode 100644 (file)
index 0000000..d6f0852
--- /dev/null
@@ -0,0 +1,51 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ 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
diff --git a/zypp/parser/susetags/FileReaderBaseImpl.h b/zypp/parser/susetags/FileReaderBaseImpl.h
new file mode 100644 (file)
index 0000000..f686f74
--- /dev/null
@@ -0,0 +1,132 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ 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
index cb51d60b916a28965928d54166f85a34c6702550..7ca7d4bad3da52079ed74d9afb22e398edc785aa 100644 (file)
@@ -13,7 +13,7 @@
 #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;
 
@@ -32,11 +32,247 @@ namespace zypp
       //       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;
       };
       ///////////////////////////////////////////////////////////////////
 
@@ -64,91 +300,96 @@ namespace zypp
 
       ///////////////////////////////////////////////////////////////////
       //
-      //       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();
       }
 
index d909c2714d40fd36ebd537cca8ed36990d205648..8b911dea5d0d0276dcb2483360b179bfca727c69 100644 (file)
 
 #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
   { /////////////////////////////////////////////////////////////////
@@ -32,14 +43,27 @@ namespace zypp
       //       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();
@@ -53,6 +77,8 @@ namespace zypp
        private:
          class Impl;
          scoped_ptr<Impl> _pimpl;
+         PkgConsumer      _pkgConsumer;
+         SrcPkgConsumer   _srcPkgConsumer;
       };
       ///////////////////////////////////////////////////////////////////
 
diff --git a/zypp/parser/susetags/PackagesLangFileReader.cc b/zypp/parser/susetags/PackagesLangFileReader.cc
new file mode 100644 (file)
index 0000000..71142fe
--- /dev/null
@@ -0,0 +1,254 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ 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
+///////////////////////////////////////////////////////////////////
diff --git a/zypp/parser/susetags/PackagesLangFileReader.h b/zypp/parser/susetags/PackagesLangFileReader.h
new file mode 100644 (file)
index 0000000..21b986a
--- /dev/null
@@ -0,0 +1,100 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ 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
diff --git a/zypp/parser/susetags/PatternFileReader.cc b/zypp/parser/susetags/PatternFileReader.cc
new file mode 100644 (file)
index 0000000..a75c57c
--- /dev/null
@@ -0,0 +1,356 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ 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
+///////////////////////////////////////////////////////////////////
diff --git a/zypp/parser/susetags/PatternFileReader.h b/zypp/parser/susetags/PatternFileReader.h
new file mode 100644 (file)
index 0000000..e10a906
--- /dev/null
@@ -0,0 +1,86 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ 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