libzypp
10.5.0
|
00001 #include <iostream> 00002 #include <sstream> 00003 #include "zypp/base/Logger.h" 00004 #include "zypp/repo/ServiceRepos.h" 00005 #include "zypp/repo/RepoException.h" 00006 #include "zypp/media/MediaException.h" 00007 #include "zypp/parser/RepoFileReader.h" 00008 #include "zypp/media/MediaManager.h" 00009 #include "zypp/parser/RepoindexFileReader.h" 00010 #include "zypp/ExternalProgram.h" 00011 00012 using std::stringstream; 00013 using std::endl; 00014 00015 namespace zypp 00016 { 00017 namespace repo 00018 { 00019 00020 class ServiceRepos::Impl 00021 { 00022 public: 00023 Impl() 00024 { 00025 } 00026 00027 virtual ~Impl() 00028 { 00029 } 00030 }; 00031 00032 class RIMServiceRepos : public ServiceRepos::Impl 00033 { 00034 public: 00035 ServiceRepos::ProcessRepo _callback; 00036 00037 RIMServiceRepos(const ServiceInfo &service, 00038 const ServiceRepos::ProcessRepo & callback, 00039 const ProgressData::ReceiverFnc &progress = ProgressData::ReceiverFnc() ) 00040 : _callback(callback) 00041 { 00042 // repoindex.xml must be fetched always without using cookies (bnc #573897) 00043 Url serviceUrl( service.url() ); 00044 serviceUrl.setQueryParam( "cookies", "0" ); 00045 00046 // download the repo index file 00047 media::MediaManager mediamanager; 00048 media::MediaAccessId mid = mediamanager.open( serviceUrl ); 00049 mediamanager.attach( mid ); 00050 mediamanager.provideFile( mid, "repo/repoindex.xml" ); 00051 Pathname path = mediamanager.localPath(mid, "repo/repoindex.xml" ); 00052 parser::RepoindexFileReader reader(path, _callback); 00053 mediamanager.release( mid ); 00054 mediamanager.close( mid ); 00055 } 00056 00057 ~RIMServiceRepos() 00058 { 00059 00060 } 00061 }; 00062 00063 class PluginServiceRepos : public ServiceRepos::Impl 00064 { 00065 public: 00066 ServiceRepos::ProcessRepo _callback; 00067 00068 PluginServiceRepos(const ServiceInfo &service, 00069 const ServiceRepos::ProcessRepo & callback, 00070 const ProgressData::ReceiverFnc &progress = ProgressData::ReceiverFnc() ) 00071 : _callback(callback) 00072 { 00073 Url serviceUrl( service.url() ); 00074 stringstream buffer; 00075 00076 ExternalProgram::Arguments args; 00077 args.reserve( 3 ); 00078 args.push_back( "/bin/sh" ); 00079 args.push_back( "-c" ); 00080 args.push_back( serviceUrl.getPathName() ); 00081 ExternalProgramWithStderr prog( args ); 00082 prog >> buffer; 00083 00084 if ( prog.close() != 0 ) 00085 { 00086 // ServicePluginInformalException: 00087 // Ignore this error but we'd like to report it somehow... 00088 std::string errbuffer; 00089 prog.stderrGetUpTo( errbuffer, '\0' ); 00090 ERR << "Capture plugin error:[" << endl << errbuffer << endl << ']' << endl; 00091 ZYPP_THROW( repo::ServicePluginInformalException(errbuffer)); 00092 } 00093 00094 parser::RepoFileReader parser(buffer, _callback); 00095 } 00096 00097 ~PluginServiceRepos() 00098 {} 00099 }; 00100 00101 00102 ServiceRepos::ServiceRepos(const ServiceInfo &service, 00103 const ServiceRepos::ProcessRepo & callback, 00104 const ProgressData::ReceiverFnc &progress) 00105 : _impl( (service.type() == ServiceType::PLUGIN) ? (ServiceRepos::Impl *)(new PluginServiceRepos(service, callback, progress)) : (ServiceRepos::Impl *)(new RIMServiceRepos(service, callback, progress))) 00106 { 00107 } 00108 00109 ServiceRepos::~ServiceRepos() 00110 { 00111 } 00112 00113 00114 } 00115 }