[banshee] [Banshee.Networking] Add WICD support (bgo#596918)



commit 83d681c708796f37d8be12754832cfe9cb5ccbd6
Author: Jérémie Laval <jeremie laval gmail com>
Date:   Tue Oct 20 10:44:15 2009 -0400

    [Banshee.Networking] Add WICD support (bgo#596918)
    
    Implement  WICD connectivity backend to the network availability service.
    Backends now implement a INetworkAvailabilityService interface.
    
    Move State enum and StateChangeHandler delegate from NetworkManager.cs
    to State.cs since it's generic code.
    
    Make INetworkManager a private inner interface of NetworkManager.
    
    Signed-off-by: Aaron Bockover <abockover novell com>

 .../INetworkAvailabilityService.cs                 |   36 ++++++
 .../Banshee.Services/Banshee.Networking/Network.cs |   31 ++++--
 .../Banshee.Networking/NetworkManager.cs           |   30 ++---
 .../Banshee.Services/Banshee.Networking/State.cs   |   41 +++++++
 .../Banshee.Services/Banshee.Networking/Wicd.cs    |  112 ++++++++++++++++++++
 src/Core/Banshee.Services/Banshee.Services.csproj  |    3 +
 src/Core/Banshee.Services/Makefile.am              |    3 +
 7 files changed, 226 insertions(+), 30 deletions(-)
---
diff --git a/src/Core/Banshee.Services/Banshee.Networking/INetworkAvailabilityService.cs b/src/Core/Banshee.Services/Banshee.Networking/INetworkAvailabilityService.cs
new file mode 100644
index 0000000..d7b9d64
--- /dev/null
+++ b/src/Core/Banshee.Services/Banshee.Networking/INetworkAvailabilityService.cs
@@ -0,0 +1,36 @@
+//
+// INetworkAvailabilityService.cs
+//
+// Author:
+//   Jérémie "Garuma" Laval <jeremie laval gmail com>
+//
+// Copyright 2009 Jérémie "Garuma" Laval
+//
+// 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.Networking
+{
+    public interface INetworkAvailabilityService
+    {
+        State State { get; }
+        event StateChangeHandler StateChange;
+    }
+}
diff --git a/src/Core/Banshee.Services/Banshee.Networking/Network.cs b/src/Core/Banshee.Services/Banshee.Networking/Network.cs
index 6b41fdc..5d98152 100644
--- a/src/Core/Banshee.Services/Banshee.Networking/Network.cs
+++ b/src/Core/Banshee.Services/Banshee.Networking/Network.cs
@@ -41,7 +41,7 @@ using Banshee.Configuration;
 namespace Banshee.Networking
 {
     public delegate void NetworkStateChangedHandler(object o, NetworkStateChangedArgs args);
-    
+
     public class NetworkStateChangedArgs : EventArgs
     {
         public bool Connected;
@@ -62,7 +62,7 @@ namespace Banshee.Networking
     {
         public event NetworkStateChangedHandler StateChanged;
         
-        private NetworkManager nm_manager;
+        private INetworkAvailabilityService manager;
         private State current_state;
         private bool disable_internet_access = false;
         
@@ -71,11 +71,11 @@ namespace Banshee.Networking
             InstallPreferences ();
             
             try {
-                ConnectToNetworkManager();
+                ConnectToManager ();
             } catch(Exception) {
-                nm_manager = null;
+                manager = null;
                 Log.Warning(
-                    Catalog.GetString("Cannot connect to NetworkManager"),
+                    Catalog.GetString("Cannot connect to NetworkManager or Wicd"),
                     Catalog.GetString("An available, working network connection will be assumed"),
                     false);
             }
@@ -86,11 +86,18 @@ namespace Banshee.Networking
             UninstallPreferences ();
         }
 
-        private void ConnectToNetworkManager()
+        private void ConnectToManager()
         {
-            nm_manager = new NetworkManager();
-            nm_manager.StateChange += OnNetworkManagerEvent;
-            current_state = nm_manager.State;
+            if (NetworkManager.ManagerPresent) {
+                manager = new NetworkManager ();
+            } else if (Wicd.ManagerPresent) {
+                manager = new Wicd ();
+            } else {
+                throw new NetworkUnavailableException ("Neither NetworkManager nor Wicd could be found");
+            }
+
+            manager.StateChange += OnNetworkManagerEvent;
+            current_state = manager.State;
         }
         
         private void OnNetworkManagerEvent(State new_state)
@@ -126,11 +133,11 @@ namespace Banshee.Networking
         }
         
         public bool Connected {
-            get { return disable_internet_access ? false : (nm_manager == null ? true : current_state == State.Connected); }
+            get { return disable_internet_access ? false : (manager == null ? true : current_state == State.Connected); }
         }
         
-        public NetworkManager Manager {
-            get { return nm_manager; }
+        public INetworkAvailabilityService Manager {
+            get { return manager; }
         }
         
 #region Offline Preference
diff --git a/src/Core/Banshee.Services/Banshee.Networking/NetworkManager.cs b/src/Core/Banshee.Services/Banshee.Networking/NetworkManager.cs
index 9d6b558..255c034 100644
--- a/src/Core/Banshee.Services/Banshee.Networking/NetworkManager.cs
+++ b/src/Core/Banshee.Services/Banshee.Networking/NetworkManager.cs
@@ -34,25 +34,15 @@ using NDesk.DBus;
 
 namespace Banshee.Networking
 {
-    public enum State : uint {
-        Unknown = 0,
-        Asleep,
-        Connecting,
-        Connected,
-        Disconnected
-    }
-    
-    [Interface("org.freedesktop.NetworkManager")]
-    public interface INetworkManager
+    public class NetworkManager : INetworkAvailabilityService
     {
-        event StateChangeHandler StateChange;
-        State state();
-    }
-    
-    public delegate void StateChangeHandler(State state);
+        [Interface ("org.freedesktop.NetworkManager")]
+        private interface INetworkManager
+        {
+            event StateChangeHandler StateChange;
+            State state ();
+        }
     
-    public class NetworkManager
-    {
         private const string BusName = "org.freedesktop.NetworkManager";
         private const string ObjectPath = "/org/freedesktop/NetworkManager";
 
@@ -62,7 +52,7 @@ namespace Banshee.Networking
 
         public NetworkManager()
         {
-            if(!Bus.System.NameHasOwner(BusName)) {
+            if (!ManagerPresent) {
                 throw new ApplicationException(String.Format("Name {0} has no owner", BusName));
             }
 
@@ -81,6 +71,10 @@ namespace Banshee.Networking
         public State State {
             get { return manager.state(); }
         }
+
+        public static bool ManagerPresent {
+            get { return Bus.System.NameHasOwner (BusName); }
+        }
     }
 }
 
diff --git a/src/Core/Banshee.Services/Banshee.Networking/State.cs b/src/Core/Banshee.Services/Banshee.Networking/State.cs
new file mode 100644
index 0000000..4619416
--- /dev/null
+++ b/src/Core/Banshee.Services/Banshee.Networking/State.cs
@@ -0,0 +1,41 @@
+//
+// State.cs
+//
+// Author:
+//   Aaron Bockover <abockover novell com>
+//
+// Copyright 2005-2009 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.
+//
+
+namespace Banshee.Networking
+{
+    public enum State : uint
+    {
+        Unknown = 0,
+        Asleep,
+        Connecting,
+        Connected,
+        Disconnected
+    }
+
+    public delegate void StateChangeHandler (State state);
+}
diff --git a/src/Core/Banshee.Services/Banshee.Networking/Wicd.cs b/src/Core/Banshee.Services/Banshee.Networking/Wicd.cs
new file mode 100644
index 0000000..723e272
--- /dev/null
+++ b/src/Core/Banshee.Services/Banshee.Networking/Wicd.cs
@@ -0,0 +1,112 @@
+//
+// Wicd.cs
+//
+// Author:
+//   Jérémie Laval <jeremie laval gmail com>
+//
+// Copyright 2009 Jérémie "Garuma" Laval
+//
+// 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;
+using System.Reflection;
+using System.Collections;
+using System.Collections.Generic;
+using NDesk.DBus;
+
+namespace Banshee.Networking
+{
+    public class Wicd : INetworkAvailabilityService
+    {
+        public delegate void StateChangeInternalHandler (uint code, object [] foo);
+
+        internal struct StatusStruct
+        {
+            public uint Code;
+            public string [] Foo;
+        }
+
+        [Interface ("org.wicd.daemon")]
+        internal interface IWicd
+        {
+            event StateChangeInternalHandler StatusChanged;
+            StatusStruct GetConnectionStatus ();
+        }
+
+        private enum WicdCodes : uint {
+            NotConnected = 0,
+            Connecting,
+            Wired,
+            Wireless,
+            Suspended
+        }
+
+        private const string BusName = "org.wicd.daemon";
+        private const string ObjectPath = "/org/wicd/daemon";
+
+        private IWicd manager;
+
+        public event StateChangeHandler StateChange;
+
+        public Wicd ()
+        {
+            if (!ManagerPresent) {
+                throw new ApplicationException (String.Format ("Name {0} has no owner", BusName));
+            }
+
+            manager = Bus.System.GetObject<IWicd> (BusName, new ObjectPath(ObjectPath));
+            manager.StatusChanged += OnStateChange;
+        }
+
+        private void OnStateChange (uint code, object[] foo)
+        {
+            var handler = StateChange;
+            if (handler != null) {
+                handler(GetTranslatedCode (code));
+            }
+        }
+
+        public State State {
+            get { return GetTranslatedCode (manager.GetConnectionStatus ().Code); }
+        }
+
+        public static bool ManagerPresent {
+            get { return Bus.System.NameHasOwner (BusName); }
+        }
+
+        private State GetTranslatedCode (uint wicdCode)
+        {
+            switch ((WicdCodes)wicdCode) {
+                case WicdCodes.NotConnected:
+                    return State.Disconnected;
+                case WicdCodes.Connecting:
+                    return State.Connecting;
+                case WicdCodes.Wireless:
+                case WicdCodes.Wired:
+                    return State.Connected;
+                case WicdCodes.Suspended:
+                    return State.Asleep;
+                default:
+                    return State.Unknown;
+            }
+        }
+    }
+}
diff --git a/src/Core/Banshee.Services/Banshee.Services.csproj b/src/Core/Banshee.Services/Banshee.Services.csproj
index d6a5ccc..80d2974 100644
--- a/src/Core/Banshee.Services/Banshee.Services.csproj
+++ b/src/Core/Banshee.Services/Banshee.Services.csproj
@@ -171,7 +171,10 @@
     <Compile Include="Banshee.Metadata.Rhapsody\RhapsodyMetadataProvider.cs" />
     <Compile Include="Banshee.Metadata.Rhapsody\RhapsodyQueryJob.cs" />
     <Compile Include="Banshee.Networking\Network.cs" />
+    <Compile Include="Banshee.Networking\State.cs" />
     <Compile Include="Banshee.Networking\NetworkManager.cs" />
+    <Compile Include="Banshee.Networking\Wicd.cs" />
+    <Compile Include="Banshee.Networking\INetworkAvailabilityService.cs" />
     <Compile Include="Banshee.Database\BansheeModelProvider.cs" />
     <Compile Include="Banshee.Database\BansheeModelCache.cs" />
     <Compile Include="Banshee.PlaybackController\IPlaybackController.cs" />
diff --git a/src/Core/Banshee.Services/Makefile.am b/src/Core/Banshee.Services/Makefile.am
index c36d426..c626e57 100644
--- a/src/Core/Banshee.Services/Makefile.am
+++ b/src/Core/Banshee.Services/Makefile.am
@@ -119,7 +119,10 @@ SOURCES =  \
 	Banshee.Metadata/SaveTrackMetadataJob.cs \
 	Banshee.Metadata/SaveTrackMetadataService.cs \
 	Banshee.Networking/Network.cs \
+	Banshee.Networking/State.cs \
 	Banshee.Networking/NetworkManager.cs \
+	Banshee.Networking/Wicd.cs \
+	Banshee.Networking/INetworkAvailabilityService.cs \
 	Banshee.PlatformServices/IScreensaverManager.cs \
 	Banshee.PlatformServices/ScreensaverManager.cs \
 	Banshee.PlaybackController/IBasicPlaybackController.cs \



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