00001
00002
00003
00004
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
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
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 bool PatternFileReader::Impl::consumeNode(Reader & reader_r)
00099 {
00100
00101 if (consumeDependency(reader_r, _pattern->deps))
00102 return true;
00103
00104 if (reader_r->nodeType() == XML_READER_TYPE_ELEMENT)
00105 {
00106
00107 if (reader_r->name() == "pattern")
00108 {
00109 tag(tag_pattern);
00110 _pattern = new data::Pattern;
00111 return true;
00112 }
00113
00114
00115 if (reader_r->name() == "name")
00116 {
00117 _pattern->name = reader_r.nodeText().asString();
00118 return true;
00119 }
00120
00121
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
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
00138 if (reader_r->name() == "default")
00139 {
00140 _pattern->isDefault = true;
00141 }
00142
00143
00144 if (reader_r->name() == "uservisible")
00145 {
00146 _pattern->userVisible = true;
00147 return true;
00148 }
00149
00150
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
00159 if (reader_r->name() == "icon")
00160 {
00161 _pattern->icon = reader_r.nodeText().asString();
00162 return true;
00163 }
00164
00165
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
00176 if (reader_r->name() == "pattern")
00177 {
00178 if (_callback)
00179 _callback(handoutPattern());
00180
00181 toParentTag();
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
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 }
00215 }
00216 }
00217
00218