banshee r3845 - in trunk/banshee: . src/Core/Banshee.Services src/Core/Banshee.Services/Banshee.ServiceStack src/Core/Banshee.ThickClient/Banshee.Gui src/Core/Banshee.ThickClient/Banshee.Gui.Widgets src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp src/Dap/Banshee.Dap/Banshee.Dap



Author: gburt
Date: Tue Apr 29 19:42:32 2008
New Revision: 3845
URL: http://svn.gnome.org/viewvc/banshee?rev=3845&view=rev

Log:
2008-04-29  Gabriel Burt  <gabriel burt gmail com>

	* src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs: Add
	ClientAdded event.

	* src/Core/Banshee.Services/Makefile.am:
	* src/Core/Banshee.Services/Banshee.ServiceStack/IDelayedInitializeService.cs:
	New interface for services that shouldn't be started until there is at
	least one Client that has started.  In practice, means DapService doesn't
	scan and load DAPs until after the GTK client is fully loaded.

	* src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs: When
	at least one client is started, call DelayedInitialize on
	IDelayedInitializeServices.

	* src/Core/Banshee.Services/Banshee.ServiceStack/Client.cs:
	* src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs: Add Started
	event and call it when appropriate.

	* src/Dap/Banshee.Dap/Banshee.Dap/DapService.cs: Implement
	IDelayedInitializeService.

	* src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ConnectedMessageBar.cs:
	Remove bandaid fix for AnimatedImage since abock has committed the real
	fix.

	* src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs: Remove self from
	SourceManager within Dispose, so MTP source actually disappears when
	ejected.


Added:
   trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/IDelayedInitializeService.cs
Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/Client.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs
   trunk/banshee/src/Core/Banshee.Services/Makefile.am
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ConnectedMessageBar.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs
   trunk/banshee/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs
   trunk/banshee/src/Dap/Banshee.Dap/Banshee.Dap/DapService.cs

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs	Tue Apr 29 19:42:32 2008
@@ -51,6 +51,7 @@
     public static class Application
     {   
         public static event ShutdownRequestHandler ShutdownRequested;
+        public static event Action<Client> ClientAdded;
 
         private static Stack<Client> running_clients = new Stack<Client> ();
         private static bool shutting_down;
@@ -99,6 +100,11 @@
             lock (running_clients) {
                 running_clients.Push (client);
             }
+
+            Action<Client> handler = ClientAdded;
+            if (handler != null) {
+                handler (client);
+            }
         }
         
         public static Client PopClient ()

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/Client.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/Client.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/Client.cs	Tue Apr 29 19:42:32 2008
@@ -32,6 +32,8 @@
 {
     public abstract class Client : IDisposable
     {
+        public event EventHandler Started;
+
         public Client ()
         {
         }
@@ -43,5 +45,13 @@
         public abstract string ClientId {
             get; 
         }
+
+        protected void OnStarted ()
+        {
+            EventHandler handler = Started;
+            if (handler != null) {
+                handler (this, EventArgs.Empty);
+            }
+        }
     }
 }

Added: trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/IDelayedInitializeService.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/IDelayedInitializeService.cs	Tue Apr 29 19:42:32 2008
@@ -0,0 +1,37 @@
+//
+// IDelayedInitializeService.cs
+//
+// Author:
+//   Gabriel Burt <gburt novell com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+
+namespace Banshee.ServiceStack
+{
+    public interface IDelayedInitializeService : IService
+    {
+        void DelayedInitialize ();
+    }
+}

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs	Tue Apr 29 19:42:32 2008
@@ -54,7 +54,7 @@
         
         private static bool is_initialized = false;
         private static readonly object self_mutex = new object ();
-        
+
         public static event EventHandler StartupBegin;
         public static event EventHandler StartupFinished;
         public static event ServiceStartedHandler ServiceStarted;
@@ -89,6 +89,12 @@
             
             Banshee.Configuration.ConfigurationClient.Initialize ();
             extension_nodes = AddinManager.GetExtensionNodes ("/Banshee/ServiceManager/Service");
+
+            Application.ClientAdded += delegate (Client client) {
+                client.Started += delegate {
+                    DelayedInitialize ();
+                };
+            };
         }
         
         public static void Run()
@@ -157,6 +163,8 @@
                 service = (IExtensionService)node.CreateInstance (typeof (IExtensionService));
                 service.Initialize ();
                 RegisterService (service);
+
+                DelayedInitialize (service);
             
                 Log.DebugTimerPrint (timer_id, String.Format (
                     "Extension service started ({0}, {{0}})", service.ServiceName));
@@ -202,6 +210,27 @@
                 }
             }
         }
+
+        private static bool delayed_initialized, have_client;
+        private static void DelayedInitialize ()
+        {
+            lock (self_mutex) {
+                if (!delayed_initialized) {
+                    have_client = true;
+                    foreach (IService service in services.Values) {
+                        DelayedInitialize (service);
+                    }
+                    delayed_initialized = true;
+                }
+            }
+        }
+        
+        private static void DelayedInitialize (IService service)
+        {
+            if (have_client && !delayed_initialized && service is IDelayedInitializeService) {
+                ((IDelayedInitializeService)service).DelayedInitialize ();
+            }
+        }
         
         public static void Shutdown ()
         {

Modified: trunk/banshee/src/Core/Banshee.Services/Makefile.am
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Makefile.am	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Makefile.am	Tue Apr 29 19:42:32 2008
@@ -126,6 +126,7 @@
 	Banshee.ServiceStack/Client.cs \
 	Banshee.ServiceStack/DBusServiceManager.cs \
 	Banshee.ServiceStack/IDBusExportable.cs \
+	Banshee.ServiceStack/IDelayedInitializeService.cs \
 	Banshee.ServiceStack/IExtensionService.cs \
 	Banshee.ServiceStack/IInitializeService.cs \
 	Banshee.ServiceStack/InterfaceAction.cs \

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ConnectedMessageBar.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ConnectedMessageBar.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ConnectedMessageBar.cs	Tue Apr 29 19:42:32 2008
@@ -88,9 +88,6 @@
         private void InnerUpdate (object o, EventArgs args)
         {
             if (source == null || source.CurrentMessage == null || source.CurrentMessage.IsHidden) {
-                // Fix bug where the AnimatedImage's stage kept playing, triggering tons of ExpoeEvents
-                // that caused the ListView to be re Exposed.
-                Spinning = false;
                 Hide ();
                 return;
             }

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs	Tue Apr 29 19:42:32 2008
@@ -39,7 +39,7 @@
     public abstract class GtkBaseClient : Client
     {
         private static Type client_type; 
-        
+
         public static void Entry<T> () where T : GtkBaseClient
         {
             if (client_type != null) {
@@ -110,6 +110,7 @@
         
         public virtual void Run ()
         {
+            RunIdle (delegate { OnStarted (); return false; });
             Gtk.Application.Run ();
         }
         

Modified: trunk/banshee/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs
==============================================================================
--- trunk/banshee/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs	(original)
+++ trunk/banshee/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs	Tue Apr 29 19:42:32 2008
@@ -279,8 +279,10 @@
                     mtp_device.Dispose ();
                 }
             }
-            mtp_device = null;
 
+            ServiceManager.SourceManager.RemoveSource (this);
+
+            mtp_device = null;
             mtp_source = null;
         }
 

Modified: trunk/banshee/src/Dap/Banshee.Dap/Banshee.Dap/DapService.cs
==============================================================================
--- trunk/banshee/src/Dap/Banshee.Dap/Banshee.Dap/DapService.cs	(original)
+++ trunk/banshee/src/Dap/Banshee.Dap/Banshee.Dap/DapService.cs	Tue Apr 29 19:42:32 2008
@@ -43,13 +43,18 @@
 
 namespace Banshee.Dap
 {
-    public class DapService : IExtensionService, IDisposable
+    public class DapService : IExtensionService, IDelayedInitializeService, IDisposable
     {
         private Dictionary<string, DapSource> sources;
         private List<TypeExtensionNode> supported_dap_types = new List<TypeExtensionNode> ();
+        private bool initialized;
 
         public void Initialize ()
         {
+        }
+
+        public void DelayedInitialize ()
+        {
             lock (this) {
                 sources = new Dictionary<string, DapSource> ();
                 
@@ -58,6 +63,7 @@
                 ServiceManager.HardwareManager.DeviceAdded += OnHardwareDeviceAdded;
                 ServiceManager.HardwareManager.DeviceRemoved += OnHardwareDeviceRemoved;
                 ServiceManager.SourceManager.SourceRemoved += OnSourceRemoved;
+                initialized = true;
             }
         }
 
@@ -94,6 +100,9 @@
         public void Dispose ()
         {
             lock (this) {
+                if (!initialized)
+                    return;
+
                 AddinManager.RemoveExtensionNodeHandler ("/Banshee/Dap/DeviceClass", OnExtensionChanged);
                 
                 ServiceManager.HardwareManager.DeviceAdded -= OnHardwareDeviceAdded;



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