/* This file is part of the KDE project Copyright (C) 2008 Norbert Frese This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "kfileplacessharedbookmarks_p.h" #include #include #include #include #include #include #include //////////////// utility functions static bool compareBookmarks(const KBookmark & bookmark1, const KBookmark & bookmark2) { return (bookmark1.url() == bookmark2.url() || bookmark1.text() == bookmark2.text()); } static bool deepCompareDomNodes(const QDomNode & node1, const QDomNode & node2) { // compare name and value if (node1.nodeName() != node2.nodeName() || node1.nodeValue() != node2.nodeValue()) return false; // recursively compare children const QDomNodeList node1Children = node1.childNodes(); const QDomNodeList node2Children = node2.childNodes(); if (node1Children.count () != node2Children.count ()) return false; for (int i=0; iroot(); KBookmark bookmark = root.first(); KBookmarkGroup sharedRoot = m_sharedBookmarkManager->root(); KBookmark sharedBookmark = sharedRoot.first(); bool dirty = false; while (!bookmark.isNull()) { //kDebug() << "importing" << bookmark.text(); // skip over system items if (bookmark.metaDataItem("isSystemItem") == "true") { bookmark = root.next(bookmark); continue; } // do the bookmarks match? if (!sharedBookmark.isNull() && compareBookmarks(bookmark, sharedBookmark)) { //kDebug() << "excat comparing: targetbk:\n" << nodeAsString(bookmark.internalElement()) << "\nsourcbk:\n" << nodeAsString(sharedBookmark.internalElement()); if (!exactCompareBookmarks(bookmark, sharedBookmark)) { KBookmark cloneTarget=bookmark; KBookmark cloneSource = sharedBookmark; sharedBookmark = sharedRoot.next(sharedBookmark); bookmark = root.next(bookmark); //kDebug() << "cloning" << cloneSource.text(); //kDebug() << "cloning: target=\n" << nodeAsString(cloneTarget.internalElement()) << "\n source:\n" << nodeAsString(cloneSource.internalElement()); cloneBookmarkContents(cloneTarget, cloneSource); dirty = true; continue; } else { //kDebug() << "keeping" << bookmark.text(); } sharedBookmark = sharedRoot.next(sharedBookmark); bookmark = root.next(bookmark); continue; } // they don't match -> remove //kDebug() << "removing" << bookmark.text(); KBookmark bookmarkToRemove = bookmark; bookmark = root.next(bookmark); root.deleteBookmark(bookmarkToRemove); dirty = true; } // append the remaining shared bookmarks while(!sharedBookmark.isNull()) { root.addBookmark(cloneBookmark(sharedBookmark)); sharedBookmark = sharedRoot.next(sharedBookmark); dirty = true; } return dirty; } bool KFilePlacesSharedBookmarks::exportSharedBookmarks() { KBookmarkGroup root = m_placesBookmarkManager->root(); KBookmark bookmark = root.first(); KBookmarkGroup sharedRoot = m_sharedBookmarkManager->root(); KBookmark sharedBookmark = sharedRoot.first(); bool dirty = false; // first check if they are the same int count=0; while (!bookmark.isNull()) { //kDebug() << "exporting..." << bookmark.text(); // skip over system items if (bookmark.metaDataItem("isSystemItem") == "true") { bookmark = root.next(bookmark); continue; } count++; // end of sharedBookmarks? if (sharedBookmark.isNull()) { dirty=true; break; } // do the bookmarks match? if (compareBookmarks(bookmark, sharedBookmark)) { if (!exactCompareBookmarks(bookmark, sharedBookmark)) { dirty = true; break; } } else { dirty=true; break; } sharedBookmark = sharedRoot.next(sharedBookmark); bookmark = root.next(bookmark); } //kDebug() << "dirty=" << dirty << " oldsize=" << bookmarkGroupSize(sharedRoot) << " count=" << count; if (bookmarkGroupSize(sharedRoot) != count) dirty=true; if (dirty) { emptyBookmarkGroup(sharedRoot); // append all bookmarks KBookmark bookmark = root.first(); while(!bookmark.isNull()) { if (bookmark.metaDataItem("isSystemItem") == "true") { bookmark = root.next(bookmark); continue; } sharedRoot.addBookmark(cloneBookmark(bookmark)); bookmark = root.next(bookmark); dirty = true; } } return dirty; } void KFilePlacesSharedBookmarks::slotSharedBookmarksChanged() { //kDebug() << "shared bookmarks changed"; bool dirty = integrateSharedBookmarks(); if (dirty) m_placesBookmarkManager->emitChanged(); } void KFilePlacesSharedBookmarks::slotBookmarksChanged() { //kDebug() << "places bookmarks changed"; bool dirty = exportSharedBookmarks(); if (dirty) m_sharedBookmarkManager->emitChanged(); } #include "moc_kfileplacessharedbookmarks_p.cpp"