summaryrefslogtreecommitdiffstats
path: root/kdecore/kurl.h
diff options
context:
space:
mode:
Diffstat (limited to 'kdecore/kurl.h')
-rw-r--r--kdecore/kurl.h1828
1 files changed, 1828 insertions, 0 deletions
diff --git a/kdecore/kurl.h b/kdecore/kurl.h
new file mode 100644
index 000000000..d637d620c
--- /dev/null
+++ b/kdecore/kurl.h
@@ -0,0 +1,1828 @@
+/* This file is part of the KDE libraries
+ * Copyright (C) 1999 Torben Weis <weis@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 as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * 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.
+ **/
+
+#ifndef __kurl_h__
+#define __kurl_h__
+
+#include <qstring.h>
+#include <qvaluelist.h>
+#include "kdelibs_export.h"
+
+class QUrl;
+class QStringList;
+template <typename K, typename V> class QMap;
+
+class KURLPrivate;
+
+// Defines that file-urls look like file:///path/file instead of file:/path/file
+#define KURL_TRIPLE_SLASH_FILE_PROT
+
+/**
+ * @brief Represents and parses a URL
+ *
+ * A prototypical URL looks like:
+ * @code
+ * protocol://user:password@hostname:port/path/to/file.ext#reference
+ * @endcode
+ *
+ * KURL handles escaping of URLs. This means that the specification
+ * of a full URL will differ from the corresponding string that would specify a
+ * local file or directory in file-operations like fopen. This is because an URL
+ * doesn't allow certain characters and escapes them.
+ *
+ * For examle:
+ * - '#' -> "%23"
+ * (In a URL the hash-character @c '#' is used to specify a "reference", i.e.
+ * the position within a document)
+ * - space -> "%20"
+ *
+ * The constructor KURL(const QString&) expects a string properly escaped,
+ * or at least non-ambiguous.
+ * For instance a local file or directory <tt>"/bar/#foo#"</tt> would have the
+ * URL <tt>"file:///bar/%23foo%23"</tt>.
+ * If you have the absolute path and need the URL-escaping you should create
+ * KURL via the default-constructor and then call setPath(const QString&):
+ * @code
+ * KURL kurl;
+ * kurl.setPath( "/bar/#foo#" );
+ * QString url = kurl.url(); // -> "file:///bar/%23foo%23"
+ * @endcode
+ *
+ * If you have the URL of a local file or directory and need the absolute path,
+ * you would use path().
+ * @code
+ * KURL url( "file:///bar/%23foo%23" );
+ * ...
+ * if ( url.isLocalFile() )
+ * QString path = url.path(); // -> "/bar/#foo#"
+ * @endcode
+ *
+ * The other way round: if the user can enter a string, that can be either a
+ * path or a URL, then you need to use KURL::fromPathOrURL() to build a KURL.
+ *
+ * This must also be considered, when you have separated directory and file
+ * strings and need to put them together.
+ * While you can simply concatenate normal path strings, you must take care if
+ * the directory-part is already an escaped URL.
+ * (This might be needed if the user specifies a relative path, and your
+ * program supplies the rest from elsewhere.)
+ *
+ * Wrong:
+ * @code
+ * QString dirUrl = "file:///bar/";
+ * QString fileName = "#foo#";
+ * QString invalidURL = dirUrl + fileName; // -> "file:///bar/#foo#" won't behave like you would expect.
+ * @endcode
+ * Instead you should use addPath().
+ *
+ * Right:
+ * @code
+ * KURL url( "file:///bar/" );
+ * QString fileName = "#foo#";
+ * url.addPath( fileName );
+ * QString validURL = url.url(); // -> "file:///bar/%23foo%23"
+ * @endcode
+ *
+ * Also consider that some URLs contain the password, but this shouldn't be
+ * visible. Your program should use prettyURL() every time it displays a
+ * URL, whether in the GUI or in debug output or...
+ *
+ * @code
+ * KURL url( "ftp://name:password@ftp.faraway.org/bar/%23foo%23");
+ * QString visibleURL = url.prettyURL(); // -> "ftp://name@ftp.faraway.org/bar/%23foo%23"
+ * @endcode
+ * Note that prettyURL() doesn't change the character escapes (like <tt>"%23"</tt>).
+ * Otherwise the URL would be invalid and the user wouldn't be able to use it in another
+ * context.
+ *
+ * KURL has some restrictions regarding the path
+ * encoding. KURL works internally with the decoded path and
+ * and encoded query. For example,
+ * @code
+ * http://localhost/cgi-bin/test%20me.pl?cmd=Hello%20you
+ * @endcode
+ * would result in a decoded path <tt>"/cgi-bin/test me.pl"</tt>
+ * and in the encoded query <tt>"?cmd=Hello%20you"</tt>.
+ * Since path is internally always encoded you may @em not use
+ * <tt>"%00"</tt> in the path, although this is OK for the query.
+ *
+ * @author Torben Weis <weis@kde.org>
+ */
+class KDECORE_EXPORT KURL
+{
+public:
+ /**
+ * Flags to choose how file: URLs are treated when creating their QString
+ * representation with prettyURL(int,AdjustementFlags)
+ *
+ * However it is recommended to use pathOrURL() instead of this variant of prettyURL()
+ */
+ enum AdjustementFlags
+ {
+ /**
+ * Do not treat file: URLs differently
+ */
+ NoAdjustements = 0,
+ /**
+ * Strip the file: protocol from the string, i.e. return only the path and
+ * filename as a local path
+ */
+ StripFileProtocol = 1
+ };
+
+ /**
+ * Defines the type of URI we are processing.
+ */
+ enum URIMode
+ {
+ /**
+ * Automatically detected. Using this mode, an appropriate processing
+ * mode will be selected when the URI is first processed.
+ */
+ Auto,
+ /**
+ * Invalid URI. This is something that can't be parsed as a URI at all.
+ * The contents are accessible through the protocol() method.
+ */
+ Invalid,
+ /**
+ * Raw URI. This type of URI should not be processed in any way.
+ * Contents are accessible through the path() method.
+ */
+ RawURI,
+ /**
+ * Standards compliant URL. Process as a syntactically correct URL.
+ */
+ URL,
+ /**
+ * Mailto URI. path() contains an email address which should have its
+ * domain part processed as a DNS name. The email address is accessible
+ * through the path() method.
+ */
+ Mailto
+ };
+
+ /**
+ * KURL::List is a QValueList that contains KURLs with a few
+ * convenience methods.
+ * @see KURL
+ * @see QValueList
+ */
+ class KDECORE_EXPORT List : public QValueList<KURL>
+ {
+ public:
+ /**
+ * Creates an empty List.
+ */
+ List() { }
+ /**
+ * @brief Creates a list that contains the given URL as only item
+ *
+ * @param url the URL to add
+ */
+ List(const KURL &url);
+ /**
+ * @brief Creates a list that contains the URLs from the given list
+ *
+ * This equivalent to iterating over the input list and using each item
+ * as the argument to KURL's constructor, i.e. the resulting list will
+ * have as many elements as the input list, but not all entries might
+ * be valid.
+ *
+ * @param list the list containing the URLs as strings
+ *
+ * @see KURL(const QString &, int)
+ */
+ List(const QStringList &list);
+ /**
+ * @brief Converts the URLs of this list to a list of strings
+ *
+ * This is equivalent to iterating over the list and calling url() on
+ * each item.
+ * If you need a list of user visible URLs, i.e. not containing password
+ * information, iterate over the list yourself and call prettyURL() on
+ * each item instead.
+ *
+ * @return the list of strings
+ *
+ * @see KURL::url()
+ */
+ QStringList toStringList() const;
+ };
+ /**
+ * @brief Constructs an empty URL
+ *
+ * The created instance will also be invalid, see isValid()
+ */
+ KURL();
+
+ /**
+ * @brief Destructs the KURL object
+ */
+ ~KURL();
+
+ /**
+ * @brief Usual constructor, to construct from a string
+ *
+ * @warning It is dangerous to feed UNIX filenames into this function,
+ * this will work most of the time but not always.
+ *
+ * For example <tt>"/home/Torben%20Weis"</tt> will be considered a URL
+ * pointing to the file <tt>"/home/Torben Weis"</tt> instead
+ * of to the file <tt>"/home/Torben%20Weis"</tt>.
+ *
+ * This means that if you have a usual UNIX like path you should not use
+ * this constructor. Instead use fromPathOrURL()
+ *
+ * @param url a URL, not a filename. If the URL does not have a protocol
+ * part, @c "file:" is assumed
+ * @param encoding_hint MIB of original encoding of URL.
+ * See QTextCodec::mibEnum()
+ *
+ * @see fromPathOrURL()
+ */
+ KURL( const QString& url, int encoding_hint = 0 );
+ /**
+ * @brief Constructor taking an URL encoded in a C string
+ *
+ * Constructor taking a char * @p url, which is an @em encoded representation
+ * of the URL, exactly like the usual constructor. This is useful when
+ * the URL, in its encoded form, is strictly ASCII.
+ *
+ * @warning It is dangerous to feed UNIX filenames into this function,
+ * this will work most of the time but not always.
+ *
+ * For example <tt>"/home/Torben%20Weis"</tt> will be considered a URL
+ * pointing to the file <tt>"/home/Torben Weis"</tt> instead
+ * of to the file <tt>"/home/Torben%20Weis"</tt>.
+ *
+ * This means that if you have a usual UNIX like path you should not use
+ * this constructor. Instead use fromPathOrURL()
+ *
+ * @param url an encoded URL. If the URL does not have a protocol part,
+ * @c "file:" is assumed
+ * @param encoding_hint MIB of original encoding of URL.
+ * See QTextCodec::mibEnum()
+ *
+ * @see fromPathOrURL()
+ * @see QString::fromLatin1()
+ */
+ KURL( const char * url, int encoding_hint = 0 );
+ /**
+ * @brief Constructor taking an URL encoded in a QCString
+ *
+ * Constructor taking a QCString @p url, which is an @em encoded
+ * representation of the URL, exactly like the usual constructor. This is
+ * useful when the URL, in its encoded form, is strictly ASCII.
+ *
+ * @warning It is dangerous to feed UNIX filenames into this function,
+ * this will work most of the time but not always.
+ *
+ * For example <tt>"/home/Torben%20Weis"</tt> will be considered a URL
+ * pointing to the file <tt>"/home/Torben Weis"</tt> instead
+ * of to the file <tt>"/home/Torben%20Weis"</tt>.
+ *
+ * This means that if you have a usual UNIX like path you should not use
+ * this constructor. Instead use fromPathOrURL()
+ *
+ * @param url A encoded URL. If the URL does not have a protocol part,
+ * @c "file:" is assumed
+ * @param encoding_hint MIB of original encoding of URL.
+ * See QTextCodec::mibEnum()
+ *
+ * @see fromPathOrURL()
+ * @see QString::fromLatin1()
+ */
+ KURL( const QCString& url, int encoding_hint = 0 );
+
+ /**
+ * @brief Copy constructor
+ *
+ * @param u the KURL to copy
+ */
+ KURL( const KURL& u );
+ /**
+ * @brief Constructor taking a Qt URL
+ *
+ * Converts from a Qt URL.
+ *
+ * @param u the QUrl
+ */
+ KURL( const QUrl &u );
+ /**
+ * @brief Constructor allowing relative URLs
+ *
+ * @warning It is dangerous to feed UNIX filenames into this function,
+ * this will work most of the time but not always.
+ *
+ * For example <tt>"/home/Torben%20Weis"</tt> will be considered a URL
+ * pointing to the file <tt>"/home/Torben Weis"</tt> instead
+ * of to the file <tt>"/home/Torben%20Weis"</tt>.
+ *
+ * This means that if you have a usual UNIX like path you should not use
+ * this constructor. Instead use fromPathOrURL()
+ *
+ * @param _baseurl The base url.
+ * @param _rel_url A relative or absolute URL.
+ * If this is an absolute URL then @p _baseurl will be ignored.
+ * If this is a relative URL it will be combined with @p _baseurl.
+ * Note that @p _rel_url should be encoded too, in any case.
+ * So do NOT pass a path here (use setPath() or addPath() or
+ * fromPathOrURL() instead)
+ * @param encoding_hint MIB of original encoding of URL.
+ * See QTextCodec::mibEnum()
+ *
+ * @see fromPathOrURL()
+ */
+ KURL( const KURL& _baseurl, const QString& _rel_url, int encoding_hint=0 );
+
+ /**
+ * @brief Returns the protocol for the URL
+ *
+ * Examples for a protocol string are @c "file", @c "http", etc. but also
+ * @c "mailto:" and other pseudo protocols.
+ *
+ * @return the protocol of the URL, does not include the colon. If the
+ * URL is malformed, @c QString::null will be returned
+ *
+ * @see setProtocol()
+ * @see isValid()
+ */
+ QString protocol() const { return m_bIsMalformed ? QString::null : m_strProtocol; }
+ /**
+ * @brief Sets the protocol for the URL
+ *
+ * Examples for a protocol string are @c "file", @c "http", etc. but also
+ * @c "mailto:" and other pseudo protocols.
+ *
+ * @param _txt the new protocol of the URL (without colon)
+ *
+ * @see protocol()
+ */
+ void setProtocol( const QString& _txt );
+
+ /**
+ * @brief Returns the URI processing mode for the URL
+ *
+ * @return the URI processing mode set for this URL
+ *
+ * @see URIMode
+ * @see uriModeForProtocol()
+ *
+ * @since 3.2
+ */
+ int uriMode() const;
+
+ /**
+ * @brief Returns the decoded user name (login, user id, etc) included in
+ * the URL
+ *
+ * @return the user name or @c QString::null if there is no user name
+ *
+ * @see setUser()
+ * @see hasUser()
+ */
+ QString user() const { return m_strUser; }
+ /**
+ * @brief Sets the user name (login, user id, etc) to include in the URL
+ *
+ * Special characters in the user name will appear encoded in the URL.
+ * If there is a password associated with the user, it can be set using
+ * setPass().
+ *
+ * @param _txt the name of the user or @c QString::null to remove the user
+ *
+ * @see user()
+ * @see hasUser()
+ * @see hasPass()
+ */
+ void setUser( const QString& _txt );
+ /**
+ * @brief Tests if this URL has a user name included in it
+ *
+ * @return @c true if the URL has an non-empty user name
+ *
+ * @see user()
+ * @see setUser()
+ * @see hasPass()
+ */
+ bool hasUser() const { return !m_strUser.isEmpty(); }
+
+ /**
+ * @brief Returns the decoded password (corresponding to user()) included
+ * in the URL
+ *
+ * @note a password can only appear in a URL string if you also set
+ * a user, see setUser().
+ *
+ * @return the password or @c QString::null if it does not exist
+ *
+ * @see setPass()
+ * @see hasPass()
+ * @see hasUser()
+ */
+ QString pass() const { return m_strPass; }
+ /**
+ * @brief Sets the password (corresponding to user()) to include in the URL
+ *
+ * Special characters in the password will appear encoded in the URL.
+ * @note a password can only appear in a URL string if you also set
+ * a user, see setUser().
+ *
+ * @param _txt the password to set or @c QString::null to remove the password
+ *
+ * @see pass()
+ * @see hasPass()
+ * @see hasUser()
+ */
+ void setPass( const QString& _txt );
+ /**
+ * @brief Tests if this URL has a password included in it
+ *
+ * @note a password can only appear in a URL string if you also set
+ * a user, see setUser().
+ *
+ * @return @c true if there is a non-empty password set
+ *
+ * @see pass()
+ * @see setPass()
+ * @see hasUser()
+ */
+ bool hasPass() const { return !m_strPass.isEmpty(); }
+
+ /**
+ * @brief Returns the decoded hostname included in the URL
+ *
+ * @return the name of the host or @c QString::null if no host is set
+ *
+ * @see setHost()
+ * @see hasHost()
+ */
+ QString host() const { return m_strHost; }
+
+ /**
+ * @brief Sets the hostname to include in the URL
+ *
+ * Special characters in the hostname will appear encoded in the URL.
+ *
+ * @param _txt the new name of the host or QString::null to remove the host
+ *
+ * @see host()
+ * @see hasHost()
+ */
+ void setHost( const QString& _txt );
+ /**
+ * @brief Tests if this URL has a hostname included in it
+ *
+ * @return @c true if the URL has a non-empty host
+ *
+ * @see host()
+ * @see setHost()
+ */
+ bool hasHost() const { return !m_strHost.isEmpty(); }
+
+ /**
+ * @brief Returns the port number included in the URL
+ *
+ * @return the port number or @c 0 if there is no port number specified in
+ * the URL
+ *
+ * @see setPort()
+ * @see host()
+ */
+ unsigned short int port() const { return m_iPort; }
+ /**
+ * @brief Sets the port number to include in the URL
+ *
+ * @param _p the new port number or @c 0 to have no port number
+ *
+ * @see port()
+ * @see setHost()
+ */
+ void setPort( unsigned short int _p );
+
+ /**
+ * @brief Returns the current decoded path
+ *
+ * This does @em not include the query.
+ *
+ * @return the path of the URL (without query), or @c QString::null if no
+ * path is set
+ *
+ * @see path(int)
+ * @see setPath()
+ * @see hasPath()
+ */
+ QString path() const { return m_strPath; }
+
+ /**
+ * @brief Returns the current decoded path
+ *
+ * This does @em not include the query, see query() for accessing it.
+ *
+ * The @p _trailing parameter allows to ensure the existance or absence of
+ * the last (trailing) @c '/' character in the path.
+ * If the URL has no path, then no @c '/' is added anyway.
+ * And on the other side: if the path is just @c "/", then this character
+ * won't be stripped.
+ *
+ * Reason: <tt>"ftp://weis@host"</tt> means something completely different
+ * than <tt>"ftp://weis@host/"</tt>.
+ * So adding or stripping the '/' would really alter the URL, while
+ * <tt>"ftp://host/path"</tt> and <tt>"ftp://host/path/"</tt> mean the same
+ * directory.
+ *
+ * @param _trailing May be ( @c -1, @c 0, @c +1 ). @c -1 strips a trailing
+ * @c '/', @c +1 adds a trailing @c '/' if there is none yet
+ * and @c 0 returns the path unchanged
+ *
+ * @return the path of the URL (without query), or @c QString::null if no
+ * path is set
+ *
+ * @see path()
+ * @see setPath()
+ * @see hasPath()
+ * @see adjustPath()
+ */
+ QString path( int _trailing ) const;
+
+ /**
+ * @brief Sets the decoded path of the URL
+ *
+ * This does @em not changed the query, see setQuery() for that.
+ *
+ * The @p path is considered to be decoded, i.e. characters not allowed in
+ * path, for example @c '?' will be encoded and does not indicate the
+ * beginning of the query part. Something that might look encoded,
+ * like @c "%3f" will not become decoded.
+ *
+ * @param path the new, decoded, path or @c QString::null to remove the path
+ *
+ * @see path()
+ * @see path(int)
+ * @see hasPath()
+ */
+ void setPath( const QString& path );
+
+ /**
+ * @brief Tests if this URL has a path included in it
+ *
+ * @return @c true if there is a non-empty path
+ *
+ * @see path()
+ * @see setPath()
+ */
+ bool hasPath() const { return !m_strPath.isEmpty(); }
+
+ /**
+ * @brief Resolves @c "." and @c ".." components in path
+ *
+ * Some servers seem not to like the removal of extra @c '/'
+ * even though it is against the specification in RFC 2396.
+ *
+ * @param cleanDirSeparator if @c true, occurrences of consecutive
+ * directory separators (e.g. <tt>"/foo//bar"</tt>) are cleaned up as
+ * well
+ *
+ * @see hasPath()
+ * @see adjustPath()
+ */
+ void cleanPath(bool cleanDirSeparator = true);
+
+ /**
+ * @brief Adds or removes a trailing slash to/from the path
+ *
+ * The @p _trailing parameter allows to ensure the existance or absence of
+ * the last (trailing) @c '/' character in the path.
+ * If the URL has no path, then no @c '/' is added anyway.
+ * And on the other side: if the path is just @c "/", then this character
+ * won't be stripped.
+ *
+ * Reason: <tt>"ftp://weis@host"</tt> means something completely different
+ * than <tt>"ftp://weis@host/"</tt>.
+ * So adding or stripping the '/' would really alter the URL, while
+ * <tt>"ftp://host/path"</tt> and <tt>"ftp://host/path/"</tt> mean the same
+ * directory.
+ *
+ * @param _trailing May be ( @c -1, @c 0, @c +1 ). @c -1 strips a trailing
+ * @c '/', @c +1 adds a trailing @c '/' if there is none yet
+ * and @c 0 returns the path unchanged
+ *
+ * @see hasPath()
+ * @see cleanPath()
+ */
+ void adjustPath(int _trailing);
+
+ /**
+ * @brief Sets both path and query of the URL in their encoded form
+ *
+ * This is useful for HTTP. It looks first for @c '?' and decodes then,
+ * see setEncodedPath().
+ * The encoded path is the concatenation of the current path and the query.
+ *
+ * @param _txt the new encoded path and encoded query
+ * @param encoding_hint MIB of original encoding of @p _txt .
+ * See QTextCodec::mibEnum()
+ *
+ * @see encodedPathAndQuery()
+ * @see setPath()
+ * @see setQuery()
+ */
+ void setEncodedPathAndQuery( const QString& _txt, int encoding_hint = 0 );
+
+ /**
+ * @brief Sets the (already encoded) path of the URL
+ *
+ * @param _txt the new encoded path
+ * @param encoding_hint MIB of original encoding of @p _txt .
+ * See QTextCodec::mibEnum()
+ *
+ * @see setEncodedPathAndQuery()
+ * @see setPath()
+ */
+ void setEncodedPath(const QString& _txt, int encoding_hint = 0 );
+
+ /**
+ * @brief Returns the encoded path and the query
+ *
+ * The @p _trailing parameter allows to ensure the existance or absence of
+ * the last (trailing) @c '/' character in the path.
+ * If the URL has no path, then no @c '/' is added anyway.
+ * And on the other side: if the path is just @c "/", then this character
+ * won't be stripped.
+ *
+ * Reason: <tt>"ftp://weis@host"</tt> means something completely different
+ * than <tt>"ftp://weis@host/"</tt>.
+ * So adding or stripping the '/' would really alter the URL, while
+ * <tt>"ftp://host/path"</tt> and <tt>"ftp://host/path/"</tt> mean the same
+ * directory.
+ *
+ * @param _trailing May be ( @c -1, @c 0, @c +1 ). @c -1 strips a trailing
+ * @c '/', @c +1 adds a trailing @c '/' if there is none yet
+ * and @c 0 returns the path unchanged
+ * @param _no_empty_path if set to @c true then an empty path is substituted
+ * by @c "/"
+ * @param encoding_hint MIB of desired encoding of URL.
+ * See QTextCodec::mibEnum()
+ *
+ * @return the concatenation of the encoded path , @c '?' and the
+ * encoded query
+ *
+ * @see setEncodedPathAndQuery()
+ * @see path()
+ * @see query()
+ */
+ QString encodedPathAndQuery( int _trailing = 0, bool _no_empty_path = false, int encoding_hint = 0) const;
+
+ /**
+ * @brief Sets the encoded query of the URL
+ *
+ * The query should start with a @c '?'. If it doesn't @c '?' is prepended.
+ *
+ * @param _txt this is considered to be encoded. This has a good reason:
+ * the query may contain the @c '0' character
+ *
+ * @param encoding_hint MIB of the encoding. Reserved, should be @c 0 .
+ * See QTextCodec::mibEnum()
+ *
+ * @see query()
+ */
+ void setQuery( const QString& _txt, int encoding_hint = 0);
+
+ /**
+ * @brief Returns the encoded query of the URL
+ *
+ * The query may contain the @c '0' character.
+ * If a query is present it always starts with a @c '?'.
+ * A single @c '?' means an empty query.
+ * An empty string means no query.
+ *
+ * @return the encoded query or @c QString::null if there is none
+ *
+ * @see setQuery()
+ */
+ QString query() const;
+
+ /**
+ * @brief Returns the encoded reference of the URL
+ *
+ * The reference is @em never decoded automatically.
+ *
+ * @return the undecoded reference, or @c QString::null if there is none
+ *
+ * @see setRef()
+ * @see hasRef()
+ * @see htmlRef()
+ */
+ QString ref() const { return m_strRef_encoded; }
+
+ /**
+ * @brief Sets the encoded reference part (everything after @c '#')
+ *
+ * This is considered to be encoded, i.e. characters that are not allowed
+ * as part of the reference will @em not be encoded.
+ *
+ * @param _txt the encoded reference or @c QString::null to remove it
+ *
+ * @see ref()
+ * @see hasRef()
+ */
+ void setRef( const QString& _txt ) { m_strRef_encoded = _txt; }
+
+ /**
+ * @brief Tests if the URL has a reference part
+ *
+ * @return @c true if the URL has a reference part. In a URL like
+ * <tt>"http://www.kde.org/kdebase.tar#tar:/README"</tt> it would
+ * return @c true as well
+ *
+ * @see ref()
+ * @see setRef()
+ */
+ bool hasRef() const { return !m_strRef_encoded.isNull(); }
+
+ /**
+ * @brief Returns decoded the HTML-style reference
+ * (the part of the URL after @c '#')
+ *
+ * @return the HTML-style reference
+ *
+ * @see encodedHtmlRef()
+ * @see setHTMLRef()
+ * @see hasHTMLRef()
+ * @see split()
+ * @see hasSubURL()
+ * @see ref()
+ */
+ QString htmlRef() const;
+
+ /**
+ * @brief Returns the encoded HTML-style reference
+ * (the part of the URL after @c '#')
+ *
+ * @return the HTML-style reference in its original, encoded, form
+ *
+ * @see htmlRef()
+ * @see setHTMLRef()
+ * @see hasHTMLRef()
+ */
+ QString encodedHtmlRef() const;
+
+ /**
+ * @brief Sets the decoded HTML-style reference
+ *
+ * @param _ref the new reference. This is considered to be @em not encoded in
+ * contrast to setRef(). Use @c QString::null to remove it
+ *
+ * @see htmlRef()
+ * @see hasHTMLRef()
+ */
+ void setHTMLRef( const QString& _ref );
+
+ /**
+ * @brief Tests if there is an HTML-style reference
+ *
+ * @return @c true if the URL has an HTML-style reference
+ *
+ * @see htmlRef()
+ * @see encodedHtmlRef()
+ * @see setHTMLRef()
+ * @see hasRef()
+ */
+ bool hasHTMLRef() const;
+
+ /**
+ * @brief Tests if the URL is well formed
+ *
+ * @return @c false if the URL is malformed. This function does @em not test
+ * whether sub URLs are well-formed as well
+ */
+ bool isValid() const { return !m_bIsMalformed; }
+ /**
+ * @brief Tests if the URL is malformed
+ *
+ * @return @c true if the URL is malformed. This function does @em not test
+ * whether sub URLs are well-formed as well
+ *
+ * @deprecated Use !isValid() instead
+ *
+ * @see isValid()
+ */
+ KDE_DEPRECATED bool isMalformed() const { return !isValid(); }
+
+ /**
+ * @brief Tests if the file is local
+ *
+ * @return @c true if the file is a plain local file and has no filter
+ * protocols attached to it
+ */
+ bool isLocalFile() const;
+
+ /**
+ * @brief Adds file encoding information
+ *
+ * Adds encoding information to the URL by adding a @c "charset" parameter.
+ * If there is already a charset parameter, it will be replaced.
+ *
+ * @param encoding the encoding to add or @c QString::null to remove the
+ * encoding
+ *
+ * @see fileEncoding()
+ * @see QTextCodec::codecForName()
+ */
+ void setFileEncoding(const QString &encoding);
+
+ /**
+ * @brief Returns encoding information of the URL
+ *
+ * The encoding information is the content of the @c "charset" parameter.
+ *
+ * @return an encoding suitable for QTextCodec::codecForName()
+ * or @c QString::null if not encoding was specified
+ */
+ QString fileEncoding() const;
+
+ /**
+ * @brief Tests if the URL has any sub URLs
+ *
+ * See split() for examples for sub URLs.
+ *
+ * @return @c true if the file has at least one sub URL
+ *
+ * @see split()
+ */
+ bool hasSubURL() const;
+
+ /**
+ * @brief Adds to the current path
+ *
+ * Assumes that the current path is a directory. @p _txt is appended to the
+ * current path. The function adds @c '/' if needed while concatenating.
+ * This means it does not matter whether the current path has a trailing
+ * @c '/' or not. If there is none, it becomes appended. If @p _txt
+ * has a leading @c '/' then this one is stripped.
+ *
+ * @param txt the text to add. It is considered to be decoded
+ *
+ * @see setPath()
+ * @see hasPath()
+ */
+ void addPath( const QString& txt );
+
+ /**
+ * @brief Returns the value of a certain query item
+ *
+ * @param item item whose value we want
+ *
+ * @return the value of the given query item name or @c QString::null if the
+ * specified item does not exist
+ *
+ * @see addQueryItem()
+ * @see removeQueryItem()
+ * @see queryItems()
+ * @see query()
+ */
+ QString queryItem( const QString& item ) const;
+
+ /**
+ * @brief Returns the value of a certain query item
+ *
+ * @param item item whose value we want
+ * @param encoding_hint MIB of encoding of query.
+ * See QTextCodec::mibEnum()
+ *
+ * @return the value of the given query item name or @c QString::null if the
+ * specified item does not exist
+ *
+ * @see addQueryItem()
+ * @see removeQueryItem()
+ * @see queryItems()
+ * @see query()
+ */
+ QString queryItem( const QString& item, int encoding_hint ) const;
+
+ /**
+ * Options for queryItems()
+ *
+ * @since 3.1
+ */
+ enum QueryItemsOptions
+ {
+ /**
+ * Normalize query keys to lowercase
+ */
+ CaseInsensitiveKeys = 1
+ };
+
+ /**
+ * @internal, override for the below function
+ */
+ QMap< QString, QString > queryItems( int options=0 ) const;
+
+ /**
+ * @brief Returns the list of query items as a map mapping keys to values
+ *
+ * @param options any of QueryItemsOptions <em>OR</em>ed together
+ * @param encoding_hint MIB of encoding of query.
+ * See QTextCodec::mibEnum()
+ *
+ * @return the map of query items or the empty map if the URL has no
+ * query items
+ *
+ * @see queryItem()
+ * @see addQueryItem()
+ * @see removeQueryItem()
+ * @see query()
+ *
+ * @since 3.1
+ */
+ QMap< QString, QString > queryItems( int options, int encoding_hint ) const;
+
+ /**
+ * @brief Adds an additional query item
+ *
+ * To replace an existing query item, the item should first be
+ * removed with removeQueryItem()
+ *
+ * @param _item name of item to add
+ * @param _value value of item to add
+ * @param encoding_hint MIB of encoding to use for _value.
+ * See QTextCodec::mibEnum()
+ *
+ * @see queryItem()
+ * @see queryItems()
+ * @see query()
+ */
+ void addQueryItem( const QString& _item, const QString& _value, int encoding_hint = 0 );
+
+ /**
+ * @brief Removea an item from the query
+ *
+ * @param _item name of item to remove
+ *
+ * @see addQueryItem()
+ * @see queryItem()
+ * @see queryItems()
+ * @see query()
+ */
+ void removeQueryItem( const QString& _item );
+
+ /**
+ * @brief Sets the filename of the path
+ *
+ * In comparison to addPath() this function does not assume that the current
+ * path is a directory. This is only assumed if the current path ends
+ * with @c '/'.
+ *
+ * If the current path ends with @c '/' then @p _txt is just appended,
+ * otherwise all text behind the last @c '/' in the current path is erased
+ * and @p _txt is appended then. It does not matter whether @p _txt starts
+ * with @c '/' or not.
+ *
+ * Any reference is reset.
+ *
+ * @param _txt the filename to be set. It is considered to be decoded
+ *
+ * @see fileName()
+ * @see setDirectory()
+ * @see setPath()
+ */
+ void setFileName( const QString&_txt );
+
+ /**
+ * @brief Returns the filename of the path
+ *
+ * @p _ignore_trailing_slash_in_path tells whether a trailing @c '/' should
+ * be ignored. This means that the function would return @c "torben" for
+ * <tt>"file:///hallo/torben/"</tt> and <tt>"file:///hallo/torben"</tt>.
+ *
+ * @param _ignore_trailing_slash_in_path if set to @c false, then everything
+ * behind the last @c '/' is considered to be the filename
+ *
+ * @return the filename of the current path. The returned string is decoded.
+ * @c QString::null if there is no file (and thus no path)
+ *
+ * @see setFileName()
+ * @see directory()
+ * @see path()
+ */
+ QString fileName( bool _ignore_trailing_slash_in_path = true ) const;
+
+ /**
+ * @brief Returns the directory of the path
+ *
+ * The directory is everything between the last and the second last @c '/'
+ * is returned. For example <tt>"file:///hallo/torben/"</tt> would return
+ * <tt>"/hallo/torben/"</tt> while <tt>"file:///hallo/torben"</tt> would
+ * return <tt>"hallo/"</tt>.
+ *
+ * @p _ignore_trailing_slash_in_path tells whether a trailing @c '/' should
+ * be ignored. This means that the function would return @c "/hallo"
+ * (or @c "/hallo" depending on @p _strip_trailing_slash_from_result) for
+ * <tt>"file:///hallo/torben/"</tt> and <tt>"file:///hallo/torben"</tt>.
+ *
+ * @param _strip_trailing_slash_from_result tells whether the returned result
+ * should end with @c '/' or not. If the path is empty or just @c "/"
+ * then this flag has no effect
+ * @param _ignore_trailing_slash_in_path if set to @c false, then everything
+ * behind the last @c '/' is considered to be the filename
+ *
+ * @return the directory part of the current path or @c QString::null when
+ * there is no path. The returned string is decoded
+ *
+ * @see setDirectory()
+ * @see fileName()
+ * @see path()
+ */
+ QString directory( bool _strip_trailing_slash_from_result = true,
+ bool _ignore_trailing_slash_in_path = true ) const;
+
+ /**
+ * @brief Sets the directory of the path, leaving the filename empty
+ *
+ * @param dir the decoded directory to set
+ *
+ * @see directory()
+ * @see setFileName()
+ * @see setPath()
+ */
+ void setDirectory(const QString &dir);
+
+ /**
+ * @brief Changes the directory by descending into the given directory
+ *
+ * It is assumed the current URL represents a directory.
+ * If @p _dir starts with a @c '/' the current URL will be
+ * <tt>"protocol://host/dir"</tt> otherwise @p _dir will be appended to the
+ * path. @p _dir can be @c ".."
+ *
+ * This function won't strip protocols. That means that when you are in
+ * <tt>"file:///dir/dir2/my.tgz#tar:/"</tt> and you do <tt>cd("..")</tt> you
+ * will still be in <tt>"file:///dir/dir2/my.tgz#tar:/"</tt>
+ *
+ * @param _dir the directory to change to
+ * @return @c true if successful
+ *
+ * @see directory()
+ * @see path()
+ */
+ bool cd( const QString& _dir );
+
+ /**
+ * @brief Returns the URL as string, with all escape sequences intact,
+ * encoded in a given charset
+ *
+ * This is used in particular for encoding URLs in UTF-8 before using them
+ * in a drag and drop operation.
+ *
+ * @note that the string returned by url() will include the password of the
+ * URL. If you want to show the URL to the user, use prettyURL().
+ *
+ * The @p _trailing parameter allows to ensure the existance or absence of
+ * the last (trailing) @c '/' character in the path.
+ * If the URL has no path, then no @c '/' is added anyway.
+ * And on the other side: if the path is just @c "/", then this character
+ * won't be stripped.
+ *
+ * Reason: <tt>"ftp://weis@host"</tt> means something completely different
+ * than <tt>"ftp://weis@host/"</tt>.
+ * So adding or stripping the '/' would really alter the URL, while
+ * <tt>"ftp://host/path"</tt> and <tt>"ftp://host/path/"</tt> mean the same
+ * directory.
+ *
+ * @param _trailing May be ( @c -1, @c 0, @c +1 ). @c -1 strips a trailing
+ * @c '/', @c +1 adds a trailing @c '/' if there is none yet
+ * and @c 0 returns the path unchanged
+ * @param encoding_hint MIB of encoding to use.
+ * See QTextCodec::mibEnum()
+ *
+ * @return the complete URL, with all escape sequences intact, encoded
+ * in a given charset
+ *
+ * @see prettyURL()
+ * @see pathOrURL()
+ * @see htmlURL()
+ */
+ QString url( int _trailing = 0, int encoding_hint = 0) const;
+
+ /**
+ * @brief Returns the URL as string in human-friendly format
+ *
+ * Example:
+ * @code
+ * http://localhost:8080/test.cgi?test=hello world&name=fred
+ * @endcode
+ *
+ * Does @em not contain the password if the URL has one, use url() if you
+ * need to have it in the string.
+ *
+ * The @p _trailing parameter allows to ensure the existance or absence of
+ * the last (trailing) @c '/' character in the path.
+ * If the URL has no path, then no @c '/' is added anyway.
+ * And on the other side: if the path is just @c "/", then this character
+ * won't be stripped.
+ *
+ * Reason: <tt>"ftp://weis@host"</tt> means something completely different
+ * than <tt>"ftp://weis@host/"</tt>.
+ * So adding or stripping the '/' would really alter the URL, while
+ * <tt>"ftp://host/path"</tt> and <tt>"ftp://host/path/"</tt> mean the same
+ * directory.
+ *
+ * @param _trailing May be ( @c -1, @c 0, @c +1 ). @c -1 strips a trailing
+ * @c '/', @c +1 adds a trailing @c '/' if there is none yet
+ * and @c 0 returns the path unchanged
+ * @return a human readable URL, with no non-necessary encodings/escaped
+ * characters. Password will not be shown
+ *
+ * @see url()
+ * @see pathOrURL()
+ */
+ QString prettyURL( int _trailing = 0) const;
+
+ /**
+ * @brief Returns the URL as string in human-friendly format
+ * Example:
+ * @code
+ * http://localhost:8080/test.cgi?test=hello world&name=fred
+ * @endcode
+ *
+ * Does @em not contain the password if the URL has one, use url() if you
+ * need to have it in the string.
+ *
+ * The @p _trailing parameter allows to ensure the existance or absence of
+ * the last (trailing) @c '/' character in the path.
+ * If the URL has no path, then no @c '/' is added anyway.
+ * And on the other side: if the path is just @c "/", then this character
+ * won't be stripped.
+ *
+ * Reason: <tt>"ftp://weis@host"</tt> means something completely different
+ * than <tt>"ftp://weis@host/"</tt>.
+ * So adding or stripping the '/' would really alter the URL, while
+ * <tt>"ftp://host/path"</tt> and <tt>"ftp://host/path/"</tt> mean the same
+ * directory.
+ *
+ * @param _trailing May be ( @c -1, @c 0, @c +1 ). @c -1 strips a trailing
+ * @c '/', @c +1 adds a trailing @c '/' if there is none yet
+ * and @c 0 returns the path unchanged
+ * @param _flags if StripFileProtocol, @c "file://" will be stripped.
+ * The use of this method is now discouraged, better use pathOrURL().
+ *
+ * @return a human readable URL, with no non-necessary encodings/escaped
+ * characters. Password will not be shown
+ *
+ * @see prettyURL()
+ * @see url()
+ * @see pathOrURL()
+ */
+ QString prettyURL( int _trailing, AdjustementFlags _flags) const;
+ // ### BIC: Merge the two above + spell it as "Adjustment"
+ // Or remove completely, and let people use pathOrURL() instead
+
+ /**
+ * @brief Returns the URL as a string depending if it is a local file
+ *
+ * It will be either the URL (as prettyURL() would return) or, when the URL
+ * is a local file without query or ref, the path().
+ *
+ * Use this method, together with its opposite, fromPathOrURL(),
+ * to display and even let the user edit URLs.
+ *
+ * @return the path or URL string depending on its properties
+ *
+ * @see prettyURL()
+ * @see path()
+ * @see url()
+ * @see isLocalFile()
+ *
+ * @since 3.4
+ */
+ QString pathOrURL() const;
+
+ /**
+ * @brief Returns the URL as string, escaped for HTML
+ *
+ * @return a human readable URL, with no non-necessary encodings/escaped
+ * characters which is HTML encoded for safe inclusion in HTML or
+ * rich text. Password will not be shown.
+ *
+ * @see prettyURL()
+ * @see url()
+ * @see pathOrURL()
+ */
+ QString htmlURL() const;
+
+
+ /**
+ * @brief Tests if the KURL is empty
+ *
+ * An empty URL has neither path nor protocol set.
+ *
+ * @return @c true if the URL is empty
+ *
+ * @see hasPath()
+ * @see protocol()
+ * @see isValid()
+ */
+ bool isEmpty() const;
+
+ /**
+ * @brief Returns the URL that is the best possible candidate for on level
+ * higher in the path hierachy
+ *
+ * This function is useful to implement the "Up" button in a file manager for
+ * example.
+ * cd() never strips a sub-protocol. That means that if you are in
+ * <tt>"file:///home/x.tgz#gzip:/#tar:/"</tt> and hit the up button you
+ * expect to see <tt>"file:///home"</tt>. The algorithm tries to go up on the
+ * right-most URL. If that is not possible it strips the right most URL. It
+ * continues stripping URLs until it can go up.
+ *
+ * @return a URL that is a level higher
+ *
+ * @see cd()
+ * @see split()
+ * @see hasSubURL()
+ * @see path()
+ */
+ KURL upURL( ) const;
+
+ /**
+ * @brief Tests if this URL is less than the given URL
+ *
+ * The current URL is consideres <tt>"less than"</tt> then @p _u if
+ * (tested in this order):
+ * - it is not valid but @p _u is. See isValid()
+ * - its protocol is "less than" @p _u's protocol. See protocol()
+ * - its host is "less than" @p _u's host. See host()
+ * - its port is "less than" @p _u's port. See port()
+ * - its path is "less than" @p _u's path. See path()
+ * - its encoded query is "less than" @p _u's encoded query. See query()
+ * - its endoded reference is "less than" @p _u's encoded reference.
+ * See ref()
+ * - its username is "less than" @p _u's username. See user()
+ * - its password is "less than" @p _u's password. See pass()
+ *
+ * Examples:
+ * @code
+ * KURL url1;
+ * KURL url2;
+ *
+ * bool lessThan = url1 < url2; // false. Both invalid, no protocols
+ *
+ * url2.setProtocol( QString::null );
+ * lessThan = url1 < url2; // true. url2 is valid because of setProtocol()
+ *
+ * url1.setProtocol( QString::null );
+ * lessThan = url1 < url2; // false. Both valid and everything empty
+ *
+ * url1.setProtocol( "http" );
+ * url2.setProtocol( "https" );
+ * lessThan = url1 < url2; // true. "http" < "https"
+ *
+ * url2.setHost( "api.kde.org" );
+ * url2.setProtocol( "http" );
+ * url2.setProtocol( "www.kde.org" );
+ * lessThan = url1 < url2; // true. protocols equal and "api" < "www"
+ *
+ * url1.setProtocol( "https" );
+ * url2.setProtocol( "http" );
+ * lessThan = url1 < url2; // false. "https" > "http". host doesn't matter yet
+ * @endcode
+ *
+ * @param _u the URL to compare to
+ *
+ * @return @c true if the URL is less than @p _u. Otherwise @c false
+ * (equal or greater than)
+ *
+ * @see operator==()
+ * @see QString::compare()
+ */
+ bool operator<(const KURL& _u) const;
+
+ /**
+ * @brief Copies the values of the given URL into this one
+ *
+ * Just assigns each member using the member's assignment operator.
+ *
+ * @param _u the URL to take the values from
+ *
+ * @return a reference to this URL (*this)
+ *
+ * @see equals()
+ */
+ KURL& operator=( const KURL& _u );
+
+ /**
+ * @brief Assigns the URL, given as a string, to this one
+ *
+ * This will reset the current URL and parse the given string.
+ * See the similar constructor for known limitations.
+ *
+ * @param _url the QString to parse for values
+ *
+ * @return a reference to this URL (*this)
+ *
+ * @see equals()
+ * @see KURL(const QString &, int)
+ */
+ KURL& operator=( const QString& _url );
+
+ /**
+ * @brief Assigns the URL, given as a C string, to this one
+ *
+ * This will reset the current URL and parse the given string.
+ * See the similar constructor for known limitations.
+ *
+ * @param _url the C string to parse for values
+ *
+ * @return a reference to this URL (*this)
+ *
+ * @see equals()
+ * @see KURL(const char *, int)
+ */
+ KURL& operator=( const char * _url );
+
+ /**
+ * @brief Assigns the URL, given as a Qt URL, to this one
+ *
+ * This will reset the current URL and parse the given string.
+ *
+ * @param u the Qt URL to take the values from
+ *
+ * @return a reference to this URL (*this)
+ *
+ * @see equals()
+ * @see KURL(const QUrl &)
+ */
+ KURL& operator=( const QUrl & u );
+
+ /**
+ * @brief Tests if this URL is equal to the given one
+ *
+ * Tests each member for equality unless one of the URLs is invalid
+ * in which case they are not considered equal (even if both are invalid).
+ *
+ * Same as equals() when used with @p ignore_trailing set to
+ * @c false (default)
+ *
+ * @param _u the URL to compare to
+ *
+ * @return @c true if equal and neither this URL nor @p _u is malformed.
+ * Otherwise @c false
+ *
+ * @see equals()
+ * @see isValid()
+ * @see operator!=()
+ * @see operator<()
+ */
+ bool operator==( const KURL& _u ) const;
+
+ /**
+ * @brief Tests if this URL is equal to the one given as a string
+ *
+ * Creates a KURL instance for @p _u and compares with that using
+ * the equality operator for two KURLs.
+ *
+ * See the respective constructor for known limitations.
+ *
+ * @param _u the string to compare to
+ *
+ * @return @c true if equal and neither this URL nor @p _u is malformed.
+ * Otherwise @c false
+ *
+ * @see KURL(const QString &, int)
+ * @see operator==(const KURL &)
+ * @see equals()
+ * @see isValid()
+ * @see operator!=()
+ * @see operator<()
+ */
+ bool operator==( const QString& _u ) const;
+
+ /**
+ * @brief Tests if this URL is different from the given one
+ *
+ * Tests by negating the result of operator==()
+ *
+ * @param _u the URL to compare to
+ *
+ * @return the negated result of operator==()
+ *
+ * @see operator==()
+ * @see operator<()
+ */
+ bool operator!=( const KURL& _u ) const { return !( *this == _u ); }
+
+ /**
+ * @brief Tests if this URL is different from the one given as a string
+ *
+ * Tests by negating the result of operator==(const QString &)
+ *
+ * @param _u the URL to compare to
+ *
+ * @return the negated result of operator==(const QString &)
+ *
+ * @see operator==(const QString &)
+ * @see operator<()
+ */
+ bool operator!=( const QString& _u ) const { return !( *this == _u ); }
+
+ /**
+ * @brief Compares this URL with another one
+ *
+ * The same as equals(), just with a less obvious name.
+ *
+ * @param u the URL to compare this one with
+ * @param ignore_trailing set to @c true to ignore trailing @c '/' characters
+ *
+ * @return @c true if both URLs are the same
+ *
+ * @see operator==. This function should be used if you want to
+ * ignore trailing @c '/' characters
+ *
+ * @deprecated Use equals() instead.
+ */
+ bool cmp( const KURL &u, bool ignore_trailing = false ) const KDE_DEPRECATED;
+
+ /**
+ * @brief Compares this URL with another one
+ *
+ * @param u the URL to compare this one with
+ * @param ignore_trailing set to @c true to ignore trailing @c '/' characters
+ *
+ * @return @c true if both urls are the same
+ *
+ * @see operator==. This function should be used if you want to
+ * ignore trailing @c '/' characters
+ *
+ * @since 3.1
+ */
+ bool equals( const KURL &u, bool ignore_trailing = false ) const; // TODO KDE4: add bool _ignore_ref = false
+
+ /**
+ * @brief Tests if the given URL is parent of this URL
+ *
+ * For instance, <tt>"ftp://host/dir/"</tt> is a parent of
+ * <tt>"ftp://host/dir/subdir/subsubdir/"</tt>.
+ *
+ * @return @c true if this URL is a parent of @p u (or the same URL as @p u)
+ *
+ * @see equals()
+ * @see cd()
+ */
+ bool isParentOf( const KURL& u ) const;
+
+ /**
+ * @brief Splits nested URLs into a list of URLs
+ *
+ * Example for a nested URL:
+ * @code
+ * file:///home/weis/kde.tgz#gzip:/#tar:/kdebase
+ * @endcode
+ * A URL like <tt>"http://www.kde.org#tar:/kde/README.hml#ref1"</tt> will be
+ * split in <tt>"http://www.kde.org#ref1"</tt> and
+ * <tt>"tar:/kde/README.html#ref1"</tt>.
+ *
+ * That means in turn that @c "#ref1" is an HTML-style reference and not a
+ * new sub URL. Since HTML-style references mark a certain position in a
+ * document this reference is appended to every URL.
+ *
+ * The idea behind this is that browsers, for example, only look at the first
+ * URL while the rest is not of interest to them.
+ *
+ * @param _url the URL that has to be split
+ *
+ * @return an empty list on error or the list of split URLs
+ *
+ * @see hasSubURL()
+ * @see KURL(const QString&, int)
+ * @see join()
+ */
+ static List split( const QString& _url );
+
+ /**
+ * @brief Splits nested URLs into a list of URLs
+ *
+ * Example for a nested URL:
+ * @code
+ * file:///home/weis/kde.tgz#gzip:/#tar:/kdebase
+ * @endcode
+ * A URL like <tt>"http://www.kde.org#tar:/kde/README.hml#ref1"</tt> will be
+ * split in <tt>"http://www.kde.org#ref1"</tt> and
+ * <tt>"tar:/kde/README.html#ref1"</tt>.
+ *
+ * That means in turn that @c "#ref1" is an HTML-style reference and not a
+ * new sub URL. Since HTML-style references mark a certain position in a
+ * document this reference is appended to every URL.
+ *
+ * The idea behind this is that browsers, for example, only look at the first
+ * URL while the rest is not of interest to them.
+ *
+ * @param _url the URL that has to be split
+ *
+ * @return an empty list on error or the list of split URLs
+ *
+ * @see hasSubURL()
+ * @see join()
+ */
+ static List split( const KURL& _url );
+
+ /**
+ * @brief Joins a list of URLs into a single URL with sub URLs
+ *
+ * Reverses split(). Only the first URL may have a reference. This reference
+ * is considered to be HTML-like and is appended at the end of the resulting
+ * joined URL.
+ *
+ * @param _list the list to join
+ *
+ * @return the joined URL or an invalid URL if the list is empty
+ *
+ * @see split()
+ */
+ static KURL join( const List& _list );
+
+ /**
+ * @brief Creates a KURL object from a QString representing either an
+ * absolute path or a real URL
+ *
+ * Use this method instead of
+ * @code
+ * QString someDir = ...
+ * KURL url = someDir;
+ * @endcode
+ *
+ * Otherwise some characters (e.g. the '#') won't be encoded properly.
+ *
+ * @param text the string representation of the URL to convert
+ *
+ * @return the new KURL
+ *
+ * @see pathOrURL()
+ * @see KURL(const QString&, int)
+ *
+ * @since 3.1
+ */
+ static KURL fromPathOrURL( const QString& text );
+
+ /**
+ * @brief Encodes a string for use in URLs
+ *
+ * Convenience function.
+ *
+ * Convert unicoded string to local encoding and use %%-style
+ * encoding for all common delimiters / non-ascii characters.
+ *
+ * @param str the string to encode (can be @c QString::null)
+ * @param encoding_hint MIB of encoding to use.
+ * See QTextCodec::mibEnum()
+ *
+ * @return the encoded string
+ *
+ * @see encode_string_no_slash()
+ * @see decode_string()
+ */
+ static QString encode_string(const QString &str, int encoding_hint = 0);
+
+ /**
+ * @brief Encodes a string for use in URLs
+ *
+ * Convenience function.
+ *
+ * Convert unicoded string to local encoding and use %%-style
+ * encoding for all common delimiters and non-ascii characters
+ * as well as the slash @c '/'.
+ *
+ * @param str the string to encode (can be @c QString::null)
+ * @param encoding_hint MIB of encoding to use.
+ * See QTextCodec::mibEnum()
+ *
+ * @see encode_string()
+ * @see decode_string()
+ */
+ static QString encode_string_no_slash(const QString &str, int encoding_hint = 0);
+
+ /**
+ * @brief Decodes a string as used in URLs
+ *
+ * Convenience function.
+ *
+ * Decode %-style encoding and convert from local encoding to unicode.
+ *
+ * Reverse of encode_string()
+ *
+ * @param str the string to decode (can be @c QString::null)
+ * @param encoding_hint MIB of original encoding of @p str .
+ * See QTextCodec::mibEnum()
+ *
+ * @return the decoded string
+ *
+ * @see encode_string()
+ * @see encode_string_no_slash()
+ */
+ static QString decode_string(const QString &str, int encoding_hint = 0);
+
+ /**
+ * @brief Tests if a given URL is a relative as opposed to an absolute URL
+ *
+ * Convenience function.
+ *
+ * Returns whether @p _url is likely to be a "relative" URL instead of
+ * an "absolute" URL.
+ *
+ * @param _url the URL to examine
+ * @return @c true when the URL is likely to be "relative",
+ * @c false otherwise
+ *
+ * @see relativeURL()
+ */
+ static bool isRelativeURL(const QString &_url);
+
+ /**
+ * @brief Creates an URL relative to a base URL for a given input URL
+ *
+ * Convenience function
+ *
+ * Returns a "relative URL" based on @p base_url that points to @p url.
+ *
+ * If no "relative URL" can be created, e.g. because the protocol
+ * and/or hostname differ between @p base_url and @p url an absolute
+ * URL is returned.
+ *
+ * @note if @p base_url represents a directory, it should contain
+ * a trailing slash
+ *
+ * @param base_url the URL to derive from
+ * @param url the URL to point to relatively from @p base_url
+ * @param encoding_hint MIB of original encoding of @p str .
+ * See QTextCodec::mibEnum()
+ *
+ * @see isRelativeURL()
+ * @see relativePath()
+ * @see adjustPath()
+ */
+ static QString relativeURL(const KURL &base_url, const KURL &url, int encoding_hint = 0);
+
+ /**
+ * @brief Creates a path relative to a base path for a given input path
+ *
+ * Convenience function
+ *
+ * Returns a relative path based on @p base_dir that points to @p path.
+ *
+ * @param base_dir the base directory to derive from
+ * @param path the new target directory
+ * @param isParent an optional pointer to a boolean which, if provided, will
+ * be set to reflect whether @p path has @p base_dir as a parent dir
+ *
+ * @see relativeURL()
+ */
+ static QString relativePath(const QString &base_dir, const QString &path, bool *isParent=0);
+
+ /**
+ * @brief Determines which URI mode is suitable for processing URIs of a
+ * given protocol
+ *
+ * @param protocol the protocol name. See protocol()
+ *
+ * @return the URIMode suitable for the given protocol
+ *
+ * @see uriMode()
+ *
+ * @since 3.2
+ */
+ static URIMode uriModeForProtocol(const QString& protocol);
+
+#ifdef KDE_NO_COMPAT
+private:
+#endif
+ /**
+ * @deprecated change code to call fileName()
+ */
+ QString filename( bool _ignore_trailing_slash_in_path = true ) const
+ {
+ return fileName(_ignore_trailing_slash_in_path);
+ }
+
+protected:
+ /**
+ * @brief Resets the members to their "null" state
+ *
+ * All QString members get reset to @c QString::null, the port to @c 0
+ * the URIMode to @c Auto and the URL becomes invalid.
+ *
+ * This is like assigning a null URL, but more efficient as it doesn't
+ * require the temporary object.
+ *
+ * Called by constructors, assignment operators and the parse methods in case
+ * of a parsing error.
+ *
+ * @see isValid()
+ * @see isEmpty()
+ */
+ void reset();
+
+ /**
+ * @brief Parses the given string and fills the URL's values on success
+ *
+ * Treats the string as an URL.
+ *
+ * @param _url the string to parse
+ * @param encoding_hint MIB of original encoding of @p str .
+ * See QTextCodec::mibEnum()
+ */
+ void parseURL( const QString& _url, int encoding_hint = 0 );
+ /**
+ * @brief Parses the given string and fills the URL's values on success
+ *
+ * Treats the string as a generic URI.
+ *
+ * @param _url the string to parse
+ * @param encoding_hint MIB of original encoding of @p str .
+ * See QTextCodec::mibEnum()
+ */
+ void parseRawURI( const QString& _url, int encoding_hint = 0 );
+ /**
+ * @brief Parses the given string and fills the URL's values on success
+ *
+ * Treats the string as a @c "mailto:" URI.
+ *
+ * @param _url the string to parse
+ * @param encoding_hint MIB of original encoding of @p str .
+ * See QTextCodec::mibEnum()
+ */
+ void parseMailto( const QString& _url, int encoding_hint = 0 );
+ /**
+ * @brief Parses the given string and fills the URL's values on success
+ *
+ * @param _url the string to parse
+ * @param encoding_hint MIB of original encoding of @p str .
+ * See QTextCodec::mibEnum()
+ */
+ void parse( const QString& _url, int encoding_hint = 0 );
+
+private:
+ void _setQuery( const QString& _txt, int encoding_hint = 0);
+
+ QString m_strProtocol;
+ QString m_strUser;
+ QString m_strPass;
+ QString m_strHost;
+ QString m_strPath;
+ QString m_strRef_encoded;
+ QString m_strQuery_encoded;
+ bool m_bIsMalformed : 1;
+ enum URIMode m_iUriMode : 3;
+ uint freeForUse : 4;
+ unsigned short int m_iPort;
+ QString m_strPath_encoded;
+
+ friend KDECORE_EXPORT QDataStream & operator<< (QDataStream & s, const KURL & a);
+ friend KDECORE_EXPORT QDataStream & operator>> (QDataStream & s, KURL & a);
+private:
+ KURLPrivate* d;
+};
+
+/**
+ * \relates KURL
+ * Compares URLs. They are parsed, split and compared.
+ * Two malformed URLs with the same string representation
+ * are nevertheless considered to be unequal.
+ * That means no malformed URL equals anything else.
+ */
+KDECORE_EXPORT bool urlcmp( const QString& _url1, const QString& _url2 );
+
+/**
+ * \relates KURL
+ * Compares URLs. They are parsed, split and compared.
+ * Two malformed URLs with the same string representation
+ * are nevertheless considered to be unequal.
+ * That means no malformed URL equals anything else.
+ *
+ * @param _url1 A reference URL
+ * @param _url2 A URL that will be compared with the reference URL
+ * @param _ignore_trailing Described in KURL::cmp
+ * @param _ignore_ref If true, disables comparison of HTML-style references.
+ */
+KDECORE_EXPORT bool urlcmp( const QString& _url1, const QString& _url2, bool _ignore_trailing, bool _ignore_ref );
+
+KDECORE_EXPORT QDataStream & operator<< (QDataStream & s, const KURL & a);
+KDECORE_EXPORT QDataStream & operator>> (QDataStream & s, KURL & a);
+
+#endif