00001
00002
00003
00004
00005
00006
00007
00008
00012 #include <iostream>
00013 #include "zypp/base/Easy.h"
00014 #include "zypp/base/Logger.h"
00015 #include "zypp/base/LogTools.h"
00016 #include "zypp/parser/susetags/PackagesLangFileReader.h"
00017 #include "zypp/parser/susetags/FileReaderBaseImpl.h"
00018
00019 using std::endl;
00020 #undef ZYPP_BASE_LOGGER_LOGGROUP
00021 #define ZYPP_BASE_LOGGER_LOGGROUP "parser::susetags"
00022
00024 namespace zypp
00025 {
00026
00027 namespace parser
00028 {
00029
00030 namespace susetags
00031 {
00032
00034
00035
00036
00038 class PackagesLangFileReader::Impl : public BaseImpl
00039 {
00040 public:
00041 Impl( const PackagesLangFileReader & parent_r,
00042 const Locale & locale_r )
00043 : BaseImpl( parent_r ), _locale( locale_r )
00044 {}
00045
00046 virtual ~Impl()
00047 {}
00048
00049 bool hasPackage() const
00050 { return _pkgData; }
00051
00052 bool hasSourcepackage() const
00053 { return _srcpkgData; }
00054
00055 data::Package_Ptr handoutPackage()
00056 {
00057 data::Package_Ptr ret;
00058 ret.swap( _pkgData );
00059 _srcpkgData = 0;
00060 _data = 0;
00061 return ret;
00062 }
00063
00064 data::SrcPackage_Ptr handoutSourcepackage()
00065 {
00066 data::SrcPackage_Ptr ret;
00067 ret.swap( _srcpkgData );
00068 _pkgData = 0;
00069 _data = 0;
00070 return ret;
00071 }
00072
00073 public:
00075 void consumeVer( const SingleTagPtr & tag_r )
00076 { }
00077
00079 void consumePkg( const SingleTagPtr & tag_r )
00080 {
00081 std::vector<std::string> words;
00082 if ( str::split( tag_r->value, std::back_inserter(words) ) != 4 )
00083 {
00084 ZYPP_THROW( error( tag_r, "Expected [name version release arch]") );
00085 }
00086
00087 if ( words[3] == "src" || words[3] == "nosrc")
00088 {
00089 ++_c_srcpkg;
00090 _data = _srcpkgData = new data::SrcPackage;
00091 _pkgData = 0;
00092
00093 }
00094 else
00095 {
00096 ++_c_pkg;
00097 _data = _pkgData = new data::Package;
00098 _srcpkgData = 0;
00099 _data->arch = Arch( words[3] );
00100 }
00101 _data->name = words[0];
00102 _data->edition = Edition( words[1],words[2] );
00103 }
00104
00106 void consumeSum( const SingleTagPtr & tag_r )
00107 {
00108 _data->summary.setText( tag_r->value, _locale );
00109 }
00110
00111 public:
00113 void consumeDes( const MultiTagPtr & tag_r )
00114 {
00115 _data->description.setText( tag_r->value, _locale );
00116 }
00117
00119 void consumeEul( const MultiTagPtr & tag_r )
00120 {
00121 _data->licenseToConfirm.setText( tag_r->value, _locale );
00122 }
00123
00125 void consumeIns( const MultiTagPtr & tag_r )
00126 {
00127 _data->insnotify.setText( tag_r->value, _locale );
00128 }
00129
00131 void consumeDel( const MultiTagPtr & tag_r )
00132 {
00133 _data->delnotify.setText( tag_r->value, _locale );
00134 }
00135
00136 public:
00137 DefaultIntegral<unsigned,0> _c_pkg;
00138 DefaultIntegral<unsigned,0> _c_srcpkg;
00139
00140 private:
00141 Locale _locale;
00142 data::Packagebase_Ptr _data;
00143 data::Package_Ptr _pkgData;
00144 data::SrcPackage_Ptr _srcpkgData;
00145 };
00147
00149
00150
00151
00153
00155
00156
00157
00158
00159 PackagesLangFileReader::PackagesLangFileReader()
00160 {}
00161
00163
00164
00165
00166
00167 PackagesLangFileReader::~PackagesLangFileReader()
00168 {}
00169
00171
00172
00173
00174
00175 void PackagesLangFileReader::beginParse()
00176 {
00177 _pimpl.reset( new Impl( *this, _locale ) );
00178 }
00179
00181
00182
00183
00184
00185 void PackagesLangFileReader::consume( const SingleTagPtr & tag_r )
00186 {
00187 #define TAGN(V) tag_r->name == #V
00188 #define TAGFWD(V) ( TAGN(V) ) _pimpl->consume##V( tag_r )
00189
00190 if ( TAGN( Pkg ) )
00191 {
00192
00193 if ( _pimpl->hasPackage() )
00194 {
00195 if ( _pkgConsumer )
00196 _pkgConsumer( _pimpl->handoutPackage() );
00197 }
00198 else if ( _pimpl->hasSourcepackage() )
00199 {
00200 if ( _srcPkgConsumer )
00201 _srcPkgConsumer( _pimpl->handoutSourcepackage() );
00202 }
00203
00204 _pimpl->consumePkg( tag_r );
00205 }
00206 else if TAGFWD( Sum );
00207 else if TAGFWD( Ver );
00208 else
00209 { WAR << errPrefix( tag_r, "Unknown tag" ) << endl; }
00210 }
00211
00213
00214
00215
00216
00217 void PackagesLangFileReader::consume( const MultiTagPtr & tag_r )
00218 {
00219 if TAGFWD( Des );
00220 else if TAGFWD( Eul );
00221 else if TAGFWD( Ins );
00222 else if TAGFWD( Del );
00223 else
00224 { WAR << errPrefix( tag_r, "Unknown tag" ) << endl; }
00225 }
00226
00228
00229
00230
00231
00232 void PackagesLangFileReader::endParse()
00233 {
00234
00235 if ( _pimpl->hasPackage() )
00236 {
00237 if ( _pkgConsumer )
00238 _pkgConsumer( _pimpl->handoutPackage() );
00239 }
00240 else if ( _pimpl->hasSourcepackage() )
00241 {
00242 if ( _srcPkgConsumer )
00243 _srcPkgConsumer( _pimpl->handoutSourcepackage() );
00244 }
00245 MIL << "[PackagesLang]" << "(" << _pimpl->_c_pkg << "|" << _pimpl->_c_srcpkg << ")" << endl;
00246 _pimpl.reset();
00247 }
00248
00250 }
00253 }
00256 }