From e7e0f2d8f06e4086a1872757d779e19a06537b2a Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Mon, 9 Feb 2015 18:18:33 +0100 Subject: [PATCH 1/1] sync bookmarkmanager only if change was by process This is an attempt to fix a bug that seems quite difficult to reproduce, It seems there is a weird race condition linked to the sync of the two files .local/share/user-places.xbel .local/share/kfileplaces/bookmarks.xml causing the bug https://bugs.kde.org/show_bug.cgi?id=343735 all processes that are listening for changes in the bookmark manager will try to sync their bookmarks with the shared ones (user-places.xbel) and depending what process arrives first, some bookmarks may be lost The same commit will happen on kdelibs4 as well CCBUG:343735 REVIEW:122459 --- src/filewidgets/kfileplacesmodel.cpp | 9 +++++++++ src/filewidgets/kfileplacessharedbookmarks.cpp | 7 +------ src/filewidgets/kfileplacessharedbookmarks_p.h | 3 ++- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/filewidgets/kfileplacesmodel.cpp b/src/filewidgets/kfileplacesmodel.cpp index d8da868098ca8dd46129aa718e4dc75ebf871192..6c9201223c7576866de5f2e7ff91069e1e68bebe 100644 --- a/src/filewidgets/kfileplacesmodel.cpp +++ b/src/filewidgets/kfileplacesmodel.cpp @@ -656,6 +656,8 @@ bool KFilePlacesModel::dropMimeData(const QMimeData *data, Qt::DropAction action return false; } + d->sharedBookmarks->updateSharedBookmarks(); + d->reloadAndSignal(); return true; @@ -683,6 +685,8 @@ void KFilePlacesModel::addPlace(const QString &text, const QUrl &url, d->bookmarkManager->root().moveBookmark(bookmark, item->bookmark()); } + d->sharedBookmarks->updateSharedBookmarks(); + d->reloadAndSignal(); } @@ -710,6 +714,8 @@ void KFilePlacesModel::editPlace(const QModelIndex &index, const QString &text, bookmark.setIcon(iconName); bookmark.setMetaDataItem("OnlyInApp", appName); + d->sharedBookmarks->updateSharedBookmarks(); + d->reloadAndSignal(); emit dataChanged(index, index); } @@ -733,6 +739,7 @@ void KFilePlacesModel::removePlace(const QModelIndex &index) const } d->bookmarkManager->root().deleteBookmark(bookmark); + d->sharedBookmarks->updateSharedBookmarks(); d->reloadAndSignal(); } @@ -752,6 +759,8 @@ void KFilePlacesModel::setPlaceHidden(const QModelIndex &index, bool hidden) bookmark.setMetaDataItem("IsHidden", (hidden ? "true" : "false")); + d->sharedBookmarks->updateSharedBookmarks(); + d->reloadAndSignal(); emit dataChanged(index, index); } diff --git a/src/filewidgets/kfileplacessharedbookmarks.cpp b/src/filewidgets/kfileplacessharedbookmarks.cpp index fbd6b5363f8229e113a6c9d49715e6ee210ab9fd..3e7ffb9348ae5996ac2ae46ddc1ef27418400152 100644 --- a/src/filewidgets/kfileplacessharedbookmarks.cpp +++ b/src/filewidgets/kfileplacessharedbookmarks.cpp @@ -127,11 +127,6 @@ KFilePlacesSharedBookmarks::KFilePlacesSharedBookmarks(KBookmarkManager *mgr) connect(m_sharedBookmarkManager, SIGNAL(bookmarksChanged(QString)), this, SLOT(slotSharedBookmarksChanged())); - connect(m_placesBookmarkManager, SIGNAL(changed(QString,QString)), - this, SLOT(slotBookmarksChanged())); - connect(m_placesBookmarkManager, SIGNAL(bookmarksChanged(QString)), - this, SLOT(slotBookmarksChanged())); - integrateSharedBookmarks(); } @@ -278,7 +273,7 @@ void KFilePlacesSharedBookmarks::slotSharedBookmarksChanged() } } -void KFilePlacesSharedBookmarks::slotBookmarksChanged() +void KFilePlacesSharedBookmarks::updateSharedBookmarks() { //qDebug() << "places bookmarks changed"; bool dirty = exportSharedBookmarks(); diff --git a/src/filewidgets/kfileplacessharedbookmarks_p.h b/src/filewidgets/kfileplacessharedbookmarks_p.h index 4c9f6a4da4ff42dc16dd148fc29c8a93b27e6a48..2f9f4b8a84bcfbb85c701adc2c2ad4f453663609 100644 --- a/src/filewidgets/kfileplacessharedbookmarks_p.h +++ b/src/filewidgets/kfileplacessharedbookmarks_p.h @@ -38,6 +38,8 @@ public: /* delete m_sharedBookmarkManager; */ } + void updateSharedBookmarks(); + private: bool integrateSharedBookmarks(); @@ -49,7 +51,6 @@ private: private Q_SLOTS: void slotSharedBookmarksChanged(); - void slotBookmarksChanged(); }; -- 2.2.2