PatternFileReader.cc

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                          ____ _   __ __ ___                          |
00003 |                         |__  / \ / / . \ . \                         |
00004 |                           / / \ V /|  _/  _/                         |
00005 |                          / /__ | | | | | |                           |
00006 |                         /_____||_| |_| |_|                           |
00007 |                                                                      |
00008 \---------------------------------------------------------------------*/
00012 #include "zypp/base/Logger.h"
00013 #include "zypp/data/ResolvableData.h"
00014 #include "zypp/parser/xml/Reader.h"
00015 
00016 #include "zypp/parser/yum/FileReaderBaseImpl.h"
00017 #include "zypp/parser/yum/PatternFileReader.h"
00018 
00019 #undef ZYPP_BASE_LOGGER_LOGGROUP
00020 #define ZYPP_BASE_LOGGER_LOGGROUP "parser::yum"
00021 
00022 using namespace std;
00023 using namespace zypp::xml;
00024 
00025 namespace zypp
00026 {
00027   namespace parser
00028   {
00029     namespace yum
00030     {
00031 
00032 
00034   //
00035   //  CLASS NAME : PatternFileReader::Impl
00036   //
00037   class PatternFileReader::Impl : public BaseImpl
00038   {
00039   public:
00040     Impl(const Pathname & pattern_file,
00041          const ProcessPattern & callback);
00042 
00051     bool consumeNode(xml::Reader & reader_r);
00052 
00058     data::Pattern_Ptr handoutPattern();
00059 
00060   private:
00064     ProcessPattern _callback;
00065 
00070     data::Pattern_Ptr _pattern;
00071   };
00073 
00074   PatternFileReader::Impl::Impl(
00075       const Pathname & pattern_file,
00076       const ProcessPattern & callback)
00077     :
00078       _callback(callback)
00079   {
00080     Reader reader(pattern_file);
00081     MIL << "Reading " << pattern_file << endl;
00082     reader.foreachNode(bind(&PatternFileReader::Impl::consumeNode, this, _1));
00083   }
00084 
00085   // --------------------------------------------------------------------------
00086 
00087   /*
00088    * xpath and multiplicity of processed nodes are included in the code
00089    * for convenience:
00090    * 
00091    * // xpath: <xpath> (?|*|+)
00092    * 
00093    * if multiplicity is ommited, then the node has multiplicity 'one'. 
00094    */
00095 
00096   // --------------------------------------------------------------------------
00097 
00098   bool PatternFileReader::Impl::consumeNode(Reader & reader_r)
00099   {
00100     // dependency block nodes
00101     if (consumeDependency(reader_r, _pattern->deps))
00102       return true;
00103 
00104     if (reader_r->nodeType() == XML_READER_TYPE_ELEMENT)
00105     {
00106       // xpath: /patterns/pattern
00107       if (reader_r->name() == "pattern")
00108       {
00109         tag(tag_pattern); // just for the case of reuse somewhere/sometimes
00110         _pattern = new data::Pattern;
00111         return true;
00112       }
00113 
00114       // xpath: /patterns/pattern/name
00115       if (reader_r->name() == "name")
00116       {
00117         _pattern->name = reader_r.nodeText().asString();
00118         return true;
00119       }
00120 
00121       // xpath: /patterns/pattern/summary (+)
00122       if (reader_r->name() == "summary")
00123       {
00124         Locale locale(reader_r->getAttribute("lang").asString());
00125         _pattern->summary.setText(reader_r.nodeText().asString(), locale);
00126         return true;
00127       }
00128 
00129       // xpath: /patterns/pattern/description (+)
00130       if (reader_r->name() == "description")
00131       {
00132         Locale locale(reader_r->getAttribute("lang").asString());
00133         _pattern->description.setText(reader_r.nodeText().asString(), locale);
00134         return true;
00135       }
00136 
00137       // xpath: /patterns/pattern/default (?)
00138       if (reader_r->name() == "default")
00139       {
00140         _pattern->isDefault = true;
00141       }
00142 
00143       // xpath: /patterns/pattern/uservisible (?)
00144       if (reader_r->name() == "uservisible")
00145       {
00146         _pattern->userVisible = true;
00147         return true;
00148       }
00149 
00150       // xpath: /patterns/pattern/category
00151       if (reader_r->name() == "category")
00152       {
00153         Locale locale(reader_r->getAttribute("lang").asString());
00154         _pattern->category.setText(reader_r.nodeText().asString(), locale);
00155         return true;
00156       }
00157 
00158       // xpath: /patterns/pattern/icon (?)
00159       if (reader_r->name() == "icon")
00160       {
00161         _pattern->icon = reader_r.nodeText().asString();
00162         return true;
00163       }
00164 
00165       // xpath: /patterns/pattern/script (?)
00166       if (reader_r->name() == "script")
00167       {
00168         _pattern->script = reader_r.nodeText().asString();
00169         return true;
00170       }
00171     }
00172 
00173     else if (reader_r->nodeType() == XML_READER_TYPE_END_ELEMENT)
00174     {
00175       // xpath: /patterns/pattern
00176       if (reader_r->name() == "pattern")
00177       {
00178         if (_callback)
00179           _callback(handoutPattern());
00180 
00181         toParentTag(); // just for the case of reuse somewhere/sometimes
00182 
00183         return true;
00184       }
00185     }
00186 
00187     return true;
00188   }
00189 
00190   // --------------------------------------------------------------------------
00191 
00192   data::Pattern_Ptr PatternFileReader::Impl::handoutPattern()
00193   {
00194     data::Pattern_Ptr ret;
00195     ret.swap(_pattern);
00196     return ret;
00197   }
00198 
00200   //
00201   //  CLASS NAME : PatternFileReader
00202   //
00204 
00205   PatternFileReader::PatternFileReader(const Pathname & pattern_file, ProcessPattern callback)
00206       : _pimpl(new PatternFileReader::Impl(pattern_file, callback))
00207   {}
00208 
00209 
00210   PatternFileReader::~PatternFileReader()
00211   {}
00212 
00213 
00214     } // ns yum
00215   } // ns parser
00216 } // ns zypp
00217 
00218 // vim: set ts=2 sts=2 sw=2 et ai:

Generated on Tue Sep 25 19:23:03 2007 for libzypp by  doxygen 1.5.3