[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: branches/KDE/3.5/kdepim/akregator/src
From: Frank Osterfeld <frank.osterfeld () kdemail ! net>
Date: 2005-09-24 7:33:11
Message-ID: 1127547191.519047.24353.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 463464 by osterfeld:
don't crash when deleting items
Weird things happened in feed.cpp:772:
772: emit signalArticlesRemoved(this, d->removedArticlesNotify);
773: d->removedArticlesNotify.clear();
It seems clear() was called before the signal was finally handled by articlelist. \
(due to some delayed signal forwarding me thinks)
Also, the signal emit doesn't actually copy the list (not even on write), so the \
clear() breaks the refcounting in Article::d somehow, deleting the last Article \
referencing the Article::Private object of the deleted article.
=> ArticleListView operates on Article objects with invalid d pointers.
BUG: 112932
M +3 -0 akregator_view.cpp
M +3 -2 article.cpp
M +10 -4 feed.cpp
--- branches/KDE/3.5/kdepim/akregator/src/akregator_view.cpp #463463:463464
@@ -1304,7 +1304,10 @@
}
for (QValueList<Feed*>::Iterator it = feeds.begin(); it != feeds.end(); \
++it) + {
(*it)->setNotificationMode(true);
+ }
+
if (m_listTabWidget->activeView()->selectedNode())
m_listTabWidget->activeView()->selectedNode()->setNotificationMode(true);
}
--- branches/KDE/3.5/kdepim/akregator/src/article.cpp #463463:463464
@@ -197,13 +197,14 @@
{
if (isDeleted())
return;
- if (d->feed)
- d->feed->setArticleDeleted(*this);
+
setStatus(Read);
d->status = Private::Deleted | Private::Read;
d->archive->setStatus(d->guid, d->status);
d->archive->setDeleted(d->guid);
+ if (d->feed)
+ d->feed->setArticleDeleted(*this);
}
bool Article::isDeleted() const
--- branches/KDE/3.5/kdepim/akregator/src/feed.cpp #463463:463464
@@ -711,7 +711,10 @@
{
if (!d->deletedArticles.contains(a))
d->deletedArticles.append(a);
- d->removedArticlesNotify.append(a);
+
+ if (!d->removedArticlesNotify.contains(a))
+ d->removedArticlesNotify.append(a);
+
articlesModified();
}
@@ -754,17 +757,20 @@
{
if (!d->addedArticlesNotify.isEmpty())
{
- emit signalArticlesAdded(this, d->addedArticlesNotify);
+ QValueList<Article> l = d->addedArticlesNotify;
+ emit signalArticlesAdded(this, l);
d->addedArticlesNotify.clear();
}
if (!d->updatedArticlesNotify.isEmpty())
{
- emit signalArticlesUpdated(this, d->updatedArticlesNotify);
+ QValueList<Article> l = d->updatedArticlesNotify;
+ emit signalArticlesUpdated(this, l);
d->updatedArticlesNotify.clear();
}
if (!d->removedArticlesNotify.isEmpty())
{
- emit signalArticlesRemoved(this, d->removedArticlesNotify);
+ QValueList<Article> l = d->removedArticlesNotify;
+ emit signalArticlesRemoved(this, l);
d->removedArticlesNotify.clear();
}
TreeNode::doArticleNotification();
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic