1 /*
2 Copyright 2005,2006 Kevin Ottens <ervin@kde.org>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) version 3, or any
8 later version accepted by the membership of KDE e.V. (or its
9 successor approved by the membership of KDE e.V.), which shall
10 act as a proxy defined in Section 6 of version 3 of the license.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General Public
18 License along with this library. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include "halmanager.h"
22 #include "haldevice.h"
23 #include "haldeviceinterface.h"
24
25 #include <QDebug>
26 #include <QDBusConnection>
27 #include <QDBusInterface>
28 #include <QDBusReply>
29
30 using namespace Solid::Backends::Hal;
31
32 class Solid::Backends::Hal::HalManagerPrivate
33 {
34 public:
HalManagerPrivate()35 HalManagerPrivate() : manager("org.freedesktop.Hal",
36 "/org/freedesktop/Hal/Manager",
37 "org.freedesktop.Hal.Manager",
38 QDBusConnection::systemBus()),
39 cacheSynced(false) { }
40
41 QDBusInterface manager;
42 QList<QString> devicesCache;
43 bool cacheSynced;
44 QSet<Solid::DeviceInterface::Type> supportedInterfaces;
45 };
46
47
HalManager(QObject * parent)48 HalManager::HalManager(QObject *parent)
49 : DeviceManager(parent), d(new HalManagerPrivate())
50 {
51 d->manager.connection().connect("org.freedesktop.Hal",
52 "/org/freedesktop/Hal/Manager",
53 "org.freedesktop.Hal.Manager",
54 "DeviceAdded",
55 this, SLOT(slotDeviceAdded(QString)));
56
57 d->manager.connection().connect("org.freedesktop.Hal",
58 "/org/freedesktop/Hal/Manager",
59 "org.freedesktop.Hal.Manager",
60 "DeviceRemoved",
61 this, SLOT(slotDeviceRemoved(QString)));
62
63 d->supportedInterfaces << Solid::DeviceInterface::GenericInterface
64 //<< Solid::DeviceInterface::Processor
65 << Solid::DeviceInterface::Block
66 << Solid::DeviceInterface::StorageAccess
67 << Solid::DeviceInterface::StorageDrive
68 << Solid::DeviceInterface::OpticalDrive
69 << Solid::DeviceInterface::StorageVolume
70 << Solid::DeviceInterface::OpticalDisc
71 //<< Solid::DeviceInterface::Camera
72 << Solid::DeviceInterface::PortableMediaPlayer
73 /*<< Solid::DeviceInterface::NetworkInterface
74 << Solid::DeviceInterface::AcAdapter
75 << Solid::DeviceInterface::Battery
76 << Solid::DeviceInterface::Button
77 << Solid::DeviceInterface::AudioInterface
78 << Solid::DeviceInterface::DvbInterface
79 << Solid::DeviceInterface::Video
80 << Solid::DeviceInterface::SerialInterface
81 << Solid::DeviceInterface::SmartCardReader*/;
82 }
83
~HalManager()84 HalManager::~HalManager()
85 {
86 delete d;
87 }
88
udiPrefix() const89 QString HalManager::udiPrefix() const
90 {
91 return "/org/freedesktop/Hal";
92 }
93
supportedInterfaces() const94 QSet<Solid::DeviceInterface::Type> HalManager::supportedInterfaces() const
95 {
96 return d->supportedInterfaces;
97 }
98
allDevices()99 QStringList HalManager::allDevices()
100 {
101 if (d->cacheSynced)
102 {
103 return d->devicesCache;
104 }
105
106 QDBusReply<QStringList> reply = d->manager.call("GetAllDevices");
107
108 if (!reply.isValid())
109 {
110 qWarning() << Q_FUNC_INFO << " error: " << reply.error().name() << endl;
111 return QStringList();
112 }
113
114 d->devicesCache = reply;
115 d->cacheSynced = true;
116
117 return reply;
118 }
119
deviceExists(const QString & udi)120 bool HalManager::deviceExists(const QString &udi)
121 {
122 if (d->devicesCache.contains(udi))
123 {
124 return true;
125 }
126 else if (d->cacheSynced)
127 {
128 return false;
129 }
130
131 QDBusReply<bool> reply = d->manager.call("DeviceExists", udi);
132
133 if (!reply.isValid())
134 {
135 qWarning() << Q_FUNC_INFO << " error: " << reply.error().name() << endl;
136 return false;
137 }
138
139 if (reply)
140 {
141 d->devicesCache.append(udi);
142 }
143
144 return reply;
145 }
146
devicesFromQuery(const QString & parentUdi,Solid::DeviceInterface::Type type)147 QStringList HalManager::devicesFromQuery(const QString &parentUdi,
148 Solid::DeviceInterface::Type type)
149 {
150 if ((parentUdi.isEmpty()) && (type == Solid::DeviceInterface::Unknown)) {
151 return allDevices();
152 }
153
154 QStringList result;
155
156 foreach (const QString &udi, allDevices()) {
157 HalDevice device(udi);
158
159 if ((!parentUdi.isEmpty()) && (parentUdi != device.parentUdi())) {
160 continue;
161 }
162
163 if ((type != Solid::DeviceInterface::Unknown) && (!device.queryDeviceInterface(type))) {
164 continue;
165 }
166
167 result << udi;
168 }
169
170 return result;
171 }
172
createDevice(const QString & udi)173 QObject *HalManager::createDevice(const QString &udi)
174 {
175 if (deviceExists(udi)) {
176 return new HalDevice(udi);
177 } else {
178 return nullptr;
179 }
180 }
181
slotDeviceAdded(const QString & udi)182 void HalManager::slotDeviceAdded(const QString &udi)
183 {
184 d->devicesCache.append(udi);
185 emit deviceAdded(udi);
186 }
187
slotDeviceRemoved(const QString & udi)188 void HalManager::slotDeviceRemoved(const QString &udi)
189 {
190 d->devicesCache.removeAll(udi);
191 emit deviceRemoved(udi);
192 }
193
194 #include "backends/hal/moc_halmanager.cpp"
195