Dap.Bluetooth: Extract Gnome specific component
[banshee-community-extensions:banshee-community-extensions.git] / src / Bluetooth / Banshee.Dap.Bluetooth / Gui / ManagerSource.fs
1 //
2 // ManagerSource.fs
3 //
4 // Author:
5 //   Nicholas J. Little <arealityfarbetween@googlemail.com>
6 //
7 // Copyright (c) 2014 Nicholas J. Little
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining a copy
10 // of this software and associated documentation files (the "Software"), to deal
11 // in the Software without restriction, including without limitation the rights
12 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 // copies of the Software, and to permit persons to whom the Software is
14 // furnished to do so, subject to the following conditions:
15 //
16 // The above copyright notice and this permission notice shall be included in
17 // all copies or substantial portions of the Software.
18 //
19 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 // THE SOFTWARE.
26 namespace Banshee.Dap.Bluetooth.Gui
27
28 open System
29 open System.Collections.Generic
30 open Banshee.Sources
31 open Banshee.Sources.Gui
32 open Banshee.ServiceStack
33 open Banshee.Dap.Bluetooth
34 open Banshee.Dap.Bluetooth.Adapters
35 open Banshee.Dap.Bluetooth.Devices
36 open Banshee.Dap.Bluetooth.Client
37 open Banshee.Dap.Bluetooth.DapGlue
38 open Banshee.Dap.Bluetooth.InversionApi
39 open Banshee.Dap.Bluetooth.Wrappers
40 open Banshee.Gui
41 open DBus
42 open Gtk
43 open Hyena
44 open Hyena.Log
45
46 module Constants =
47     let SORT = 410 // Puts us in "Devices"
48     let NAME = "Banshee.Dap.Bluetooth.Gui"
49
50 type ManagerContents(s, am: AdapterManager, dm: DeviceManager, cm: ClientManager) =
51     inherit VBox(false, 10)
52     let act = new AdaptersWidget(am)
53     let box = new VBox()
54     let dwm = Dictionary<ObjectPath,DeviceWidget>()
55     let add p = let dw = new DeviceWidget(BansheeDevice(p, am, dm, cm))
56                 dwm.[p] <- dw
57                 box.PackStart (dw, false, false, 10u)
58     let rem p = use dw = dwm.[p]
59                 box.Remove dw
60                 dwm.Remove p |> ignore
61     do
62        base.PackStart (act, false, false, 10u)
63        base.PackStart (box, true, true, 10u)
64        base.ShowAll ()
65        dm.DeviceEvent.Add (fun o -> match o.Action with
66                                     | Added -> add o.Path
67                                     | Changed -> if dwm.ContainsKey o.Path then
68                                                    dwm.[o.Path].Refresh()
69                                     | Removed -> rem o.Path)
70        dm.TransportEvent.Add (fun o -> if dwm.ContainsKey o.Object.Device then
71                                          dwm.[o.Object.Device].Refresh())
72        dm.Devices |> Seq.iter (fun o -> add o)
73     interface ISourceContents with
74         member x.SetSource y = false
75         member x.ResetSource () = ()
76         member x.Widget with get () = x :> Widget
77         member x.Source with get () = s
78
79 type ManagerSource(am: AdapterManager, dm: DeviceManager, cm: ClientManager) as this =
80     inherit Source (Singular "Bluetooth Manager",
81                     "Bluetooth Manager",
82                     Constants.SORT,
83                     "extension-unique-id")
84     do Infof "Dap.Bluetooth: Initializing ManagerSource"
85        base.Properties.SetStringList ("Icon.Name", "bluetooth")
86        base.Properties.Set<ISourceContents> ("Nereid.SourceContents", new ManagerContents(this, am, dm, cm))
87        base.Initialize ();
88
89 type ManagerService(name: string) =
90     let mutable ks : GnomeRfkill = Unchecked.defaultof<_>
91     let mutable am : AdapterManager = Unchecked.defaultof<_>
92     let mutable dm : DeviceManager = Unchecked.defaultof<_>
93     let mutable cm : ClientManager = Unchecked.defaultof<_>
94     let mutable ms : ManagerSource = Unchecked.defaultof<_>
95     member x.Dispose () = ServiceManager.SourceManager.RemoveSource (ms)
96     member x.ServiceName = name
97     member x.Initialize () =
98         ks <- GnomeRfkill()
99         am <- AdapterManager(ks.Set)
100         dm <- DeviceManager()
101         cm <- ClientManager()
102     member x.DelayedInitialize () = ms <- new ManagerSource(am, dm, cm)
103                                     ServiceManager.SourceManager.AddSource (ms)
104     interface IService with
105         member x.ServiceName = x.ServiceName
106     interface IDisposable with
107         member x.Dispose () = x.Dispose ()
108     interface IExtensionService with
109         member x.Initialize () = x.Initialize ()
110     interface IDelayedInitializeService with
111         member x.DelayedInitialize () = x.DelayedInitialize ()
112     new() = new ManagerService (Constants.NAME + ".ManagerService")