← Back to team overview

ubuntu-touch-coreapps-reviewers team mailing list archive

[Merge] lp:~renatofilho/ubuntu-filemanager-app/fix-network-crash into lp:ubuntu-filemanager-app

 

Renato Araujo Oliveira Filho has proposed merging lp:~renatofilho/ubuntu-filemanager-app/fix-network-crash into lp:ubuntu-filemanager-app.

Requested reviews:
  Ubuntu File Manager Developers (ubuntu-filemanager-dev)
Related bugs:
  Bug #1609051 in Ubuntu File Manager App: "File Manager crashes when Network is selected"
  https://bugs.launchpad.net/ubuntu-filemanager-app/+bug/1609051

For more details, see:
https://code.launchpad.net/~renatofilho/ubuntu-filemanager-app/fix-network-crash/+merge/314870
-- 
Your team Ubuntu File Manager Developers is requested to review the proposed merge of lp:~renatofilho/ubuntu-filemanager-app/fix-network-crash into lp:ubuntu-filemanager-app.
=== modified file 'src/plugin/folderlistmodel/diriteminfo.cpp'
--- src/plugin/folderlistmodel/diriteminfo.cpp	2015-12-12 12:30:47 +0000
+++ src/plugin/folderlistmodel/diriteminfo.cpp	2017-01-16 19:31:06 +0000
@@ -23,6 +23,8 @@
 #include "locationurl.h"
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <QMetaMethod>
+#include <QDebug>
 
 
 QMimeDatabase DirItemInfoPrivate::mimeDatabase;
@@ -151,6 +153,15 @@
 
 DirItemInfo::~DirItemInfo()
 {
+    qDebug() << "Destroing" << (void*) this;
+    Q_FOREACH(const DestructionSlot &slot, d_ptr->_destructionSlots) {
+        if (slot.first) {
+            qDebug() << "Notify" << slot.first << slot.second;
+            const QMetaObject *mObject = slot.first->metaObject();
+            QMetaMethod method = mObject->method(slot.second);
+            method.invoke(slot.first.data(), Qt::DirectConnection);
+        }
+    }
 }
 
 
@@ -602,3 +613,14 @@
 {
     d_ptr->_isNetworkShare = true;
 }
+
+void DirItemInfo::connectDestructionSignal(QObject *obj, const QByteArray &slot)
+{
+    int index = obj->metaObject()->indexOfSlot(slot.constData()+1);
+    if (index == -1) {
+        qWarning() << "Object" << obj << "does not has slot named:" << slot;
+    } else {
+        qDebug() << "Will register destruction signal" << obj << slot;
+        d_ptr->_destructionSlots.append(qMakePair(QPointer<QObject>(obj), index));
+    }
+}

=== modified file 'src/plugin/folderlistmodel/diriteminfo.h'
--- src/plugin/folderlistmodel/diriteminfo.h	2015-12-12 12:30:47 +0000
+++ src/plugin/folderlistmodel/diriteminfo.h	2017-01-16 19:31:06 +0000
@@ -30,6 +30,9 @@
 #include <QDir>
 #include <QMimeType>
 #include <QMimeDatabase>
+#include <QPair>
+#include <QPointer>
+#include <QByteArray>
 
 class DirItemInfoPrivate;
 
@@ -114,6 +117,7 @@
     void              fillFromStatBuf(const struct stat& statBuffer);
     void              setAsHost();
     void              setAsShare();
+    void              connectDestructionSignal(QObject *obj, const QByteArray &slot);
 
 public:
     static QString    removeExtraSlashes(const QString &url, int firstSlashIndex = -1);
@@ -134,6 +138,7 @@
 };
 
 typedef QVector<DirItemInfo>   DirItemInfoList;
+typedef QPair<QPointer<QObject>, int> DestructionSlot;
 
 Q_DECLARE_SHARED(DirItemInfo)
 Q_DECLARE_METATYPE(DirItemInfo)
@@ -180,6 +185,8 @@
     QString   _normalizedPath;
     QString   _authenticationPath;
 
+    QVector<DestructionSlot> _destructionSlots;
+
     static QMimeDatabase mimeDatabase;
 };
 

=== modified file 'src/plugin/folderlistmodel/location.h'
--- src/plugin/folderlistmodel/location.h	2015-12-12 13:59:49 +0000
+++ src/plugin/folderlistmodel/location.h	2017-01-16 19:31:06 +0000
@@ -91,6 +91,9 @@
     virtual void setAuthentication(const QString& user,
                                    const QString& password);
 
+private slots:
+    void   onParentDestroyed();
+
 
 public: //pure functions
     /*!

=== modified file 'src/plugin/folderlistmodel/networklistworker.cpp'
--- src/plugin/folderlistmodel/networklistworker.cpp	2015-12-12 14:32:18 +0000
+++ src/plugin/folderlistmodel/networklistworker.cpp	2017-01-16 19:31:06 +0000
@@ -23,8 +23,10 @@
 #include "locationitemdiriterator.h"
 #include "locationurl.h"
 
+#include <QDebug>
+
 NetworkListWorker::NetworkListWorker(LocationItemDirIterator * dirIterator,
-                                     DirItemInfo * mainItemInfo, const DirItemInfo *parent) :
+                                     DirItemInfo * mainItemInfo, DirItemInfo *parent) :
     DirListWorker(dirIterator->path(),
                   dirIterator->filters(),
                   dirIterator->flags() == QDirIterator::Subdirectories ? true : false),
@@ -33,6 +35,7 @@
     m_parent(parent)
 {
      mLoaderType =  NetworkLoader;
+     parent->connectDestructionSignal(this, SLOT(onParentDestroyed()));
 }
 
 
@@ -42,6 +45,12 @@
     delete m_mainItemInfo;
 }
 
+void NetworkListWorker::onParentDestroyed()
+{
+    qDebug() << "Parent destroiedddddd";
+    m_parent = 0;
+}
+
 
 DirItemInfoList NetworkListWorker::getNetworkContent()
 {

=== modified file 'src/plugin/folderlistmodel/networklistworker.h'
--- src/plugin/folderlistmodel/networklistworker.h	2015-12-12 14:32:18 +0000
+++ src/plugin/folderlistmodel/networklistworker.h	2017-01-16 19:31:06 +0000
@@ -40,11 +40,15 @@
 public:
     NetworkListWorker(LocationItemDirIterator * dirIterator,
                       DirItemInfo             * mainItemInfo,
-                      const DirItemInfo       * parent = 0);
+                      DirItemInfo             * parent = 0);
     ~NetworkListWorker();
+public slots:
+    void    onParentDestroyed();
+
 protected:
     virtual DirItemInfoList getNetworkContent();
     void                    setSmbItemAttributes();
+
 protected:
      LocationItemDirIterator     * m_dirIterator;
      DirItemInfo                 * m_mainItemInfo;


References