rendered paste bodyIndex: deviceinterface_p.h
===================================================================
--- deviceinterface_p.h (revision 1051764)
+++ deviceinterface_p.h (working copy)
@@ -20,7 +20,7 @@
#ifndef SOLID_DEVICEINTERFACE_P_H
#define SOLID_DEVICEINTERFACE_P_H
-#include <QtCore/QPointer>
+#include <QtCore/QWeakPointer>
namespace Solid
{
@@ -34,7 +34,7 @@
void setBackendObject(QObject *object);
private:
- QPointer<QObject> m_backendObject;
+ QWeakPointer<QObject> m_backendObject;
};
}
Index: devicemanager_p.h
===================================================================
--- devicemanager_p.h (revision 1051764)
+++ devicemanager_p.h (working copy)
@@ -25,7 +25,7 @@
#include "devicenotifier.h"
#include <QtCore/QMap>
-#include <QtCore/QPointer>
+#include <QtCore/QWeakPointer>
#include <QtCore/QSharedData>
namespace Solid
@@ -55,7 +55,7 @@
Ifaces::Device *createBackendObject(const QString &udi);
QExplicitlySharedDataPointer<DevicePrivate> m_nullDevice;
- QMap<QString, QPointer<DevicePrivate> > m_devicesMap;
+ QMap<QString, QWeakPointer<DevicePrivate> > m_devicesMap;
QMap<QObject *, QString> m_reverseMap;
};
}
Index: deviceinterface.cpp
===================================================================
--- deviceinterface.cpp (revision 1051764)
+++ deviceinterface.cpp (working copy)
@@ -122,7 +122,7 @@
QObject *Solid::DeviceInterfacePrivate::backendObject() const
{
- return m_backendObject;
+ return m_backendObject.data();
}
void Solid::DeviceInterfacePrivate::setBackendObject(QObject *object)
Index: devicemanager.cpp
===================================================================
--- devicemanager.cpp (revision 1051764)
+++ devicemanager.cpp (working copy)
@@ -46,10 +46,15 @@
Solid::DeviceManagerPrivate::~DeviceManagerPrivate()
{
- foreach (DevicePrivate *dev, m_devicesMap) {
- delete dev;
+ QObject *backend = managerBackend();
+ if (backend) {
+ disconnect(backend, 0, this, 0);
}
+ foreach (QWeakPointer<DevicePrivate> dev, m_devicesMap) {
+ delete dev.data();
+ }
+
m_devicesMap.clear();
}
@@ -156,12 +161,12 @@
void Solid::DeviceManagerPrivate::_k_deviceAdded(const QString &udi)
{
if (m_devicesMap.contains(udi)) {
- DevicePrivate *dev = m_devicesMap[udi];
+ DevicePrivate *dev = m_devicesMap[udi].data();
// Ok, this one was requested somewhere was invalid
// and now becomes magically valid!
- if (dev->backendObject() == 0) {
+ if (dev && dev->backendObject() == 0) {
dev->setBackendObject(createBackendObject(udi));
Q_ASSERT(dev->backendObject()!=0);
}
@@ -173,14 +178,16 @@
void Solid::DeviceManagerPrivate::_k_deviceRemoved(const QString &udi)
{
if (m_devicesMap.contains(udi)) {
- DevicePrivate *dev = m_devicesMap[udi];
+ DevicePrivate *dev = m_devicesMap[udi].data();
// Ok, this one was requested somewhere was valid
// and now becomes magically invalid!
- Q_ASSERT(dev->backendObject()!=0);
- delete dev->backendObject();
- Q_ASSERT(dev->backendObject()==0);
+ if (dev) {
+ Q_ASSERT(dev->backendObject()!=0);
+ delete dev->backendObject();
+ Q_ASSERT(dev->backendObject()==0);
+ }
}
emit deviceRemoved(udi);
@@ -200,14 +207,15 @@
if (udi.isEmpty()) {
return m_nullDevice.data();
} else if (m_devicesMap.contains(udi)) {
- return m_devicesMap[udi];
+ return m_devicesMap[udi].data();
} else {
Ifaces::Device *iface = createBackendObject(udi);
DevicePrivate *devData = new DevicePrivate(udi);
devData->setBackendObject(iface);
- m_devicesMap[udi] = devData;
+ QWeakPointer<DevicePrivate> ptr(devData);
+ m_devicesMap[udi] = ptr;
m_reverseMap[devData] = udi;
connect(devData, SIGNAL(destroyed(QObject *)),