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 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
|
using System;
using System.Collections;
using System.Collections.Generic;
using NDesk.DBus;
namespace Hal
{
internal delegate void DBusPropertyModifiedHandler(string key, bool added, bool removed);
[Interface("org.freedesktop.Hal.Device")]
internal interface IDevice
{
// TODO:
// Need to support the Condition event, but it has a
// variable number of arguments, not currently supported
event DBusPropertyModifiedHandler PropertyModified;
void SetPropertyString(string key, string value);
void SetPropertyInteger(string key, int value);
void SetPropertyBoolean(string key, bool value);
void SetPropertyDouble(string key, double value);
void SetPropertyStringList(string key, string [] value);
void SetProperty(string key, ulong value);
ulong GetProperty(string key); // nasty hack to get around the fact
// that HAL doesn't actually send this
// in a variant, nor does it have a
// GetPropertyUInt64
// should be object GetProperty(string key)
string GetPropertyString(string key);
int GetPropertyInteger(string key);
bool GetPropertyBoolean(string key);
double GetPropertyDouble(string key);
string [] GetPropertyStringList(string key);
IDictionary<string, object> GetAllProperties();
void RemoveProperty(string key);
PropertyType GetPropertyType(string key);
bool PropertyExists(string key);
void AddCapability(string capability);
bool QueryCapability(string capability);
void Lock(string reason);
void Unlock();
}
public enum PropertyType
{
Invalid = DType.Invalid,
Int32 = DType.Int32,
UInt64 = DType.UInt64,
Double = DType.Double,
Boolean = DType.Boolean,
String = DType.String,
StrList = ((int)(DType.String << 8) + ('l'))
}
public class PropertyModifiedArgs : EventArgs
{
private string key;
private bool added;
private bool removed;
public PropertyModifiedArgs(string key, bool added, bool removed)
{
this.key = key;
this.added = added;
this.removed = removed;
}
public string Key {
get { return key; }
}
public bool Added {
get { return added; }
}
public bool Removed {
get { return removed; }
}
}
public delegate void PropertyModifiedHandler(object o, PropertyModifiedArgs args);
public class Device : IEnumerable<KeyValuePair<string, object>>, IEqualityComparer<Device>,
IEquatable<Device>, IComparer<Device>, IComparable<Device>
{
private string udi;
private IDevice device;
public event PropertyModifiedHandler PropertyModified;
public Device(string udi)
{
this.udi = udi;
if(!Bus.System.NameHasOwner("org.freedesktop.Hal")) {
throw new ApplicationException("Could not find org.freedesktop.Hal");
}
device = Bus.System.GetObject<IDevice>("org.freedesktop.Hal", new ObjectPath(udi));
device.PropertyModified += OnPropertyModified;
}
public static Device [] UdisToDevices(string [] udis)
{
if(udis == null || udis.Length == 0) {
return null;
}
Device [] devices = new Device[udis.Length];
for(int i = 0; i < udis.Length; i++) {
devices[i] = new Device(udis[i]);
}
return devices;
}
protected virtual void OnPropertyModified(string key, bool added, bool removed)
{
if(PropertyModified != null)
PropertyModified(this, new PropertyModifiedArgs(key, added, removed));
}
public void Lock(string reason)
{
device.Lock(reason);
}
public void Unlock()
{
device.Unlock();
}
public string GetPropertyString(string key)
{
return device.GetPropertyString(key);
}
public int GetPropertyInteger(string key)
{
return device.GetPropertyInteger(key);
}
public ulong GetPropertyUInt64(string key)
{
return device.GetProperty(key);
}
public double GetPropertyDouble(string key)
{
return device.GetPropertyDouble(key);
}
public bool GetPropertyBoolean(string key)
{
return device.GetPropertyBoolean(key);
}
public string [] GetPropertyStringList(string key)
{
return device.GetPropertyStringList(key);
}
public PropertyType GetPropertyType(string key)
{
return PropertyExists(key) ? device.GetPropertyType(key) : PropertyType.Invalid;
}
public void SetPropertyString(string key, string value)
{
device.SetPropertyString(key, value);
}
public void SetPropertyUInt64(string key, ulong value)
{
device.SetProperty(key, value);
}
public void SetPropertyInteger(string key, int value)
{
device.SetPropertyInteger(key, value);
}
public void SetPropertyDouble(string key, double value)
{
device.SetPropertyDouble(key, value);
}
public void SetPropertyBoolean(string key, bool value)
{
device.SetPropertyBoolean(key, value);
}
public void SetPropertyStringList(string key, string [] value)
{
device.SetPropertyStringList(key, value);
}
public void RemoveProperty(string key)
{
device.RemoveProperty(key);
}
public bool PropertyExists(string key)
{
return device.PropertyExists(key);
}
public void AddCapability(string capability)
{
device.AddCapability(capability);
}
public bool QueryCapability(string capability)
{
return device.QueryCapability(capability);
}
public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
{
return device.GetAllProperties().GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return device.GetAllProperties().GetEnumerator();
}
public bool Equals(Device other)
{
return Udi.Equals(other.Udi);
}
public bool Equals(Device a, Device b)
{
return a.Udi.Equals(b.Udi);
}
public int CompareTo(Device other)
{
return Udi.CompareTo(other.Udi);
}
public int Compare(Device a, Device b)
{
return a.Udi.CompareTo(b.Udi);
}
public int GetHashCode(Device a)
{
return a.Udi.GetHashCode();
}
public override int GetHashCode()
{
return Udi.GetHashCode();
}
public override string ToString()
{
return udi;
}
public string this[string property] {
get { return PropertyExists(property) ? GetPropertyString(property) : null; }
set { SetPropertyString(property, value); }
}
public string Udi {
get { return udi; }
}
public Device Parent {
get {
if(PropertyExists("info.parent")) {
return new Device(this["info.parent"]);
}
return null;
}
}
}
}
|