banshee r3579 - in trunk/banshee: . src/Backends/Banshee.Hal/Banshee.HalBackend src/Core/Banshee.Services/Banshee.Hardware src/Extensions/Banshee.AudioCd/Banshee.AudioCd src/Libraries/Hyena/Hyena



Author: abock
Date: Fri Mar 28 23:41:11 2008
New Revision: 3579
URL: http://svn.gnome.org/viewvc/banshee?rev=3579&view=rev

Log:
2008-03-28  Aaron Bockover  <abock gnome org>

    * src/Core/Banshee.Services/Banshee.Hardware/IVolume.cs: Added Eject
    and Unmount properties/methods

    * src/Backends/Banshee.Hal/Banshee.HalBackend/Volume.cs: Implemented
    the new Eject/Unmount members

    * src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:
    Make UnmapDiscVolume internal so the source can call it when being
    unmapped by the user

    * src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:
    Implement the unmap method to eject the disc from the drive

    * src/Libraries/Hyena/Hyena/Log.cs: Added an Exception method to which
    all exceptions that are handled should be logged; currently it just
    prints the exception, but we should later save them to a log file



Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/src/Backends/Banshee.Hal/Banshee.HalBackend/Volume.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Hardware/IVolume.cs
   trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs
   trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs
   trunk/banshee/src/Libraries/Hyena/Hyena/Log.cs

Modified: trunk/banshee/src/Backends/Banshee.Hal/Banshee.HalBackend/Volume.cs
==============================================================================
--- trunk/banshee/src/Backends/Banshee.Hal/Banshee.HalBackend/Volume.cs	(original)
+++ trunk/banshee/src/Backends/Banshee.Hal/Banshee.HalBackend/Volume.cs	Fri Mar 28 23:41:11 2008
@@ -34,6 +34,8 @@
 {
     public class Volume : Device, IVolume
     {
+        private const string method_names_property = "org.freedesktop.Hal.Device.Volume.method_names";
+        
         public static Volume Resolve (BlockDevice parent, Hal.Manager manager, Hal.Device device)
         {
             if (!device.IsVolume) {
@@ -46,10 +48,15 @@
         }
         
         private BlockDevice parent;
+        private string [] method_names;
         
         protected Volume (BlockDevice parent, Hal.Manager manager, Hal.Device device) : base (manager, device)
         {
             this.parent = parent ?? BlockDevice.Resolve<IBlockDevice> (manager, device.Parent);
+            
+            method_names = HalDevice.PropertyExists (method_names_property) 
+                ? device.GetPropertyStringList (method_names_property)
+                : new string[0];
         }
 
         public string MountPoint {
@@ -90,6 +97,28 @@
             get { return parent; }
         }
         
+        public bool CanEject {
+            get { return Array.IndexOf<string> (method_names, "Eject") >= 0; }
+        }
+        
+        public void Eject ()
+        {
+            if (CanEject && HalDevice.IsVolume) {
+                HalDevice.Volume.Eject ();
+            }
+        }
+        
+        public bool CanUnmount {
+            get { return Array.IndexOf<string> (method_names, "Unmount") >= 0; }
+        }
+        
+        public void Unmount ()
+        {
+            if (CanUnmount && HalDevice.IsVolume) {
+                HalDevice.Volume.Unmount ();
+            }
+        }
+        
         public override string ToString ()
         {
             if (IsMounted) {

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Hardware/IVolume.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Hardware/IVolume.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Hardware/IVolume.cs	Fri Mar 28 23:41:11 2008
@@ -38,5 +38,11 @@
         ulong Capacity { get; }
         long Available { get; }
         new IBlockDevice Parent { get; }
+        
+        bool CanEject { get; }
+        void Eject ();
+        
+        bool CanUnmount { get; }
+        void Unmount ();
     }
 }

Modified: trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs	Fri Mar 28 23:41:11 2008
@@ -74,7 +74,7 @@
         {
             lock (this) {
                 if (!sources.ContainsKey (volume.Uuid) && volume.HasAudio) {
-                    AudioCdSource source = new AudioCdSource (new AudioCdDisc (volume));
+                    AudioCdSource source = new AudioCdSource (this, new AudioCdDisc (volume));
                     sources.Add (volume.Uuid, source);
                     ServiceManager.SourceManager.AddSource (source);
                     Log.DebugFormat ("Mapping audio CD ({0})", volume.Uuid);
@@ -82,7 +82,7 @@
             }
         }
         
-        private void UnmapDiscVolume (string uuid)
+        internal void UnmapDiscVolume (string uuid)
         {
             lock (this) {
                 if (sources.ContainsKey (uuid)) {

Modified: trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs	Fri Mar 28 23:41:11 2008
@@ -29,6 +29,7 @@
 using System;
 using Mono.Unix;
 
+using Hyena;
 using Banshee.Sources;
 using Banshee.Collection;
 
@@ -36,11 +37,14 @@
 {
     public class AudioCdSource : Source, ITrackModelSource, IUnmapableSource, IDisposable
     {
+        private AudioCdService service;
         private AudioCdDisc disc;
         private MemoryTrackListModel track_model;
         
-        public AudioCdSource (AudioCdDisc disc) : base (Catalog.GetString ("Audio CD"), disc.Title, 200)
+        public AudioCdSource (AudioCdService service, AudioCdDisc disc) 
+            : base (Catalog.GetString ("Audio CD"), disc.Title, 200)
         {
+            this.service = service;
             this.disc = disc;
             
             track_model = new MemoryTrackListModel ();
@@ -131,6 +135,18 @@
 
         public bool Unmap ()
         {
+            System.Threading.ThreadPool.QueueUserWorkItem (delegate {
+                try {
+                    disc.Volume.Unmount ();
+                    disc.Volume.Eject ();
+                } catch (Exception e) {
+                    Log.Error (Catalog.GetString ("Could not eject Audio CD"), e.Message, true);
+                    Log.Exception (e);
+                }
+            });
+            
+            service.UnmapDiscVolume (disc.Volume.Uuid);
+            
             return true;
         }
 

Modified: trunk/banshee/src/Libraries/Hyena/Hyena/Log.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena/Log.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena/Log.cs	Fri Mar 28 23:41:11 2008
@@ -356,5 +356,15 @@
         }
         
         #endregion
+        
+        #region Public Exception Methods
+        
+        public static void Exception (Exception e)
+        {
+            // FIXME: We should save these to an actual log file
+            Console.WriteLine (e);
+        }
+        
+        #endregion
     }
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]