3 * meego handset bluetooth
4 * Copyright © 2010, Intel Corporation.
6 * This program is licensed under the terms and conditions of the
7 * Apache License, version 2.0. The full text of the Apache License is at
8 * http://www.apache.org/licenses/LICENSE-2.0
12 #include "bluetoothdevicemodel.h"
14 BluetoothDevicesModel::BluetoothDevicesModel(QObject *parent) :
15 QAbstractListModel(parent), m_connected(false), adapter(NULL)
17 manager = new OrgBluezManagerInterface(
19 "/", QDBusConnection::systemBus(), this);
21 connect(manager,SIGNAL(AdapterAdded(QDBusObjectPath)),this,SLOT(adapterAdded(QDBusObjectPath)));
22 connect(manager,SIGNAL(AdapterRemoved(QDBusObjectPath)),this,SLOT(adapterRemoved(QDBusObjectPath)));
23 adapterAdded(QDBusObjectPath());
25 QHash<int, QByteArray> roles;
27 QMetaObject properties = BluetoothDevice::staticMetaObject;
29 for(int i=0; i<properties.propertyCount();i++)
31 roles[i]=properties.property(i).name();
37 int BluetoothDevicesModel::rowCount(const QModelIndex &) const
39 return m_devices.size();
42 QVariant BluetoothDevicesModel::data(const QModelIndex &index, int role) const
44 qDebug()<<"requested role: "<<roleNames()[role];
46 if(!index.isValid() || index.row() < 0)
48 qDebug()<<"index is not valid: "<<index.row()<<","<<index.column();
49 return QVariant(); ///this is retarded but it has to be done.
52 QString roleName = roleNames()[role];
53 QMetaObject object = BluetoothDevice::staticMetaObject;
55 for(int i=0; i<object.propertyCount(); i++)
57 if(object.property(i).name() == roleName)
60 return object.property(i).read(m_devices[index.row()]);
66 QString BluetoothDevicesModel::devicePath(QString devicename)
68 foreach(BluetoothDevice* device, m_devices)
70 if(device->name() == devicename)
71 return device->path();
76 BluetoothDevice* BluetoothDevicesModel::device(QString path)
78 foreach(BluetoothDevice* device, m_devices)
80 if(device->path() == path)
83 qDebug()<<"Device not found for path: "<<path;
87 void BluetoothDevicesModel::makePowered(bool poweredValue)
89 if(adapter) adapter->SetProperty("Powered", QDBusVariant(poweredValue));
92 bool BluetoothDevicesModel::powered()
96 QVariantMap props = adapter->GetProperties();
97 return props["Powered"].toBool();
103 void BluetoothDevicesModel::makeDiscoverable(bool discoverableValue)
105 if(adapter) adapter->SetProperty("Discoverable", QDBusVariant(discoverableValue));
108 bool BluetoothDevicesModel::discoverable()
112 QVariantMap props = adapter->GetProperties();
113 return props["Discoverable"].toBool();
119 int BluetoothDevicesModel::discoverableTimeout()
123 QVariantMap props = adapter->GetProperties();
124 return props["DiscoverableTimeout"].toInt();
130 void BluetoothDevicesModel::setDiscoverableTimeout(int timeout)
134 QDBusReply<void> reply = adapter->SetProperty("DiscoverableTimeout", QDBusVariant(timeout));
137 qDebug()<<"error setting discoverable timeout: "<<reply.error().message();
141 qDebug()<<"Setting discoverable timeout to "<<timeout;
146 void BluetoothDevicesModel::adapterAdded(QDBusObjectPath path)
148 if(adapter && adapter->path() == path.path()) return;
150 QDBusObjectPath adapterpath = manager->DefaultAdapter();
152 if(adapterpath.path() == "")
154 ///we actually shouldn't ever get here.
158 adapter = new OrgBluezAdapterInterface(
161 QDBusConnection::systemBus(), this);
164 SIGNAL(PropertyChanged(QString,QDBusVariant)),
166 SLOT(adapterPropertyChanged(QString,QDBusVariant)));
169 SIGNAL(DeviceRemoved(QDBusObjectPath)),
171 SLOT(deviceRemoved(QDBusObjectPath)));
174 SIGNAL(DeviceCreated(QDBusObjectPath)),
176 SLOT(deviceCreated(QDBusObjectPath)));
178 adapterChanged(true);
180 QList<QDBusObjectPath> list = adapter->ListDevices();
181 foreach(QDBusObjectPath item, list)
187 void BluetoothDevicesModel::adapterRemoved(QDBusObjectPath)
189 QDBusObjectPath adapterpath = manager->DefaultAdapter();
191 if(adapterpath.path() == "")
193 beginRemoveRows(QModelIndex(), 0, m_devices.size()-1);
194 foreach(BluetoothDevice* device, m_devices)
196 updateConnected(device->connected());
197 device->deleteLater();
202 if(adapter) delete adapter;
204 adapterChanged(false);
209 void BluetoothDevicesModel::deviceCreated(QDBusObjectPath devicepath)
211 BluetoothDevice* device = new BluetoothDevice(devicepath,this);
213 updateConnected(device->connected());
214 connect(device,SIGNAL(propertyChanged(QString,QVariant)),this,SLOT(devicePropertyChanged(QString,QVariant)));
216 beginInsertRows(QModelIndex(),m_devices.size(),m_devices.size());
217 m_devices.append(device);
221 void BluetoothDevicesModel::deviceRemoved(QDBusObjectPath devicepath)
223 for(int i=0; i<m_devices.size(); i++)
226 if(m_devices[i]->path() == devicepath.path())
228 beginRemoveRows(QModelIndex(), i, i);
229 m_devices[i]->deleteLater();
230 m_devices.removeAt(i);
236 void BluetoothDevicesModel::devicePropertyChanged(QString name, QVariant value)
238 BluetoothDevice* device = qobject_cast<BluetoothDevice*>(sender());
240 qDebug()<<"device property changed for "<<device->address()<<": "<<name<<" "<<value;
242 if(name == "Paired" && value.toBool() == true)
244 emit devicePaired(device);
247 else if(name == "Connected")
249 updateConnected(value.toBool());
251 int row = m_devices.indexOf(device);
252 if(row == -1) return; ///device doesn't exist.
254 dataChanged(createIndex(row, 0),createIndex(row, 0));
257 void BluetoothDevicesModel::adapterPropertyChanged(QString name, QDBusVariant value)
259 qDebug()<<"adapter property changed: "<<name<<" "<<value.variant();
261 if(name == "Powered")
263 poweredChanged(value.variant().toBool());
265 else if(name == "Discoverable")
267 discoverableChanged(value.variant().toBool());
269 else if(name == "DiscoverableTimeout")
271 discoverableTimeoutChanged(value.variant().toInt());
275 void BluetoothDevicesModel::updateConnected(bool deviceconnectedStatus)
277 if(deviceconnectedStatus)
282 connectedChanged(m_connected);
288 foreach(BluetoothDevice* device, devices())
290 temp |= device->connected();
293 if(temp != m_connected)
296 connectedChanged(m_connected);