/
UDisksManagerProxy.c
99 lines (71 loc) · 2.5 KB
/
UDisksManagerProxy.c
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
#include "UDisksManagerProxy.h"
UDisksManagerProxy::UDisksManagerProxy(DBus::Connection &connection)
: DBus::InterfaceProxy("org.freedesktop.UDisks"),
DBus::ObjectProxy(connection, "/org/freedesktop/UDisks", "org.freedesktop.UDisks")
{
connect_signal(UDisksManagerProxy, DeviceAdded, DeviceAddedCb);
connect_signal(UDisksManagerProxy, DeviceRemoved, DeviceRemovedCb);
std::vector< DBus::Path > devices = GetAllDevices();
std::vector< DBus::Path >::iterator it;
for (it = devices.begin(); it != devices.end(); ++it)
{
DBus::Path udi = *it;
dsyslog("[vdr-dbus] UDisksManagerProxy :: found device %s", udi.c_str());
_devices[udi] = new UDisksDeviceProxy(connection, udi);
}
}
std::vector< DBus::Path > UDisksManagerProxy::GetAllDevices()
{
std::vector< DBus::Path > udis;
DBus::CallMessage call;
call.member("EnumerateDevices");
DBus::Message reply = invoke_method(call);
DBus::MessageIter it = reply.reader();
it >> udis;
return udis;
}
void UDisksManagerProxy::DeviceAddedCb(const DBus::SignalMessage &sig)
{
DBus::MessageIter it = sig.reader();
DBus::Path devname;
it >> devname;
DBus::Path udi(devname);
_devices[devname] = new UDisksDeviceProxy(conn(), udi);
dsyslog("[vdr-dbus] UDisksManagerProxy :: added device %s", udi.c_str());
}
void UDisksManagerProxy::DeviceRemovedCb(const DBus::SignalMessage &sig)
{
DBus::MessageIter it = sig.reader();
DBus::Path devname;
it >> devname;
dsyslog("[vdr-dbus] UDisksManagerProxy :: removed device %s", devname.c_str());
_devices.erase(devname);
}
UDisksDeviceProxy::UDisksDeviceProxy(DBus::Connection &connection, DBus::Path &udi)
: DBus::InterfaceProxy("org.freedesktop.UDisks"),
DBus::ObjectProxy(connection, "/org/freedesktop/UDisks", "org.freedesktop.UDisks")
{
connect_signal(UDisksDeviceProxy, PropertyModified, PropertyModifiedCb);
connect_signal(UDisksDeviceProxy, Condition, ConditionCb);
}
void UDisksDeviceProxy::PropertyModifiedCb(const DBus::SignalMessage &sig)
{
typedef DBus::Struct< std::string, bool, bool > HalProperty;
DBus::MessageIter it = sig.reader();
int32_t number;
it >> number;
DBus::MessageIter arr = it.recurse();
for (int i = 0; i < number; ++i, ++arr)
{
HalProperty hp;
arr >> hp;
std::cout << "modified property " << hp._1 << " in " << path() << std::endl;
}
}
void UDisksDeviceProxy::ConditionCb(const DBus::SignalMessage &sig)
{
DBus::MessageIter it = sig.reader();
std::string condition;
it >> condition;
std::cout << "encountered condition " << condition << " in " << path() << std::endl;
}