1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/parser/RepoFileReader.cc
13 #include "zypp/base/Logger.h"
14 #include "zypp/base/String.h"
15 #include "zypp/base/InputStream.h"
16 #include "zypp/base/UserRequestException.h"
18 #include "zypp/parser/IniDict.h"
19 #include "zypp/parser/ServiceFileReader.h"
20 #include "zypp/ServiceInfo.h"
23 using zypp::parser::IniDict;
25 ///////////////////////////////////////////////////////////////////
27 { /////////////////////////////////////////////////////////////////
28 ///////////////////////////////////////////////////////////////////
30 { /////////////////////////////////////////////////////////////////
32 class ServiceFileReader::Impl
35 static void parseServices( const Pathname & file,
36 const ServiceFileReader::ProcessService & callback );
39 void ServiceFileReader::Impl::parseServices( const Pathname & file,
40 const ServiceFileReader::ProcessService & callback/*,
41 const ProgressData::ReceiverFnc &progress*/ )
44 if( is.stream().fail() )
46 ZYPP_THROW(Exception("Failed to open service file"));
49 parser::IniDict dict(is);
50 for ( parser::IniDict::section_const_iterator its = dict.sectionsBegin();
51 its != dict.sectionsEnd();
54 MIL << (*its) << endl;
56 ServiceInfo service(*its);
58 for ( IniDict::entry_const_iterator it = dict.entriesBegin(*its);
59 it != dict.entriesEnd(*its);
62 // MIL << (*it).first << endl;
63 if ( it->first == "name" )
64 service.setName( it->second );
65 else if ( it->first == "url" )
66 service.setUrl( Url (it->second) );
67 else if ( it->first == "enabled" )
68 service.setEnabled( str::strToTrue( it->second ) );
69 else if ( it->first == "autorefresh" )
70 service.setAutorefresh( str::strToTrue( it->second ) );
71 else if ( it->first == "type" )
72 service.setType( repo::ServiceType(it->second) );
73 else if ( it->first == "repostoenable" )
75 std::vector<std::string> aliases;
76 str::splitEscaped( it->second, std::back_inserter(aliases) );
77 for_( ait, aliases.begin(), aliases.end() )
79 service.addRepoToEnable( *ait );
82 else if ( it->first == "repostodisable" )
84 std::vector<std::string> aliases;
85 str::splitEscaped( it->second, std::back_inserter(aliases) );
86 for_( ait, aliases.begin(), aliases.end() )
88 service.addRepoToDisable( *ait );
92 ERR << "Unknown attribute " << it->first << " ignored" << endl;
95 MIL << "Linking ServiceInfo with file " << file << endl;
96 service.setFilepath(file);
98 // add it to the list.
99 if ( !callback(service) )
100 ZYPP_THROW(AbortRequestException());
104 ///////////////////////////////////////////////////////////////////
106 // CLASS NAME : RepoFileReader
108 ///////////////////////////////////////////////////////////////////
110 ServiceFileReader::ServiceFileReader( const Pathname & repo_file,
111 const ProcessService & callback/*,
112 const ProgressData::ReceiverFnc &progress */)
114 Impl::parseServices(repo_file, callback/*, progress*/);
115 //MIL << "Done" << endl;
118 ServiceFileReader::~ServiceFileReader()
121 std::ostream & operator<<( std::ostream & str, const ServiceFileReader & obj )
126 /////////////////////////////////////////////////////////////////
127 } // namespace parser
128 ///////////////////////////////////////////////////////////////////
129 /////////////////////////////////////////////////////////////////
131 ///////////////////////////////////////////////////////////////////