From fa8f88c5b306834144b34dff9b71cdfe056923ac Mon Sep 17 00:00:00 2001 From: DongHun Kwak Date: Tue, 1 Nov 2016 10:40:46 +0900 Subject: [PATCH] Imported Upstream version 15.1.0 Change-Id: I8ffe70a8fd40ed7c14d671b5f60326d1866c485e Signed-off-by: DongHun Kwak --- CMakeLists.txt | 4 ++-- VERSION.cmake | 6 +++--- package/libzypp.changes | 12 ++++++++++++ tools/zypp-NameReqPrv.cc | 5 +++-- zypp/DiskUsageCounter.h | 21 --------------------- zypp/PathInfo.cc | 9 ++------- zypp/PathInfo.h | 6 ------ zypp/RepoInfo.cc | 15 ++++++++++----- zypp/RepoInfo.h | 4 ++++ zypp/ZYpp.cc | 21 ++------------------- zypp/ZYpp.h | 26 ++++++++++++-------------- zypp/ZYppCallbacks.h | 17 ----------------- zypp/ZYppFactory.cc | 2 +- zypp/base/Debug.h | 2 ++ zypp/base/LogControl.cc | 37 +++++++++++++++++++++++++++++++++++++ zypp/base/Logger.h | 21 +++++++++++++++++++-- zypp/parser/RepoFileReader.cc | 2 ++ zypp/repo/RepoMirrorList.cc | 23 ++++++++++++++--------- zypp/repo/RepoMirrorList.h | 6 +++++- 19 files changed, 130 insertions(+), 109 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 47786d4..f9023c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,8 +55,8 @@ CHECK_CXX_COMPILER_FLAG("-Werror=format-security" CXX_FORMAT_SECURITY) SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden -fno-strict-aliasing -fPIC -g -rdynamic -Wall -Woverloaded-virtual -Wnon-virtual-dtor -Wl,-as-needed -std=c++11" ) SET( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-strict-aliasing -fPIC -g -rdynamic -Wall -Wl,-as-needed" ) -set( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -O3" ) -set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O3" ) +set( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -O3 -DZYPP_NDEBUG" ) +set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O3 -DZYPP_NDEBUG" ) IF(${CC_FORMAT_SECURITY}) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror=format-security") diff --git a/VERSION.cmake b/VERSION.cmake index 738ddfd..999a2a7 100644 --- a/VERSION.cmake +++ b/VERSION.cmake @@ -59,10 +59,10 @@ # See './mkChangelog -h' for help. # SET(LIBZYPP_MAJOR "15") -SET(LIBZYPP_COMPATMINOR "0") -SET(LIBZYPP_MINOR "0") +SET(LIBZYPP_COMPATMINOR "1") +SET(LIBZYPP_MINOR "1") SET(LIBZYPP_PATCH "0") # -# LAST RELEASED: 15.0.0 (0) +# LAST RELEASED: 15.1.0 (1) # (The number in parenthesis is LIBZYPP_COMPATMINOR) #======= diff --git a/package/libzypp.changes b/package/libzypp.changes index 3763aa8..c5583f0 100644 --- a/package/libzypp.changes +++ b/package/libzypp.changes @@ -1,4 +1,16 @@ ------------------------------------------------------------------- +Wed Apr 22 10:50:00 CEST 2015 - ma@suse.de + +- ZYpp: Changed ZYpp::Ptr to be a shared_ptr; + a precondition for fixing bnc-899755 +- rpmmd: support 'metalink=' in .repo (for zypper#63) +- RepoMirrorList: ignore comments and malformed urls in mirrorlist +- PathInfo: remove minor/major conflicting with GNU libc macros + DiskUsageCounter: remove ctors taking 'magic' bool flags + ZyppCallbacks: remove unused PatchDownload callbacks +- version 15.1.0 (1) + +------------------------------------------------------------------- Thu Apr 2 19:06:56 CEST 2015 - ma@suse.de - POODLE: libzypp should only talk TLS (bnc#903405) diff --git a/tools/zypp-NameReqPrv.cc b/tools/zypp-NameReqPrv.cc index da23d21..ae041a2 100644 --- a/tools/zypp-NameReqPrv.cc +++ b/tools/zypp-NameReqPrv.cc @@ -289,13 +289,14 @@ int main( int argc, char * argv[] ) { tableOut( str::numstring( it->id() ), it->asString(), str::form( "(%d)%s", it->repository().info().priority(), it->repository().name().c_str() ), - it->vendor().asString(), str::numstring( PoolItem(*it)->buildtime() ) ); + tableOut( "", "", + it->vendor().asString() ); if ( ! it.matchesEmpty() ) { for_( match, it.matchesBegin(), it.matchesEnd() ) { - tableOut( "", "", "", match->inSolvAttr().asString().substr( 9, 3 )+": " +match->asString() ); + tableOut( "", "", match->inSolvAttr().asString().substr( 9, 3 )+": " +match->asString() ); } } } diff --git a/zypp/DiskUsageCounter.h b/zypp/DiskUsageCounter.h index 224bac1..52ee980 100644 --- a/zypp/DiskUsageCounter.h +++ b/zypp/DiskUsageCounter.h @@ -116,27 +116,6 @@ namespace zypp : MountPoint( std::string(d?d:""), HintFlags(hint) ) {} - - /** \deprecated Use HintFlags instead of a trailing 'bool ro' argument. - * \code - * - MountPoint( "/usr", ..., true ); // readonly - * + MountPoint( "/usr", ..., MountPoint::Hint_readonly ); - * \endcode - */ - ZYPP_DEPRECATED MountPoint( const std::string & d, long long bs, long long total, long long used, long long pkg, bool ro ) - : MountPoint( d, bs, total, used, pkg, HintFlags(ro?Hint_readonly:NoHint) ) - {} - /** \deprecated Use HintFlags instead of a trailing 'bool ro' argument. - * \code - * - MountPoint( "/usr", ..., true ); // readonly - * + MountPoint( "/usr", ..., MountPoint::Hint_readonly ); - * \endcode - */ - ZYPP_DEPRECATED MountPoint( const char * d, long long bs, long long total, long long used, long long pkg, bool ro ) - : MountPoint( d, bs, total, used, pkg, HintFlags(ro?Hint_readonly:NoHint) ) - {} - - /** Sort by directory name */ bool operator<( const MountPoint & rhs ) const { return dir < rhs.dir; } diff --git a/zypp/PathInfo.cc b/zypp/PathInfo.cc index 08c1a10..eecff00 100644 --- a/zypp/PathInfo.cc +++ b/zypp/PathInfo.cc @@ -241,7 +241,7 @@ namespace zypp */ unsigned int PathInfo::devMajor() const { - return isBlk() || isChr() ? ::major(statbuf_C.st_rdev) : 0; + return isBlk() || isChr() ? major(statbuf_C.st_rdev) : 0; } /****************************************************************** @@ -251,14 +251,9 @@ namespace zypp */ unsigned int PathInfo::devMinor() const { - return isBlk() || isChr() ? ::minor(statbuf_C.st_rdev) : 0; + return isBlk() || isChr() ? minor(statbuf_C.st_rdev) : 0; } - unsigned int PathInfo::major() const - { INT << "Cleanup the code: This method is deprecated" << endl; return devMajor(); } - unsigned int PathInfo::minor() const - { INT << "Cleanup the code: This method is deprecated" << endl; return devMinor(); } - /****************************************************************** ** ** FUNCTION NAME : operator<< diff --git a/zypp/PathInfo.h b/zypp/PathInfo.h index 248614f..0a189cb 100644 --- a/zypp/PathInfo.h +++ b/zypp/PathInfo.h @@ -27,7 +27,6 @@ extern "C" #include #include -#include "zypp/APIConfig.h" #include "zypp/Pathname.h" #include "zypp/CheckSum.h" #include "zypp/ByteCount.h" @@ -362,11 +361,6 @@ namespace zypp unsigned int devMajor() const; unsigned int devMinor() const; - - /** \deprecated Name clashes with GNU libc macro, use \ref devMajor instead. */ - unsigned int major() const ZYPP_DEPRECATED; - /** \deprecated Name clashes with GNU libc macro, use \ref devMinor instead. */ - unsigned int minor() const ZYPP_DEPRECATED; //@} /** \name Size info. */ diff --git a/zypp/RepoInfo.cc b/zypp/RepoInfo.cc index 0ad8cf4..3e8f523 100644 --- a/zypp/RepoInfo.cc +++ b/zypp/RepoInfo.cc @@ -44,6 +44,7 @@ namespace zypp Impl() : gpgcheck(indeterminate) , keeppackages(indeterminate) + , _mirrorListForceMetalink(false) , type(repo::RepoType::NONE_e) , emptybaseurls(false) {} @@ -75,7 +76,7 @@ namespace zypp { emptybaseurls = true; DBG << "MetadataPath: " << metadatapath << endl; - repo::RepoMirrorList rmurls( mlurl, metadatapath ); + repo::RepoMirrorList rmurls( mlurl, metadatapath, _mirrorListForceMetalink ); _baseUrls.raw().insert( _baseUrls.raw().end(), rmurls.getUrls().begin(), rmurls.getUrls().end() ); } return _baseUrls; @@ -141,6 +142,7 @@ namespace zypp TriBool keeppackages; RepoVariablesReplacedUrl _gpgKeyUrl; RepoVariablesReplacedUrl _mirrorListUrl; + bool _mirrorListForceMetalink; repo::RepoType type; Pathname path; std::string service; @@ -208,7 +210,10 @@ namespace zypp { _pimpl->gpgcheck = check; } void RepoInfo::setMirrorListUrl( const Url & url_r ) // Raw - { _pimpl->_mirrorListUrl.raw() = url_r; } + { _pimpl->_mirrorListUrl.raw() = url_r; _pimpl->_mirrorListForceMetalink = false; } + + void RepoInfo::setMetalinkUrl( const Url & url_r ) // Raw + { _pimpl->_mirrorListUrl.raw() = url_r; _pimpl->_mirrorListForceMetalink = true; } void RepoInfo::setGpgKeyUrl( const Url & url_r ) { _pimpl->_gpgKeyUrl.raw() = url_r; } @@ -450,7 +455,7 @@ namespace zypp str << tag_r << value_r << std::endl; }); - strif( "- mirrorlist : ", rawMirrorListUrl().asString() ); + strif( (_pimpl->_mirrorListForceMetalink ? "- metalink : " : "- mirrorlist : "), rawMirrorListUrl().asString() ); strif( "- path : ", path().asString() ); str << "- type : " << type() << std::endl; str << "- priority : " << priority() << std::endl; @@ -487,7 +492,7 @@ namespace zypp str << "path="<< path() << endl; if ( ! (rawMirrorListUrl().asString().empty()) ) - str << "mirrorlist=" << rawMirrorListUrl() << endl; + str << (_pimpl->_mirrorListForceMetalink ? "metalink=" : "mirrorlist=") << rawMirrorListUrl() << endl; str << "type=" << type().asString() << endl; @@ -526,7 +531,7 @@ namespace zypp if (!(tmpstr = gpgKeyUrl().asString()).empty()) str << " gpgkey=\"" << escape(tmpstr) << "\""; if (!(tmpstr = mirrorListUrl().asString()).empty()) - str << " mirrorlist=\"" << escape(tmpstr) << "\""; + str << (_pimpl->_mirrorListForceMetalink ? " metalink=\"" : " mirrorlist=\"") << escape(tmpstr) << "\""; str << ">" << endl; if ( _pimpl->baseurl2dump() ) diff --git a/zypp/RepoInfo.h b/zypp/RepoInfo.h index be80cf4..bd12e4a 100644 --- a/zypp/RepoInfo.h +++ b/zypp/RepoInfo.h @@ -195,6 +195,10 @@ namespace zypp * \param url The base url for the list */ void setMirrorListUrl( const Url &url ); + /** + * Like \ref setMirrorListUrl but expect metalink format. + */ + void setMetalinkUrl( const Url &url ); /** * Type of repository, diff --git a/zypp/ZYpp.cc b/zypp/ZYpp.cc index ffa5895..babffdf 100644 --- a/zypp/ZYpp.cc +++ b/zypp/ZYpp.cc @@ -23,32 +23,15 @@ using std::endl; namespace zypp { ///////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////// - // - // METHOD NAME : ZYpp::ZYpp - // METHOD TYPE : Ctor - // ZYpp::ZYpp( const Impl_Ptr & impl_r ) : _pimpl( impl_r ) {} - /////////////////////////////////////////////////////////////////// - // - // METHOD NAME : ZYpp::~ZYpp - // METHOD TYPE : Dtor - // ZYpp::~ZYpp() {} - /////////////////////////////////////////////////////////////////// - // - // METHOD NAME : ZYpp::dumpOn - // METHOD TYPE : std::ostream & - // - std::ostream & ZYpp::dumpOn( std::ostream & str ) const - { - return str << *_pimpl; - } + std::ostream & operator<<( std::ostream & str, const ZYpp & obj ) + { return str << *obj._pimpl; } /////////////////////////////////////////////////////////////////// // diff --git a/zypp/ZYpp.h b/zypp/ZYpp.h index f193f97..46af218 100644 --- a/zypp/ZYpp.h +++ b/zypp/ZYpp.h @@ -14,7 +14,6 @@ #include -#include "zypp/base/ReferenceCounted.h" #include "zypp/base/NonCopyable.h" #include "zypp/base/PtrTypes.h" #include "zypp/APIConfig.h" @@ -52,12 +51,14 @@ namespace zypp * \todo define Exceptions * ZYpp API main interface */ - class ZYpp : public base::ReferenceCounted, private base::NonCopyable + class ZYpp : private base::NonCopyable { - public: + friend std::ostream & operator<<( std::ostream & str, const ZYpp & obj ); - typedef intrusive_ptr Ptr; - typedef intrusive_ptr constPtr; + public: + // can't get swig working if shared_ptr is without namespace here + typedef ::boost::shared_ptr Ptr; + typedef ::boost::shared_ptr constPtr; public: @@ -139,21 +140,18 @@ namespace zypp /** set the home, if you need to change it */ void setHomePath( const Pathname & path ); - protected: - /** Dtor */ - virtual ~ZYpp(); - /** Stream output */ - virtual std::ostream & dumpOn( std::ostream & str ) const; private: /** Factory */ friend class ZYppFactory; - - /** */ typedef zypp_detail::ZYppImpl Impl; typedef shared_ptr Impl_Ptr; /** Factory ctor */ - explicit - ZYpp( const Impl_Ptr & impl_r ); + explicit ZYpp( const Impl_Ptr & impl_r ); + private: + /** Deleted via shared_ptr */ + friend void ::boost::checked_delete(ZYpp*); // template inline void checked_delete(T * x) + /** Dtor */ + ~ZYpp(); private: /** Pointer to implementation */ RW_pointer _pimpl; diff --git a/zypp/ZYppCallbacks.h b/zypp/ZYppCallbacks.h index 27b0c4f..9727486 100644 --- a/zypp/ZYppCallbacks.h +++ b/zypp/ZYppCallbacks.h @@ -157,23 +157,6 @@ namespace zypp virtual void finishDeltaApply() {} - /** \deprecated Unused since 2008 */ - virtual ZYPP_DEPRECATED void startPatchDownload( const Pathname & /*filename*/, const ByteCount & /*downloadsize*/ ) - {} - - /** \deprecated Unused since 2008 */ - virtual ZYPP_DEPRECATED bool progressPatchDownload( int /*value*/ ) - { return true; } - - /** \deprecated Unused since 2008 */ - virtual ZYPP_DEPRECATED void problemPatchDownload( const std::string &/*description*/ ) - {} - - /** \deprecated Unused since 2008 */ - virtual ZYPP_DEPRECATED void finishPatchDownload() - {} - - // return false if the download should be aborted right now virtual bool progress(int /*value*/, Resolvable::constPtr /*resolvable_ptr*/) { return true; } diff --git a/zypp/ZYppFactory.cc b/zypp/ZYppFactory.cc index 45fc1c2..10ff5ff 100644 --- a/zypp/ZYppFactory.cc +++ b/zypp/ZYppFactory.cc @@ -400,7 +400,7 @@ namespace zypp } } // Here we go... - _instance = new ZYpp( ZYpp::Impl_Ptr(new ZYpp::Impl) ); + _instance.reset( new ZYpp( ZYpp::Impl_Ptr(new ZYpp::Impl) ) ); if ( _instance ) _haveZYpp = true; } diff --git a/zypp/base/Debug.h b/zypp/base/Debug.h index e19d94f..2f8e475 100644 --- a/zypp/base/Debug.h +++ b/zypp/base/Debug.h @@ -10,6 +10,7 @@ * * Debuging tools which should not be used in released code. */ +#ifndef ZYPP_NDEBUG #warning ZYPP_BASE_DEBUG_H included #ifndef ZYPP_BASE_DEBUG_H #define ZYPP_BASE_DEBUG_H @@ -170,3 +171,4 @@ namespace zypp } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_DEBUG_H +#endif // ZYPP_NDEBUG diff --git a/zypp/base/LogControl.cc b/zypp/base/LogControl.cc index 03080bb..3dda602 100644 --- a/zypp/base/LogControl.cc +++ b/zypp/base/LogControl.cc @@ -26,6 +26,43 @@ using std::endl; namespace zypp { ///////////////////////////////////////////////////////////////// +#ifndef ZYPP_NDEBUG + namespace debug + { + void osdlog( const std::string & msg_r, unsigned level_r ) + { + // Fg::Black: 30 Bg: 40 Attr::Normal: 22;27 + // Fg::Red: 31 ... Attr::Bright: 1 + // Fg::Green: 32 Attr::Reverse: 7 + // Fg::Yellow: 33 + // Fg::Blue: 34 + // Fg::Magenta: 35 + // Fg::Cyan: 36 + // Fg::White: 37 + // Fg::Default: 39 + static const char * ansi[] = { + "\033[37;40m", // 0 w + "\033[36;40m", // 1 c + "\033[33;1;40m", // 2 y + "\033[32;40m", // 3 g + "\033[31;1;40m", // 4 r + "\033[35;40m", // 5 m + }; + static const unsigned n = sizeof(ansi)/sizeof(const char *); + switch ( level_r ) + { + case 'w': level_r = 0; break; + case 'c': level_r = 1; break; + case 'y': level_r = 2; break; + case 'g': level_r = 3; break; + case 'r': level_r = 4; break; + case 'm': level_r = 5; break; + } + std::cerr << ansi[level_r%n] << "OSD[" << msg_r << "]\033[0m" << std::endl; + } +} +#endif // ZYPP_NDEBUG + /////////////////////////////////////////////////////////////////// namespace log { ///////////////////////////////////////////////////////////////// diff --git a/zypp/base/Logger.h b/zypp/base/Logger.h index 4ba1955..9043a9c 100644 --- a/zypp/base/Logger.h +++ b/zypp/base/Logger.h @@ -11,9 +11,26 @@ */ #ifndef ZYPP_BASE_LOGGER_H #define ZYPP_BASE_LOGGER_H - -#include #include +#include +#include + +/////////////////////////////////////////////////////////////////// +#ifdef ZYPP_NDEBUG +#define OSDLOG( MSG ) +#define OSMLOG( L, MSG ) +#else +namespace zypp +{ + namespace debug + { + void osdlog( const std::string & msg_r, unsigned level_r ); // LogControl.cc + } +} +#define OSDLOG( MSG ) ::zypp::debug::osdlog( MSG, 0 ) +#define OSMLOG( L, MSG ) ::zypp::debug::osdlog( MSG, L ) +#endif // ZYPP_NDEBUG +/////////////////////////////////////////////////////////////////// /** \defgroup ZYPP_BASE_LOGGER_MACROS ZYPP_BASE_LOGGER_MACROS * Convenience macros for logging. diff --git a/zypp/parser/RepoFileReader.cc b/zypp/parser/RepoFileReader.cc index cdda52f..10d4d91 100644 --- a/zypp/parser/RepoFileReader.cc +++ b/zypp/parser/RepoFileReader.cc @@ -111,6 +111,8 @@ namespace zypp info.setAutorefresh( str::strToTrue( it->second ) ); else if ( it->first == "mirrorlist" && !it->second.empty()) info.setMirrorListUrl(Url(it->second)); + else if ( it->first == "metalink" && !it->second.empty()) + info.setMetalinkUrl(Url(it->second)); else if ( it->first == "gpgkey" && !it->second.empty()) { std::vector keys; diff --git a/zypp/repo/RepoMirrorList.cc b/zypp/repo/RepoMirrorList.cc index ad44f25..5477838 100644 --- a/zypp/repo/RepoMirrorList.cc +++ b/zypp/repo/RepoMirrorList.cc @@ -79,18 +79,24 @@ namespace zypp string tmpurl; while (getline(tmpfstream.stream(), tmpurl)) { - my_urls.push_back(Url(tmpurl)); + if ( tmpurl[0] == '#' ) + continue; + try { + my_urls.push_back(Url(tmpurl)); + } + catch (...) + {;} // ignore malformed urls } return my_urls; } /** Parse a local mirrorlist \a listfile_r and return usable URLs */ - inline std::vector RepoMirrorListParse( const Url & url_r, const Pathname & listfile_r ) + inline std::vector RepoMirrorListParse( const Url & url_r, const Pathname & listfile_r, bool mirrorListForceMetalink_r ) { USR << url_r << " " << listfile_r << endl; std::vector mirrorurls; - if ( url_r.asString().find( "/metalink" ) != string::npos ) + if ( mirrorListForceMetalink_r || url_r.asString().find( "/metalink" ) != string::npos ) mirrorurls = RepoMirrorListParseXML( listfile_r ); else mirrorurls = RepoMirrorListParseTXT( listfile_r ); @@ -118,25 +124,24 @@ namespace zypp } // namespace /////////////////////////////////////////////////////////////////// - - RepoMirrorList::RepoMirrorList( const Url & url_r, const Pathname & metadatapath_r ) + RepoMirrorList::RepoMirrorList( const Url & url_r, const Pathname & metadatapath_r, bool mirrorListForceMetalink_r ) { if ( url_r.getScheme() == "file" ) { // never cache for local mirrorlist - _urls = RepoMirrorListParse( url_r, url_r.getPathName() ); + _urls = RepoMirrorListParse( url_r, url_r.getPathName(), mirrorListForceMetalink_r ); } else if ( ! PathInfo( metadatapath_r).isDir() ) { // no cachedir RepoMirrorListTempProvider provider( url_r ); // RAII: lifetime of any downloaded files - _urls = RepoMirrorListParse( url_r, provider.localfile() ); + _urls = RepoMirrorListParse( url_r, provider.localfile(), mirrorListForceMetalink_r ); } else { // have cachedir Pathname cachefile( metadatapath_r ); - if ( url_r.asString().find( "/metalink" ) != string::npos ) + if ( mirrorListForceMetalink_r || url_r.asString().find( "/metalink" ) != string::npos ) cachefile /= "mirrorlist.xml"; else cachefile /= "mirrorlist.txt"; @@ -153,7 +158,7 @@ namespace zypp zypp::filesystem::hardlinkCopy( provider.localfile(), cachefile ); } - _urls = RepoMirrorListParse( url_r, cachefile ); + _urls = RepoMirrorListParse( url_r, cachefile, mirrorListForceMetalink_r ); if( _urls.empty() ) { DBG << "Removing Cachefile as it contains no URLs" << endl; diff --git a/zypp/repo/RepoMirrorList.h b/zypp/repo/RepoMirrorList.h index e6ad1fd..1898716 100644 --- a/zypp/repo/RepoMirrorList.h +++ b/zypp/repo/RepoMirrorList.h @@ -21,7 +21,11 @@ namespace zypp class RepoMirrorList { public: - RepoMirrorList( const Url & url_r, const Pathname & metadatapath_r = Pathname() ); + RepoMirrorList( const Url & url_r, const Pathname & metadatapath_r, bool mirrorListForceMetalink_r ); + + RepoMirrorList( const Url & url_r ) + : RepoMirrorList( url_r, Pathname(), false ) + {} const std::vector & getUrls() const { return _urls; } -- 2.7.4