13 #include <unordered_map>
31 #undef ZYPP_BASE_LOGGER_LOGGROUP
32 #define ZYPP_BASE_LOGGER_LOGGROUP "parser"
50 void setVar(
const std::string & key_r,
const std::string & val_r )
53 _vars[key_r] = replace( val_r );
57 std::string replace(
const std::string & val_r )
const
60 if ( vbeg == std::string::npos )
65 for( ; vbeg != std::string::npos; vbeg = val_r.find(
"%{", vbeg ) )
69 if ( nend == std::string::npos )
71 WAR <<
"Incomplete variable in '" << val_r <<
"'" << endl;
74 const auto & iter =
_vars.find( val_r.substr( nbeg, nend-nbeg ) );
75 if ( iter !=
_vars.end() )
78 ret << val_r.substr( cbeg, vbeg-cbeg );
83 WAR <<
"Undefined variable %{" << val_r.substr( nbeg, nend-nbeg ) <<
"} in '" << val_r <<
"'" << endl;
86 if ( cbeg < val_r.size() )
87 ret << val_r.substr( cbeg );
92 std::unordered_map<std::string,std::string>
_vars;
119 bool getAttrValue(
const std::string & key_r, Reader & reader_r, std::string & value_r )
121 const XmlString & s( reader_r->getAttribute( key_r ) );
124 value_r =
_replacer.replace( s.asString() );
125 return !value_r.empty();
143 MIL <<
"Reading " << is.
path() << endl;
162 if ( reader_r->nodeType() == XML_READER_TYPE_ELEMENT )
165 if ( reader_r->name() ==
"repoindex" )
167 while ( reader_r.nextNodeAttribute() )
169 const std::string & name( reader_r->localName().asString() );
170 const std::string & value( reader_r->value().asString() );
171 _replacer.setVar( name, value );
174 _ttl = str::strtonum<Date::Duration>(value);
180 if ( reader_r->name() ==
"repo" )
187 std::string attrValue;
191 if ( getAttrValue(
"alias", reader_r, attrValue ) )
194 _replacer.setVar(
"alias", attrValue );
204 getAttrValue(
"url", reader_r, urlstr );
205 getAttrValue(
"path", reader_r, pathstr );
206 if ( urlstr.empty() )
208 if ( pathstr.empty() )
211 info.
setPath( Pathname(
"/repo") / pathstr );
215 if ( pathstr.empty() )
227 if ( getAttrValue(
"name", reader_r, attrValue ) )
231 if ( getAttrValue(
"distro_target", reader_r, attrValue ) )
235 if ( getAttrValue(
"priority", reader_r, attrValue ) )
236 info.
setPriority( str::strtonum<unsigned>( attrValue ) );
240 if ( getAttrValue(
"enabled", reader_r, attrValue ) )
244 if ( getAttrValue(
"autorefresh", reader_r, attrValue ) )
270 : _pimpl(new
Impl(is, callback))