Removed obsolete files and classes.
[platform/upstream/libzypp.git] / zypp / parser / yum / OtherFileReader.cc
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/parser/yum/OtherFileReader.cc
10  * Implementation of other.xml.gz file reader.
11  */
12 #include "zypp/base/Logger.h"
13 #include "zypp/parser/xml/Reader.h"
14 #include "zypp/data/ResolvableData.h"
15 #include "zypp/Changelog.h"
16 #include "zypp/base/UserRequestException.h"
17
18 #include "zypp/parser/yum/OtherFileReader.h"
19 #include "zypp/parser/yum/FileReaderBaseImpl.h"
20
21 #undef ZYPP_BASE_LOGGER_LOGGROUP
22 #define ZYPP_BASE_LOGGER_LOGGROUP "parser::yum"
23
24 using namespace std;
25 using namespace zypp::xml;
26
27 namespace zypp
28 {
29   namespace parser
30   {
31     namespace yum
32     {
33
34
35   ///////////////////////////////////////////////////////////////////////
36   //
37   //  CLASS NAME : OtherFileReader::Impl
38   //
39   class OtherFileReader::Impl : public BaseImpl
40   {
41   public:
42     Impl(
43     const Pathname & other_file,
44     const ProcessPackage & callback,
45     const ProgressData::ReceiverFnc & progress);
46
47   public:
48
49     /**
50      * Callback provided to the XML parser.
51      */
52     bool consumeNode(xml::Reader & reader_r);
53
54     /**
55      * Creates a new \ref data::Resolvable_Ptr, swaps its contents with
56      * \ref _resolvable and returns it. Used to hand-out the data object to its consumer
57      * (a \ref ProcessPackage function) after it has been read.
58      */
59     data::Resolvable_Ptr handoutResolvable();
60
61   private:
62
63     /**
64      * Pointer to the \ref zypp::data::Resolvable object for storing the NVRA
65      * data.
66      */
67     zypp::data::Resolvable_Ptr _resolvable;
68
69     /**
70      * Changelog of \ref _resolvable.
71      */
72     Changelog _changelog;
73
74     /**
75      * Callback for processing package metadata passed in through constructor.
76      */
77     ProcessPackage _callback;
78
79     /**
80      * Progress reporting object.
81      */
82     ProgressData _ticks;
83   };
84   ///////////////////////////////////////////////////////////////////////
85
86   OtherFileReader::Impl::Impl(
87       const Pathname & other_file,
88       const ProcessPackage & callback,
89       const ProgressData::ReceiverFnc & progress)
90     :
91       _callback(callback)
92   {
93     _ticks.sendTo(progress);
94     _ticks.name("other.xml.gz");
95
96     Reader reader(other_file);
97     MIL << "Reading " << other_file << endl;
98     reader.foreachNode(bind(&OtherFileReader::Impl::consumeNode, this, _1));
99   }
100
101   // --------------------------------------------------------------------------
102
103   /*
104    * xpath and multiplicity of processed nodes are included in the code
105    * for convenience:
106    *
107    * // xpath: <xpath> (?|*|+)
108    *
109    * if multiplicity is ommited, then the node has multiplicity 'one'.
110    */
111
112   // --------------------------------------------------------------------------
113
114   bool OtherFileReader::Impl::consumeNode(Reader & reader_r)
115   {
116     if (reader_r->nodeType() == XML_READER_TYPE_ELEMENT)
117     {
118       // xpath: /otherdata
119       if (reader_r->name() == "otherdata")
120       {
121         unsigned total_packages;
122         zypp::str::strtonum(reader_r->getAttribute("packages").asString(), total_packages);
123         _ticks.range(total_packages);
124         _ticks.toMin();
125         return true;
126       }
127
128       // xpath: /otherdata/package (+)
129       if (reader_r->name() == "package")
130       {
131         _resolvable = new data::Resolvable;
132         _changelog.clear();
133
134         _resolvable->name = reader_r->getAttribute("name").asString();
135         _resolvable->arch = Arch( reader_r->getAttribute("arch").asString() );
136
137         return true;
138       }
139
140       // xpath: /otherdata/package/version
141       if (reader_r->name() == "version")
142       {
143         editionStringFromAttrs( reader_r,  _resolvable->edition );
144         return true;
145       }
146
147       // xpath: /otherdata/package/changelog (*)
148       if (reader_r->name() == "changelog")
149       {
150         ChangelogEntry entry(
151               Date(reader_r->getAttribute("date").asString()),
152               reader_r->getAttribute("author").asString(),
153               reader_r.nodeText().asString());
154         _changelog.push_back(entry);
155         return true;
156       }
157     }
158
159     else if (reader_r->nodeType() == XML_READER_TYPE_END_ELEMENT)
160     {
161       // xpath: /otherdata/package
162       if (reader_r->name() == "package")
163       {
164         if (_callback && !_changelog.empty())
165           _callback(handoutResolvable(), _changelog);
166
167         if (!_ticks.incr())
168           ZYPP_THROW(AbortRequestException());
169
170         return true;
171       }
172
173       // xpath: /otherdata
174       if (reader_r->name() == "otherdata")
175       {
176         _ticks.toMax();
177         return true;
178       }
179     }
180
181     return true;
182   }
183
184   // --------------------------------------------------------------------------
185
186   data::Resolvable_Ptr OtherFileReader::Impl::handoutResolvable()
187   {
188     data::Resolvable_Ptr ret;
189     ret.swap(_resolvable);
190     return ret;
191   }
192
193
194   ///////////////////////////////////////////////////////////////////
195   //
196   //  CLASS NAME : OtherFileReader
197   //
198   ///////////////////////////////////////////////////////////////////
199
200   OtherFileReader::OtherFileReader(
201       const Pathname & other_file,
202       const ProcessPackage & callback,
203       const ProgressData::ReceiverFnc & progress)
204     :
205       _pimpl(new Impl(other_file, callback, progress))
206   {}
207
208   OtherFileReader::~OtherFileReader()
209   {}
210
211
212     } // ns yum
213   } // ns parser
214 } // ns zypp
215
216 // vim: set ts=2 sts=2 sw=2 et ai: