summaryrefslogtreecommitdiffstats
path: root/kio/bookmarks/kbookmark.cc
diff options
context:
space:
mode:
Diffstat (limited to 'kio/bookmarks/kbookmark.cc')
-rw-r--r--kio/bookmarks/kbookmark.cc535
1 files changed, 0 insertions, 535 deletions
diff --git a/kio/bookmarks/kbookmark.cc b/kio/bookmarks/kbookmark.cc
deleted file mode 100644
index ab1cc398a..000000000
--- a/kio/bookmarks/kbookmark.cc
+++ /dev/null
@@ -1,535 +0,0 @@
-// -*- c-basic-offset:4; indent-tabs-mode:nil -*-
-// vim: set ts=4 sts=4 sw=4 et:
-/* This file is part of the KDE libraries
- Copyright (C) 2000 David Faure <faure@kde.org>
- Copyright (C) 2003 Alexander Kellett <lypanov@kde.org>
-
- 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 "kbookmark.h"
-#include <tqvaluestack.h>
-#include <kdebug.h>
-#include <kmimetype.h>
-#include <kstringhandler.h>
-#include <kinputdialog.h>
-#include <kglobal.h>
-#include <klocale.h>
-#include <assert.h>
-#include <kapplication.h>
-#include <dcopclient.h>
-#include <kbookmarkmanager.h>
-
-KBookmarkGroup::KBookmarkGroup()
- : KBookmark( TQDomElement() )
-{
-}
-
-KBookmarkGroup::KBookmarkGroup( TQDomElement elem )
- : KBookmark(elem)
-{
-}
-
-TQString KBookmarkGroup::groupAddress() const
-{
- if (m_address.isEmpty())
- m_address = address();
- return m_address;
-}
-
-bool KBookmarkGroup::isOpen() const
-{
- return element.attribute("folded") == "no"; // default is: folded
-}
-
-// Returns first element node equal to or after node n
-static TQDomElement firstElement(TQDomNode n)
-{
- while(!n.isNull() && !n.isElement())
- n = n.nextSibling();
- return n.toElement();
-}
-
-// Returns first element node equal to or before node n
-static TQDomElement lastElement(TQDomNode n)
-{
- while(!n.isNull() && !n.isElement())
- n = n.previousSibling();
- return n.toElement();
-}
-
-KBookmark KBookmarkGroup::first() const
-{
- return KBookmark( nextKnownTag( firstElement(element.firstChild()), true ) );
-}
-
-KBookmark KBookmarkGroup::previous( const KBookmark & current ) const
-{
- return KBookmark( nextKnownTag( lastElement(current.element.previousSibling()), false ) );
-}
-
-KBookmark KBookmarkGroup::next( const KBookmark & current ) const
-{
- return KBookmark( nextKnownTag( firstElement(current.element.nextSibling()), true ) );
-}
-
-// KDE4: Change TQDomElement to TQDomNode so that we can get rid of
-// firstElement() and lastElement()
-TQDomElement KBookmarkGroup::nextKnownTag( TQDomElement start, bool goNext ) const
-{
- static const TQString & bookmark = TDEGlobal::staticQString("bookmark");
- static const TQString & folder = TDEGlobal::staticQString("folder");
- static const TQString & separator = TDEGlobal::staticQString("separator");
-
- for( TQDomNode n = start; !n.isNull(); )
- {
- TQDomElement elem = n.toElement();
- TQString tag = elem.tagName();
- if (tag == folder || tag == bookmark || tag == separator)
- return elem;
- if (goNext)
- n = n.nextSibling();
- else
- n = n.previousSibling();
- }
- return TQDomElement();
-}
-
-KBookmarkGroup KBookmarkGroup::createNewFolder( KBookmarkManager* mgr, const TQString & text, bool emitSignal )
-{
- TQString txt( text );
- if ( text.isEmpty() )
- {
- bool ok;
- TQString caption = parentGroup().fullText().isEmpty() ?
- i18n( "Create New Bookmark Folder" ) :
- i18n( "Create New Bookmark Folder in %1" )
- .arg( parentGroup().text() );
- txt = KInputDialog::getText( caption, i18n( "New folder:" ),
- TQString::null, &ok );
- if ( !ok )
- return KBookmarkGroup();
- }
-
- Q_ASSERT(!element.isNull());
- TQDomDocument doc = element.ownerDocument();
- TQDomElement groupElem = doc.createElement( "folder" );
- element.appendChild( groupElem );
- TQDomElement textElem = doc.createElement( "title" );
- groupElem.appendChild( textElem );
- textElem.appendChild( doc.createTextNode( txt ) );
-
- KBookmarkGroup grp(groupElem);
-
- if (emitSignal)
- emit mgr->notifier().createdNewFolder(
- mgr->path(), grp.fullText(),
- grp.address() );
-
- return grp;
-
-}
-
-KBookmark KBookmarkGroup::createNewSeparator()
-{
- Q_ASSERT(!element.isNull());
- TQDomDocument doc = element.ownerDocument();
- Q_ASSERT(!doc.isNull());
- TQDomElement sepElem = doc.createElement( "separator" );
- element.appendChild( sepElem );
- return KBookmark(sepElem);
-}
-
-bool KBookmarkGroup::moveItem( const KBookmark & item, const KBookmark & after )
-{
- TQDomNode n;
- if ( !after.isNull() )
- n = element.insertAfter( item.element, after.element );
- else // first child
- {
- if ( element.firstChild().isNull() ) // Empty element -> set as real first child
- n = element.insertBefore( item.element, TQDomElement() );
-
- // we have to skip everything up to the first valid child
- TQDomElement firstChild = nextKnownTag(element.firstChild().toElement(), true);
- if ( !firstChild.isNull() )
- n = element.insertBefore( item.element, firstChild );
- else
- {
- // No real first child -> append after the <title> etc.
- n = element.appendChild( item.element );
- }
- }
- return (!n.isNull());
-}
-
-KBookmark KBookmarkGroup::addBookmark( KBookmarkManager* mgr, const KBookmark &bm, bool emitSignal )
-{
- element.appendChild( bm.internalElement() );
-
- if (emitSignal) {
- if ( bm.hasMetaData() ) {
- mgr->notifyCompleteChange( "" );
- } else {
- emit mgr->notifier().addedBookmark(
- mgr->path(), bm.url().url(),
- bm.fullText(), bm.address(), bm.icon() );
- }
- }
-
- return bm;
-}
-
-KBookmark KBookmarkGroup::addBookmark( KBookmarkManager* mgr, const TQString & text, const KURL & url, const TQString & icon, bool emitSignal )
-{
- //kdDebug(7043) << "KBookmarkGroup::addBookmark " << text << " into " << m_address << endl;
- TQDomDocument doc = element.ownerDocument();
- TQDomElement elem = doc.createElement( "bookmark" );
- elem.setAttribute( "href", url.url( 0, 106 ) ); // write utf8 URL (106 is mib enum for utf8)
- TQString _icon = icon;
- if ( _icon.isEmpty() )
- _icon = KMimeType::iconForURL( url );
- elem.setAttribute( "icon", _icon );
-
- TQDomElement textElem = doc.createElement( "title" );
- elem.appendChild( textElem );
- textElem.appendChild( doc.createTextNode( text ) );
-
- return addBookmark( mgr, KBookmark( elem ), emitSignal );
-}
-
-void KBookmarkGroup::deleteBookmark( KBookmark bk )
-{
- element.removeChild( bk.element );
-}
-
-bool KBookmarkGroup::isToolbarGroup() const
-{
- return ( element.attribute("toolbar") == "yes" );
-}
-
-TQDomElement KBookmarkGroup::findToolbar() const
-{
- if ( element.attribute("toolbar") == "yes" )
- return element;
- for (TQDomNode n = element.firstChild(); !n.isNull() ; n = n.nextSibling() )
- {
- TQDomElement e = n.toElement();
- // Search among the "folder" children only
- if ( e.tagName() == "folder" )
- {
- if ( e.attribute("toolbar") == "yes" )
- return e;
- else
- {
- TQDomElement result = KBookmarkGroup(e).findToolbar();
- if (!result.isNull())
- return result;
- }
- }
- }
- return TQDomElement();
-}
-
-TQValueList<KURL> KBookmarkGroup::groupUrlList() const
-{
- TQValueList<KURL> urlList;
- for ( KBookmark bm = first(); !bm.isNull(); bm = next(bm) )
- {
- if ( bm.isSeparator() || bm.isGroup() )
- continue;
- urlList << bm.url();
- }
- return urlList;
-}
-
-//////
-
-bool KBookmark::isGroup() const
-{
- TQString tag = element.tagName();
- return ( tag == "folder"
- || tag == "xbel" ); // don't forget the toplevel group
-}
-
-bool KBookmark::isSeparator() const
-{
- return (element.tagName() == "separator");
-}
-
-bool KBookmark::hasParent() const
-{
- TQDomElement parent = element.parentNode().toElement();
- return !parent.isNull();
-}
-
-TQString KBookmark::text() const
-{
- return KStringHandler::csqueeze( fullText() );
-}
-
-TQString KBookmark::fullText() const
-{
- if (isSeparator())
- return i18n("--- separator ---");
-
- return element.namedItem("title").toElement().text();
-}
-
-KURL KBookmark::url() const
-{
- return KURL(element.attribute("href"), 106); // Decode it from utf8 (106 is mib enum for utf8)
-}
-
-TQString KBookmark::icon() const
-{
- TQString icon = element.attribute("icon");
- if ( icon.isEmpty() )
- // Default icon depends on URL for bookmarks, and is default directory
- // icon for groups.
- if ( isGroup() )
- icon = "bookmark_folder";
- else
- if ( isSeparator() )
- icon = "eraser"; // whatever
- else
- icon = KMimeType::iconForURL( url() );
- return icon;
-}
-
-KBookmarkGroup KBookmark::parentGroup() const
-{
- return KBookmarkGroup( element.parentNode().toElement() );
-}
-
-KBookmarkGroup KBookmark::toGroup() const
-{
- Q_ASSERT( isGroup() );
- return KBookmarkGroup(element);
-}
-
-TQString KBookmark::address() const
-{
- if ( element.tagName() == "xbel" )
- return ""; // not TQString::null !
- else
- {
- // Use keditbookmarks's DEBUG_ADDRESSES flag to debug this code :)
- if (!hasParent())
- {
- Q_ASSERT(hasParent());
- return "ERROR"; // Avoid an infinite loop
- }
- KBookmarkGroup group = parentGroup();
- TQString parentAddress = group.address();
- uint counter = 0;
- // Implementation note: we don't use QDomNode's childNode list because we
- // would have to skip "TEXT", which KBookmarkGroup already does for us.
- for ( KBookmark bk = group.first() ; !bk.isNull() ; bk = group.next(bk), ++counter )
- {
- if ( bk.element == element )
- return parentAddress + "/" + TQString::number(counter);
- }
- kdWarning() << "KBookmark::address : this can't happen! " << parentAddress << endl;
- return "ERROR";
- }
-}
-
-KBookmark KBookmark::standaloneBookmark( const TQString & text, const KURL & url, const TQString & icon )
-{
- TQDomDocument doc("xbel");
- TQDomElement elem = doc.createElement("xbel");
- doc.appendChild( elem );
- KBookmarkGroup grp( elem );
- grp.addBookmark( 0L, text, url, icon, false );
- return grp.first();
-}
-
-// For some strange reason TQString("").left(0) returns TQString::null;
-// That breaks commonParent()
-TQString KBookmark::left(const TQString & str, uint len)
-{
- //kdDebug()<<"********"<<TQString("").left(0).isNull()<<endl;
- if(len == 0)
- return TQString("");
- else
- return str.left(len);
-}
-
-TQString KBookmark::commonParent(TQString A, TQString B)
-{
- TQString error("ERROR");
- if(A == error || B == error)
- return error;
-
- A += "/";
- B += "/";
-
- uint lastCommonSlash = 0;
- uint lastPos = A.length() < B.length() ? A.length() : B.length();
- for(uint i=0; i < lastPos; ++i)
- {
- if(A[i] != B[i])
- return left(A, lastCommonSlash);
- if(A[i] == '/')
- lastCommonSlash = i;
- }
- return left(A, lastCommonSlash);
-}
-
-static TQDomNode cd_or_create(TQDomNode node, TQString name)
-{
- TQDomNode subnode = node.namedItem(name);
- if (subnode.isNull())
- {
- subnode = node.ownerDocument().createElement(name);
- node.appendChild(subnode);
- }
- return subnode;
-}
-
-static TQDomText get_or_create_text(TQDomNode node)
-{
- TQDomNode subnode = node.firstChild();
- if (subnode.isNull())
- {
- subnode = node.ownerDocument().createTextNode("");
- node.appendChild(subnode);
- }
- return subnode.toText();
-}
-
-// Look for a metadata with owner="http://www.kde.org" or without any owner (for compatibility)
-static TQDomNode findOrCreateMetadata( TQDomNode& parent )
-{
- static const char kdeOwner[] = "http://www.kde.org";
- TQDomElement metadataElement;
- for ( TQDomNode _node = parent.firstChild(); !_node.isNull(); _node = _node.nextSibling() ) {
- TQDomElement elem = _node.toElement();
- if ( !elem.isNull() && elem.tagName() == "metadata" ) {
- const TQString owner = elem.attribute( "owner" );
- if ( owner == kdeOwner )
- return elem;
- if ( owner.isEmpty() )
- metadataElement = elem;
- }
- }
- if ( metadataElement.isNull() ) {
- metadataElement = parent.ownerDocument().createElement( "metadata" );
- parent.appendChild(metadataElement);
- }
- metadataElement.setAttribute( "owner", kdeOwner );
- return metadataElement;
-}
-
-bool KBookmark::hasMetaData() const
-{
- // ### NOTE: this code creates <info> and <metadata>, despite its name and the const.
- // It doesn't matter much in practice since it's only called for newly-created bookmarks,
- // which will get metadata soon after anyway.
- TQDomNode n = cd_or_create( internalElement(), "info" );
- return findOrCreateMetadata( n ).hasChildNodes();
-}
-
-void KBookmark::updateAccessMetadata()
-{
- kdDebug(7043) << "KBookmark::updateAccessMetadata " << address() << " " << url().prettyURL() << endl;
-
- const uint timet = TQDateTime::currentDateTime().toTime_t();
- setMetaDataItem( "time_added", TQString::number( timet ), DontOverwriteMetaData );
- setMetaDataItem( "time_visited", TQString::number( timet ) );
-
- TQString countStr = metaDataItem( "visit_count" ); // TODO use spec'ed name
- bool ok;
- int currentCount = countStr.toInt(&ok);
- if (!ok)
- currentCount = 0;
- currentCount++;
- setMetaDataItem( "visit_count", TQString::number( currentCount ) );
-
- // TODO - for 4.0 - time_modified
-}
-
-TQString KBookmark::metaDataItem( const TQString &key ) const
-{
- TQDomNode infoNode = cd_or_create( internalElement(), "info" );
- infoNode = findOrCreateMetadata( infoNode );
- for ( TQDomNode n = infoNode.firstChild(); !n.isNull(); n = n.nextSibling() ) {
- if ( !n.isElement() ) {
- continue;
- }
- const TQDomElement e = n.toElement();
- if ( e.tagName() == key ) {
- return e.text();
- }
- }
- return TQString::null;
-}
-
-void KBookmark::setMetaDataItem( const TQString &key, const TQString &value, MetaDataOverwriteMode mode )
-{
- TQDomNode infoNode = cd_or_create( internalElement(), "info" );
- infoNode = findOrCreateMetadata( infoNode );
-
- TQDomNode item = cd_or_create( infoNode, key );
- TQDomText text = get_or_create_text( item );
- if ( mode == DontOverwriteMetaData && !text.data().isEmpty() ) {
- return;
- }
-
- text.setData( value );
-}
-
-void KBookmarkGroupTraverser::traverse(const KBookmarkGroup &root)
-{
- // non-recursive bookmark iterator
- TQValueStack<KBookmarkGroup> stack;
- stack.push(root);
- KBookmark bk = stack.top().first();
- for (;;) {
- if (bk.isNull())
- {
- if (stack.isEmpty())
- return;
- if (stack.count() > 1)
- visitLeave(stack.top());
- bk = stack.pop();
- bk = stack.top().next(bk);
- if (bk.isNull())
- continue;
- }
-
- if (bk.isGroup())
- {
- KBookmarkGroup gp = bk.toGroup();
- visitEnter(gp);
- if (!gp.first().isNull())
- {
- stack.push(gp);
- bk = gp.first();
- continue;
- }
- // empty group
- visitLeave(gp);
- }
- else
- visit(bk);
-
- bk = stack.top().next(bk);
- }
-
- // never reached
-}
-