libzypp Repository class has been exchanged by the SAT repo
[platform/upstream/libzypp.git] / zypp / sat / Pool.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/sat/Pool.h
10  *
11 */
12 #ifndef ZYPP_SAT_POOL_H
13 #define ZYPP_SAT_POOL_H
14
15 #include <iosfwd>
16
17 #include "zypp/Pathname.h"
18
19 #include "zypp/sat/detail/PoolMember.h"
20 #include "zypp/Repository.h"
21 #include "zypp/sat/WhatProvides.h"
22
23 ///////////////////////////////////////////////////////////////////
24 namespace zypp
25 { /////////////////////////////////////////////////////////////////
26
27   class SerialNumber;
28   class RepoInfo;
29
30   ///////////////////////////////////////////////////////////////////
31   namespace sat
32   { /////////////////////////////////////////////////////////////////
33
34     ///////////////////////////////////////////////////////////////////
35     //
36     //  CLASS NAME : Pool
37     //
38     /** Global sat-pool.
39      *
40      * Explicitly shared singleton \ref Pool::instance.
41      */
42     class Pool : protected detail::PoolMember
43     {
44       public:
45         typedef detail::SolvableIterator SolvableIterator;
46         typedef zypp::detail::RepositoryIterator     RepositoryIterator;        
47         typedef detail::size_type        size_type;
48
49       public:
50         /** Singleton ctor. */
51         static Pool instance()
52         { return Pool(); }
53
54         /** Ctor from \ref PoolMember. */
55         Pool( const detail::PoolMember & )
56         {}
57
58       public:
59         /** Internal array size for stats only. */
60         size_type capacity() const;
61
62         /** Housekeeping data serial number. */
63         const SerialNumber & serial() const;
64
65         /** Update housekeeping data if necessary (e.g. whatprovides). */
66         void prepare() const;
67
68       public:
69         /** Whether \ref Pool contains repos. */
70         bool reposEmpty() const;
71
72         /** Number of repos in \ref Pool. */
73         size_type reposSize() const;
74
75         /** Iterator to the first \ref Repository. */
76         RepositoryIterator reposBegin() const;
77
78         /** Iterator behind the last \ref Repository. */
79         RepositoryIterator reposEnd() const;
80
81         /** Return a \ref Repository named \c name_r.
82          * It a such a \ref Repository does not already exist
83          * a new empty \ref Repository is created.
84          */
85         Repository reposInsert( const std::string & name_r );
86
87         /** Find a \ref Repository named \c name_r.
88          * Returns \ref norepository if there is no such \ref Repository.
89          */
90         Repository reposFind( const std::string & name_r ) const;
91
92         /** Remove a \ref Repository named \c name_r.
93          * \see \ref Repository::eraseFromPool
94          */
95         void reposErase( const std::string & name_r )
96         { reposFind( name_r ).eraseFromPool(); }
97
98       public:
99         /** Reserved system repository name \c @System. */
100         static const std::string & systemRepoName();
101
102         /** Return the system repository. */
103         Repository systemRepo()
104         { return reposInsert( systemRepoName() ); }
105
106       public:
107         /** Load \ref Solvables from a solv-file into a \ref Repository named \c name_r.
108          * In case of an exception the \ref Repository is removed from the \ref Pool.
109          * \throws Exception if loading the solv-file fails.
110          * \see \ref Repository::EraseFromPool
111         */
112         Repository addRepoSolv( const Pathname & file_r, const std::string & name_r );
113         /** \overload Using the files basename as \ref Repository name. */
114         Repository addRepoSolv( const Pathname & file_r );
115         /** \overload Using the \ref RepoInfo::alias \ref Repo name.
116          * Additionally stores the \ref RepoInfo. \See \ref Prool::setInfo.
117         */
118         Repository addRepoSolv( const Pathname & file_r, const RepoInfo & info_r );
119
120       public:
121         /** Whether \ref Pool contains solvables. */
122         bool solvablesEmpty() const;
123
124         /** Number of solvables in \ref Pool. */
125         size_type solvablesSize() const;
126
127         /** Iterator to the first \ref Solvable. */
128         SolvableIterator solvablesBegin() const;
129
130         /** Iterator behind the last \ref Solvable. */
131         SolvableIterator solvablesEnd() const;
132
133       public:
134         /** \name Iterate all Solvables matching a \c _Filter. */
135         //@{
136         template<class _Filter>
137         filter_iterator<_Filter,SolvableIterator> filterBegin( const _Filter & filter_r ) const
138         { return make_filter_iterator( filter_r, solvablesBegin(), solvablesEnd() ); }
139
140         template<class _Filter>
141         filter_iterator<_Filter,SolvableIterator> filterEnd( const _Filter & filter_r ) const
142         { return make_filter_iterator( filter_r, solvablesEnd(), solvablesEnd() ); }
143         //@}
144
145      public:
146         /** Conainer of all \ref Solvable providing \c cap_r.  */
147         WhatProvides whatProvides( Capability cap_r ) const
148         { return WhatProvides( cap_r ); }
149
150       public:
151         /** \name Requested locales. */
152         //@{
153         /** Set the requested locales.
154          * Languages to be supported by the system, e.g. language specific
155          * packages to be installed.
156          */
157         void setRequestedLocales( const LocaleSet & locales_r );
158
159         /** Add one \ref Locale to the set of requested locales.
160          * Return \c true if \c locale_r was newly added to the set.
161         */
162         bool addRequestedLocale( const Locale & locale_r );
163
164         /** Erase one \ref Locale from the set of requested locales.
165         * Return \c false if \c locale_r was not found in the set.
166          */
167         bool eraseRequestedLocale( const Locale & locale_r );
168
169         /** Return the requested locales.
170          * \see \ref setRequestedLocales
171         */
172         const LocaleSet & getRequestedLocales() const;
173
174         /** Wheter this \ref Locale is in the set of requested locales. */
175         bool isRequestedLocale( const Locale & locale_r ) const;
176
177         /** Get the set of available locales.
178          * This is computed from the package data so it actually
179          * represents all locales packages claim to support.
180          */
181         const LocaleSet & getAvailableLocales() const;
182
183         /** Wheter this \ref Locale is in the set of available locales. */
184         bool isAvailableLocale( const Locale & locale_r ) const;
185         //@}
186
187       public:
188         /** Expert backdoor. */
189         ::_Pool * get() const;
190       private:
191         /** Default ctor */
192         Pool() {}
193     };
194     ///////////////////////////////////////////////////////////////////
195
196     /** \relates Pool Stream output */
197     std::ostream & operator<<( std::ostream & str, const Pool & obj );
198
199     /** \relates Pool */
200     inline bool operator==( const Pool & lhs, const Pool & rhs )
201     { return lhs.get() == rhs.get(); }
202
203     /** \relates Pool */
204     inline bool operator!=( const Pool & lhs, const Pool & rhs )
205     { return lhs.get() != rhs.get(); }
206
207     /////////////////////////////////////////////////////////////////
208   } // namespace sat
209   ///////////////////////////////////////////////////////////////////
210   /////////////////////////////////////////////////////////////////
211 } // namespace zypp
212 ///////////////////////////////////////////////////////////////////
213 #endif // ZYPP_SAT_POOL_H