libzypp  15.28.6
ServiceFileReader.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #include <iostream>
13 #include "zypp/base/Logger.h"
14 #include "zypp/base/String.h"
15 #include "zypp/base/Regex.h"
16 #include "zypp/base/InputStream.h"
18 
19 #include "zypp/parser/IniDict.h"
21 #include "zypp/ServiceInfo.h"
22 
23 using std::endl;
25 
27 namespace zypp
28 {
29  namespace parser
31  {
32 
34  {
35  public:
36  static void parseServices( const Pathname & file,
37  const ServiceFileReader::ProcessService & callback );
38  };
39 
40  void ServiceFileReader::Impl::parseServices( const Pathname & file,
41  const ServiceFileReader::ProcessService & callback/*,
42  const ProgressData::ReceiverFnc &progress*/ )
43  {
44  InputStream is(file);
45  if( is.stream().fail() )
46  {
47  ZYPP_THROW(Exception("Failed to open service file"));
48  }
49 
50  parser::IniDict dict(is);
52  its != dict.sectionsEnd();
53  ++its )
54  {
55  MIL << (*its) << endl;
56 
57  ServiceInfo service(*its);
58  std::map<std::string,std::pair<std::string,ServiceInfo::RepoState>> repoStates; // <repo_NUM,< alias,RepoState >>
59 
60  for ( IniDict::entry_const_iterator it = dict.entriesBegin(*its);
61  it != dict.entriesEnd(*its);
62  ++it )
63  {
64  // MIL << (*it).first << endl;
65  if ( it->first == "name" )
66  service.setName( it->second );
67  else if ( it->first == "url" && ! it->second.empty() )
68  service.setUrl( Url (it->second) );
69  else if ( it->first == "enabled" )
70  service.setEnabled( str::strToTrue( it->second ) );
71  else if ( it->first == "autorefresh" )
72  service.setAutorefresh( str::strToTrue( it->second ) );
73  else if ( it->first == "type" )
74  service.setType( repo::ServiceType(it->second) );
75  else if ( it->first == "ttl_sec" )
76  service.setTtl( str::strtonum<Date::Duration>(it->second) );
77  else if ( it->first == "lrf_dat" )
78  service.setLrf( Date( it->second ) );
79  else if ( it->first == "repostoenable" )
80  {
81  std::vector<std::string> aliases;
82  str::splitEscaped( it->second, std::back_inserter(aliases) );
83  for_( ait, aliases.begin(), aliases.end() )
84  {
85  service.addRepoToEnable( *ait );
86  }
87  }
88  else if ( it->first == "repostodisable" )
89  {
90  std::vector<std::string> aliases;
91  str::splitEscaped( it->second, std::back_inserter(aliases) );
92  for_( ait, aliases.begin(), aliases.end() )
93  {
94  service.addRepoToDisable( *ait );
95  }
96  }
97  else if ( str::startsWith( it->first, "repo_" ) )
98  {
99  static str::regex rxexpr( "([0-9]+)(_(.*))?" );
100  str::smatch what;
101  if ( str::regex_match( it->first.c_str()+5/*repo_*/, what, rxexpr ) )
102  {
103  std::string tag( what[1] );
104  if ( what.size() > 3 )
105  {
106  // attribute
107  if ( what[3] == "enabled" )
108  repoStates[tag].second.enabled = str::strToBool( it->second, repoStates[tag].second.enabled );
109  else if ( what[3] == "autorefresh" )
110  repoStates[tag].second.autorefresh = str::strToBool( it->second, repoStates[tag].second.autorefresh );
111  else if ( what[3] == "priority" )
112  str::strtonum( it->second, repoStates[tag].second.priority );
113  else
114  ERR << "Unknown attribute " << it->first << " ignored" << endl;
115  }
116  else
117  {
118  // alias
119  repoStates[tag].first = it->second;
120  }
121  }
122  else
123  ERR << "Unknown attribute " << it->first << " ignored" << endl;
124  }
125  else
126  ERR << "Unknown attribute " << it->first << " ignored" << endl;
127  }
128 
129  if ( ! repoStates.empty() )
130  {
132  for ( const auto & el : repoStates )
133  {
134  if ( el.second.first.empty() )
135  ERR << "Missing alias for repo_" << el.first << "; ignore entry" << endl;
136  else
137  data[el.second.first] = el.second.second;
138  }
139  if ( ! data.empty() )
140  service.setRepoStates( std::move(data) );
141  }
142 
143  MIL << "Linking ServiceInfo with file " << file << endl;
144  service.setFilepath(file);
145 
146  // add it to the list.
147  if ( !callback(service) )
148  ZYPP_THROW(AbortRequestException());
149  }
150  }
151 
153  //
154  // CLASS NAME : RepoFileReader
155  //
157 
158  ServiceFileReader::ServiceFileReader( const Pathname & repo_file,
159  const ProcessService & callback/*,
160  const ProgressData::ReceiverFnc &progress */)
161  {
162  Impl::parseServices(repo_file, callback/*, progress*/);
163  //MIL << "Done" << endl;
164  }
165 
167  {}
168 
169  std::ostream & operator<<( std::ostream & str, const ServiceFileReader & obj )
170  {
171  return str;
172  }
173 
175  } // namespace parser
178 } // namespace zypp
unsigned splitEscaped(const C_Str &line_r, TOutputIterator result_r, const C_Str &sepchars_r=" \t", bool withEmpty=false)
Split line_r into words with respect to escape delimeters.
Definition: String.h:577
Service data.
Definition: ServiceInfo.h:36
#define MIL
Definition: Logger.h:64
MapKVIteratorTraits< SectionSet >::Key_const_iterator section_const_iterator
Definition: IniDict.h:46
Read service data from a .service file.
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
Definition: Exception.h:321
void setAutorefresh(bool autorefresh)
enable or disable autorefresh
Definition: RepoInfoBase.cc:91
Regular expression.
Definition: Regex.h:86
ServiceFileReader(const Pathname &serviceFile, const ProcessService &callback)
Constructor.
friend std::ostream & operator<<(std::ostream &str, const ServiceFileReader &obj)
void setTtl(Date::Duration ttl_r)
Set sugested TTL.
Definition: ServiceInfo.cc:113
void setEnabled(bool enabled)
enable or disable the repository
Definition: RepoInfoBase.cc:88
void addRepoToEnable(const std::string &alias_r)
Add alias_r to the set of ReposToEnable.
Definition: ServiceInfo.cc:127
void setFilepath(const Pathname &filename)
set the path to the .repo file
Helper to create and pass std::istream.
Definition: InputStream.h:56
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
Definition: Easy.h:27
void setType(const repo::ServiceType &type)
Set service type.
Definition: ServiceInfo.cc:109
static void parseServices(const Pathname &file, const ServiceFileReader::ProcessService &callback)
#define ERR
Definition: Logger.h:66
std::map< std::string, RepoState > RepoStates
Definition: ServiceInfo.h:185
unsigned size() const
Definition: Regex.cc:95
Store and operate on date (time_t).
Definition: Date.h:32
Service type enumeration.
Definition: ServiceType.h:26
void setRepoStates(RepoStates newStates_r)
Remember a new set of repository states.
Definition: ServiceInfo.cc:162
section_const_iterator sectionsBegin() const
Definition: IniDict.cc:94
bool startsWith(const C_Str &str_r, const C_Str &prefix_r)
alias for hasPrefix
Definition: String.h:1066
TInt strtonum(const C_Str &str)
Parsing numbers from string.
Definition: String.h:403
entry_const_iterator entriesEnd(const std::string &section) const
Definition: IniDict.cc:82
function< bool(const ServiceInfo &)> ProcessService
Callback definition.
std::istream & stream() const
The std::istream.
Definition: InputStream.h:93
void setUrl(const Url &url)
Set the service url (raw value)
Definition: ServiceInfo.cc:105
void setLrf(Date lrf_r)
Set date of last refresh.
Definition: ServiceInfo.cc:117
Parses a INI file and offers its structure as a dictionary.
Definition: IniDict.h:40
bool strToTrue(const C_Str &str)
Parsing boolean from string.
Definition: String.cc:63
Regular expression match result.
Definition: Regex.h:145
entry_const_iterator entriesBegin(const std::string &section) const
Definition: IniDict.cc:71
Base class for Exception.
Definition: Exception.h:143
bool strToBool(const C_Str &str, bool default_r)
Parse str into a bool depending on the default value.
Definition: String.h:444
bool regex_match(const std::string &s, smatch &matches, const regex &regex)
regex ZYPP_STR_REGEX regex ZYPP_STR_REGEX
Definition: Regex.h:70
void addRepoToDisable(const std::string &alias_r)
Add alias_r to the set of ReposToDisable.
Definition: ServiceInfo.cc:148
EntrySet::const_iterator entry_const_iterator
Definition: IniDict.h:47
void setName(const std::string &name)
set the repository name
Definition: RepoInfoBase.cc:97
section_const_iterator sectionsEnd() const
Definition: IniDict.cc:99
Url manipulation class.
Definition: Url.h:87