Imported Upstream version 14.48.2
[platform/upstream/libzypp.git] / zypp / MediaSetAccess.cc
index c063563..5dad952 100644 (file)
@@ -46,7 +46,9 @@ IMPL_PTR_TYPE(MediaSetAccess);
   {
     try
     {
-      release();
+      media::MediaManager manager;
+      for ( const auto & mm : _medias )
+       manager.close( mm.second );
     }
     catch(...) {} // don't let exception escape a dtor.
   }
@@ -108,10 +110,11 @@ IMPL_PTR_TYPE(MediaSetAccess);
   struct ProvideFileOperation
   {
     Pathname result;
+    ByteCount expectedFileSize;
     void operator()( media::MediaAccessId media, const Pathname &file )
     {
       media::MediaManager media_mgr;
-      media_mgr.provideFile(media, file);
+      media_mgr.provideFile(media, file, expectedFileSize);
       result = media_mgr.localPath(media, file);
     }
   };
@@ -157,6 +160,7 @@ IMPL_PTR_TYPE(MediaSetAccess);
   Pathname MediaSetAccess::provideFile( const OnMediaLocation & resource, ProvideFileOptions options, const Pathname &deltafile )
   {
     ProvideFileOperation op;
+    op.expectedFileSize = resource.downloadSize();
     provide( boost::ref(op), resource, options, deltafile );
     return op.result;
   }
@@ -256,9 +260,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);
@@ -284,7 +289,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 +303,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 )