diff options
Diffstat (limited to 'src/kio_locate.h')
-rw-r--r-- | src/kio_locate.h | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/src/kio_locate.h b/src/kio_locate.h new file mode 100644 index 0000000..d5df32c --- /dev/null +++ b/src/kio_locate.h @@ -0,0 +1,273 @@ +/*************************************************************************** + * kio-locate: KDE I/O Slave for the locate command * + * * + * Copyright (C) 2005 by Tobi Vollebregt * + * tobivollebregt@gmail.com * + * * + * Thanks to Google's Summer Of Code Program! * + * * + * Copyright (C) 2004 by Armin Straub * + * linux@arminstraub.de * + * * + * This program was initially written by Michael Schuerig. * + * Although I have completely rewritten it, most ideas are adopted * + * from his original work. * + * * + * Copyright (C) 2002 by Michael Schuerig * + * michael@schuerig.de * + * * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + ***************************************************************************/ + +/** + * \mainpage KDE I/O Slave for the locate command + * + * \section intro_sec What is kio-locate? + * kio-locate is a KDE I/O Slave for the locate command. + * <p>This means that you can use kio-locate by simply typing in konquerors + * address box. You can e.g. type "locate:index.html" to find all files that + * contain "index.html" in their name. + * <p>There's even more: You can use kio-locate in all KDE applications, that + * accept URLs. + * <p>To find out more about kio-locate and to look for new versions, you + * should take a look at + * <a href="http://arminstraub.de/browse.php?page=programs_kiolocate"> + * arminstraub.de</a>. + * + * + * \todo Implement locater:help. + * + * \todo If a directory matches then don't add its childs.\ At least make + * this configurable. + * + * \todo Use different icons for collapsed directories and make this + * configurable. + * + * \todo After updating the settings show a success html message instead + * of a blank page. + * + * \todo Check if locate's databases are outdated and warn about that. + * + * \todo Provide a means of updating the locate database (configurable + * of course). + */ + +#ifndef _kio_locate_H_ +#define _kio_locate_H_ + +#include <qcstring.h> +#include <qstring.h> +#include <qstringlist.h> +#include <qdict.h> +#include <qvaluelist.h> + +#include <kio/global.h> +#include <kio/slavebase.h> + +#include "locater.h" +#include "pattern.h" + +class QCString; + +class KURL; + + +class LocateItem; +class LocateDirectory; + +typedef QValueList<LocateItem> LocateItems; +typedef QDict<LocateDirectory> LocateDirectories; +typedef QDictIterator<LocateDirectory> LocateDirectoriesIterator; + +enum LocateCaseSensitivity { caseAuto, caseSensitive, caseInsensitive }; +enum LocateCollapsedIcon { iconBlue, iconGreen, iconGrey, iconOrange, iconRed, iconViolet, iconYellow }; + + +/** + * Implementation of the kioslave for the locate protocol. + * + * Enables you to enter "locate:pattern" wherever an URL can be used + * in KDE. + */ +class LocateProtocol : public QObject, public KIO::SlaveBase +{ + Q_OBJECT + public: + /** + * Constructor + */ + LocateProtocol(const QCString &pool_socket, const QCString &app_socket); + + virtual ~LocateProtocol(); + + /** + * Returns the mimetype "inode/directory". + * @param url the url to work on + */ + virtual void mimetype(const KURL& url); + + /** + * Raises an error so that eyerone notes we are dealing with + * directories only. + * @param url the url to work on + */ + virtual void get(const KURL& url); + + /** + * Marks the url as a directory. + * @param url the url to work on + */ + virtual void stat(const KURL& url); + + /** + * Searches for the pattern specified in the url. + * Every file found is listed. + * @param url the url to work on + */ + virtual void listDir(const KURL& url); + + /** + * Actually report a hit. + * If subItems > 0 then this hit is a "directory subsearch". + * @param path the path of the hit + * @param subItems the number of hits beneath this one + * (or 0 for a regular hit) + */ + virtual void addHit(const QString& path, int subItems = 0); + + const LocateRegExp& getRegExp() const; + int getCollapseDirectoryThreshold() const; + + private slots: + void processLocateOutput(const QStringList& items); + void locateFinished(); + void configFinished(); + void updateConfig(); + + private: + Locater m_locater; + KURL m_url; + + QString m_locatePattern; + LocateRegExp m_locateRegExp; // Equals m_locatePattern, but regexp. + QString m_locateDirectory; // Includes a trailing slash. + LocateRegExpList m_regExps; // List of extra filtering regexps. + + LocateCaseSensitivity m_caseSensitivity; // For current search. + bool m_useRegExp; + + // Options + struct + { + LocateCaseSensitivity m_caseSensitivity; // Default case sensitivity. + int m_collapseDirectoryThreshold; // Maximum number of hits in a directory + // before a directory search is created + QString m_collapsedDisplay; // Format string used for collapsed directories. + LocateCollapsedIcon m_collapsedIcon; // Icon used for collapsed directories. + LocateRegExpList m_whiteList; // Path must match at least one regexp in this list. + LocateRegExpList m_blackList; // Path may not match any regexp in this list. + } m_config; + + bool m_configUpdated; // Used in config methods to check if config was cancelled or okay'ed. + QString m_pendingPath; // Must be processed as soon as new output becomes available. + + LocateDirectory *m_baseDir; // The toplevel directory, e.g. "/usr/". + LocateDirectory *m_curDir; // The current directory (while locating). + + KIO::UDSEntryList m_entries; // Used to cache a lot of hits and list them all at once. + + QString partToPattern(const QString& part, bool forLocate); + bool isMatching(const QString& file); + QString pathToDisplay(const QString& path, int subItems = 0); + void addPreviousLocateOutput(); + void processPath(const QString &path, const QString &nextPath); + + bool isSearchRequest(); + bool isConfigRequest(); + bool isHelpRequest(); + + void searchRequest(); + void configRequest(); + void helpRequest(); + + bool isCaseSensitive(const QString& text); + + /** + * Composes a locater:... url for the current search parameters + * bound to a given directory. + * @param directory the directory in which we should be searched + * @return the url that envokes the specified search + */ + QString makeLocaterUrl(const QString& dir); + + /** + * This function has to check whether we are accessed via the standard + * locater protocol. If this is not the case we have to redirect + * this access to an access via the locater protocol. + * There are other ways, that I have tried to achieve this: + * - Use a search provider. This works perfectly for konqueror but + * not for any other KDE application. + * - Really use redirection. But this turned out not to be a good + * solution. Seemed not to work from OpenDialogs ... + * - So no we just internally redirect... Works, isn't it? + */ + void setUrl(const KURL& url); + + void outputHtml(const QString& body); +}; + + +/** + * Internally used class to represent a hit as kio-locate will + * report. + * + * This may either be a path as given by locate or a directory + * search (if the number of subItems is set to a positive number). + */ +class LocateItem +{ + public: + LocateItem(); + LocateItem(const QString& path, int subItems); + + public: + QString m_path; + int m_subItems; +}; + + +/** + * Internally used class to represent a directory while kio-locate + * gathers data from locate. + * + * Each directory has a list of files found in just that directory + * and a list of all subdirectories. + */ +class LocateDirectory +{ + public: + LocateDirectory(LocateDirectory *parent, const QString& path); + + LocateDirectory *addPath(const QString& path); + void prepareListing(const LocateProtocol* protocol, int skip); + void listItems(LocateProtocol *protocol); + void debugTrace(int level = 0); + + public: + QString m_path; // Including trailing slash. + LocateDirectory *m_parent; + LocateDirectories m_childs; + LocateItems m_items; + int m_itemsCount; + int m_fullCount; + + LocateDirectory *getSubDirectory(const QString& relPath); + void addItem(const QString& path); + int countMatchingItems(const LocateProtocol *protocol, int skip); +}; + +#endif |