catch (Exception & excpt_r)
{
ZYPP_CAUGHT(excpt_r);
+
+ // do not error on optional files
+ if ((*it_res)->location.optional() )
+ {
+ MIL << "Skipping optional file " << (*it_res)->location << endl;
+ continue;
+ }
+
excpt_r.remember("Can't provide " + (*it_res)->location.filename().asString() + " : " + excpt_r.msg());
ZYPP_RETHROW(excpt_r);
}
}
}
-// callback::SendReport<source::DownloadFileReport> report;
-// DownloadProgressFileReceiver download_report( report );
-// SourceFactory source_factory;
-// Url file_url( url().asString() + file_r.asString() );
-// report->start( source_factory.createFrom(this), file_url );
-// callback::TempConnect<media::DownloadProgressReport> tmp_download( download_report );
-// Pathname file = provideJustFile( file_r, media_nr, cached, checkonly );
-// report->finish( file_url, source::DownloadFileReport::NO_ERROR, "" );
-// return file;
-
void MediaSetAccess::releaseFile( const OnMediaLocation & on_media_file )
{
releaseFile( on_media_file.filename(), on_media_file.medianr() );
Pathname MediaSetAccess::provideFile( const OnMediaLocation & on_media_file )
{
- return provideFile( on_media_file.filename(), on_media_file.medianr() );
+ // if the file is optional we don't want a retry, ignore, abort
+ // callback, but just abort inmediately if it does not exist
+ // therefore we pass checkonly true
+ if (on_media_file.optional() )
+ return provideFileInternal( on_media_file.filename(),
+ on_media_file.medianr(),
+ true, true);
+
+ return provideFileInternal( on_media_file.filename(),
+ on_media_file.medianr(),
+ true, false );
}
Pathname MediaSetAccess::provideFile(const Pathname & file, unsigned media_nr )
{
- return provideFileInternal( file, media_nr, false, false);
+ return provideFileInternal( file, media_nr, false, false );
}
bool MediaSetAccess::doesFileExist(const Pathname & file, unsigned media_nr )
* \param on_media_file location of the file on media
* \return local pathname of the requested file
*
+ * If \p on_media_file is marked as optional, then
+ * in case of failure the user interaction callbacks
+ * will be ignored and the exception will throw
+ * inmediately.
+ *
* \throws MediaException if a problem occurs,
* see \ref media::MediaManager::provideFile()
*/
SignatureFileChecker sigchecker;
Pathname sig = _path + "/content.asc";
- if ( media.doesFileExist(sig) )
- {
- this->enqueue( OnMediaLocation( sig, 1 ) );
- this->start( dest_dir, media );
- this->reset();
- sigchecker = SignatureFileChecker( dest_dir + sig );
- }
+ this->enqueue( OnMediaLocation( sig, 1 ).setOptional(true) );
+ this->start( dest_dir, media );
+ this->reset();
+
+ if ( PathInfo(dest_dir + sig).isExist() )
+ sigchecker = SignatureFileChecker( dest_dir + sig );
Pathname key = _path + "/content.key";
- if ( media.doesFileExist(key) )
- {
- this->enqueue( OnMediaLocation( key, 1 ) );
- this->start( dest_dir, media );
- this->reset();
- sigchecker.addPublicKey(dest_dir + key);
- }
+ // the key may not exist
+ this->enqueue( OnMediaLocation( key, 1 ).setOptional(true) );
+ this->start( dest_dir, media );
+ this->reset();
+ if ( PathInfo(dest_dir + key).isExist() )
+ sigchecker.addPublicKey(dest_dir + key);
this->enqueue( OnMediaLocation( _path + "/content", 1 ), sigchecker );
this->start( dest_dir, media );
SignatureFileChecker sigchecker;
- if ( _media_ptr->doesFileExist(sigpath) )
- {
- this->enqueue( OnMediaLocation(sigpath,1).setOptional(true) );
- this->start( dest_dir, *_media_ptr);
- this->reset();
- sigchecker = SignatureFileChecker(dest_dir + sigpath);
- }
-
+ // this file is optional, may be the signature is not there
+ this->enqueue( OnMediaLocation(sigpath,1).setOptional(true) );
+ this->start( dest_dir, *_media_ptr);
+ this->reset();
- if ( _media_ptr->doesFileExist(keypath) )
- {
- this->enqueue( OnMediaLocation(keypath,1).setOptional(true) );
- this->start( dest_dir, *_media_ptr);
- this->reset();
- sigchecker.addPublicKey(dest_dir + keypath);
- }
+ // only need a checker if the signature exist.
+ if ( PathInfo(dest_dir + sigpath).isExist() )
+ sigchecker = SignatureFileChecker(dest_dir + sigpath);
+
+ // the key path may also not be there
+ this->enqueue( OnMediaLocation(keypath,1).setOptional(true) );
+ this->start( dest_dir, *_media_ptr);
+ this->reset();
+
+ if ( PathInfo(dest_dir + keypath).isExist() )
+ sigchecker.addPublicKey(dest_dir + keypath);
-
this->start( dest_dir, *_media_ptr );
if ( ! progress.tick() )