ref: refs/heads/master
commit 1566f81f50c63e26c26223968a4767b062d3ea14
Author: Duncan Mac-Vicar P
Date: Sun Feb 15 21:03:40 2009 +0100
Refactor all error handling workflow into a unique function powered
by functor references (used to rescue results).
---
zypp/MediaSetAccess.cc | 219 +++++++++++++++++-------------------------------
zypp/MediaSetAccess.h | 13 +--
2 files changed, 79 insertions(+), 153 deletions(-)
diff --git a/zypp/MediaSetAccess.cc b/zypp/MediaSetAccess.cc
index b1d0516..7bce993 100644
--- a/zypp/MediaSetAccess.cc
+++ b/zypp/MediaSetAccess.cc
@@ -117,159 +117,99 @@ IMPL_PTR_TYPE(MediaSetAccess);
media_mgr.dirInfo(media, retlist, dirname, dots);
}
+ struct ProvideFileOperation
+ {
+ Pathname result;
+ void operator()( media::MediaAccessId media, const Pathname &file )
+ {
+ media::MediaManager media_mgr;
+ media_mgr.provideFile(media, file);
+ result = media_mgr.localPath(media, file);
+ }
+ };
+
+ struct ProvideDirTreeOperation
+ {
+ Pathname result;
+ void operator()( media::MediaAccessId media, const Pathname &file )
+ {
+ media::MediaManager media_mgr;
+ media_mgr.provideDirTree(media, file);
+ result = media_mgr.localPath(media, file);
+ }
+ };
+
+ struct ProvideDirOperation
+ {
+ Pathname result;
+ void operator()( media::MediaAccessId media, const Pathname &file )
+ {
+ media::MediaManager media_mgr;
+ media_mgr.provideDir(media, file);
+ result = media_mgr.localPath(media, file);
+ }
+ };
+
+ struct ProvideFileExistenceOperation
+ {
+ bool result;
+ ProvideFileExistenceOperation()
+ : result(false)
+ {}
+
+ void operator()( media::MediaAccessId media, const Pathname &file )
+ {
+ media::MediaManager media_mgr;
+ result = media_mgr.doesFileExist(media, file);
+ }
+ };
+
+
+
Pathname MediaSetAccess::provideFile( const OnMediaLocation & resource, ProvideFileOptions options )
{
- return provide( ProvideFile, resource, options );
+ ProvideFileOperation op;
+ provide( boost::ref(op), resource, options );
+ return op.result;
}
Pathname MediaSetAccess::provideFile(const Pathname & file, unsigned media_nr, ProvideFileOptions options )
{
OnMediaLocation resource;
+ ProvideFileOperation op;
resource.setLocation(file, media_nr);
- return provide( ProvideFile, resource, options );
+ provide( boost::ref(op), resource, options );
+ return op.result;
}
Pathname MediaSetAccess::provideOptionalFile(const Pathname & file, unsigned media_nr )
{
OnMediaLocation resource;
+ ProvideFileOperation op;
resource.setLocation(file, media_nr);
- Pathname ret;
try {
- ret = provide(ProvideFile, resource, NON_INTERACTIVE);
+ provide(boost::ref(op), resource, NON_INTERACTIVE);
}
catch ( const Exception &e )
{
ZYPP_CAUGHT(e);
}
- return ret;
+ return op.result;
}
bool MediaSetAccess::doesFileExist(const Pathname & file, unsigned media_nr )
{
- callback::SendReportmedia::MediaChangeReport report;
- media::MediaManager media_mgr;
-
- bool exists = false;
- do
- {
- // get the mediaId, but don't try to attach it here
- media::MediaAccessId media = getMediaAccessId( media_nr);
-
- try
- {
- DBG << "Cheking if file " << file
- << " from media number " << media_nr << " exists." << endl;
- // try to attach the media
- if ( ! media_mgr.isAttached(media) )
- media_mgr.attachDesiredMedia(media);
- exists = media_mgr.doesFileExist(media, file);
- break;
- }
- catch ( media::MediaException & excp )
- {
- ZYPP_CAUGHT(excp);
- media::MediaChangeReport::Action user;
- do
- {
- DBG << "Media couldn't provide file " << file << " , releasing." << endl;
- try
- {
- media_mgr.release (media);
- }
- catch (const Exception & excpt_r)
- {
- ZYPP_CAUGHT(excpt_r);
- MIL << "Failed to release media " << media << endl;
- }
-
- // set up the reason
- media::MediaChangeReport::Error reason = media::MediaChangeReport::INVALID;
-
- if( typeid(excp) == typeid( media::MediaFileNotFoundException ) ||
- typeid(excp) == typeid( media::MediaNotAFileException ) )
- {
- reason = media::MediaChangeReport::NOT_FOUND;
- }
- else if( typeid(excp) == typeid( media::MediaNotDesiredException) ||
- typeid(excp) == typeid( media::MediaNotAttachedException) )
- {
- reason = media::MediaChangeReport::WRONG;
- }
- else if( typeid(excp) == typeid( media::MediaTimeoutException) ||
- typeid(excp) == typeid( media::MediaTemporaryProblemException))
- {
- reason = media::MediaChangeReport::IO_SOFT;
- }
-
- vector<string> devices;
- unsigned int devindex;
- media_mgr.getDetectedDevices(media, devices, devindex);
-
- // release all media before requesting another (#336881)
- media_mgr.releaseAll();
-
- user = report->requestMedia (
- _url,
- media_nr,
- _label,
- reason,
- excp.asUserString(),
- devices, devindex
- );
-
- MIL << "doesFileExist exception caught, callback answer: " << user << endl;
-
- if( user == media::MediaChangeReport::ABORT )
- {
- DBG << "Aborting" << endl;
- ZYPP_RETHROW ( excp );
- }
- else if ( user == media::MediaChangeReport::IGNORE )
- {
- DBG << "Skipping" << endl;
- SkipRequestException nexcp("User-requested skipping of a file");
- nexcp.remember(excp);
- ZYPP_THROW(nexcp);
- }
- else if ( user == media::MediaChangeReport::EJECT )
- {
- DBG << "Eject: try to release" << endl;
- media_mgr.releaseAll();
- // eject
- media_mgr.release (media,
- devindex < devices.size() ? devices[devindex] : "");
- }
- else if ( user == media::MediaChangeReport::RETRY ||
- user == media::MediaChangeReport::CHANGE_URL )
- {
- // retry
- DBG << "Going to try again" << endl;
- // invalidate current media access id
- media_mgr.close(media);
- _medias.erase(media_nr);
-
- // not attaching, media set will do that for us
- // this could generate uncaught exception (#158620)
- break;
- }
- else
- {
- DBG << "Don't know, let's ABORT" << endl;
- ZYPP_RETHROW ( excp );
- }
- } while( user == media::MediaChangeReport::EJECT );
- }
-
- // retry or change URL
- } while( true );
-
- return exists;
+ ProvideFileExistenceOperation op;
+ OnMediaLocation resource;
+ resource.setLocation(file, media_nr);
+ provide( boost::ref(op), resource, NONE);
+ return op.result;
}
- Pathname MediaSetAccess::provide( ProvideAction action,
- const OnMediaLocation &resource,
- ProvideFileOptions options )
+ void MediaSetAccess::provide( ProvideOperation op,
+ const OnMediaLocation &resource,
+ ProvideFileOptions options )
{
Pathname file(resource.filename());
unsigned media_nr(resource.medianr());
@@ -291,18 +231,7 @@ IMPL_PTR_TYPE(MediaSetAccess);
// try to attach the media
if ( ! media_mgr.isAttached(media) )
media_mgr.attachDesiredMedia(media);
-
- switch (action)
- {
- case ProvideFile:
- media_mgr.provideFile (media, file); break;
- case ProvideDir:
- media_mgr.provideDir (media, file); break;
- case ProvideDirRecursive:
- media_mgr.provideDirTree(media, file); break;
- default:
- ZYPP_THROW(Exception("Unknown action"));
- }
+ op(media, file);
break;
}
catch ( media::MediaException & excp )
@@ -415,11 +344,8 @@ IMPL_PTR_TYPE(MediaSetAccess);
// retry or change URL
} while( true );
-
- return media_mgr.localPath( media, file );
}
-
Pathname MediaSetAccess::provideDir(const Pathname & dir,
bool recursive,
unsigned media_nr,
@@ -427,8 +353,15 @@ IMPL_PTR_TYPE(MediaSetAccess);
{
OnMediaLocation resource;
resource.setLocation(dir, media_nr);
-
- return provide( recursive? ProvideDir : ProvideDirRecursive, resource, options );
+ if ( recursive )
+ {
+ ProvideDirTreeOperation op;
+ provide( boost::ref(op), resource, options);
+ return op.result;
+ }
+ ProvideDirOperation op;
+ provide( boost::ref(op), resource, options);
+ return op.result;
}
media::MediaAccessId MediaSetAccess::getMediaAccessId (media::MediaNr medianr)
diff --git a/zypp/MediaSetAccess.h b/zypp/MediaSetAccess.h
index 01cfaf2..d912a60 100644
--- a/zypp/MediaSetAccess.h
+++ b/zypp/MediaSetAccess.h
@@ -13,7 +13,7 @@
#include <iosfwd>
#include <string>
#include <vector>
-#include
+#include
#include "zypp/base/ReferenceCounted.h"
#include "zypp/base/NonCopyable.h"
@@ -283,16 +283,9 @@ namespace zypp
*/
Pathname provideFileInternal( const OnMediaLocation &resource, ProvideFileOptions options );
- //typedef function ProvideAction;
- enum ProvideAction
- {
- ProvideFile,
- ProvideDir,
- ProvideDirRecursive,
- ProvideFileExist,
- };
+ typedef function ProvideOperation;
- Pathname provide( ProvideAction action, const OnMediaLocation &resource, ProvideFileOptions options );
+ void provide( ProvideOperation op, const OnMediaLocation &resource, ProvideFileOptions options );
media::MediaAccessId getMediaAccessId (media::MediaNr medianr);
virtual std::ostream & dumpOn( std::ostream & str ) const;
--
To unsubscribe, e-mail: zypp-commit+unsubscribe@opensuse.org
For additional commands, e-mail: zypp-commit+help@opensuse.org