• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.10.5 API Reference
  • KDE Home
  • Contact Us
 

KIO

  • kio
  • bookmarks
kbookmark.cc
Go to the documentation of this file.
1 // -*- c-basic-offset:4; indent-tabs-mode:nil -*-
2 // vim: set ts=4 sts=4 sw=4 et:
3 /* This file is part of the KDE libraries
4  Copyright (C) 2000 David Faure <faure@kde.org>
5  Copyright (C) 2003 Alexander Kellett <lypanov@kde.org>
6  Copyright (C) 2008 Norbert Frese <nf2@scheinwelt.at>
7 
8  This library is free software; you can redistribute it and/or
9  modify it under the terms of the GNU Library General Public
10  License version 2 as published by the Free Software Foundation.
11 
12  This library is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  Library General Public License for more details.
16 
17  You should have received a copy of the GNU Library General Public License
18  along with this library; see the file COPYING.LIB. If not, write to
19  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  Boston, MA 02110-1301, USA.
21 */
22 
23 #include "kbookmark.h"
24 #include <QStack>
25 #include <kdebug.h>
26 #include <kmimetype.h>
27 #include <kstringhandler.h>
28 #include <kglobal.h>
29 #include <klocale.h>
30 #include <assert.h>
31 #include <kbookmarkmanager.h>
32 
33 #include <qdatetime.h>
34 #include <qmimedata.h>
35 
36 #define METADATA_KDE_OWNER "http://www.kde.org"
37 #define METADATA_FREEDESKTOP_OWNER "http://freedesktop.org"
38 #define METADATA_MIME_OWNER "http://www.freedesktop.org/standards/shared-mime-info"
39 
41 
42 static QDomNode cd(QDomNode node, const QString &name, bool create)
43 {
44  QDomNode subnode = node.namedItem(name);
45  if (create && subnode.isNull())
46  {
47  subnode = node.ownerDocument().createElement(name);
48  node.appendChild(subnode);
49  }
50  return subnode;
51 }
52 
53 static QDomNode cd_or_create(QDomNode node, const QString &name)
54 {
55  return cd(node, name, true);
56 }
57 
58 static QDomText get_or_create_text(QDomNode node)
59 {
60  QDomNode subnode = node.firstChild();
61  if (subnode.isNull())
62  {
63  subnode = node.ownerDocument().createTextNode("");
64  node.appendChild(subnode);
65  }
66  return subnode.toText();
67 }
68 
69 static QDomNode findMetadata(const QString & forOwner, QDomNode& parent, bool create)
70 {
71  bool forOwnerIsKDE = forOwner == METADATA_KDE_OWNER;
72 
73  QDomElement metadataElement;
74  for ( QDomNode _node = parent.firstChild(); !_node.isNull(); _node = _node.nextSibling() ) {
75  QDomElement elem = _node.toElement();
76  if ( !elem.isNull() && elem.tagName() == "metadata" ) {
77  const QString owner = elem.attribute( "owner" );
78  if ( owner == forOwner )
79  return elem;
80  if ( owner.isEmpty() && forOwnerIsKDE )
81  metadataElement = elem;
82  }
83  }
84  if ( create && metadataElement.isNull() ) {
85  metadataElement = parent.ownerDocument().createElement( "metadata" );
86  parent.appendChild(metadataElement);
87  metadataElement.setAttribute( "owner", forOwner );
88 
89  } else if (!metadataElement.isNull() && forOwnerIsKDE) {
90  // i'm not sure if this is good, we shouln't take over foreign metatdata
91  metadataElement.setAttribute( "owner", METADATA_KDE_OWNER );
92  }
93  return metadataElement;
94 }
95 
97 
98 KBookmarkGroup::KBookmarkGroup()
99  : KBookmark( QDomElement() )
100 {
101 }
102 
103 KBookmarkGroup::KBookmarkGroup( const QDomElement &elem )
104  : KBookmark(elem)
105 {
106 }
107 
108 bool KBookmarkGroup::isOpen() const
109 {
110  return element.attribute("folded") == "no"; // default is: folded
111 }
112 
113 KBookmark KBookmarkGroup::first() const
114 {
115  return KBookmark( nextKnownTag( element.firstChildElement(), true ) );
116 }
117 
118 KBookmark KBookmarkGroup::previous( const KBookmark & current ) const
119 {
120  return KBookmark( nextKnownTag( current.element.previousSiblingElement(), false ) );
121 }
122 
123 KBookmark KBookmarkGroup::next( const KBookmark & current ) const
124 {
125  return KBookmark( nextKnownTag( current.element.nextSiblingElement(), true ) );
126 }
127 
128 int KBookmarkGroup::indexOf(const KBookmark& child) const
129 {
130  uint counter = 0;
131  for ( KBookmark bk = first(); !bk.isNull(); bk = next(bk), ++counter ) {
132  if ( bk.element == child.element )
133  return counter;
134  }
135  return -1;
136 }
137 
138 QDomElement KBookmarkGroup::nextKnownTag( const QDomElement &start, bool goNext ) const
139 {
140  static const QString & bookmark = KGlobal::staticQString("bookmark");
141  static const QString & folder = KGlobal::staticQString("folder");
142  static const QString & separator = KGlobal::staticQString("separator");
143 
144  for( QDomElement elem = start; !elem.isNull(); )
145  {
146  QString tag = elem.tagName();
147  if (tag == folder || tag == bookmark || tag == separator)
148  return elem;
149  if (goNext)
150  elem = elem.nextSiblingElement();
151  else
152  elem = elem.previousSiblingElement();
153  }
154  return QDomElement();
155 }
156 
157 KBookmarkGroup KBookmarkGroup::createNewFolder( const QString & text )
158 {
159  if (isNull())
160  return KBookmarkGroup();
161  QDomDocument doc = element.ownerDocument();
162  QDomElement groupElem = doc.createElement( "folder" );
163  element.appendChild( groupElem );
164  QDomElement textElem = doc.createElement( "title" );
165  groupElem.appendChild( textElem );
166  textElem.appendChild( doc.createTextNode( text ) );
167  return KBookmarkGroup(groupElem);
168 
169 }
170 
171 KBookmark KBookmarkGroup::createNewSeparator()
172 {
173  if (isNull())
174  return KBookmark();
175  QDomDocument doc = element.ownerDocument();
176  Q_ASSERT(!doc.isNull());
177  QDomElement sepElem = doc.createElement( "separator" );
178  element.appendChild( sepElem );
179  return KBookmark(sepElem);
180 }
181 
182 #ifndef KDE_NO_DEPRECATED
183 bool KBookmarkGroup::moveItem( const KBookmark & bookmark, const KBookmark & after )
184 {
185  return moveBookmark(bookmark, after);
186 }
187 #endif
188 
189 bool KBookmarkGroup::moveBookmark( const KBookmark & item, const KBookmark & after )
190 {
191  QDomNode n;
192  if ( !after.isNull() )
193  n = element.insertAfter( item.element, after.element );
194  else // first child
195  {
196  if ( element.firstChild().isNull() ) // Empty element -> set as real first child
197  n = element.insertBefore( item.element, QDomElement() );
198 
199  // we have to skip everything up to the first valid child
200  QDomElement firstChild = nextKnownTag(element.firstChild().toElement(), true);
201  if ( !firstChild.isNull() )
202  n = element.insertBefore( item.element, firstChild );
203  else
204  {
205  // No real first child -> append after the <title> etc.
206  n = element.appendChild( item.element );
207  }
208  }
209  return (!n.isNull());
210 }
211 
212 KBookmark KBookmarkGroup::addBookmark( const KBookmark &bm )
213 {
214  element.appendChild( bm.internalElement() );
215  return bm;
216 }
217 
218 KBookmark KBookmarkGroup::addBookmark( const QString & text, const KUrl & url, const QString & icon )
219 {
220  if (isNull())
221  return KBookmark();
222  QDomDocument doc = element.ownerDocument();
223  QDomElement elem = doc.createElement( "bookmark" );
224  elem.setAttribute( "href", url.url() ); // gives us utf8
225 
226  QDomElement textElem = doc.createElement( "title" );
227  elem.appendChild( textElem );
228  textElem.appendChild( doc.createTextNode( text ) );
229 
230  KBookmark newBookmark = addBookmark( KBookmark( elem ) );
231 
232  // as icons are moved to metadata, we have to use the KBookmark API for this
233  newBookmark.setIcon(icon.isEmpty() ? KMimeType::iconNameForUrl( url ) : icon );
234  return newBookmark;
235 }
236 
237 void KBookmarkGroup::deleteBookmark( const KBookmark &bk )
238 {
239  element.removeChild( bk.element );
240 }
241 
242 bool KBookmarkGroup::isToolbarGroup() const
243 {
244  return ( element.attribute("toolbar") == "yes" );
245 }
246 
247 QDomElement KBookmarkGroup::findToolbar() const
248 {
249  if ( element.attribute("toolbar") == "yes" )
250  return element;
251  for (QDomNode n = element.firstChild(); !n.isNull() ; n = n.nextSibling() )
252  {
253  QDomElement e = n.toElement();
254  // Search among the "folder" children only
255  if ( e.tagName() == "folder" )
256  {
257  if ( e.attribute("toolbar") == "yes" )
258  return e;
259  else
260  {
261  QDomElement result = KBookmarkGroup(e).findToolbar();
262  if (!result.isNull())
263  return result;
264  }
265  }
266  }
267  return QDomElement();
268 }
269 
270 QList<KUrl> KBookmarkGroup::groupUrlList() const
271 {
272  QList<KUrl> urlList;
273  for ( KBookmark bm = first(); !bm.isNull(); bm = next(bm) )
274  {
275  if ( bm.isSeparator() || bm.isGroup() )
276  continue;
277  urlList << bm.url();
278  }
279  return urlList;
280 }
281 
283 
284 KBookmark::KBookmark()
285 {
286 }
287 
288 KBookmark::KBookmark( const QDomElement &elem ) : element(elem)
289 {
290 }
291 
292 bool KBookmark::isGroup() const
293 {
294  QString tag = element.tagName();
295  return ( tag == "folder"
296  || tag == "xbel" ); // don't forget the toplevel group
297 }
298 
299 bool KBookmark::isSeparator() const
300 {
301  return (element.tagName() == "separator");
302 }
303 
304 bool KBookmark::isNull() const
305 {
306  return element.isNull();
307 }
308 
309 bool KBookmark::hasParent() const
310 {
311  QDomElement parent = element.parentNode().toElement();
312  return !parent.isNull();
313 }
314 
315 QString KBookmark::text() const
316 {
317  return KStringHandler::csqueeze( fullText() );
318 }
319 
320 QString KBookmark::fullText() const
321 {
322  if (isSeparator())
323  return i18n("--- separator ---");
324 
325  QString text = element.namedItem("title").toElement().text();
326  text.replace('\n', ' '); // #140673
327  return text;
328 }
329 
330 void KBookmark::setFullText(const QString &fullText)
331 {
332  QDomNode titleNode = element.namedItem("title");
333  if (titleNode.isNull()) {
334  titleNode = element.ownerDocument().createElement("title");
335  element.appendChild(titleNode);
336  }
337 
338  if (titleNode.firstChild().isNull()) {
339  QDomText domtext = titleNode.ownerDocument().createTextNode("");
340  titleNode.appendChild(domtext);
341  }
342 
343  QDomText domtext = titleNode.firstChild().toText();
344  domtext.setData(fullText);
345 }
346 
347 KUrl KBookmark::url() const
348 {
349  return KUrl(element.attribute("href").toLatin1()); // Decodes it from utf8
350 }
351 
352 void KBookmark::setUrl(const KUrl &url)
353 {
354  element.setAttribute("href", url.url());
355 }
356 
357 QString KBookmark::icon() const
358 {
359  QDomNode metaDataNode = metaData(METADATA_FREEDESKTOP_OWNER, false);
360  QDomElement iconElement = cd(metaDataNode, "bookmark:icon", false).toElement();
361 
362  QString icon = iconElement.attribute("name");
363 
364  // migration code
365  if (icon.isEmpty())
366  icon = element.attribute("icon");
367  if (icon == "www") // common icon for kde3 bookmarks
368  return "internet-web-browser";
369  // end migration code
370 
371  if (icon == "bookmark_folder") {
372  return "folder-bookmarks";
373  }
374  if (icon.isEmpty()) {
375  // Default icon depends on URL for bookmarks, and is default directory
376  // icon for groups.
377  if (isGroup()) {
378  icon = "folder-bookmarks";
379  }
380  else {
381  if (isSeparator()) {
382  icon = "edit-clear"; // whatever
383  } else {
384  // get icon from mimeType
385  QString _mimeType = mimeType();
386  if (!_mimeType.isEmpty()) {
387  KMimeType::Ptr mime = KMimeType::mimeType(_mimeType, KMimeType::ResolveAliases);
388  if (mime) {
389  return mime->iconName();
390  }
391  }
392  // get icon from URL
393  icon = KMimeType::iconNameForUrl(url());
394  }
395  }
396  }
397  return icon;
398 }
399 
400 void KBookmark::setIcon(const QString &icon)
401 {
402  QDomNode metaDataNode = metaData(METADATA_FREEDESKTOP_OWNER, true);
403  QDomElement iconElement = cd_or_create(metaDataNode, "bookmark:icon").toElement();
404  iconElement.setAttribute ( "name", icon );
405 
406  // migration code
407  if(!element.attribute("icon").isEmpty())
408  element.removeAttribute("icon");
409 }
410 
411 QString KBookmark::description() const
412 {
413  if (isSeparator())
414  return QString();
415 
416  QString description = element.namedItem("desc").toElement().text();
417  description.replace('\n', ' '); // #140673
418  return description;
419 }
420 
421 void KBookmark::setDescription(const QString &description)
422 {
423  QDomNode descNode = element.namedItem("desc");
424  if (descNode.isNull()) {
425  descNode = element.ownerDocument().createElement("desc");
426  element.appendChild(descNode);
427  }
428 
429  if (descNode.firstChild().isNull()) {
430  QDomText domtext = descNode.ownerDocument().createTextNode(QString());
431  descNode.appendChild(domtext);
432  }
433 
434  QDomText domtext = descNode.firstChild().toText();
435  domtext.setData(description);
436 }
437 
438 QString KBookmark::mimeType() const
439 {
440  QDomNode metaDataNode = metaData(METADATA_MIME_OWNER, false);
441  QDomElement mimeTypeElement = cd(metaDataNode, "mime:mime-type", false).toElement();
442  return mimeTypeElement.attribute("type");
443 }
444 
445 void KBookmark::setMimeType(const QString &mimeType)
446 {
447  QDomNode metaDataNode = metaData(METADATA_MIME_OWNER, true);
448  QDomElement iconElement = cd_or_create(metaDataNode, "mime:mime-type").toElement();
449  iconElement.setAttribute ( "type", mimeType );
450 }
451 
452 bool KBookmark::showInToolbar() const
453 {
454  if(element.hasAttribute("showintoolbar"))
455  {
456  bool show = element.attribute("showintoolbar") == "yes";
457  const_cast<QDomElement *>(&element)->removeAttribute("showintoolbar");
458  const_cast<KBookmark *>(this)->setShowInToolbar(show);
459  }
460  return metaDataItem("showintoolbar") == "yes";
461 }
462 
463 
464 void KBookmark::setShowInToolbar(bool show)
465 {
466  setMetaDataItem("showintoolbar", show ? "yes" : "no");
467 }
468 
469 KBookmarkGroup KBookmark::parentGroup() const
470 {
471  return KBookmarkGroup( element.parentNode().toElement() );
472 }
473 
474 KBookmarkGroup KBookmark::toGroup() const
475 {
476  Q_ASSERT( isGroup() );
477  return KBookmarkGroup(element);
478 }
479 
480 QString KBookmark::address() const
481 {
482  if ( element.tagName() == "xbel" )
483  return ""; // not QString() !
484  else
485  {
486  // Use keditbookmarks's DEBUG_ADDRESSES flag to debug this code :)
487  if (element.parentNode().isNull())
488  {
489  Q_ASSERT(false);
490  return "ERROR"; // Avoid an infinite loop
491  }
492  KBookmarkGroup group = parentGroup();
493  QString parentAddress = group.address();
494  int pos = group.indexOf(*this);
495  Q_ASSERT(pos != -1);
496  return parentAddress + '/' + QString::number(pos);
497  }
498 }
499 
500 int KBookmark::positionInParent() const
501 {
502  return parentGroup().indexOf(*this);
503 }
504 
505 QDomElement KBookmark::internalElement() const
506 {
507  return element;
508 }
509 
510 KBookmark KBookmark::standaloneBookmark( const QString & text, const KUrl & url, const QString & icon )
511 {
512  QDomDocument doc("xbel");
513  QDomElement elem = doc.createElement("xbel");
514  doc.appendChild( elem );
515  KBookmarkGroup grp( elem );
516  grp.addBookmark( text, url, icon );
517  return grp.first();
518 }
519 
520 
521 QString KBookmark::commonParent(const QString &first, const QString &second)
522 {
523  QString A = first;
524  QString B = second;
525  QString error("ERROR");
526  if(A == error || B == error)
527  return error;
528 
529  A += '/';
530  B += '/';
531 
532  uint lastCommonSlash = 0;
533  uint lastPos = A.length() < B.length() ? A.length() : B.length();
534  for(uint i=0; i < lastPos; ++i)
535  {
536  if(A[i] != B[i])
537  return A.left(lastCommonSlash);
538  if(A[i] == '/')
539  lastCommonSlash = i;
540  }
541  return A.left(lastCommonSlash);
542 }
543 
544 void KBookmark::updateAccessMetadata()
545 {
546  kDebug(7043) << "KBookmark::updateAccessMetadata " << address() << " " << url().prettyUrl();
547 
548  const uint timet = QDateTime::currentDateTime().toTime_t();
549  setMetaDataItem( "time_added", QString::number( timet ), DontOverwriteMetaData );
550  setMetaDataItem( "time_visited", QString::number( timet ) );
551 
552  QString countStr = metaDataItem( "visit_count" ); // TODO use spec'ed name
553  bool ok;
554  int currentCount = countStr.toInt(&ok);
555  if (!ok)
556  currentCount = 0;
557  currentCount++;
558  setMetaDataItem( "visit_count", QString::number( currentCount ) );
559 
560  // TODO - for 4.0 - time_modified
561 }
562 
563 QString KBookmark::parentAddress( const QString & address )
564 {
565  return address.left( address.lastIndexOf(QLatin1Char('/')) );
566 }
567 
568 uint KBookmark::positionInParent( const QString & address )
569 {
570  return address.mid( address.lastIndexOf(QLatin1Char('/')) + 1 ).toInt();
571 }
572 
573 QString KBookmark::previousAddress( const QString & address )
574 {
575  uint pp = positionInParent(address);
576  return pp>0
577  ? parentAddress(address) + QLatin1Char('/') + QString::number(pp-1)
578  : QString();
579 }
580 
581 QString KBookmark::nextAddress( const QString & address )
582 {
583  return parentAddress(address) + QLatin1Char('/') +
584  QString::number(positionInParent(address)+1);
585 }
586 
587 QDomNode KBookmark::metaData(const QString &owner, bool create) const
588 {
589  QDomNode infoNode = cd( internalElement(), "info", create);
590  if (infoNode.isNull()) return QDomNode();
591  return findMetadata(owner, infoNode , create);
592 }
593 
594 QString KBookmark::metaDataItem( const QString &key ) const
595 {
596  QDomNode metaDataNode = metaData(METADATA_KDE_OWNER, false);
597  for ( QDomElement e = metaDataNode.firstChildElement(); !e.isNull(); e = e.nextSiblingElement() )
598  {
599  if ( e.tagName() == key ) {
600  return e.text();
601  }
602  }
603  return QString();
604 }
605 
606 void KBookmark::setMetaDataItem( const QString &key, const QString &value, MetaDataOverwriteMode mode )
607 {
608  QDomNode metaDataNode = metaData(METADATA_KDE_OWNER, true);
609  QDomNode item = cd_or_create( metaDataNode, key );
610  QDomText text = get_or_create_text( item );
611  if ( mode == DontOverwriteMetaData && !text.data().isEmpty() ) {
612  return;
613  }
614 
615  text.setData( value );
616 }
617 
618 
619 bool KBookmark::operator==(const KBookmark& rhs) const
620 {
621  return element == rhs.element;
622 }
623 
625 
626 KBookmarkGroupTraverser::~KBookmarkGroupTraverser()
627 {
628 }
629 
630 void KBookmarkGroupTraverser::traverse(const KBookmarkGroup &root)
631 {
632  QStack<KBookmarkGroup> stack;
633  stack.push(root);
634  KBookmark bk = root.first();
635  for(;;) {
636  if(bk.isNull()) {
637  if(stack.count() == 1) // only root is on the stack
638  return;
639  if(stack.count() > 0) {
640  visitLeave(stack.top());
641  bk = stack.pop();
642  }
643  bk = stack.top().next(bk);
644  } else if(bk.isGroup()) {
645  KBookmarkGroup gp = bk.toGroup();
646  visitEnter(gp);
647  bk = gp.first();
648  stack.push(gp);
649  } else {
650  visit(bk);
651  bk = stack.top().next(bk);
652  }
653  }
654 }
655 
656 void KBookmarkGroupTraverser::visit(const KBookmark &)
657 {
658 }
659 
660 void KBookmarkGroupTraverser::visitEnter(const KBookmarkGroup &)
661 {
662 }
663 
664 void KBookmarkGroupTraverser::visitLeave(const KBookmarkGroup &)
665 {
666 }
667 
668 void KBookmark::populateMimeData( QMimeData* mimeData ) const
669 {
670  KBookmark::List bookmarkList;
671  bookmarkList.append( *this );
672  bookmarkList.populateMimeData( mimeData );
673 }
674 
675 KBookmark::List::List() : QList<KBookmark>()
676 {
677 }
678 
679 void KBookmark::List::populateMimeData( QMimeData* mimeData ) const
680 {
681  KUrl::List urls;
682 
683  QDomDocument doc( "xbel" );
684  QDomElement elem = doc.createElement( "xbel" );
685  doc.appendChild( elem );
686 
687  for ( const_iterator it = begin(), end = this->end() ; it != end ; ++it ) {
688  urls.append( (*it).url() );
689  elem.appendChild( (*it).internalElement().cloneNode( true /* deep */ ) );
690  }
691 
692  // This sets text/uri-list and text/plain into the mimedata
693  urls.populateMimeData( mimeData, KUrl::MetaDataMap() );
694 
695  mimeData->setData( "application/x-xbel", doc.toByteArray() );
696 }
697 
698 bool KBookmark::List::canDecode( const QMimeData *mimeData )
699 {
700  return mimeData->hasFormat( "application/x-xbel" ) || KUrl::List::canDecode(mimeData);
701 }
702 
703 QStringList KBookmark::List::mimeDataTypes()
704 {
705  return QStringList()<<("application/x-xbel")<<KUrl::List::mimeDataTypes();
706 }
707 
708 #ifndef KDE_NO_DEPRECATED
709 KBookmark::List KBookmark::List::fromMimeData( const QMimeData *mimeData )
710 {
711  QDomDocument doc;
712  kWarning(7043) << "Deprecated method called, with wrong lifetime of QDomDocument, will probably crash";
713  return fromMimeData(mimeData, doc);
714 }
715 #endif
716 
717 KBookmark::List KBookmark::List::fromMimeData( const QMimeData *mimeData, QDomDocument& doc )
718 {
719  KBookmark::List bookmarks;
720  QByteArray payload = mimeData->data( "application/x-xbel" );
721  if ( !payload.isEmpty() ) {
722  doc.setContent( payload );
723  QDomElement elem = doc.documentElement();
724  const QDomNodeList children = elem.childNodes();
725  for ( int childno = 0; childno < children.count(); childno++)
726  {
727  bookmarks.append( KBookmark( children.item(childno).toElement() ));
728  }
729  return bookmarks;
730  }
731  const KUrl::List urls = KUrl::List::fromMimeData( mimeData );
732  if ( !urls.isEmpty() )
733  {
734  KUrl::List::ConstIterator uit = urls.begin();
735  KUrl::List::ConstIterator uEnd = urls.end();
736  for ( ; uit != uEnd ; ++uit )
737  {
738  //kDebug(7043) << "url=" << (*uit);
739  bookmarks.append( KBookmark::standaloneBookmark(
740  (*uit).prettyUrl(), (*uit) ));
741  }
742  }
743  return bookmarks;
744 }
745 
This file is part of the KDE documentation.
Documentation copyright © 1996-2013 The KDE developers.
Generated on Tue Jul 16 2013 17:50:45 by doxygen 1.8.1.1 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KIO

Skip menu "KIO"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdelibs-4.10.5 API Reference

Skip menu "kdelibs-4.10.5 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal