|
|
|
#ifndef _KVI_SPARSER_H_
|
|
|
|
#define _KVI_SPARSER_H_
|
|
|
|
|
|
|
|
//=============================================================================
|
|
|
|
//
|
|
|
|
// File : kvi_sparser.h
|
|
|
|
// Creation date : Sat Jun 29 2000 14:23:11 by Szymon Stefanek
|
|
|
|
//
|
|
|
|
// This file is part of the KVirc irc client distribution
|
|
|
|
// Copyright (C) 2000-2005 Szymon Stefanek (pragma at kvirc dot net)
|
|
|
|
//
|
|
|
|
// 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 opinion) any later version.
|
|
|
|
//
|
|
|
|
// This program 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 General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program. If not, write to the Free Software Foundation,
|
|
|
|
// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
//
|
|
|
|
//=============================================================================
|
|
|
|
|
|
|
|
|
|
|
|
#include "kvi_settings.h"
|
|
|
|
|
|
|
|
#include <time.h>
|
|
|
|
|
|
|
|
#include <tqobject.h>
|
|
|
|
#include "kvi_pointerlist.h"
|
|
|
|
|
|
|
|
#include "kvi_qstring.h"
|
|
|
|
#include "kvi_qcstring.h"
|
|
|
|
#include "kvi_console.h"
|
|
|
|
|
|
|
|
#include "kvi_ircmessage.h"
|
|
|
|
|
|
|
|
class KviWindow;
|
|
|
|
class KviChannel;
|
|
|
|
class KviServerParser;
|
|
|
|
class KviFrame;
|
|
|
|
class KviIrcConnection;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define UNRECOGNIZED_MESSAGE(_msg,_err) \
|
|
|
|
_msg->setUnrecognized(); \
|
|
|
|
m_szLastParserError = _err;
|
|
|
|
|
|
|
|
#define IS_ME(_msg,_nick) KviTQString::equalCI(_msg->connection()->currentNickName(),_nick)
|
|
|
|
|
|
|
|
typedef void (KviServerParser::*messageParseProc)(KviIrcMessage *);
|
|
|
|
|
|
|
|
typedef struct _KviLiteralMessageParseStruct
|
|
|
|
{
|
|
|
|
const char * msgName;
|
|
|
|
messageParseProc proc;
|
|
|
|
} KviLiteralMessageParseStruct;
|
|
|
|
|
|
|
|
class KviIrcMask;
|
|
|
|
|
|
|
|
typedef struct _KviCtcpMessage
|
|
|
|
{
|
|
|
|
KviIrcMessage * msg;
|
|
|
|
const char * pData;
|
|
|
|
TQString szTarget;
|
|
|
|
KviIrcMask * pSource;
|
|
|
|
bool bIgnored;
|
|
|
|
bool bIsFlood;
|
|
|
|
bool bUnknown;
|
|
|
|
|
|
|
|
TQString szTag;
|
|
|
|
} KviCtcpMessage;
|
|
|
|
|
|
|
|
typedef struct _KviDccRequest
|
|
|
|
{
|
|
|
|
KviStr szType;
|
|
|
|
KviStr szParam1;
|
|
|
|
KviStr szParam2;
|
|
|
|
KviStr szParam3;
|
|
|
|
KviStr szParam4;
|
|
|
|
KviStr szParam5;
|
|
|
|
bool bIpV6;
|
|
|
|
KviCtcpMessage * ctcpMsg;
|
|
|
|
KviConsole * pConsole;
|
|
|
|
} KviDccRequest;
|
|
|
|
|
|
|
|
typedef void (KviServerParser::*ctcpParseProc)(KviCtcpMessage *);
|
|
|
|
|
|
|
|
#define KVI_CTCP_MESSAGE_PARSE_TRIGGERNOEVENT 1
|
|
|
|
|
|
|
|
typedef struct _KviCtcpMessageParseStruct
|
|
|
|
{
|
|
|
|
const char * msgName;
|
|
|
|
ctcpParseProc proc;
|
|
|
|
int iFlags;
|
|
|
|
} KviCtcpMessageParseStruct;
|
|
|
|
|
|
|
|
|
|
|
|
#define EXTERNAL_SERVER_DATA_PARSER_CONTROL_RESET 0
|
|
|
|
#define EXTERNAL_SERVER_DATA_PARSER_CONTROL_STARTOFDATA 1
|
|
|
|
#define EXTERNAL_SERVER_DATA_PARSER_CONTROL_ENDOFDATA 2
|
|
|
|
|
|
|
|
class KVIRC_API KviExternalServerDataParser
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
KviExternalServerDataParser(){};
|
|
|
|
virtual ~KviExternalServerDataParser(){};
|
|
|
|
public:
|
|
|
|
virtual void processData(KviIrcMessage *){};
|
|
|
|
virtual void control(int){};
|
|
|
|
virtual void die(){ delete this; };
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class KVIRC_API KviServerParser : public TQObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
public:
|
|
|
|
KviServerParser();
|
|
|
|
~KviServerParser();
|
|
|
|
private:
|
|
|
|
static messageParseProc m_numericParseProcTable[1000];
|
|
|
|
static KviLiteralMessageParseStruct m_literalParseProcTable[];
|
|
|
|
static KviCtcpMessageParseStruct m_ctcpRequestParseProcTable[];
|
|
|
|
static KviCtcpMessageParseStruct m_ctcpReplyParseProcTable[];
|
|
|
|
KviStr m_szLastParserError;
|
|
|
|
|
|
|
|
// KviStr m_szNoAwayNick; //<-- moved to kvi_console.h in KviConnectionInfo
|
|
|
|
public:
|
|
|
|
void parseMessage(const char * message,KviIrcConnection *pConnection);
|
|
|
|
private:
|
|
|
|
void parseNumeric001(KviIrcMessage *msg);
|
|
|
|
void parseNumeric002(KviIrcMessage *msg);
|
|
|
|
void parseNumeric003(KviIrcMessage *msg);
|
|
|
|
void parseNumeric004(KviIrcMessage *msg);
|
|
|
|
void parseNumeric005(KviIrcMessage *msg);
|
|
|
|
|
|
|
|
void parseNumericMotd(KviIrcMessage *msg);
|
|
|
|
void parseNumericNames(KviIrcMessage *msg);
|
|
|
|
void parseNumericEndOfNames(KviIrcMessage *msg);
|
|
|
|
void parseNumericTopic(KviIrcMessage *msg);
|
|
|
|
void parseNumericNoTopic(KviIrcMessage *msg);
|
|
|
|
void parseNumericTopicWhoTime(KviIrcMessage *msg);
|
|
|
|
void parseNumericChannelModeIs(KviIrcMessage *msg);
|
|
|
|
void parseNumericBanList(KviIrcMessage *msg);
|
|
|
|
void parseNumericEndOfBanList(KviIrcMessage *msg);
|
|
|
|
void parseNumericInviteList(KviIrcMessage *msg);
|
|
|
|
void parseNumericEndOfInviteList(KviIrcMessage *msg);
|
|
|
|
void parseNumericExceptList(KviIrcMessage *msg);
|
|
|
|
void parseNumericEndOfExceptList(KviIrcMessage *msg);
|
|
|
|
void parseNumericWhoReply(KviIrcMessage *msg);
|
|
|
|
void parseNumericEndOfWho(KviIrcMessage *msg);
|
|
|
|
void parseNumericNicknameProblem(KviIrcMessage *msg);
|
|
|
|
void parseNumericWhoisAway(KviIrcMessage *);
|
|
|
|
void parseNumericWhoisUser(KviIrcMessage *msg);
|
|
|
|
void parseNumericWhoisChannels(KviIrcMessage *msg);
|
|
|
|
void parseNumericWhoisIdle(KviIrcMessage *msg);
|
|
|
|
void parseNumericWhoisServer(KviIrcMessage *msg);
|
|
|
|
void parseNumericWhoisOther(KviIrcMessage *msg);
|
|
|
|
void parseNumericWhoisAuth(KviIrcMessage *msg);
|
|
|
|
void parseNumericWhowasUser(KviIrcMessage *msg);
|
|
|
|
void parseNumericEndOfWhois(KviIrcMessage *msg);
|
|
|
|
void parseNumericEndOfWhowas(KviIrcMessage *msg);
|
|
|
|
void parseNumericNoSuchNick(KviIrcMessage *msg);
|
|
|
|
void parseNumericCreationTime(KviIrcMessage *msg);
|
|
|
|
void parseNumericIsOn(KviIrcMessage *msg);
|
|
|
|
void parseNumericUnavailResource(KviIrcMessage *msg);
|
|
|
|
void parseNumericLinks(KviIrcMessage *msg);
|
|
|
|
void parseNumericEndOfLinks(KviIrcMessage *msg);
|
|
|
|
void parseNumericUserhost(KviIrcMessage *msg);
|
|
|
|
void parseLoginNicknameProblem(KviIrcMessage *msg);
|
|
|
|
void parseNumericBackFromAway(KviIrcMessage *);
|
|
|
|
void parseNumericAway(KviIrcMessage *);
|
|
|
|
void parseNumericWatch(KviIrcMessage *msg);
|
|
|
|
void parseNumericList(KviIrcMessage *msg);
|
|
|
|
void parseNumericListStart(KviIrcMessage *msg);
|
|
|
|
void parseNumericListEnd(KviIrcMessage *msg);
|
|
|
|
void parseNumericCantJoinChannel(KviIrcMessage *msg);
|
|
|
|
void parseNumericStats(KviIrcMessage *msg);
|
|
|
|
void parseNumericUserMode(KviIrcMessage * msg);
|
|
|
|
void parseNumericCodePageSet(KviIrcMessage * msg);
|
|
|
|
void parseNumericCodePageScheme(KviIrcMessage * msg);
|
|
|
|
void parseNumeric020(KviIrcMessage *msg);
|
|
|
|
void parseNumericCannotSend(KviIrcMessage *msg);
|
|
|
|
void parseNumericNoSuchChannel(KviIrcMessage *msg);
|
|
|
|
void parseNumericNoSuchServer(KviIrcMessage *msg);
|
|
|
|
void parseNumericTime(KviIrcMessage *msg);
|
|
|
|
void parseNumericInfoEnd(KviIrcMessage *msg);
|
|
|
|
void parseNumericInfoStart(KviIrcMessage *msg);
|
|
|
|
void parseNumericInfo(KviIrcMessage *msg);
|
|
|
|
void parseNumericInviting(KviIrcMessage *msg);
|
|
|
|
void parseNumericCommandSyntax(KviIrcMessage *msg);
|
|
|
|
void parseNumericServerAdminInfoAdminContact(KviIrcMessage *msg);
|
|
|
|
void parseNumericServerAdminInfoAdminName(KviIrcMessage *msg);
|
|
|
|
void parseNumericServerAdminInfoServerName(KviIrcMessage *msg);
|
|
|
|
void parseNumericServerAdminInfoTitle(KviIrcMessage *msg);
|
|
|
|
void parseNumericCannotSendColor(KviIrcMessage *msg);
|
|
|
|
void parseNumericEndOfStats(KviIrcMessage *msg);
|
|
|
|
void otherChannelError(KviIrcMessage *msg);
|
|
|
|
void parseCommandSyntaxHelp(KviIrcMessage *msg);
|
|
|
|
void parseCommandHelp(KviIrcMessage *msg);
|
|
|
|
void parseCommandEndOfHelp(KviIrcMessage *msg);
|
|
|
|
void parseChannelHelp(KviIrcMessage *msg);
|
|
|
|
|
|
|
|
void parseLiteralPing(KviIrcMessage *msg);
|
|
|
|
void parseLiteralJoin(KviIrcMessage *msg);
|
|
|
|
void parseLiteralTopic(KviIrcMessage *msg);
|
|
|
|
void parseLiteralPart(KviIrcMessage *msg);
|
|
|
|
void parseLiteralPrivmsg(KviIrcMessage *msg);
|
|
|
|
void parseLiteralNotice(KviIrcMessage *msg);
|
|
|
|
void parseLiteralQuit(KviIrcMessage *msg);
|
|
|
|
void parseLiteralNick(KviIrcMessage *msg);
|
|
|
|
void parseLiteralMode(KviIrcMessage *msg);
|
|
|
|
void parseLiteralKick(KviIrcMessage *msg);
|
|
|
|
void parseLiteralInvite(KviIrcMessage *msg);
|
|
|
|
void parseLiteralWallops(KviIrcMessage *msg);
|
|
|
|
void parseLiteralPong(KviIrcMessage *msg);
|
|
|
|
void parseLiteralError(KviIrcMessage *msg);
|
|
|
|
void parseChannelMode(const TQString &szNick,const TQString &szUser,const TQString &szHost,KviChannel * chan,KviStr &modefl,KviIrcMessage *msg,int curParam);
|
|
|
|
void parseUserMode(KviIrcMessage *msg,const char * modeflptr);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void parseCtcpRequest(KviCtcpMessage *msg);
|
|
|
|
void parseCtcpReply(KviCtcpMessage *msg);
|
|
|
|
void echoCtcpRequest(KviCtcpMessage *msg);
|
|
|
|
void echoCtcpReply(KviCtcpMessage *msg);
|
|
|
|
void replyCtcp(KviCtcpMessage *msg,const char * data);
|
|
|
|
bool checkCtcpFlood(KviCtcpMessage *msg);
|
|
|
|
|
|
|
|
void parseCtcpRequestPing(KviCtcpMessage *msg);
|
|
|
|
void parseCtcpRequestVersion(KviCtcpMessage *msg);
|
|
|
|
void parseCtcpRequestUserinfo(KviCtcpMessage *msg);
|
|
|
|
void parseCtcpRequestClientinfo(KviCtcpMessage *msg);
|
|
|
|
void parseCtcpRequestFinger(KviCtcpMessage *msg);
|
|
|
|
void parseCtcpRequestSource(KviCtcpMessage *msg);
|
|
|
|
void parseCtcpRequestAction(KviCtcpMessage *msg);
|
|
|
|
void parseCtcpRequestTime(KviCtcpMessage *msg);
|
|
|
|
void parseCtcpRequestAvatar(KviCtcpMessage *msg);
|
|
|
|
void parseCtcpRequestDcc(KviCtcpMessage *msg);
|
|
|
|
void parseCtcpRequestPage(KviCtcpMessage *msg);
|
|
|
|
|
|
|
|
void parseCtcpReplyAvatar(KviCtcpMessage *msg);
|
|
|
|
void parseCtcpReplyUserinfo(KviCtcpMessage *msg);
|
|
|
|
void parseCtcpReplyGeneric(KviCtcpMessage *msg);
|
|
|
|
void parseCtcpReplyPing(KviCtcpMessage *msg);
|
|
|
|
void parseCtcpReplyLagcheck(KviCtcpMessage *msg);
|
|
|
|
// void parseCtcpReply(const char * msg_ptr,KviIrcUser &source,const char * target);
|
|
|
|
public:
|
|
|
|
static void encodeCtcpParameter(const char * param,KviStr &buffer,bool bSpaceBreaks = true);
|
|
|
|
static void encodeCtcpParameter(const char * param,TQString &buffer,bool bSpaceBreaks = true);
|
|
|
|
static const char * decodeCtcpEscape(const char * msg_ptr,KviStr &buffer);
|
|
|
|
static const char * decodeCtcpEscape(const char * msg_ptr,KviTQCString &buffer);
|
|
|
|
static const char * extractCtcpParameter(const char * msg_ptr,KviStr &buffer,bool bSpaceBreaks = true);
|
|
|
|
static const char * extractCtcpParameter(const char * msg_ptr,TQString &buffer,bool bSpaceBreaks = true);
|
|
|
|
};
|
|
|
|
|
|
|
|
#ifndef _KVI_SPARSER_CPP_
|
|
|
|
extern KVIRC_API KviServerParser * g_pServerParser;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#endif //_KVI_SPARSER_H_
|