All pastes #1685702 Raw Edit

Something

public text v1 · immutable
#1685702 ·published 2009-11-24 17:50 UTC
rendered paste body
Index: 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 *)),