summaryrefslogtreecommitdiff
path: root/hcid/Bluetooth.cs
blob: b7bec4e563d2658630c49aa808d27bd422ebf4a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/*
 *
 *  BlueZ - Bluetooth protocol stack for Linux
 *
 *  Copyright (C) 2005-2007  Marcel Holtmann <marcel@holtmann.org>
 *
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

namespace Bluetooth
{
	using System;
	using DBus;

	[Interface("org.bluez.Manager")]
	internal abstract class ManagerProxy
	{
		[Method] public abstract string DefaultAdapter();
		[Method] public abstract string FindAdapter(string pattern);
	}

	public delegate void RemoteDeviceFoundHandler(string address, Int class, Int16 rssi);
	public delegate void RemoteNameUpdatedHandler(string address, string name);

	[Interface("org.bluez.Adapter")]
	internal abstract class AdapterProxy
	{
		[Method] public abstract string GetAddress();
		[Method] public abstract string GetVersion();
		[Method] public abstract string GetRevision();
		[Method] public abstract string GetManufacturer();
		[Method] public abstract string GetCompany();

		[Method] public abstract void SetDiscoverableTimeout(int timeout);
		[Method] public abstract void SetMode(string mode);

		[Method] public abstract string GetName();
		[Method] public abstract void SetName(string name);
		[Method] public abstract string GetRemoteAlias(string address);
		[Method] public abstract void SetRemoteAlias(string address, string alias);

		[Method] public abstract string[] ListBondings();
		[Method] public abstract bool HasBonding(string address);

#pragma warning disable 0067
		[Signal] public virtual event RemoteDeviceFoundHandler RemoteDeviceFound;
		[Signal] public virtual event RemoteNameUpdatedHandler RemoteNameUpdated;
#pragma warning restore 0067
	}

	public class Adapter : IDisposable
	{
		private Service service;
		private Connection connection;
		private ManagerProxy manager;
		private AdapterProxy adapter;
		private string path;

#pragma warning disable 0067
		public event RemoteDeviceFoundHandler RemoteDeviceFound;
		public event RemoteNameUpdatedHandler RemoteNameUpdated;
#pragma warning restore 0067

		public Adapter() : this("")
		{
		}

		public Adapter(string pattern)
		{
			connection = Bus.GetSystemBus();
			service = Service.Get(connection, "org.bluez");

			manager = (ManagerProxy) service.GetObject(typeof(ManagerProxy), "/org/bluez");

			if (pattern == "")
				path = manager.DefaultAdapter();
			else
				path = manager.FindAdapter(pattern);

			adapter = (AdapterProxy) service.GetObject(typeof(AdapterProxy), path);

			service.SignalCalled += OnSignalCalled;

			adapter.RemoteDeviceFound += OnRemoteDeviceFound;
			adapter.RemoteNameUpdated += OnRemoteNameUpdated;
		}

		public void Dispose()
		{
			GC.SuppressFinalize(adapter);
			GC.SuppressFinalize(manager);
		}

		private void OnSignalCalled(Signal signal)
		{
			if (signal.InterfaceName != "org.bluez.Adapter")
				return;

			if (signal.PathName != path)
				return;
		}

		private void OnRemoteDeviceFound(string address, Int16 rssi,
				string major, string minor, string[] services)
		{
			if (RemoteDeviceFound != null)
				RemoteDeviceFound(address, rssi, major, minor, services);
		}

		private void OnRemoteNameUpdated(string address, string name)
		{
			if (RemoteNameUpdated != null)
				RemoteNameUpdated(address, name);
		}

		public string Address {
			get { return adapter.GetAddress(); }
		}

		public string Version {
			get { return adapter.GetVersion(); }
		}

		public string Revision {
			get { return adapter.GetRevision(); }
		}

		public string Manufacturer {
			get { return adapter.GetManufacturer(); }
		}

		public string Company {
			get { return adapter.GetCompany(); }
		}

		public string Name {
			get { return adapter.GetName(); }
			set { adapter.SetName(value); }
		}

		public override string ToString() {
			return Address;
		}
	}
}