diff options
Diffstat (limited to 'kopete/libkopete/kopetecommandhandler.h')
-rw-r--r-- | kopete/libkopete/kopetecommandhandler.h | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/kopete/libkopete/kopetecommandhandler.h b/kopete/libkopete/kopetecommandhandler.h new file mode 100644 index 00000000..f763ace6 --- /dev/null +++ b/kopete/libkopete/kopetecommandhandler.h @@ -0,0 +1,219 @@ +/* + kopetecommandhandler.h - Command Handler + + Copyright (c) 2003 by Jason Keirstead <jason@keirstead.org> + Kopete (c) 2002-2003 by the Kopete developers <kopete-devel@kde.org> + + ************************************************************************* + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + ************************************************************************* +*/ + +#ifndef _KOPETECOMMANDHANDLER_H_ +#define _KOPETECOMMANDHANDLER_H_ + +#include <qdict.h> +#include <kshortcut.h> +#include "kopetemessage.h" + +#include "kopete_export.h" + +class KProcess; + +struct CommandHandlerPrivate; + +class KopeteView; +class KopeteCommandGUIClient; + +namespace Kopete +{ + +class ChatSession; +class Plugin; +class Protocol; +class Command; + +typedef QDict<Command> CommandList; + +/** + * @author Jason Keirstead <jason@keirstead.org> + * + * The Kopete::CommandHandler can handle /action like messages + */ +class KOPETE_EXPORT CommandHandler : public QObject +{ + friend class ::KopeteCommandGUIClient; + + Q_OBJECT + + public: + /** + * an enum defining the type of a command + */ + enum CommandType { Normal, SystemAlias, UserAlias, Undefined }; + + /** + * Returns a pointer to the command handler + */ + static CommandHandler *commandHandler(); + + /** + * \brief Register a command with the command handler. + * + * Command matching is case insensitive. All commands are registered, + * regardless of whether or not they are already handled by another + * handler. This is so that if the first plugin is unloaded, the next + * handler in the sequence will handle the command. However, there are + * certain commands which are reserved (internally handled by the + * Kopete::CommandHandler). These commands can also be overridden by + * registering a new duplicate command. + * + * @param parent The plugin who owns this command + * @param command The command we want to handle, not including the '/' + * @param handlerSlot The slot used to handle the command. This slot must + * accept two parameters, a QString of arguments, and a Kopete::ChatSession + * pointer to the manager under which the command was sent. + * @param help An optional help string to be shown when the user uses + * /help \<command\> + * @param minArgs the minimum number of arguments for this command + * @param maxArgs the maximum number of arguments this command takes + * @param cut a default keyboard shortcut + * @param pix icon name, the icon will be shown in menus + */ + void registerCommand( QObject *parent, const QString &command, const char* handlerSlot, + const QString &help = QString::null, uint minArgs = 0, int maxArgs = -1, + const KShortcut &cut = 0, const QString &pix = QString::null ); + + /** + * \brief Register a command alias. + * + * @param parent The plugin who owns this alias + * @param alias The command for the alias + * @param formatString This is the string that will be transformed into another + * command. The formatString should begin with an already existing command, + * followed by any other arguments. The variables %1, %2... %9 will be substituted + * with the arguments passed into the alias. The variable %s will be substituted with + * the entire argument string + * @param help An optional help string to be shown when the user uses + * /help \<command\> + * @param minArgs the minimum number of arguments for this command + * @param maxArgs the maximum number of arguments this command takes + * @param cut a default keyboard shortcut + * @param pix icon name, the icon will be shown in menus + */ + void registerAlias( QObject *parent, + const QString &alias, + const QString &formatString, + const QString &help = QString::null, + CommandType = SystemAlias, + uint minArgs = 0, + int maxArgs = -1, + const KShortcut &cut = 0, + const QString &pix = QString::null ); + + /** + * \brief Unregister a command. + * + * When a plugin unloads, all commands are automaticlly unregistered and deleted. + * This function should only be called in the case of a plugin which loads and + * unloads commands dynamically. + * + * @param parent The plugin who owns this command + * @param command The command to unload + */ + void unregisterCommand( QObject *parent, const QString &command ); + + /** + * \brief Unregister an alias. + * + * \see unregisterCommand( QObject *parent, const QString &command ) + * @param parent The plugin who owns this alias + * @param alias The alais to unload + */ + void unregisterAlias( QObject *parent, const QString &alias ); + + /** + * \brief Process a message to see if any commands should be handled + * + * @param msg The message to process + * @param manager The manager who owns this message + * @return True if the command was handled, false if not + */ + bool processMessage( Message &msg, ChatSession *manager ); + + /** + * \brief Process a message to see if any commands should be handled + * + * \see processMessage( Kopete::Message &msg, Kopete::ChatSession *manager) + * \param msg A QString contain the message + * \param manager the Kopete::ChatSession who will own the message + * \return true if the command was handled, false if the command was not handled. + */ + bool processMessage( const QString &msg, ChatSession *manager ); + + /** + * Parses a string of command arguments into a QStringList. Quoted + * blocks within the arguments string are treated as one argument. + */ + static QStringList parseArguments( const QString &args ); + + /** + * \brief Check if a command is already handled + * + * @param command The command to check + * @return True if the command is already being handled, False if not + */ + bool commandHandled( const QString &command ); + + /** + * \brief Check if a command is already handled by a spesific protocol + * + * @param command The command to check + * @param protocol The protocol to check + * @return True if the command is already being handled, False if not + */ + bool commandHandledByProtocol( const QString &command, Protocol *protocol); + + private slots: + void slotPluginLoaded( Kopete::Plugin * ); + void slotPluginDestroyed( QObject * ); + void slotExecReturnedData(KProcess *proc, char *buff, int bufflen ); + void slotExecFinished(KProcess *proc); + void slotViewCreated( KopeteView *view ); + + void slotHelpCommand( const QString & args, Kopete::ChatSession *manager ); + void slotClearCommand( const QString & args, Kopete::ChatSession *manager ); + void slotPartCommand( const QString & args, Kopete::ChatSession *manager ); + void slotCloseCommand( const QString & args, Kopete::ChatSession *manager ); + //void slotMeCommand( const QString & args, Kopete::ChatSession *manager ); + void slotExecCommand( const QString & args, Kopete::ChatSession *manager ); + void slotAwayCommand( const QString & args, Kopete::ChatSession *manager ); + void slotAwayAllCommand( const QString & args, Kopete::ChatSession *manager ); + void slotSayCommand( const QString & args, Kopete::ChatSession *manager ); + + private: + /** + * Helper function. Returns all the commands that can be used by a KMM of this protocol + * (all non-protocol commands, plus this protocols commands) + */ + CommandList commands( Protocol * ); + + /** + * Helper function for commands() + */ + void addCommands( CommandList &from, CommandList &to, CommandType type = Undefined ); + + CommandHandler(); + ~CommandHandler(); + + static CommandHandlerPrivate *p; +}; + +} + +#endif |