Merge lp:~mandel/ubuntu-download-manager/emit-finish into lp:ubuntu-download-manager

Proposed by Manuel de la Peña
Status: Merged
Merged at revision: 79
Proposed branch: lp:~mandel/ubuntu-download-manager/emit-finish
Merge into: lp:ubuntu-download-manager
Diff against target: 108 lines (+35/-4)
2 files modified
libubuntudownloadmanager/download_queue.cpp (+34/-4)
libubuntudownloadmanager/download_queue.h (+1/-0)
To merge this branch: bzr merge lp:~mandel/ubuntu-download-manager/emit-finish
Reviewer Review Type Date Requested Status
Alejandro J. Cura (community) Approve
PS Jenkins bot continuous-integration Needs Fixing
Review via email: mp+176047@code.launchpad.net

Commit message

Connect to the destroyed signal to ensure that all signals are emitted BEFORE we remove the object from DBus.

Description of the change

Connect to the destroyed signal to ensure that all signals are emitted BEFORE we remove the object from DBus.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Alejandro J. Cura (alecu) wrote :

+1

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'libubuntudownloadmanager/download_queue.cpp'
--- libubuntudownloadmanager/download_queue.cpp 2013-07-20 15:53:38 +0000
+++ libubuntudownloadmanager/download_queue.cpp 2013-07-21 10:55:28 +0000
@@ -16,6 +16,8 @@
16 * Boston, MA 02110-1301, USA.16 * Boston, MA 02110-1301, USA.
17 */17 */
1818
19#include <QDebug>
20#include <QSignalMapper>
19#include "download_queue.h"21#include "download_queue.h"
2022
21/*23/*
@@ -28,6 +30,7 @@
28 Q_DECLARE_PUBLIC(DownloadQueue)30 Q_DECLARE_PUBLIC(DownloadQueue)
29public:31public:
30 explicit DownloadQueuePrivate(SystemNetworkInfo* networkInfo, DownloadQueue* parent);32 explicit DownloadQueuePrivate(SystemNetworkInfo* networkInfo, DownloadQueue* parent);
33 ~DownloadQueuePrivate();
3134
32 void add(Download* download, DownloadAdaptor* adaptor);35 void add(Download* download, DownloadAdaptor* adaptor);
33 void add(const QPair<Download*, DownloadAdaptor*>& value);36 void add(const QPair<Download*, DownloadAdaptor*>& value);
@@ -38,12 +41,14 @@
38 QHash<QString, Download*> downloads();41 QHash<QString, Download*> downloads();
3942
40 void onDownloadStateChanged();43 void onDownloadStateChanged();
44 void onDestroyed(const QString& path);
41 void onCurrentNetworkModeChanged(QNetworkInfo::NetworkMode mode);45 void onCurrentNetworkModeChanged(QNetworkInfo::NetworkMode mode);
4246
43private:47private:
44 void updateCurrentDownload();48 void updateCurrentDownload();
4549
46private:50private:
51 QSignalMapper* _mapper;
47 QString _current;52 QString _current;
48 DownloadList _downloads; // quick for access53 DownloadList _downloads; // quick for access
49 QStringList _sortedPaths; // keep the order in witch the downloads have been added54 QStringList _sortedPaths; // keep the order in witch the downloads have been added
@@ -57,8 +62,19 @@
57 q_ptr(parent)62 q_ptr(parent)
58{63{
59 Q_Q(DownloadQueue);64 Q_Q(DownloadQueue);
65 _mapper = new QSignalMapper();
66
60 q->connect(_networkInfo, SIGNAL(currentNetworkModeChanged(QNetworkInfo::NetworkMode)),67 q->connect(_networkInfo, SIGNAL(currentNetworkModeChanged(QNetworkInfo::NetworkMode)),
61 q, SLOT(onCurrentNetworkModeChanged(QNetworkInfo::NetworkMode)));68 q, SLOT(onCurrentNetworkModeChanged(QNetworkInfo::NetworkMode)));
69
70 q->connect(_mapper, SIGNAL(mapped(const QString&)),
71 q, SLOT(onDestroyed(const QString&)));
72}
73
74DownloadQueuePrivate::~DownloadQueuePrivate()
75{
76 if (_mapper != NULL)
77 delete _mapper;
62}78}
6379
64void DownloadQueuePrivate::add(Download* download, DownloadAdaptor* adaptor)80void DownloadQueuePrivate::add(Download* download, DownloadAdaptor* adaptor)
@@ -82,15 +98,22 @@
8298
83void DownloadQueuePrivate::remove(const QString& path)99void DownloadQueuePrivate::remove(const QString& path)
84{100{
101 qDebug() << __FUNCTION__ << path;
102
85 Q_Q(DownloadQueue);103 Q_Q(DownloadQueue);
104
86 QPair<Download*, DownloadAdaptor*> pair = _downloads[path];105 QPair<Download*, DownloadAdaptor*> pair = _downloads[path];
87 pair.first->deleteLater();
88 pair.second->deleteLater();
89 _sortedPaths.removeOne(path);106 _sortedPaths.removeOne(path);
90 _downloads.remove(path);107 _downloads.remove(path);
91108
92 // emit the signal that it was removed109 // connect to the adaptor destroyed event to ensure that we have emitted all signals, else
93 emit q->downloadRemoved(path);110 // we might have a race condition where the object path is removed from dbus to early
111 q->connect(pair.second, SIGNAL(destroyed(QObject*)),
112 _mapper, SLOT(map(QObject*)));
113 _mapper->setMapping(pair.first, path);
114
115 pair.second->deleteLater();
116 pair.first->deleteLater();
94}117}
95118
96QString DownloadQueuePrivate::currentDownload()119QString DownloadQueuePrivate::currentDownload()
@@ -154,6 +177,13 @@
154 }177 }
155}178}
156179
180void DownloadQueuePrivate::onDestroyed(const QString &path)
181{
182 qDebug() << __FUNCTION__;
183 Q_Q(DownloadQueue);
184 emit q->downloadRemoved(path);
185}
186
157void DownloadQueuePrivate::onCurrentNetworkModeChanged(QNetworkInfo::NetworkMode mode)187void DownloadQueuePrivate::onCurrentNetworkModeChanged(QNetworkInfo::NetworkMode mode)
158{188{
159 Q_UNUSED(mode);189 Q_UNUSED(mode);
160190
=== modified file 'libubuntudownloadmanager/download_queue.h'
--- libubuntudownloadmanager/download_queue.h 2013-07-12 10:45:37 +0000
+++ libubuntudownloadmanager/download_queue.h 2013-07-21 10:55:28 +0000
@@ -49,6 +49,7 @@
4949
50private:50private:
51 Q_PRIVATE_SLOT(d_func(), void onDownloadStateChanged())51 Q_PRIVATE_SLOT(d_func(), void onDownloadStateChanged())
52 Q_PRIVATE_SLOT(d_func(), void onDestroyed(const QString& path))
52 Q_PRIVATE_SLOT(d_func(), void onCurrentNetworkModeChanged(QNetworkInfo::NetworkMode mode))53 Q_PRIVATE_SLOT(d_func(), void onCurrentNetworkModeChanged(QNetworkInfo::NetworkMode mode))
5354
54private:55private:

Subscribers

People subscribed via source and target branches