15b57c943d288996e31efc71058c5079ef439de1
[platform/upstream/libzypp.git] / zypp / parser / ProductFileReader.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/parser/ProductFileReader.h
10  *
11 */
12 #ifndef ZYPP_PARSER_PRODUCTSDREADER_H
13 #define ZYPP_PARSER_PRODUCTSDREADER_H
14
15 #include <iosfwd>
16
17 #include "zypp/base/PtrTypes.h"
18 #include "zypp/base/Function.h"
19 #include "zypp/base/InputStream.h"
20
21 #include "zypp/Pathname.h"
22 #include "zypp/IdString.h"
23 #include "zypp/Edition.h"
24 #include "zypp/Arch.h"
25
26 ///////////////////////////////////////////////////////////////////
27 namespace zypp
28 { /////////////////////////////////////////////////////////////////
29   ///////////////////////////////////////////////////////////////////
30   namespace parser
31   { /////////////////////////////////////////////////////////////////
32
33     ///////////////////////////////////////////////////////////////////
34     //
35     //  CLASS NAME : ProductFileData
36     //
37     /** Data returned by \ref ProductFileReader
38      * \see \ref ProductFileReader
39     */
40     class ProductFileData
41     {
42       public:
43         class Impl;
44         /** Ctor takes ownership of \c allocated_r. */
45         ProductFileData( Impl * allocated_r = 0 );
46
47         /** Whether this is an empty object without valid data. */
48         bool empty() const
49         { return name().empty(); }
50
51       public:
52         IdString    vendor()  const;
53         IdString    name()    const;
54         Edition     edition() const;
55         Arch        arch()    const;
56
57         std::string shortName() const;
58         std::string summary()   const;
59
60       public:
61         std::string productline()     const;
62         std::string registerTarget()  const;
63         std::string registerRelease() const;
64         std::string registerFlavor()  const;
65
66       public:
67         std::string updaterepokey() const;
68
69       public:
70         ///////////////////////////////////////////////////////////////////
71         /** \see http://en.opensuse.org/Product_Management/Code11/Upgrade */
72         struct Upgrade
73         {
74           public:
75             class Impl;
76             /** Ctor takes ownership of \c allocated_r. */
77             Upgrade( Impl * allocated_r = 0 );
78
79           public:
80             std::string name()    const;
81             std::string summary() const;
82             std::string repository() const;
83             std::string product() const;
84             bool        notify()  const;
85             std::string status()  const;
86
87           private:
88             RWCOW_pointer<Impl> _pimpl;
89         };
90         ///////////////////////////////////////////////////////////////////
91
92         typedef std::vector<Upgrade> Upgrades;
93         const Upgrades & upgrades() const;
94
95       private:
96         RWCOW_pointer<Impl> _pimpl;
97     };
98     ///////////////////////////////////////////////////////////////////
99
100     /** \relates  ProductFileData Stream output */
101     std::ostream & operator<<( std::ostream & str, const ProductFileData & obj );
102
103     /** \relates  ProductFileData::Upgrade Stream output */
104     std::ostream & operator<<( std::ostream & str, const ProductFileData::Upgrade & obj );
105
106     ///////////////////////////////////////////////////////////////////
107     //
108     //  CLASS NAME : ProductFileReader
109     //
110     /** Parser for /etc/products.d enries (just relevant entires).
111      *
112      * \code
113      * #include "zypp/base/Functional.h" // functor::getAll
114      *
115      * std::vector<ProductFileData> result;
116      * ProductFileReader::scanDir( functor::getAll( std::back_inserter( result ) ),
117      *                             "/etc/products.d" );
118      * \endcode
119      */
120     class ProductFileReader
121     {
122     public:
123       /** Callback being invoked for each \ref ProductFileData parsed.
124        * Return \c false to stop parsing.
125        */
126       typedef function<bool( const ProductFileData & )> Consumer;
127
128     public:
129       ProductFileReader()
130       {}
131
132       ProductFileReader( const Consumer & consumer_r )
133       : _consumer( consumer_r )
134       {}
135
136       ProductFileReader( const Consumer & consumer_r, const InputStream & input_r )
137       : _consumer( consumer_r )
138       { parse( input_r ); }
139
140     public:
141       const Consumer & consumer() const
142       { return _consumer; }
143
144       void setConsumer( const Consumer & consumer_r )
145       { _consumer = consumer_r; }
146
147     public:
148       /** Parse the input stream and call \c _consumer for each
149        * parsed section.
150        *
151        * Returns \c false if the \c _consumer requested to stop parsing.
152        */
153       bool parse( const InputStream & input_r = InputStream() ) const;
154
155     public:
156       /** Parse all files (no symlinks) in \c dir_r and call \c consumer_r
157        * for each \ref ProductFileData parsed.
158        *
159        * Returns \c false if the \c _consumer requested to stop parsing.
160        */
161       static bool scanDir( const Consumer & consumer_r, const Pathname & dir_r );
162
163       /** Parse one file (or symlink) and return the  \ref ProductFileData parsed.
164        */
165       static ProductFileData scanFile( const Pathname & file_r );
166
167    private:
168       Consumer _consumer;
169     };
170     ///////////////////////////////////////////////////////////////////
171
172    /////////////////////////////////////////////////////////////////
173   } // namespace parser
174   ///////////////////////////////////////////////////////////////////
175   /////////////////////////////////////////////////////////////////
176 } // namespace zypp
177 ///////////////////////////////////////////////////////////////////
178 #endif // ZYPP_PARSER_PRODUCTSDREADER_H