/* kircmessage.h - IRC Client Copyright (c) 2003 by Michel Hermier Kopete (c) 2003 by the Kopete developers ************************************************************************* * * * 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. * * * ************************************************************************* */ #ifndef KIRCMESSAGE_H #define KIRCMESSAGE_H #include "kircentity.h" #include #include #include #include #include #include #include // Uncoment this if you want a really rfc compliant message handling. // This is due to some changes of the message encoding with 14 arguments.(not very frequent :) // #define _IRC_STRICTNESS_ namespace KIRC { class Engine; class Message { public: /** \brief Sends the message as-is to the server. */ static void writeRawMessage(KIRC::Engine *engine, const TQTextCodec *codec, const TQString &str); static void writeMessage(KIRC::Engine *engine, const TQTextCodec *codec, const TQString &str); static void writeMessage(KIRC::Engine *engine, const TQTextCodec *codec, const TQString &command, const TQStringList &args, const TQString &suffix); static void writeCtcpMessage(KIRC::Engine *engine, const TQTextCodec *codec, const TQString &command, const TQString &to, const TQString &ctcpMessage); static void writeCtcpMessage(KIRC::Engine *engine, const TQTextCodec *codec, const TQString &command, const TQString &to, const TQString &suffix, const TQString &ctcpCommand, const TQStringList &ctcpArgs = TQStringList(), const TQString &ctcpSuffix = TQString() ); Message(); Message(const KIRC::Message &obj); Message(const KIRC::Message *obj); ~Message(); inline const TQString nickFromPrefix() const { return Kopete::Message::unescape(KIRC::Entity::userNick(m_prefix)); } TQString toString() const; /** \brief Returns true if the message command is numeric. */ bool isNumeric() const; /** \brief Message is valid if it was parsed correctly. */ bool isValid() const; /** \brief Writes internal message information about this message through kdDebug(). */ void dump() const; /** \brief Re-decodes the message with given codec. */ void decodeAgain( const TQTextCodec *codec ); /** \brief The whole message as received. */ inline const TQCString &raw() const { return m_raw; } /** \brief Prefix of this message. * * Returns the prefix of the message. Note that it can be empty. * * Prefix is the server name or the nick name of the sender. * * message = [ ":" prefix SPACE ] command [ params ] crlf * prefix = servername / ( nickname [ [ "!" user ] "@" host ] ) */ inline const TQString &prefix() const { return m_prefix; } /** \brief The command part of this message. * * Returns the command of this message. Can be numerical. * * Examples: "MODE", "PRIVMSG", 303, 001, ... */ inline const TQString &command() const { return m_command; } /** \brief The number of command arguments this message contains. */ inline size_t argsSize() const { return m_args.size(); } /** \brief i:th command argument. */ inline const TQString &arg(size_t i) const { return m_args[i]; } /** \brief All command arguments. */ inline const TQStringList &args() const { return m_args; } /** \brief Message suffix. */ inline const TQString &suffix() const { return m_suffix; } inline const TQString &ctcpRaw() const { return m_ctcpRaw; } inline bool hasCtcpMessage() const { return m_ctcpMessage!=0; } inline class KIRC::Message &ctcpMessage() const { return *m_ctcpMessage; } static KIRC::Message parse(KIRC::Engine *engine, const TQTextCodec *codec, bool *parseSuccess=0); private: /** * Contains the low level dequoted message. */ TQCString m_raw; /** * Contains the completely dequoted prefix. */ TQString m_prefix; /** * Contains the completely dequoted command. */ TQString m_command; /** * Contains the completely dequoted args. */ TQStringList m_args; /** * Contains the completely dequoted suffix. */ TQString m_suffix; /** * If it is a message contains the completely dequoted rawCtcpLine. * If it is a ctcp message contains the completely dequoted rawCtcpArgsLine. */ TQString m_ctcpRaw; // low level quoting, message quoting static TQString quote(const TQString &str); static TQString unquote(const TQString &str); // ctcp level quoting static TQString ctcpQuote(const TQString &str); static TQString ctcpUnquote(const TQString &str); static bool extractCtcpCommand(TQCString &str, TQCString &ctcpline); static bool matchForIRCRegExp(const TQCString &line, const TQTextCodec *codec, KIRC::Message &message); static bool matchForIRCRegExp(TQRegExp ®exp, const TQTextCodec *codec, const TQCString &line, KIRC::Message &message); class KIRC::Message *m_ctcpMessage; static TQRegExp m_IRCCommandType1; #ifdef _IRC_STRICTNESS_ static TQRegExp m_IRCCommandType2; #endif // _IRC_STRICTNESS_ static TQRegExp m_IRCNumericCommand; }; } #endif // KIRCMESSAGE_H