Imported Upstream version 16.3.2
[platform/upstream/libzypp.git] / zypp / MediaSetAccess.cc
index c063563..66bc72f 100644 (file)
@@ -256,9 +256,10 @@ IMPL_PTR_TYPE(MediaSetAccess);
             reason = media::MediaChangeReport::IO_SOFT;
           }
 
-          // non interactive only bother the user if wrong medium is in the drive
-          // otherwise propagate the error
-          if ( ( options & PROVIDE_NON_INTERACTIVE ) && reason != media::MediaChangeReport::WRONG)
+          // Propagate the original error if _no_ callback receiver is connected, or
+         // non_interactive mode (for optional files) is used (except for wrong media).
+          if ( ! callback::SendReport<media::MediaChangeReport>::connected()
+            || (( options & PROVIDE_NON_INTERACTIVE ) && reason != media::MediaChangeReport::WRONG ) )
           {
               MIL << "Can't provide file. Non-Interactive mode." << endl;
               ZYPP_RETHROW(excp);
@@ -273,7 +274,7 @@ IMPL_PTR_TYPE(MediaSetAccess);
               media_nr,
               _label,
               reason,
-              excp.asUserString(),
+              excp.asUserHistory(),
               devices,
               devindex
             );
@@ -284,7 +285,9 @@ IMPL_PTR_TYPE(MediaSetAccess);
           if( user == media::MediaChangeReport::ABORT )
           {
             DBG << "Aborting" << endl;
-            ZYPP_RETHROW ( excp );
+            AbortRequestException aexcp("Aborting requested by user");
+            aexcp.remember(excp);
+            ZYPP_THROW(aexcp);
           }
           else if ( user == media::MediaChangeReport::IGNORE )
           {
@@ -296,10 +299,15 @@ IMPL_PTR_TYPE(MediaSetAccess);
           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] : "");
+           try
+           {
+             media_mgr.releaseAll();
+             media_mgr.release (media, devindex < devices.size() ? devices[devindex] : "");
+           }
+           catch ( const Exception & e)
+           {
+             ZYPP_CAUGHT(e);
+           }
           }
           else if ( user == media::MediaChangeReport::RETRY  ||
             user == media::MediaChangeReport::CHANGE_URL )
@@ -346,31 +354,27 @@ IMPL_PTR_TYPE(MediaSetAccess);
 
   media::MediaAccessId MediaSetAccess::getMediaAccessId (media::MediaNr medianr)
   {
-    media::MediaManager media_mgr;
-
-    if (_medias.find(medianr) != _medias.end())
+    if ( _medias.find( medianr ) != _medias.end() )
     {
-      media::MediaAccessId id = _medias[medianr];
-      return id;
+      return _medias[medianr];
     }
-    Url url;
-    url = rewriteUrl (_url, medianr);
-    media::MediaAccessId id = media_mgr.open(url, _prefAttachPoint);
+
+    Url url( medianr > 1 ? rewriteUrl( _url, medianr ) : _url );
+    media::MediaManager media_mgr;
+    media::MediaAccessId id = media_mgr.open( url, _prefAttachPoint );
     _medias[medianr] = id;
 
     try
     {
-      if (_verifiers.find(medianr) != _verifiers.end())
+      if ( _verifiers.find(medianr) != _verifiers.end() )
       {
         // a verifier is set for this media
         // FIXME check the case where the verifier exists
         // but we have no access id for the media
-        media::MediaAccessId id = _medias[medianr];
-        media::MediaManager media_mgr;
-        media_mgr.delVerifier(id);
+        media_mgr.delVerifier( id );
         media_mgr.addVerifier( id, _verifiers[medianr] );
         // remove any saved verifier for this media
-        _verifiers.erase(medianr);
+        _verifiers.erase( medianr );
       }
     }
     catch ( const Exception &e )