59 struct DownloadFileReportHack :
public callback::ReceiveReport<media::DownloadProgressReport>
61 typedef callback::ReceiveReport<ReportType> BaseType;
62 typedef function<bool(int)> RedirectType;
64 DownloadFileReportHack( RedirectType redirect_r )
65 :
_oldRec( Distributor::instance().getReceiver() )
68 ~DownloadFileReportHack()
69 {
if (
_oldRec ) Distributor::instance().setReceiver( *
_oldRec );
else Distributor::instance().noReceiver(); }
71 virtual void start(
const Url & file, Pathname localfile )
74 _oldRec->start( file, localfile );
76 BaseType::start( file, localfile );
79 virtual bool progress(
int value,
const Url & file,
double dbps_avg = -1,
double dbps_current = -1 )
83 ret &=
_oldRec->progress( value, file, dbps_avg, dbps_current );
89 virtual Action problem(
const Url & file, Error
error,
const std::string & description )
92 return _oldRec->problem( file, error, description );
93 return BaseType::problem( file, error, description );
95 virtual void finish(
const Url & file, Error error,
const std::string & reason )
98 _oldRec->finish( file, error, reason );
100 BaseType::finish( file, error, reason );
117 return access.
provideFile(repo_r, loc_r, policy_r );
130 std::map<Url, shared_ptr<MediaSetAccess> >::iterator it;
135 it->second->release();
148 std::map<Url, shared_ptr<MediaSetAccess> >::const_iterator it;
150 shared_ptr<MediaSetAccess> media;
168 media->setLabel( repo.
name() );
172 Pathname mediafile = repo.
metadataPath() +
"/media.1/media";
175 if ( PathInfo(mediafile).isExist() )
177 std::map<shared_ptr<MediaSetAccess>,
RepoInfo>::const_iterator it;
181 if ( it->second.alias() == repo.
alias() )
188 std::ifstream str(mediafile.asString().c_str());
198 unsigned media_nr = str::strtonum<unsigned>(buffer);
199 MIL <<
"Repository '" << repo.
alias() <<
"' has " << media_nr <<
" medias"<< endl;
201 for (
unsigned i=1; i <= media_nr; ++i )
205 media->setVerifier( i, verifier);
216 WAR <<
"No media verifier for repo '" << repo.
alias() <<
"' media/media.1 does not exist in '" << repo.
metadataPath() <<
"'" << endl;
221 WAR <<
"'" << repo.
alias() <<
"' metadata path is empty. Can't set verifier. Probably this repository does not come from RepoManager." << endl;
227 std::map<Url, shared_ptr<MediaSetAccess> >
_medias;
236 : _impl( new
Impl( defaultPolicy_r ) )
252 MIL << loc_r << endl;
259 str::form(
_(
"Can't provide file '%s' from repository '%s'"),
261 repo_r.
alias().c_str() ) );
278 PathInfo pi( destinationDir );
279 if ( ! pi.isExist() )
285 if ( geteuid() != 0 && ! pi.userMayW() )
287 WAR <<
"Destination dir '" << destinationDir <<
"' is not user writable, using tmp space." << endl;
288 destinationDir = getZYpp()->tmpPath() / destinationDir;
291 MIL <<
"Added cache path " << destinationDir << endl;
302 MIL <<
"Providing file of repo '" << repo_r.
alias()
303 <<
"' from " << url << endl;
309 fetcher.
start( destinationDir, *access );
323 WAR <<
"No checksum in metadata " << loc_r << endl;
327 std::ifstream input( ret->asString().c_str() );
331 if ( loc_r.
checksum() != retChecksum )
334 std::ostringstream err;
335 err <<
"File " << ret <<
" fails integrity check. Expected: [" << loc_r.
checksum() <<
"] Got: [";
336 if ( retChecksum.empty() )
337 err <<
"Failed to compute checksum";
342 WAR << err.str() << endl;
347 WAR <<
"NO failOnChecksumError: " << err.str() << endl;
351 MIL <<
"provideFile at " << ret << endl;
354 catch (
const SkipRequestException &e )
359 catch (
const AbortRequestException &e )
370 WAR <<
"Trying next url" << endl;