summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/opieirc/ircchannellist.cpp26
-rw-r--r--noncore/net/opieirc/ircchannellist.h1
-rw-r--r--noncore/net/opieirc/ircmessageparser.cpp61
-rw-r--r--noncore/net/opieirc/ircmessageparser.h8
4 files changed, 50 insertions, 46 deletions
diff --git a/noncore/net/opieirc/ircchannellist.cpp b/noncore/net/opieirc/ircchannellist.cpp
index 4e13dee..6bef318 100644
--- a/noncore/net/opieirc/ircchannellist.cpp
+++ b/noncore/net/opieirc/ircchannellist.cpp
@@ -1,47 +1,65 @@
#include <qpe/resource.h>
#include "ircchannellist.h"
IRCChannelList::IRCChannelList(IRCChannel *channel, QWidget *parent, const char *name, WFlags f) : QListBox(parent, name, f) {
m_channel = channel;
}
void IRCChannelList::update() {
QPixmap op = Resource::loadPixmap("opieirc/op");
QPixmap hop = Resource::loadPixmap("opieirc/hop");
QPixmap voice = Resource::loadPixmap("opieirc/voice");
QListIterator<IRCChannelPerson> it = m_channel->people();
clear();
for (; it.current(); ++it) {
IRCChannelPerson *person = it.current();
if (person->flags & PERSON_FLAG_OP) {
- insertItem(op, person->person->nick());
+ insertItem(op, "1" + person->person->nick());
} else if (person->flags & PERSON_FLAG_HALFOP) {
- insertItem(op, person->person->nick());
+ insertItem(op, "2" + person->person->nick());
} else if (person->flags & PERSON_FLAG_VOICE) {
- insertItem(voice, person->person->nick());
+ insertItem(voice, "3" + person->person->nick());
} else {
- insertItem(person->person->nick());
+ insertItem("4" + person->person->nick());
}
}
sort();
+ adjustNicks();
}
bool IRCChannelList::hasPerson(QString nick) {
for (unsigned int i=0; i<count(); i++) {
if (text(i) == nick)
return TRUE;
}
return FALSE;
}
bool IRCChannelList::removePerson(QString nick) {
for (unsigned int i=0; i<count(); i++) {
if (text(i) == nick){
removeItem(i);
return TRUE;
}
}
return FALSE;
}
+void IRCChannelList::adjustNicks() {
+ QString txt;
+ QPixmap pm;
+
+ for(unsigned int i=0; i<count(); i++) {
+ txt = text(i).remove(0,1);
+ if(pixmap(i)) {
+ pm = *pixmap(i);
+ removeItem(i);
+ insertItem(pm, txt, i);
+ }
+ else {
+ removeItem(i);
+ insertItem(txt,i);
+ }
+ }
+}
diff --git a/noncore/net/opieirc/ircchannellist.h b/noncore/net/opieirc/ircchannellist.h
index deab649..b4e46eb 100644
--- a/noncore/net/opieirc/ircchannellist.h
+++ b/noncore/net/opieirc/ircchannellist.h
@@ -7,31 +7,32 @@
the Free Software Foundation; either version 2 of the License, or
(at your option) 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __IRCCHANNELLIST_H
#define __IRCCHANNELLIST_H
#include <qlistbox.h>
#include "ircchannel.h"
class IRCChannelList : public QListBox {
public:
IRCChannelList(IRCChannel *channel, QWidget *parent = 0, const char *name = 0, WFlags f = 0);
void update();
+ void adjustNicks();
bool hasPerson(QString nick);
bool removePerson(QString nick);
protected:
IRCChannel *m_channel;
};
#endif /* __IRCCHANNELLIST_H */
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 *) {
}
+
+
diff --git a/noncore/net/opieirc/ircmessageparser.h b/noncore/net/opieirc/ircmessageparser.h
index c4dd96c..5412f5f 100644
--- a/noncore/net/opieirc/ircmessageparser.h
+++ b/noncore/net/opieirc/ircmessageparser.h
@@ -52,48 +52,44 @@ typedef struct IRCNumericalMessageParserStruct {
class IRCMessageParser : public QObject {
Q_OBJECT
public:
/* Create an IRCMessageParser object */
IRCMessageParser(IRCSession *session);
/* Parse a server message and take the appropriate actions */
void parse(IRCMessage *message);
signals:
/* Used to send commands to the UI (such as displaying text etc) */
void outputReady(IRCOutput output);
private:
/* Parser functions */
void nullFunc(IRCMessage *message);
void parseLiteralPing(IRCMessage *message);
void parseLiteralNotice(IRCMessage *message);
void parseLiteralJoin(IRCMessage *message);
void parseLiteralPrivMsg(IRCMessage *message);
void parseLiteralNick(IRCMessage *message);
void parseLiteralPart(IRCMessage *message);
void parseLiteralQuit(IRCMessage *message);
void parseLiteralError(IRCMessage *message);
void parseLiteralMode(IRCMessage *message);
void parseLiteralKick(IRCMessage *message);
void parseLiteralTopic(IRCMessage *message);
- void parseNumerical001(IRCMessage *message);
- void parseNumerical002(IRCMessage *message);
- void parseNumerical003(IRCMessage *message);
- void parseNumerical004(IRCMessage *message);
- void parseNumerical005(IRCMessage *message);
- void parseNumericalStats(IRCMessage *message);
+ void parseNumericalSecondParam(IRCMessage *message);
+ void parseNumericalAllParams(IRCMessage *message);
void parseNumericalNames(IRCMessage *message);
void parseNumericalEndOfNames(IRCMessage *message);
void parseNumericalNicknameInUse(IRCMessage *message);
void parseNumericalNoSuchNick(IRCMessage *message);
void parseNumericalTopic(IRCMessage *message);
void parseNumericalTopicWhoTime(IRCMessage *message);
void parseCTCPPing(IRCMessage *message);
void parseCTCPVersion(IRCMessage *message);
void parseCTCPAction(IRCMessage *message);
protected:
IRCSession *m_session;
/* Parser tables */
static IRCLiteralMessageParserStruct literalParserProcTable[];
static IRCNumericalMessageParserStruct numericalParserProcTable[];
static IRCCTCPMessageParserStruct ctcpParserProcTable[];
};
#endif /* __IRCMESSAGEPARSER_H */