summaryrefslogtreecommitdiff
path: root/noncore/net/opieirc/ircmessageparser.cpp
Side-by-side diff
Diffstat (limited to 'noncore/net/opieirc/ircmessageparser.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/opieirc/ircmessageparser.cpp61
1 files changed, 25 insertions, 36 deletions
diff --git a/noncore/net/opieirc/ircmessageparser.cpp b/noncore/net/opieirc/ircmessageparser.cpp
index ecc7e9a..f8ccbb6 100644
--- a/noncore/net/opieirc/ircmessageparser.cpp
+++ b/noncore/net/opieirc/ircmessageparser.cpp
@@ -8,76 +8,79 @@ IRCLiteralMessageParserStruct IRCMessageParser::literalParserProcTable[] = {
{ "NOTICE", FUNC(parseLiteralNotice) },
{ "JOIN", FUNC(parseLiteralJoin) },
{ "PRIVMSG", FUNC(parseLiteralPrivMsg) },
{ "NICK", FUNC(parseLiteralNick) },
{ "PART", FUNC(parseLiteralPart) },
{ "QUIT", FUNC(parseLiteralQuit) },
{ "ERROR", FUNC(parseLiteralError) },
{ "ERROR:", FUNC(parseLiteralError) },
{ "MODE", FUNC(parseLiteralMode) },
{ "KICK", FUNC(parseLiteralKick) },
{ "TOPIC", FUNC(parseLiteralTopic) },
{ 0 , 0 }
};
/* Lookup table for literal commands */
IRCCTCPMessageParserStruct IRCMessageParser::ctcpParserProcTable[] = {
{ "PING", FUNC(parseCTCPPing) },
{ "VERSION", FUNC(parseCTCPVersion) },
{ "ACTION", FUNC(parseCTCPAction) },
{ 0 , 0 }
};
/* Lookup table for numerical commands */
IRCNumericalMessageParserStruct IRCMessageParser::numericalParserProcTable[] = {
- { 1, FUNC(parseNumerical001) }, // RPL_WELCOME
- { 2, FUNC(parseNumerical002) }, // RPL_YOURHOST
- { 3, FUNC(parseNumerical003) }, // RPL_CREATED
- { 4, FUNC(parseNumerical004) }, // RPL_MYINFO
- { 5, FUNC(parseNumerical005) }, // RPL_BOUNCE, RPL_PROTOCTL
- { 251, FUNC(parseNumericalStats) }, // RPL_LUSERCLIENT
- { 252, FUNC(parseNumericalStats) }, // RPL_LUSEROP
- { 265, FUNC(parseNumericalStats) }, // RPL_LOCALUSERS
- { 266, FUNC(parseNumericalStats) }, // RPL_GLOBALUSERS
- { 250, FUNC(parseNumericalStats) }, // RPL_STATSCONN
- { 254, FUNC(nullFunc)}, // RPL_LUSERCHANNELS
- { 255, FUNC(parseNumericalStats) }, // RPL_LUSERNAME
+ { 1, FUNC(parseNumericalSecondParam) }, // RPL_WELCOME
+ { 2, FUNC(parseNumericalSecondParam) }, // RPL_YOURHOST
+ { 3, FUNC(parseNumericalSecondParam) }, // RPL_CREATED
+ { 4, FUNC(parseNumericalAllParams) }, // RPL_MYINFO
+ { 5, FUNC(parseNumericalSecondParam) }, // RPL_BOUNCE, RPL_PROTOCTL
+ { 250, FUNC(parseNumericalAllParams) }, // RPL_STATSCONN
+ { 251, FUNC(parseNumericalSecondParam) }, // RPL_LUSERCLIENT
+ { 252, FUNC(parseNumericalAllParams) }, // RPL_LUSEROP
+ { 253, FUNC(parseNumericalAllParams) }, // RPL_LUSERUNKNOWN
+ { 254, FUNC(parseNumericalAllParams) }, // RPL_LUSERCHANNELS
+ { 255, FUNC(parseNumericalSecondParam) }, // RPL_LUSERME
+ { 265, FUNC(parseNumericalAllParams) }, // RPL_LOCALUSERS
+ { 266, FUNC(parseNumericalAllParams) }, // RPL_GLOBALUSERS
{ 332, FUNC(parseNumericalTopic) }, // RPL_TOPIC
{ 333, FUNC(parseNumericalTopicWhoTime) }, // RPL_TOPICWHOTIME
{ 353, FUNC(parseNumericalNames) }, // RPL_NAMREPLY
{ 366, FUNC(parseNumericalEndOfNames) }, // RPL_ENDOFNAMES
- { 375, FUNC(parseNumericalStats) }, // RPL_MOTDSTART
- { 372, FUNC(parseNumericalStats) }, // RPL_MOTD
- { 376, FUNC(parseNumericalStats) }, // RPL_ENDOFMOTD
- { 377, FUNC(parseNumericalStats) }, // RPL_MOTD2
- { 378, FUNC(parseNumericalStats) }, // RPL_MOTD3
+ { 372, FUNC(parseNumericalSecondParam) }, // RPL_MOTD
+ { 375, FUNC(parseNumericalSecondParam) }, // RPL_MOTDSTART
+ { 376, FUNC(parseNumericalSecondParam) }, // RPL_ENDOFMOTD
+ { 377, FUNC(parseNumericalSecondParam) }, // RPL_MOTD2
+ { 378, FUNC(parseNumericalSecondParam) }, // RPL_MOTD3
{ 401, FUNC(parseNumericalNoSuchNick) }, // ERR_NOSUCHNICK
{ 406, FUNC(parseNumericalNoSuchNick) }, // ERR_WASNOSUCHNICK
- { 412, FUNC(parseNumericalStats) }, // ERR_NOTEXTTOSEND
+ { 412, FUNC(parseNumericalSecondParam) }, // ERR_NOTEXTTOSEND
+ { 422, FUNC(parseNumericalSecondParam) }, // ERR_NOMOTD
{ 433, FUNC(parseNumericalNicknameInUse) }, // ERR_NICKNAMEINUSE
{ 0, 0 }
};
+
IRCMessageParser::IRCMessageParser(IRCSession *session) {
m_session = session;
}
void IRCMessageParser::parse(IRCMessage *message) {
/* Find out what kind of message we have here and call the appropriate handler using
the parser tables. If no handler can be found, print out an error message */
if (message->isNumerical()) {
for (int i=0; i<numericalParserProcTable[i].commandNumber; i++) {
if (message->commandNumber() == numericalParserProcTable[i].commandNumber) {
(this->*(numericalParserProcTable[i].proc))(message);
return;
}
}
emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Received unhandled numeric command: %1").arg( QString::number(message->commandNumber()) )));
} else if (message->isCTCP()) {
for (int i=0; ctcpParserProcTable[i].commandName; i++) {
if (message->ctcpCommand() == ctcpParserProcTable[i].commandName) {
(this->*(ctcpParserProcTable[i].proc))(message);
return;
}
}
emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Received unhandled ctcp command: %1").arg( message->ctcpCommand())) );
} else {
@@ -439,73 +442,57 @@ void IRCMessageParser::parseLiteralKick(IRCMessage *message) {
if (channel) {
IRCChannelPerson *person = channel->getPerson(message->param(1));
if (person) {
if (person->person->nick() == m_session->m_server->nick()) {
m_session->removeChannel(channel);
IRCOutput output(OUTPUT_SELFKICK, tr("You were kicked from ") + channel->channelname() + tr(" by ") + mask.nick() + " (" + message->param(2) + ")");
output.addParam(channel);
emit outputReady(output);
} else {
/* someone else got kicked */
channel->removePerson(person);
IRCOutput output(OUTPUT_OTHERKICK, person->person->nick() + tr(" was kicked from ") + channel->channelname() + tr(" by ") + mask.nick()+ " (" + message->param(2) + ")");
output.addParam(channel);
output.addParam(person);
emit outputReady(output);
}
} else {
emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Unknown person kick - desynchronized?")));
}
} else {
emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Unknown channel kick - desynchronized?")));
}
}
-void IRCMessageParser::parseNumerical001(IRCMessage *message) {
- /* Welcome to IRC message, display */
- emit outputReady(IRCOutput(OUTPUT_SERVERMESSAGE, message->param(1)));
-}
-void IRCMessageParser::parseNumerical002(IRCMessage *message) {
+void IRCMessageParser::parseNumericalSecondParam(IRCMessage *message) {
emit outputReady(IRCOutput(OUTPUT_SERVERMESSAGE, message->param(1)));
}
-void IRCMessageParser::parseNumerical003(IRCMessage *message) {
- emit outputReady(IRCOutput(OUTPUT_SERVERMESSAGE, message->param(1)));
-}
-
-void IRCMessageParser::parseNumerical004(IRCMessage *message) {
+void IRCMessageParser::parseNumericalAllParams(IRCMessage *message) {
emit outputReady(IRCOutput(OUTPUT_SERVERMESSAGE, message->allParameters()));
}
-void IRCMessageParser::parseNumerical005(IRCMessage *message) {
- emit outputReady(IRCOutput(OUTPUT_SERVERMESSAGE, message->allParameters()));
-}
-
-void IRCMessageParser::parseNumericalStats(IRCMessage *message) {
- emit outputReady(IRCOutput(OUTPUT_SERVERMESSAGE, message->param(1)));
-}
-
void IRCMessageParser::parseNumericalNames(IRCMessage *message) {
/* Name list sent when joining a channel */
IRCChannel *channel = m_session->getChannel(message->param(2).lower());
if (channel != 0) {
QString people = message->param(3);
QTextIStream stream(&people);
QString temp;
while (!stream.atEnd()) {
stream >> temp;
char flagch = temp.at(0).latin1();
int flag = 0;
QString nick;
/* Parse person flags */
if (flagch == '@' || flagch == '+' || flagch=='%' || flagch == '*') {
nick = temp.right(temp.length()-1);
switch (flagch) {
case '@': flag = PERSON_FLAG_OP; break;
case '+': flag = PERSON_FLAG_VOICE; break;
case '%': flag = PERSON_FLAG_HALFOP; break;
default : flag = 0; break;
}
@@ -547,24 +534,26 @@ void IRCMessageParser::parseNumericalEndOfNames(IRCMessage *message) {
void IRCMessageParser::parseNumericalNicknameInUse(IRCMessage *) {
emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Nickname is in use, please reconnect with a different nickname")));
m_session->endSession();
}
void IRCMessageParser::parseNumericalNoSuchNick(IRCMessage *) {
emit outputReady(IRCOutput(OUTPUT_ERROR, tr("No such nickname")));
}
void IRCMessageParser::parseNumericalTopic(IRCMessage *message) {
IRCChannel *channel = m_session->getChannel(message->param(1).lower());
if (channel) {
IRCOutput output(OUTPUT_TOPIC, tr("Topic for channel " + channel->channelname() + " is \"" + message->param(2) + "\""));
output.addParam(channel);
emit outputReady(output);
} else {
IRCOutput output(OUTPUT_TOPIC, tr("Topic for channel " + message->param(1) + " is \"" + message->param(2) + "\""));
output.addParam(0);
emit outputReady(output);
}
}
void IRCMessageParser::parseNumericalTopicWhoTime(IRCMessage *) {
}
+
+