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