PatchesFileReader.cc
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00012 #include <iostream>
00013
00014 #include "zypp/base/String.h"
00015 #include "zypp/base/Logger.h"
00016
00017 #include "zypp/Date.h"
00018 #include "zypp/CheckSum.h"
00019 #include "zypp/OnMediaLocation.h"
00020
00021 #include "zypp/parser/xml/Reader.h"
00022 #include "zypp/parser/yum/PatchesFileReader.h"
00023
00024
00025 using namespace std;
00026 using namespace zypp::xml;
00027
00028 namespace zypp
00029 {
00030 namespace parser
00031 {
00032 namespace yum
00033 {
00034
00035
00036 enum Tag
00037 {
00038 tag_NONE,
00039 tag_Patches,
00040 tag_Patch,
00041 tag_Location,
00042 tag_CheckSum,
00043 tag_Timestamp,
00044 tag_OpenCheckSum
00045 };
00046
00047
00049
00050
00051
00052 class PatchesFileReader::Impl : private base::NonCopyable
00053 {
00054 public:
00058 Impl(const Pathname &patches_file, const ProcessResource & callback);
00059
00063 bool consumeNode( Reader & reader_r );
00064
00065 private:
00066 OnMediaLocation _location;
00067 Tag _tag;
00068 std::string _id;
00069 ProcessResource _callback;
00070 CheckSum _checksum;
00071 std::string _checksum_type;
00072 Date _timestamp;
00073 };
00075
00076
00077 PatchesFileReader::Impl::Impl(const Pathname & patches_file,
00078 const ProcessResource & callback)
00079 : _tag(tag_NONE), _callback(callback)
00080 {
00081 Reader reader( patches_file );
00082 MIL << "Reading " << patches_file << endl;
00083 reader.foreachNode(bind( &PatchesFileReader::Impl::consumeNode, this, _1 ));
00084 }
00085
00086
00087
00088 bool PatchesFileReader::Impl::consumeNode( Reader & reader_r )
00089 {
00090
00091 std::string data_type;
00092 if ( reader_r->nodeType() == XML_READER_TYPE_ELEMENT )
00093 {
00094 if ( reader_r->name() == "patches" )
00095 {
00096 _tag = tag_Patches;
00097 return true;
00098 }
00099 if ( reader_r->name() == "patch" )
00100 {
00101 _tag = tag_Patch;
00102 _id = reader_r->getAttribute("id").asString();
00103 return true;
00104 }
00105 if ( reader_r->name() == "location" )
00106 {
00107 _tag = tag_Location;
00108 _location.setLocation( reader_r->getAttribute("href").asString(), 1 );
00109 return true;
00110 }
00111 if ( reader_r->name() == "checksum" )
00112 {
00113 _tag = tag_CheckSum;
00114 string checksum_type = reader_r->getAttribute("type").asString() ;
00115 string checksum_vaue = reader_r.nodeText().asString();
00116 _location.setChecksum( CheckSum( checksum_type, checksum_vaue ) );
00117 return true;
00118 }
00119 if ( reader_r->name() == "timestamp" )
00120 {
00121
00122 return true;
00123 }
00124 }
00125 else if ( reader_r->nodeType() == XML_READER_TYPE_END_ELEMENT )
00126 {
00127
00128 if ( reader_r->name() == "patch" )
00129 _callback( _location, _id );
00130 return true;
00131 }
00132 return true;
00133 }
00134
00135
00137
00138
00139
00141
00142 PatchesFileReader::PatchesFileReader(const Pathname & patches_file,
00143 const ProcessResource & callback)
00144 : _pimpl(new Impl(patches_file, callback))
00145 {}
00146
00147 PatchesFileReader::~PatchesFileReader()
00148 {}
00149
00150
00151 }
00152 }
00153 }
00154
00155