ServiceFileReader.cc
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00012 #include <iostream>
00013 #include "zypp/base/Logger.h"
00014 #include "zypp/base/String.h"
00015 #include "zypp/base/InputStream.h"
00016 #include "zypp/base/UserRequestException.h"
00017
00018 #include "zypp/parser/IniDict.h"
00019 #include "zypp/parser/ServiceFileReader.h"
00020 #include "zypp/ServiceInfo.h"
00021
00022 using std::endl;
00023 using zypp::parser::IniDict;
00024
00026 namespace zypp
00027 {
00028
00029 namespace parser
00030 {
00031
00032 class ServiceFileReader::Impl
00033 {
00034 public:
00035 static void parseServices( const Pathname & file,
00036 const ServiceFileReader::ProcessService & callback );
00037 };
00038
00039 void ServiceFileReader::Impl::parseServices( const Pathname & file,
00040 const ServiceFileReader::ProcessService & callback
00041 )
00042 {
00043 InputStream is(file);
00044 if( is.stream().fail() )
00045 {
00046 ZYPP_THROW(Exception("Failed to open service file"));
00047 }
00048
00049 parser::IniDict dict(is);
00050 for ( parser::IniDict::section_const_iterator its = dict.sectionsBegin();
00051 its != dict.sectionsEnd();
00052 ++its )
00053 {
00054 MIL << (*its) << endl;
00055
00056 ServiceInfo service(*its);
00057
00058 for ( IniDict::entry_const_iterator it = dict.entriesBegin(*its);
00059 it != dict.entriesEnd(*its);
00060 ++it )
00061 {
00062
00063 if ( it->first == "name" )
00064 service.setName( it->second );
00065 else if ( it->first == "url" && ! it->second.empty() )
00066 service.setUrl( Url (it->second) );
00067 else if ( it->first == "enabled" )
00068 service.setEnabled( str::strToTrue( it->second ) );
00069 else if ( it->first == "autorefresh" )
00070 service.setAutorefresh( str::strToTrue( it->second ) );
00071 else if ( it->first == "type" )
00072 service.setType( repo::ServiceType(it->second) );
00073 else if ( it->first == "repostoenable" )
00074 {
00075 std::vector<std::string> aliases;
00076 str::splitEscaped( it->second, std::back_inserter(aliases) );
00077 for_( ait, aliases.begin(), aliases.end() )
00078 {
00079 service.addRepoToEnable( *ait );
00080 }
00081 }
00082 else if ( it->first == "repostodisable" )
00083 {
00084 std::vector<std::string> aliases;
00085 str::splitEscaped( it->second, std::back_inserter(aliases) );
00086 for_( ait, aliases.begin(), aliases.end() )
00087 {
00088 service.addRepoToDisable( *ait );
00089 }
00090 }
00091 else
00092 ERR << "Unknown attribute " << it->first << " ignored" << endl;
00093 }
00094
00095 MIL << "Linking ServiceInfo with file " << file << endl;
00096 service.setFilepath(file);
00097
00098
00099 if ( !callback(service) )
00100 ZYPP_THROW(AbortRequestException());
00101 }
00102 }
00103
00105
00106
00107
00109
00110 ServiceFileReader::ServiceFileReader( const Pathname & repo_file,
00111 const ProcessService & callback
00112 )
00113 {
00114 Impl::parseServices(repo_file, callback);
00115
00116 }
00117
00118 ServiceFileReader::~ServiceFileReader()
00119 {}
00120
00121 std::ostream & operator<<( std::ostream & str, const ServiceFileReader & obj )
00122 {
00123 return str;
00124 }
00125
00127 }
00130 }