KVIrc  4.9.2
DeveloperAPIs
KviIrcServerParser.h
Go to the documentation of this file.
1 #ifndef _KVI_SPARSER_H_
2 #define _KVI_SPARSER_H_
3 
4 //=============================================================================
5 //
6 // File : KviIrcServerParser.h
7 // Creation date : Sat Jun 29 2000 14:23:11 by Szymon Stefanek
8 //
9 // This file is part of the KVIrc IRC client distribution
10 // Copyright (C) 2000-2010 Szymon Stefanek (pragma at kvirc dot net)
11 //
12 // This program is FREE software. You can redistribute it and/or
13 // modify it under the terms of the GNU General Public License
14 // as published by the Free Software Foundation; either version 2
15 // of the License, or (at your option) any later version.
16 //
17 // This program is distributed in the HOPE that it will be USEFUL,
18 // but WITHOUT ANY WARRANTY; without even the implied warranty of
19 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20 // See the GNU General Public License for more details.
21 //
22 // You should have received a copy of the GNU General Public License
23 // along with this program. If not, write to the Free Software Foundation,
24 // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
25 //
26 //=============================================================================
27 
28 #include "kvi_settings.h"
29 #include "KviPointerList.h"
30 #include "KviQString.h"
31 #include "KviConsoleWindow.h"
32 #include "KviIrcMessage.h"
33 
34 #include <QObject>
35 #include <QByteArray>
36 
37 #include <time.h>
38 
39 class KviWindow;
40 class KviChannelWindow;
41 class KviIrcServerParser;
42 class KviMainWindow;
43 class KviIrcConnection;
44 
45 #define UNRECOGNIZED_MESSAGE(_msg, _err) \
46  _msg->setUnrecognized(); \
47  m_szLastParserError = _err;
48 
49 #define IS_ME(_msg, _nick) KviQString::equalCI(_msg->connection()->currentNickName(), _nick)
50 
52 
54 {
55  const char * msgName;
58 
59 class KviIrcMask;
60 
61 typedef struct _KviCtcpMessage
62 {
64  const char * pData;
65  QString szTarget;
67  bool bIgnored;
68  bool bIsFlood;
69  bool bUnknown;
70 
71  QString szTag;
73 
74 typedef struct _KviDccRequest
75 {
82  bool bIPv6;
86 
88 
89 #define KVI_CTCP_MESSAGE_PARSE_TRIGGERNOEVENT 1
90 
92 {
93  const char * msgName;
96  int iFlags;
98 
99 #define EXTERNAL_SERVER_DATA_PARSER_CONTROL_RESET 0
100 #define EXTERNAL_SERVER_DATA_PARSER_CONTROL_STARTOFDATA 1
101 #define EXTERNAL_SERVER_DATA_PARSER_CONTROL_ENDOFDATA 2
102 
104 {
105 public:
108 
109 public:
110  virtual void processData(KviIrcMessage *){};
111  virtual void control(int){};
112  virtual void die() { delete this; };
113 };
114 
115 class KVIRC_API KviIrcServerParser : public QObject
116 {
117  Q_OBJECT
118 public:
121 
122 private:
123  static messageParseProc m_numericParseProcTable[1000];
124  static KviLiteralMessageParseStruct m_literalParseProcTable[];
125  static KviCtcpMessageParseStruct m_ctcpParseProcTable[];
127 
128  // KviCString m_szNoAwayNick; //<-- moved to KviConsoleWindow.h in KviConnectionInfo
129 public:
130  void parseMessage(const char * message, KviIrcConnection * pConnection);
131 
132 private:
133  void parseNumeric001(KviIrcMessage * msg);
134  void parseNumeric002(KviIrcMessage * msg);
135  void parseNumeric003(KviIrcMessage * msg);
136  void parseNumeric004(KviIrcMessage * msg);
137  void parseNumeric005(KviIrcMessage * msg);
138  void parseNumeric020(KviIrcMessage * msg);
139  void parseNumeric344(KviIrcMessage * msg);
140  void parseNumeric345(KviIrcMessage * msg);
141  void parseNumeric367(KviIrcMessage * msg);
142  void parseNumeric368(KviIrcMessage * msg);
143  void parseNumeric480(KviIrcMessage * msg);
144  void parseNumeric728(KviIrcMessage * msg);
145  void parseNumeric729(KviIrcMessage * msg);
146  void parseNumeric742(KviIrcMessage * msg);
147  void parseNumeric486(KviIrcMessage * msg);
148 
149  void parseNumericSnomask(KviIrcMessage * msg);
150  void parseNumericYourUID(KviIrcMessage * msg);
151  void parseNumericMotd(KviIrcMessage * msg);
152  void parseNumericNames(KviIrcMessage * msg);
153  void parseNumericEndOfNames(KviIrcMessage * msg);
154  void parseNumericTopic(KviIrcMessage * msg);
155  void parseNumericNoTopic(KviIrcMessage * msg);
156  void parseNumericTopicWhoTime(KviIrcMessage * msg);
157  void parseNumericChannelModeIs(KviIrcMessage * msg);
158  void parseNumericInviteList(KviIrcMessage * msg);
159  void parseNumericEndOfInviteList(KviIrcMessage * msg);
160  void parseNumericExceptList(KviIrcMessage * msg);
161  void parseNumericEndOfExceptList(KviIrcMessage * msg);
162  void parseNumericQList(KviIrcMessage * msg);
163  void parseNumericEndOfQList(KviIrcMessage * msg);
164  void parseNumericAList(KviIrcMessage * msg);
165  void parseNumericEndOfAList(KviIrcMessage * msg);
166  void parseNumericReopList(KviIrcMessage * msg);
167  void parseNumericEndOfReopList(KviIrcMessage * msg);
168  void parseNumericChanAccessList(KviIrcMessage * msg);
169  void parseNumericEndOfChanAccessList(KviIrcMessage * msg);
170  void parseNumericExemptChanOpList(KviIrcMessage * msg);
171  void parseNumericEndOfExemptChanOpList(KviIrcMessage * msg);
172  void parseNumericInvited(KviIrcMessage * msg);
173  void parseNumericSpamFilterList(KviIrcMessage * msg);
174  void parseNumericEndOfSpamFilterList(KviIrcMessage * msg);
175  void parseNumericWhoReply(KviIrcMessage * msg);
176  void parseNumericEndOfWho(KviIrcMessage * msg);
177  void parseNumericNicknameProblem(KviIrcMessage * msg);
178  void parseNumericWhoisAway(KviIrcMessage *);
179  void parseNumericWhoisUser(KviIrcMessage * msg);
180  void parseNumericWhoisChannels(KviIrcMessage * msg);
181  void parseNumericWhoisIdle(KviIrcMessage * msg);
182  void parseNumericWhoisServer(KviIrcMessage * msg);
183  void parseNumericWhoisActually(KviIrcMessage * msg);
184  void parseNumericWhoisOther(KviIrcMessage * msg);
185  void parseNumericWhoisAuth(KviIrcMessage * msg);
186  void parseNumericWhoisRegistered(KviIrcMessage * msg);
187  void parseNumericWhowasUser(KviIrcMessage * msg);
188  void parseNumericEndOfWhois(KviIrcMessage * msg);
189  void parseNumericEndOfWhowas(KviIrcMessage * msg);
190  void parseNumericNoSuchNick(KviIrcMessage * msg);
191  void parseNumericChanUrl(KviIrcMessage * msg);
192  void parseNumericCreationTime(KviIrcMessage * msg);
193  void parseNumericIsOn(KviIrcMessage * msg);
194  void parseNumericBanOnChan(KviIrcMessage * msg);
195  void parseNumericUnavailResource(KviIrcMessage * msg);
196  void parseNumericUserInChan(KviIrcMessage * msg);
197  void parseNumericLinks(KviIrcMessage * msg);
198  void parseNumericEndOfLinks(KviIrcMessage * msg);
199  void parseNumericUserhost(KviIrcMessage * msg);
200  void parseLoginNicknameProblem(KviIrcMessage * msg);
201  void parseNumericBackFromAway(KviIrcMessage *);
202  void parseNumericAway(KviIrcMessage *);
203  void parseNumericUsersDontMatch(KviIrcMessage * msg);
204  void parseNumericWatch(KviIrcMessage * msg);
205  void parseNumericList(KviIrcMessage * msg);
206  void parseNumericListStart(KviIrcMessage * msg);
207  void parseNumericListEnd(KviIrcMessage * msg);
208  void parseNumericCantJoinChannel(KviIrcMessage * msg);
209  void parseNumericStats(KviIrcMessage * msg);
210  void parseNumericUserMode(KviIrcMessage * msg);
211  void parseNumericCodePageSet(KviIrcMessage * msg);
212  void parseNumericCodePageScheme(KviIrcMessage * msg);
213  void parseNumericCannotSend(KviIrcMessage * msg);
214  void parseNumericNoSuchChannel(KviIrcMessage * msg);
215  void parseNumericNoSuchServer(KviIrcMessage * msg);
216  void parseNumericTime(KviIrcMessage * msg);
217  void parseNumericHiddenHost(KviIrcMessage * msg);
218  void parseNumericInfoEnd(KviIrcMessage * msg);
219  void parseNumericInfoStart(KviIrcMessage * msg);
220  void parseNumericInfo(KviIrcMessage * msg);
221  void parseNumericYoureOper(KviIrcMessage * msg);
222  void parseNumericNotEnoughParams(KviIrcMessage * msg);
223  void parseNumericAlreadyRegistered(KviIrcMessage * msg);
224  void parseNumericPasswordIncorrect(KviIrcMessage * msg);
225  void parseNumericInviting(KviIrcMessage * msg);
226  void parseNumericCommandSyntax(KviIrcMessage * msg);
227  void parseNumericServerAdminInfoAdminContact(KviIrcMessage * msg);
228  void parseNumericServerAdminInfoAdminName(KviIrcMessage * msg);
229  void parseNumericServerAdminInfoServerName(KviIrcMessage * msg);
230  void parseNumericServerAdminInfoTitle(KviIrcMessage * msg);
231  void parseNumericCannotSendColor(KviIrcMessage * msg);
232  void parseNumericEndOfStats(KviIrcMessage * msg);
233  void parseNumericForward(KviIrcMessage * msg);
234  void parseNumericNoPrivs(KviIrcMessage * msg);
235  void parseNumericNotifyGeneric(KviIrcMessage * msg);
236  void parseNumericYouHaveCallerID(KviIrcMessage * msg);
237  void otherChannelError(KviIrcMessage * msg);
238  void parseNumericUnknownCommand(KviIrcMessage * msg);
239  void parseNumericMotdMissing(KviIrcMessage * msg);
240  void parseCommandSyntaxHelp(KviIrcMessage * msg);
241  void parseCommandHelp(KviIrcMessage * msg);
242  void parseCommandEndOfHelp(KviIrcMessage * msg);
243  void parseChannelHelp(KviIrcMessage * msg);
244  void parseNumericNeedSSL(KviIrcMessage * msg);
245  void parseNumericOftcQuietList(KviIrcMessage * msg);
246  void parseNumericOftcEndOfQuietList(KviIrcMessage * msg);
247  void parseNumericQuietList(KviIrcMessage * msg);
248  void parseNumericEndOfQuietList(KviIrcMessage * msg);
249  void parseNumericWhospcrpl(KviIrcMessage * msg);
250  void parseNumericTryAgain(KviIrcMessage * msg);
251 
252  void parseLiteralPing(KviIrcMessage * msg);
253  void parseLiteralJoin(KviIrcMessage * msg);
254  void parseLiteralTopic(KviIrcMessage * msg);
255  void parseLiteralPart(KviIrcMessage * msg);
256  void parseLiteralPrivmsg(KviIrcMessage * msg);
257  void parseLiteralNotice(KviIrcMessage * msg);
258  void parseLiteralQuit(KviIrcMessage * msg);
259  void parseLiteralNick(KviIrcMessage * msg);
260  void parseLiteralMode(KviIrcMessage * msg);
261  void parseLiteralKick(KviIrcMessage * msg);
262  void parseLiteralInvite(KviIrcMessage * msg);
263  void parseLiteralWallops(KviIrcMessage * msg);
264  void parseLiteralPong(KviIrcMessage * msg);
265  void parseLiteralError(KviIrcMessage * msg);
266  void parseChannelMode(const QString & szNick, const QString & szUser, const QString & szHost, KviChannelWindow * chan, KviCString & modefl, KviIrcMessage * msg, int curParam);
267  void parseUserMode(KviIrcMessage * msg, const char * modeflptr);
268  void parseLiteralCap(KviIrcMessage * msg);
269  void parseLiteralAuthenticate(KviIrcMessage * msg);
270  void parseLiteralAway(KviIrcMessage * msg);
271 
272  void parseCtcpRequest(KviCtcpMessage * msg);
273  void parseCtcpReply(KviCtcpMessage * msg);
274  void echoCtcpRequest(KviCtcpMessage * msg);
275  void echoCtcpReply(KviCtcpMessage * msg);
276  void replyCtcp(KviCtcpMessage * msg, const QString & data);
277  bool checkCtcpFlood(KviCtcpMessage * msg);
278  void parseCtcpRequestPing(KviCtcpMessage * msg);
279  void parseCtcpRequestVersion(KviCtcpMessage * msg);
280  void parseCtcpRequestUserinfo(KviCtcpMessage * msg);
281  void parseCtcpRequestClientinfo(KviCtcpMessage * msg);
282  void parseCtcpRequestFinger(KviCtcpMessage * msg);
283  void parseCtcpRequestSource(KviCtcpMessage * msg);
284  void parseCtcpRequestAction(KviCtcpMessage * msg);
285  void parseCtcpRequestTime(KviCtcpMessage * msg);
286  void parseCtcpRequestAvatar(KviCtcpMessage * msg);
287  void parseCtcpRequestDcc(KviCtcpMessage * msg);
288  void parseCtcpRequestPage(KviCtcpMessage * msg);
289  void parseCtcpReplyAvatar(KviCtcpMessage * msg);
290  void parseCtcpReplyUserinfo(KviCtcpMessage * msg);
291  void parseCtcpReplyGeneric(KviCtcpMessage * msg);
292  void parseCtcpReplyPing(KviCtcpMessage * msg);
293  void parseCtcpReplyLagcheck(KviCtcpMessage * msg);
294  // void parseCtcpReply(const char * msg_ptr,KviIrcUser &source,const char * target);
295  // STARTTLS support
296  void parseNumericStartTls(KviIrcMessage * msg);
297  void parseNumericNotRegistered(KviIrcMessage * msg);
298  //sasl
299  void parseNumericSaslSuccess(KviIrcMessage * msg);
300  void parseNumericSaslLogin(KviIrcMessage * msg);
301  void parseNumericSaslFail(KviIrcMessage * msg);
302  // IRCv3 stuffs
303  void parseLiteralAccount(KviIrcMessage * msg);
304  void parseLiteralChghost(KviIrcMessage * msg);
305 
306 public:
307  static void encodeCtcpParameter(const char * param, KviCString & buffer, bool bSpaceBreaks = true);
308  static void encodeCtcpParameter(const char * param, QString & buffer, bool bSpaceBreaks = true);
309  static const char * decodeCtcpEscape(const char * msg_ptr, KviCString & buffer);
310  static const char * decodeCtcpEscape(const char * msg_ptr, QByteArray & buffer);
311  static const char * extractCtcpParameter(const char * msg_ptr, KviCString & buffer, bool bSpaceBreaks = true, bool bSafeOnly = false);
312  static const char * extractCtcpParameter(const char * msg_ptr, QString & buffer, bool bSpaceBreaks = true, bool bSafeOnly = false);
313 };
314 
315 #ifndef _KVI_SPARSER_CPP_
317 #endif
318 
319 #endif //_KVI_SPARSER_H_
const char * pData
Definition: KviIrcServerParser.h:64
virtual void die()
Definition: KviIrcServerParser.h:112
ctcpParseProc rpl
Definition: KviIrcServerParser.h:95
Definition: KviCString.h:105
Definition: KviMainWindow.h:60
Definition: KviConsoleWindow.h:75
KviCString szParam2
Definition: KviIrcServerParser.h:78
#define KVIRC_API
Definition: kvi_settings.h:128
KviIrcMask * pSource
Definition: KviIrcServerParser.h:66
Definition: KviIrcServerParser.h:91
KviCString szType
Definition: KviIrcServerParser.h:76
Definition: KviIrcMessage.h:50
QString szTarget
Definition: KviIrcServerParser.h:65
An abstraction of a connection to an IRC server.
Definition: KviIrcConnection.h:95
KviCtcpMessage * ctcpMsg
Definition: KviIrcServerParser.h:83
const char * msgName
Definition: KviIrcServerParser.h:55
Definition: KviIrcServerParser.h:53
bool bIPv6
Definition: KviIrcServerParser.h:82
KviExternalServerDataParser()
Definition: KviIrcServerParser.h:106
Irc user mask handling.
Definition: KviIrcMask.h:45
virtual void processData(KviIrcMessage *)
Definition: KviIrcServerParser.h:110
QString szHost
Definition: libkvisetup.cpp:45
Definition: KviIrcServerParser.h:74
KVIRC_API KviIrcServerParser * g_pServerParser
Definition: KviIrcServerParser.cpp:37
KviCString szParam1
Definition: KviIrcServerParser.h:77
bool bIgnored
Definition: KviIrcServerParser.h:67
QString szTag
Definition: KviIrcServerParser.h:71
virtual void control(int)
Definition: KviIrcServerParser.h:111
Definition: KviIrcServerParser.h:103
C++ Template based double linked pointer list class.
Base class for all windows in KVIrc.
Definition: KviWindow.h:74
KviCString m_szLastParserError
Definition: KviIrcServerParser.h:126
const char * msgName
Definition: KviIrcServerParser.h:93
struct _KviCtcpMessage KviCtcpMessage
ctcpParseProc req
Definition: KviIrcServerParser.h:94
KviIrcMessage * msg
Definition: KviIrcServerParser.h:63
virtual ~KviExternalServerDataParser()
Definition: KviIrcServerParser.h:107
Definition: KviIrcServerParser.h:61
KviCString szParam3
Definition: KviIrcServerParser.h:79
KviConsoleWindow * pConsole
Definition: KviIrcServerParser.h:84
Definition: KviIrcServerParser.h:115
void(KviIrcServerParser::* ctcpParseProc)(KviCtcpMessage *)
Definition: KviIrcServerParser.h:87
void(KviIrcServerParser::* messageParseProc)(KviIrcMessage *)
Definition: KviIrcServerParser.h:51
struct _KviDccRequest KviDccRequest
This file contains compile time settings.
KviCString szParam5
Definition: KviIrcServerParser.h:81
messageParseProc proc
Definition: KviIrcServerParser.h:56
struct _KviLiteralMessageParseStruct KviLiteralMessageParseStruct
bool bUnknown
Definition: KviIrcServerParser.h:69
Helper functions for the QString class.
struct _KviCtcpMessageParseStruct KviCtcpMessageParseStruct
bool bIsFlood
Definition: KviIrcServerParser.h:68
KviCString szParam4
Definition: KviIrcServerParser.h:80
int iFlags
Definition: KviIrcServerParser.h:96
The class which manages a channel.
Definition: KviChannelWindow.h:113