Imported Upstream version 16.3.2
[platform/upstream/libzypp.git] / zypp / ServiceInfo.cc
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/ServiceInfo.cc
10  *
11  */
12 #include <ostream>
13 #include <iostream>
14
15 #include "zypp/base/String.h"
16 #include "zypp/base/DefaultIntegral.h"
17 #include "zypp/parser/xml/XmlEscape.h"
18
19 #include "zypp/RepoInfo.h"
20 #include "zypp/ServiceInfo.h"
21
22 using namespace std;
23 using zypp::xml::escape;
24
25 ///////////////////////////////////////////////////////////////////////////////
26 namespace zypp
27 {//////////////////////////////////////////////////////////////////////////////
28
29   ///////////////////////////////////////////////////////////////////
30   //
31   //  CLASS NAME : ServiceInfo::Impl
32   //
33   struct ServiceInfo::Impl
34   {
35     typedef ServiceInfo::ReposToEnable  ReposToEnable;
36     typedef ServiceInfo::ReposToDisable ReposToDisable;
37
38   public:
39     RepoVariablesReplacedUrl _url;
40     repo::ServiceType _type;
41     ReposToEnable _reposToEnable;
42     ReposToDisable _reposToDisable;
43     RepoStates _repoStates;
44     DefaultIntegral<Date::Duration,0> _ttl;
45     Date _lrf;
46
47   public:
48     Impl()
49     {}
50
51     Impl( const Url & url_r )
52     : _url( url_r )
53     {}
54
55     ~Impl()
56     {}
57
58     void setProbedType( const repo::ServiceType & type_r ) const
59     {
60       if ( _type == repo::ServiceType::NONE
61            && type_r != repo::ServiceType::NONE )
62       {
63         // lazy init!
64         const_cast<Impl*>(this)->_type = type_r;
65       }
66     }
67
68   private:
69     friend Impl * rwcowClone<Impl>( const Impl * rhs );
70
71     /** clone for RWCOW_pointer */
72     Impl * clone() const
73     { return new Impl( *this ); }
74   };
75   ///////////////////////////////////////////////////////////////////
76
77
78   ///////////////////////////////////////////////////////////////////
79   //
80   //  CLASS NAME : ServiceInfo::Impl
81   //
82   ///////////////////////////////////////////////////////////////////
83
84   const ServiceInfo ServiceInfo::noService;
85
86   ServiceInfo::ServiceInfo() : _pimpl( new Impl() ) {}
87
88   ServiceInfo::ServiceInfo(const string & alias)
89     : repo::RepoInfoBase(alias), _pimpl( new Impl() )
90   {}
91
92   ServiceInfo::ServiceInfo(const string & alias, const Url & url)
93     : repo::RepoInfoBase(alias), _pimpl( new Impl(url) )
94   {}
95
96   ServiceInfo::~ServiceInfo()
97   {}
98
99   Url ServiceInfo::url() const                  // Variables replaced
100   { return _pimpl->_url.transformed(); }
101
102   Url ServiceInfo::rawUrl() const               // Raw
103   { return _pimpl->_url.raw(); }
104
105   void ServiceInfo::setUrl( const Url& url )    // Raw
106   { _pimpl->_url.raw() = url; }
107
108   repo::ServiceType ServiceInfo::type() const                           { return _pimpl->_type; }
109   void ServiceInfo::setType( const repo::ServiceType & type )           { _pimpl->_type = type; }
110   void ServiceInfo::setProbedType( const repo::ServiceType &t ) const   { _pimpl->setProbedType( t ); }
111
112   Date::Duration ServiceInfo::ttl() const                       { return _pimpl->_ttl; }
113   void ServiceInfo::setTtl( Date::Duration ttl_r )              { _pimpl->_ttl = ttl_r; }
114   void ServiceInfo::setProbedTtl( Date::Duration ttl_r ) const  { const_cast<ServiceInfo*>(this)->setTtl( ttl_r ); }
115
116   Date ServiceInfo::lrf() const                                 { return _pimpl->_lrf; }
117   void ServiceInfo::setLrf( Date lrf_r )                        { _pimpl->_lrf = lrf_r; }
118
119   bool ServiceInfo::reposToEnableEmpty() const                                          { return _pimpl->_reposToEnable.empty(); }
120   ServiceInfo::ReposToEnable::size_type ServiceInfo::reposToEnableSize() const          { return _pimpl->_reposToEnable.size(); }
121   ServiceInfo::ReposToEnable::const_iterator ServiceInfo::reposToEnableBegin() const    { return _pimpl->_reposToEnable.begin(); }
122   ServiceInfo::ReposToEnable::const_iterator ServiceInfo::reposToEnableEnd() const      { return _pimpl->_reposToEnable.end(); }
123
124   bool ServiceInfo::repoToEnableFind( const std::string & alias_r ) const
125   { return( _pimpl->_reposToEnable.find( alias_r ) != _pimpl->_reposToEnable.end() ); }
126
127   void ServiceInfo::addRepoToEnable( const std::string & alias_r )
128   {
129     _pimpl->_reposToEnable.insert( alias_r );
130     _pimpl->_reposToDisable.erase( alias_r );
131   }
132
133   void ServiceInfo::delRepoToEnable( const std::string & alias_r )
134   { _pimpl->_reposToEnable.erase( alias_r ); }
135
136   void ServiceInfo::clearReposToEnable()
137   { _pimpl->_reposToEnable.clear(); }
138
139
140   bool ServiceInfo::reposToDisableEmpty() const                                         { return _pimpl->_reposToDisable.empty(); }
141   ServiceInfo::ReposToDisable::size_type ServiceInfo::reposToDisableSize() const        { return _pimpl->_reposToDisable.size(); }
142   ServiceInfo::ReposToDisable::const_iterator ServiceInfo::reposToDisableBegin() const  { return _pimpl->_reposToDisable.begin(); }
143   ServiceInfo::ReposToDisable::const_iterator ServiceInfo::reposToDisableEnd() const    { return _pimpl->_reposToDisable.end(); }
144
145   bool ServiceInfo::repoToDisableFind( const std::string & alias_r ) const
146   { return( _pimpl->_reposToDisable.find( alias_r ) != _pimpl->_reposToDisable.end() ); }
147
148   void ServiceInfo::addRepoToDisable( const std::string & alias_r )
149   {
150     _pimpl->_reposToDisable.insert( alias_r );
151     _pimpl->_reposToEnable.erase( alias_r );
152   }
153
154   void ServiceInfo::delRepoToDisable( const std::string & alias_r )
155   { _pimpl->_reposToDisable.erase( alias_r ); }
156
157   void ServiceInfo::clearReposToDisable()
158   { _pimpl->_reposToDisable.clear(); }
159
160
161   const ServiceInfo::RepoStates & ServiceInfo::repoStates() const       { return _pimpl->_repoStates; }
162   void ServiceInfo::setRepoStates( RepoStates newStates_r )             { swap( _pimpl->_repoStates, newStates_r ); }
163
164
165   std::ostream & operator<<( std::ostream & str, const ServiceInfo::RepoState & obj )
166   {
167     return str
168         << "enabled=" << obj.enabled << " "
169         << "autorefresh=" << obj.autorefresh << " "
170         << "priority=" << obj.priority;
171   }
172
173   std::ostream & ServiceInfo::dumpAsIniOn( std::ostream & str ) const
174   {
175     RepoInfoBase::dumpAsIniOn(str)
176       << "url = " << rawUrl() << endl
177       << "type = " << type() << endl;
178
179     if ( ttl() )
180       str << "ttl_sec = " << ttl() << endl;
181
182     if ( lrf() )
183       str << "lrf_dat = " << lrf().asSeconds() << endl;
184
185     if ( ! repoStates().empty() )
186     {
187       unsigned cnt = 0U;
188       for ( const auto & el : repoStates() )
189       {
190         std::string tag( "repo_" );
191         tag += str::numstring( ++cnt );
192         const RepoState & state( el.second );
193
194         str << tag << "=" << el.first << endl
195             << tag << "_enabled=" << state.enabled << endl
196             << tag << "_autorefresh=" << state.autorefresh << endl;
197         if ( state.priority != RepoInfo::defaultPriority() )
198           str
199             << tag << "_priority=" << state.priority << endl;
200       }
201     }
202
203     if ( ! reposToEnableEmpty() )
204       str << "repostoenable = " << str::joinEscaped( reposToEnableBegin(), reposToEnableEnd() ) << endl;
205     if ( ! reposToDisableEmpty() )
206       str << "repostodisable = " << str::joinEscaped( reposToDisableBegin(), reposToDisableEnd() ) << endl;
207     return str;
208   }
209
210   ostream & ServiceInfo::dumpAsXmlOn( ostream & str, const string & content ) const
211   {
212     str
213       << "<service"
214       << " alias=\"" << escape(alias()) << "\""
215       << " name=\"" << escape(name()) << "\""
216       << " enabled=\"" << enabled() << "\""
217       << " autorefresh=\"" << autorefresh() << "\""
218       << " url=\"" << escape(url().asString()) << "\""
219       << " type=\"" << type().asString() << "\""
220       << " ttl_sec=\"" << ttl() << "\"";
221
222     if (content.empty())
223       str << "/>" << endl;
224     else
225       str << ">" << endl << content << "</service>" << endl;
226
227     return str;
228   }
229
230
231   std::ostream & operator<<( std::ostream& str, const ServiceInfo &obj )
232   {
233     return obj.dumpAsIniOn(str);
234   }
235
236
237 ///////////////////////////////////////////////////////////////////////////////
238 } //namespace zypp
239 ///////////////////////////////////////////////////////////////////////////////