summaryrefslogtreecommitdiff
authorwazlaf <wazlaf>2002-09-21 23:59:08 (UTC)
committer wazlaf <wazlaf>2002-09-21 23:59:08 (UTC)
commitd60625b5551f26cdc35f7b2497ab538de859537d (patch) (unidiff)
tree998c8d2e1f12a9c7ab9b55fa578f93d1a178ade6
parent54238c669808ceccaa6fb0ab0dcbf4565b370196 (diff)
downloadopie-d60625b5551f26cdc35f7b2497ab538de859537d.zip
opie-d60625b5551f26cdc35f7b2497ab538de859537d.tar.gz
opie-d60625b5551f26cdc35f7b2497ab538de859537d.tar.bz2
query windows and basic commands such as /me, /msg
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/opieirc/ircchanneltab.cpp7
-rw-r--r--noncore/net/opieirc/ircmessage.cpp1
-rw-r--r--noncore/net/opieirc/ircmessageparser.cpp10
-rw-r--r--noncore/net/opieirc/ircmessageparser.h1
-rw-r--r--noncore/net/opieirc/ircperson.cpp6
-rw-r--r--noncore/net/opieirc/ircperson.h3
-rw-r--r--noncore/net/opieirc/ircquerytab.cpp76
-rw-r--r--noncore/net/opieirc/ircquerytab.h27
-rw-r--r--noncore/net/opieirc/ircservertab.cpp54
-rw-r--r--noncore/net/opieirc/ircservertab.h7
10 files changed, 182 insertions, 10 deletions
diff --git a/noncore/net/opieirc/ircchanneltab.cpp b/noncore/net/opieirc/ircchanneltab.cpp
index 3267525..4675265 100644
--- a/noncore/net/opieirc/ircchanneltab.cpp
+++ b/noncore/net/opieirc/ircchanneltab.cpp
@@ -1,85 +1,84 @@
1#include <qhbox.h> 1#include <qhbox.h>
2#include "ircchanneltab.h" 2#include "ircchanneltab.h"
3#include "ircservertab.h" 3#include "ircservertab.h"
4 4
5IRCChannelTab::IRCChannelTab(IRCChannel *channel, IRCServerTab *parentTab, MainWindow *mainWindow, QWidget *parent, const char *name, WFlags f) : IRCTab(parent, name, f) { 5IRCChannelTab::IRCChannelTab(IRCChannel *channel, IRCServerTab *parentTab, MainWindow *mainWindow, QWidget *parent, const char *name, WFlags f) : IRCTab(parent, name, f) {
6 m_mainWindow = mainWindow; 6 m_mainWindow = mainWindow;
7 m_parentTab = parentTab; 7 m_parentTab = parentTab;
8 m_channel = channel; 8 m_channel = channel;
9 m_description->setText(tr("Talking on channel") + " <b>" + channel->channelname() + "</b>"); 9 m_description->setText(tr("Talking on channel") + " <b>" + channel->channelname() + "</b>");
10 QHBox *hbox = new QHBox(this); 10 QHBox *hbox = new QHBox(this);
11 m_textview = new QTextView(hbox); 11 m_textview = new QTextView(hbox);
12 m_textview->setHScrollBarMode(QScrollView::AlwaysOff); 12 m_textview->setHScrollBarMode(QScrollView::AlwaysOff);
13 m_textview->setVScrollBarMode(QScrollView::AlwaysOn); 13 m_textview->setVScrollBarMode(QScrollView::AlwaysOn);
14 m_listVisible = TRUE; 14 m_listVisible = TRUE;
15 m_listButton = new QPushButton(">", m_textview); 15 m_listButton = new QPushButton(">", m_textview);
16 m_textview->setCornerWidget(m_listButton); 16 m_textview->setCornerWidget(m_listButton);
17 m_textview->setTextFormat(RichText);
17 connect(m_listButton, SIGNAL(clicked()), this, SLOT(toggleList())); 18 connect(m_listButton, SIGNAL(clicked()), this, SLOT(toggleList()));
18 m_list = new IRCChannelList(m_channel, hbox); 19 m_list = new IRCChannelList(m_channel, hbox);
19 m_list->update(); 20 m_list->update();
20 m_list->setMaximumWidth(LISTWIDTH); 21 m_list->setMaximumWidth(LISTWIDTH);
21 m_field = new QLineEdit(this); 22 m_field = new QLineEdit(this);
22 m_layout->add(hbox); 23 m_layout->add(hbox);
23 hbox->show(); 24 hbox->show();
24 m_layout->add(m_field); 25 m_layout->add(m_field);
25 m_field->setFocus(); 26 m_field->setFocus();
26 connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand())); 27 connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand()));
27 28
28} 29}
29 30
30void IRCChannelTab::appendText(QString text) { 31void IRCChannelTab::appendText(QString text) {
31 /* not using append because it creates layout problems */ 32 /* not using append because it creates layout problems */
32 m_textview->setText(m_textview->text() + text); 33 m_textview->setText(m_textview->text() + text);
33 m_textview->ensureVisible(0, m_textview->contentsHeight()); 34 m_textview->ensureVisible(0, m_textview->contentsHeight());
34} 35}
35 36
36IRCChannelTab::~IRCChannelTab() { 37IRCChannelTab::~IRCChannelTab() {
37 m_parentTab->removeChannelTab(this); 38 m_parentTab->removeChannelTab(this);
38} 39}
39 40
40void IRCChannelTab::processCommand() { 41void IRCChannelTab::processCommand() {
41 QString text = m_field->text(); 42 QString text = m_field->text();
42 if (text.length()>0) { 43 if (text.length()>0) {
43 if (session()->isSessionActive()) { 44 if (session()->isSessionActive()) {
44 if (text.startsWith("/") && !text.startsWith("//")) { 45 if (text.startsWith("/") && !text.startsWith("//")) {
45 /* Command mode */ 46 /* Command mode */
46 m_parentTab->executeCommand(this, text);; 47 m_parentTab->executeCommand(this, text);;
47 } else { 48 } else {
48 if (text.startsWith("//")) 49 if (text.startsWith("//"))
49 text = text.right(text.length()-1); 50 text = text.right(text.length()-1);
50 if (session()->isSessionActive()) { 51 session()->sendMessage(m_channel, m_field->text());
51 session()->sendMessage(m_channel, m_field->text()); 52 appendText("&lt;<font color=\"#dd0000\">"+m_parentTab->server()->nick()+"</font>&gt; "+IRCOutput::toHTML(m_field->text())+"<br>");
52 appendText("&lt;<font color=\"#dd0000\">"+m_parentTab->server()->nick()+"</font>&gt; "+IRCOutput::toHTML(m_field->text())+"<br>");
53 }
54 } 53 }
55 } else { 54 } else {
56 appendText("<font color=\"#ff0000\">"+tr("Disconnected")+"</font><br>"); 55 appendText("<font color=\"#ff0000\">"+tr("Disconnected")+"</font><br>");
57 } 56 }
58 } 57 }
59 m_field->clear(); 58 m_field->clear();
60} 59}
61 60
62void IRCChannelTab::toggleList() { 61void IRCChannelTab::toggleList() {
63 if (m_listVisible) { 62 if (m_listVisible) {
64 m_list->setMaximumWidth(0); 63 m_list->setMaximumWidth(0);
65 m_listButton->setText("<"); 64 m_listButton->setText("<");
66 } else { 65 } else {
67 m_list->setMaximumWidth(LISTWIDTH); 66 m_list->setMaximumWidth(LISTWIDTH);
68 m_listButton->setText(">"); 67 m_listButton->setText(">");
69 } 68 }
70 m_listVisible = !m_listVisible; 69 m_listVisible = !m_listVisible;
71} 70}
72 71
73QString IRCChannelTab::title() { 72QString IRCChannelTab::title() {
74 return m_channel->channelname(); 73 return m_channel->channelname();
75} 74}
76 75
77IRCSession *IRCChannelTab::session() { 76IRCSession *IRCChannelTab::session() {
78 return m_parentTab->session(); 77 return m_parentTab->session();
79} 78}
80 79
81void IRCChannelTab::remove() { 80void IRCChannelTab::remove() {
82 if (session()->isSessionActive()) { 81 if (session()->isSessionActive()) {
83 session()->part(m_channel); 82 session()->part(m_channel);
84 } else { 83 } else {
85 m_mainWindow->killTab(this); 84 m_mainWindow->killTab(this);
diff --git a/noncore/net/opieirc/ircmessage.cpp b/noncore/net/opieirc/ircmessage.cpp
index 9c2869c..d823ad1 100644
--- a/noncore/net/opieirc/ircmessage.cpp
+++ b/noncore/net/opieirc/ircmessage.cpp
@@ -48,65 +48,64 @@ IRCMessage::IRCMessage(QString line) {
48 QTextIStream ctcpStream(&m_allParameters); 48 QTextIStream ctcpStream(&m_allParameters);
49 if (m_command == "PRIVMSG") 49 if (m_command == "PRIVMSG")
50 ctcpStream >> m_ctcpDestination; 50 ctcpStream >> m_ctcpDestination;
51 ctcpStream >> temp; 51 ctcpStream >> temp;
52 m_ctcpCommand = temp.upper().right(temp.length()-1); 52 m_ctcpCommand = temp.upper().right(temp.length()-1);
53 m_parameters.clear(); 53 m_parameters.clear();
54 int length = m_allParameters.length() - m_ctcpCommand.length() - 1; 54 int length = m_allParameters.length() - m_ctcpCommand.length() - 1;
55 if (m_command == "PRIVMSG") 55 if (m_command == "PRIVMSG")
56 length -= m_ctcpDestination.length() + 1; 56 length -= m_ctcpDestination.length() + 1;
57 if (length <= 0) { 57 if (length <= 0) {
58 m_allParameters = ""; 58 m_allParameters = "";
59 } else { 59 } else {
60 m_allParameters = m_allParameters.right(length); 60 m_allParameters = m_allParameters.right(length);
61 m_parameters << m_allParameters; 61 m_parameters << m_allParameters;
62 } 62 }
63 } else { 63 } else {
64 m_ctcp = FALSE; 64 m_ctcp = FALSE;
65 } 65 }
66 66
67 /* 67 /*
68 -- Uncomment to debug -- 68 -- Uncomment to debug --
69 69
70 printf("Parsed : '%s'\n", line.ascii()); 70 printf("Parsed : '%s'\n", line.ascii());
71 printf("Prefix : '%s'\n", m_prefix.ascii()); 71 printf("Prefix : '%s'\n", m_prefix.ascii());
72 printf("Command : '%s'\n", m_command.ascii()); 72 printf("Command : '%s'\n", m_command.ascii());
73 printf("Allparameters : '%s'\n", m_allParameters.ascii()); 73 printf("Allparameters : '%s'\n", m_allParameters.ascii());
74 for (unsigned int i=0; i<m_parameters.count(); i++) { 74 for (unsigned int i=0; i<m_parameters.count(); i++) {
75 printf("Parameter %i : '%s'\n", i, m_parameters[i].ascii()); 75 printf("Parameter %i : '%s'\n", i, m_parameters[i].ascii());
76 } 76 }
77 printf("CTCP Command : '%s'\n", m_ctcpCommand.latin1()); 77 printf("CTCP Command : '%s'\n", m_ctcpCommand.latin1());
78 printf("CTCP Destination : '%s'\n", m_ctcpDestination.latin1()); 78 printf("CTCP Destination : '%s'\n", m_ctcpDestination.latin1());
79 printf("CTCP param count is : '%i'\n", m_parameters.count()); 79 printf("CTCP param count is : '%i'\n", m_parameters.count());
80
81 */ 80 */
82} 81}
83 82
84QString IRCMessage::param(int param) { 83QString IRCMessage::param(int param) {
85 return m_parameters[param]; 84 return m_parameters[param];
86} 85}
87 86
88QString IRCMessage::prefix() { 87QString IRCMessage::prefix() {
89 return m_prefix; 88 return m_prefix;
90} 89}
91 90
92QString IRCMessage::command() { 91QString IRCMessage::command() {
93 return m_command; 92 return m_command;
94} 93}
95 94
96QString IRCMessage::ctcpCommand() { 95QString IRCMessage::ctcpCommand() {
97 return m_ctcpCommand; 96 return m_ctcpCommand;
98} 97}
99 98
100QString IRCMessage::ctcpDestination() { 99QString IRCMessage::ctcpDestination() {
101 return m_ctcpDestination; 100 return m_ctcpDestination;
102} 101}
103 102
104unsigned short IRCMessage::commandNumber() { 103unsigned short IRCMessage::commandNumber() {
105 return m_commandNumber; 104 return m_commandNumber;
106} 105}
107 106
108bool IRCMessage::isNumerical() { 107bool IRCMessage::isNumerical() {
109 return m_isNumerical; 108 return m_isNumerical;
110} 109}
111 110
112bool IRCMessage::isCTCP() { 111bool IRCMessage::isCTCP() {
diff --git a/noncore/net/opieirc/ircmessageparser.cpp b/noncore/net/opieirc/ircmessageparser.cpp
index 4038673..3063741 100644
--- a/noncore/net/opieirc/ircmessageparser.cpp
+++ b/noncore/net/opieirc/ircmessageparser.cpp
@@ -15,65 +15,67 @@ IRCLiteralMessageParserStruct IRCMessageParser::literalParserProcTable[] = {
15 { "ERROR", FUNC(parseLiteralError) }, 15 { "ERROR", FUNC(parseLiteralError) },
16 { "ERROR:", FUNC(parseLiteralError) }, 16 { "ERROR:", FUNC(parseLiteralError) },
17 { "MODE", FUNC(parseLiteralMode) }, 17 { "MODE", FUNC(parseLiteralMode) },
18 { "KICK", FUNC(parseLiteralKick) }, 18 { "KICK", FUNC(parseLiteralKick) },
19 { 0 , 0 } 19 { 0 , 0 }
20}; 20};
21 21
22/* Lookup table for literal commands */ 22/* Lookup table for literal commands */
23IRCCTCPMessageParserStruct IRCMessageParser::ctcpParserProcTable[] = { 23IRCCTCPMessageParserStruct IRCMessageParser::ctcpParserProcTable[] = {
24 { "PING", FUNC(parseCTCPPing) }, 24 { "PING", FUNC(parseCTCPPing) },
25 { "VERSION", FUNC(parseCTCPVersion) }, 25 { "VERSION", FUNC(parseCTCPVersion) },
26 { "ACTION", FUNC(parseCTCPAction) }, 26 { "ACTION", FUNC(parseCTCPAction) },
27 { 0 , 0 } 27 { 0 , 0 }
28}; 28};
29 29
30/* Lookup table for numerical commands */ 30/* Lookup table for numerical commands */
31IRCNumericalMessageParserStruct IRCMessageParser::numericalParserProcTable[] = { 31IRCNumericalMessageParserStruct IRCMessageParser::numericalParserProcTable[] = {
32 { 1, FUNC(parseNumerical001) }, // RPL_WELCOME 32 { 1, FUNC(parseNumerical001) }, // RPL_WELCOME
33 { 2, FUNC(parseNumerical002) }, // RPL_YOURHOST 33 { 2, FUNC(parseNumerical002) }, // RPL_YOURHOST
34 { 3, FUNC(parseNumerical003) }, // RPL_CREATED 34 { 3, FUNC(parseNumerical003) }, // RPL_CREATED
35 { 4, FUNC(parseNumerical004) }, // RPL_MYINFO 35 { 4, FUNC(parseNumerical004) }, // RPL_MYINFO
36 { 5, FUNC(parseNumerical005) }, // RPL_BOUNCE, RPL_PROTOCTL 36 { 5, FUNC(parseNumerical005) }, // RPL_BOUNCE, RPL_PROTOCTL
37 { 251, FUNC(parseNumericalStats) }, // RPL_LUSERCLIENT 37 { 251, FUNC(parseNumericalStats) }, // RPL_LUSERCLIENT
38 { 254, FUNC(nullFunc)}, // RPL_LUSERCHANNELS 38 { 254, FUNC(nullFunc)}, // RPL_LUSERCHANNELS
39 { 255, FUNC(parseNumericalStats) }, // RPL_LUSERNAME 39 { 255, FUNC(parseNumericalStats) }, // RPL_LUSERNAME
40 { 353, FUNC(parseNumericalNames) }, // RPL_NAMREPLY 40 { 353, FUNC(parseNumericalNames) }, // RPL_NAMREPLY
41 { 366, FUNC(parseNumericalEndOfNames) }, // RPL_ENDOFNAMES 41 { 366, FUNC(parseNumericalEndOfNames) }, // RPL_ENDOFNAMES
42 { 375, FUNC(parseNumericalStats) }, // RPL_MOTDSTART 42 { 375, FUNC(parseNumericalStats) }, // RPL_MOTDSTART
43 { 372, FUNC(parseNumericalStats) }, // RPL_MOTD 43 { 372, FUNC(parseNumericalStats) }, // RPL_MOTD
44 { 376, FUNC(parseNumericalStats) }, // RPL_ENDOFMOTD 44 { 376, FUNC(parseNumericalStats) }, // RPL_ENDOFMOTD
45 { 377, FUNC(parseNumericalStats) }, // RPL_MOTD2 45 { 377, FUNC(parseNumericalStats) }, // RPL_MOTD2
46 { 378, FUNC(parseNumericalStats) }, // RPL_MOTD3 46 { 378, FUNC(parseNumericalStats) }, // RPL_MOTD3
47 { 412, FUNC(parseNumericalStats) }, // ERNOTEXTTOSEND 47 { 401, FUNC(parseNumericalNoSuchNick) }, // ERR_NOSUCHNICK
48 { 406, FUNC(parseNumericalNoSuchNick) }, // ERR_WASNOSUCHNICK
49 { 412, FUNC(parseNumericalStats) }, // ERR_NOTEXTTOSEND
48 { 433, FUNC(parseNumericalNicknameInUse) }, // ERR_NICKNAMEINUSE 50 { 433, FUNC(parseNumericalNicknameInUse) }, // ERR_NICKNAMEINUSE
49 { 0, 0 } 51 { 0, 0 }
50}; 52};
51 53
52IRCMessageParser::IRCMessageParser(IRCSession *session) { 54IRCMessageParser::IRCMessageParser(IRCSession *session) {
53 m_session = session; 55 m_session = session;
54} 56}
55 57
56void IRCMessageParser::parse(IRCMessage *message) { 58void IRCMessageParser::parse(IRCMessage *message) {
57 /* Find out what kind of message we have here and call the appropriate handler using 59 /* Find out what kind of message we have here and call the appropriate handler using
58 the parser tables. If no handler can be found, print out an error message */ 60 the parser tables. If no handler can be found, print out an error message */
59 if (message->isNumerical()) { 61 if (message->isNumerical()) {
60 for (int i=0; i<numericalParserProcTable[i].commandNumber; i++) { 62 for (int i=0; i<numericalParserProcTable[i].commandNumber; i++) {
61 if (message->commandNumber() == numericalParserProcTable[i].commandNumber) { 63 if (message->commandNumber() == numericalParserProcTable[i].commandNumber) {
62 (this->*(numericalParserProcTable[i].proc))(message); 64 (this->*(numericalParserProcTable[i].proc))(message);
63 return; 65 return;
64 } 66 }
65 } 67 }
66 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Received unhandled numeric command : ")+QString::number(message->commandNumber()))); 68 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Received unhandled numeric command : ")+QString::number(message->commandNumber())));
67 } else if (message->isCTCP()) { 69 } else if (message->isCTCP()) {
68 for (int i=0; ctcpParserProcTable[i].commandName; i++) { 70 for (int i=0; ctcpParserProcTable[i].commandName; i++) {
69 if (message->ctcpCommand() == ctcpParserProcTable[i].commandName) { 71 if (message->ctcpCommand() == ctcpParserProcTable[i].commandName) {
70 (this->*(ctcpParserProcTable[i].proc))(message); 72 (this->*(ctcpParserProcTable[i].proc))(message);
71 return; 73 return;
72 } 74 }
73 } 75 }
74 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Received unhandled ctcp command : ")+message->ctcpCommand())); 76 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Received unhandled ctcp command : ")+message->ctcpCommand()));
75 } else { 77 } else {
76 for (int i=0; literalParserProcTable[i].commandName; i++) { 78 for (int i=0; literalParserProcTable[i].commandName; i++) {
77 if (message->command() == literalParserProcTable[i].commandName) { 79 if (message->command() == literalParserProcTable[i].commandName) {
78 (this->*(literalParserProcTable[i].proc))(message); 80 (this->*(literalParserProcTable[i].proc))(message);
79 return; 81 return;
@@ -143,65 +145,65 @@ void IRCMessageParser::parseLiteralPart(IRCMessage *message) {
143 IRCOutput output(OUTPUT_SELFPART, tr("You left channel ") + channelName); 145 IRCOutput output(OUTPUT_SELFPART, tr("You left channel ") + channelName);
144 output.addParam(channel); 146 output.addParam(channel);
145 emit outputReady(output); 147 emit outputReady(output);
146 delete channel; 148 delete channel;
147 } else { 149 } else {
148 IRCChannelPerson *person = channel->getPerson(mask.nick()); 150 IRCChannelPerson *person = channel->getPerson(mask.nick());
149 if (person) { 151 if (person) {
150 channel->removePerson(person); 152 channel->removePerson(person);
151 IRCOutput output(OUTPUT_OTHERPART, mask.nick() + tr(" left channel ") + channelName); 153 IRCOutput output(OUTPUT_OTHERPART, mask.nick() + tr(" left channel ") + channelName);
152 output.addParam(channel); 154 output.addParam(channel);
153 output.addParam(person); 155 output.addParam(person);
154 emit outputReady(output); 156 emit outputReady(output);
155 delete person; 157 delete person;
156 } else { 158 } else {
157 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Parting person not found - desynchronized?"))); 159 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Parting person not found - desynchronized?")));
158 } 160 }
159 } 161 }
160 } else { 162 } else {
161 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Channel for part not found - desynchronized?"))); 163 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Channel for part not found - desynchronized?")));
162 } 164 }
163} 165}
164 166
165void IRCMessageParser::parseLiteralPrivMsg(IRCMessage *message) { 167void IRCMessageParser::parseLiteralPrivMsg(IRCMessage *message) {
166 if (m_session->m_server->nick() == message->param(0)) { 168 if (m_session->m_server->nick() == message->param(0)) {
167 /* IRC Query message detected, verify sender and display it */ 169 /* IRC Query message detected, verify sender and display it */
168 IRCPerson mask(message->prefix()); 170 IRCPerson mask(message->prefix());
169 IRCPerson *person = m_session->getPerson(mask.nick()); 171 IRCPerson *person = m_session->getPerson(mask.nick());
170 if (!person) { 172 if (!person) {
171 /* Person not yet known, create and add to the current session */ 173 /* Person not yet known, create and add to the current session */
172 person = new IRCPerson(message->prefix()); 174 person = new IRCPerson(message->prefix());
173 m_session->addPerson(person); 175 m_session->addPerson(person);
174 } 176 }
175 IRCOutput output(OUTPUT_CHANPRIVMSG, message->param(1)); 177 IRCOutput output(OUTPUT_QUERYPRIVMSG, message->param(1));
176 output.addParam(person); 178 output.addParam(person);
177 emit outputReady(output); 179 emit outputReady(output);
178 } else if (message->param(0).at(0) == '#') { 180 } else if (message->param(0).at(0) == '#') {
179 /* IRC Channel message detected, verify sender, channel and display it */ 181 /* IRC Channel message detected, verify sender, channel and display it */
180 IRCChannel *channel = m_session->getChannel(message->param(0)); 182 IRCChannel *channel = m_session->getChannel(message->param(0));
181 if (channel) { 183 if (channel) {
182 IRCPerson mask(message->prefix()); 184 IRCPerson mask(message->prefix());
183 IRCChannelPerson *person = channel->getPerson(mask.nick()); 185 IRCChannelPerson *person = channel->getPerson(mask.nick());
184 if (person) { 186 if (person) {
185 IRCOutput output(OUTPUT_CHANPRIVMSG, message->param(1)); 187 IRCOutput output(OUTPUT_CHANPRIVMSG, message->param(1));
186 output.addParam(channel); 188 output.addParam(channel);
187 output.addParam(person); 189 output.addParam(person);
188 emit outputReady(output); 190 emit outputReady(output);
189 } else { 191 } else {
190 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Channel message with unknown sender"))); 192 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Channel message with unknown sender")));
191 } 193 }
192 } else { 194 } else {
193 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Channel message with unknown channel"))); 195 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Channel message with unknown channel")));
194 } 196 }
195 } else { 197 } else {
196 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Received PRIVMSG of unknown type"))); 198 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Received PRIVMSG of unknown type")));
197 } 199 }
198} 200}
199 201
200void IRCMessageParser::parseLiteralNick(IRCMessage *message) { 202void IRCMessageParser::parseLiteralNick(IRCMessage *message) {
201 IRCPerson mask(message->prefix()); 203 IRCPerson mask(message->prefix());
202 204
203 if (mask.nick() == m_session->m_server->nick()) { 205 if (mask.nick() == m_session->m_server->nick()) {
204 /* We are changing our nickname */ 206 /* We are changing our nickname */
205 m_session->m_server->setNick(message->param(0)); 207 m_session->m_server->setNick(message->param(0));
206 IRCOutput output(OUTPUT_NICKCHANGE, tr("You are now known as ")+message->param(0)); 208 IRCOutput output(OUTPUT_NICKCHANGE, tr("You are now known as ")+message->param(0));
207 output.addParam(0); 209 output.addParam(0);
@@ -450,32 +452,36 @@ void IRCMessageParser::parseNumericalNames(IRCMessage *message) {
450 person = new IRCPerson(); 452 person = new IRCPerson();
451 person->setNick(nick); 453 person->setNick(nick);
452 m_session->addPerson(person); 454 m_session->addPerson(person);
453 } 455 }
454 chan_person->person = person; 456 chan_person->person = person;
455 chan_person->flags = flag; 457 chan_person->flags = flag;
456 channel->addPerson(chan_person); 458 channel->addPerson(chan_person);
457 } 459 }
458 } else { 460 } else {
459 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Server message with unknown channel"))); 461 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Server message with unknown channel")));
460 } 462 }
461} 463}
462 464
463void IRCMessageParser::parseNumericalEndOfNames(IRCMessage *message) { 465void IRCMessageParser::parseNumericalEndOfNames(IRCMessage *message) {
464 /* Done syncing to channel */ 466 /* Done syncing to channel */
465 IRCChannel *channel = m_session->getChannel(message->param(1)); 467 IRCChannel *channel = m_session->getChannel(message->param(1));
466 if (channel) { 468 if (channel) {
467 channel->setHasPeople(TRUE); 469 channel->setHasPeople(TRUE);
468 /* Yes, we want the names before anything happens inside the GUI */ 470 /* Yes, we want the names before anything happens inside the GUI */
469 IRCOutput output(OUTPUT_SELFJOIN, tr("You joined channel ") + channel->channelname()); 471 IRCOutput output(OUTPUT_SELFJOIN, tr("You joined channel ") + channel->channelname());
470 output.addParam(channel); 472 output.addParam(channel);
471 emit outputReady(output); 473 emit outputReady(output);
472 } else { 474 } else {
473 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Server message with unknown channel"))); 475 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Server message with unknown channel")));
474 } 476 }
475} 477}
476 478
477 479
478void IRCMessageParser::parseNumericalNicknameInUse(IRCMessage *) { 480void IRCMessageParser::parseNumericalNicknameInUse(IRCMessage *) {
479 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Nickname is in use, please reconnect with a different nickname"))); 481 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Nickname is in use, please reconnect with a different nickname")));
480 m_session->endSession(); 482 m_session->endSession();
481} 483}
484
485void IRCMessageParser::parseNumericalNoSuchNick(IRCMessage *) {
486 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("No such nickname")));
487}
diff --git a/noncore/net/opieirc/ircmessageparser.h b/noncore/net/opieirc/ircmessageparser.h
index b45b8f0..f774047 100644
--- a/noncore/net/opieirc/ircmessageparser.h
+++ b/noncore/net/opieirc/ircmessageparser.h
@@ -52,44 +52,45 @@ typedef struct IRCNumericalMessageParserStruct {
52class IRCMessageParser : public QObject { 52class IRCMessageParser : public QObject {
53 Q_OBJECT 53 Q_OBJECT
54public: 54public:
55 /* Create an IRCMessageParser object */ 55 /* Create an IRCMessageParser object */
56 IRCMessageParser(IRCSession *session); 56 IRCMessageParser(IRCSession *session);
57 /* Parse a server message and take the appropriate actions */ 57 /* Parse a server message and take the appropriate actions */
58 void parse(IRCMessage *message); 58 void parse(IRCMessage *message);
59signals: 59signals:
60 /* Used to send commands to the UI (such as displaying text etc) */ 60 /* Used to send commands to the UI (such as displaying text etc) */
61 void outputReady(IRCOutput output); 61 void outputReady(IRCOutput output);
62private: 62private:
63 /* Parser functions */ 63 /* Parser functions */
64 void nullFunc(IRCMessage *message); 64 void nullFunc(IRCMessage *message);
65 void parseLiteralPing(IRCMessage *message); 65 void parseLiteralPing(IRCMessage *message);
66 void parseLiteralNotice(IRCMessage *message); 66 void parseLiteralNotice(IRCMessage *message);
67 void parseLiteralJoin(IRCMessage *message); 67 void parseLiteralJoin(IRCMessage *message);
68 void parseLiteralPrivMsg(IRCMessage *message); 68 void parseLiteralPrivMsg(IRCMessage *message);
69 void parseLiteralNick(IRCMessage *message); 69 void parseLiteralNick(IRCMessage *message);
70 void parseLiteralPart(IRCMessage *message); 70 void parseLiteralPart(IRCMessage *message);
71 void parseLiteralQuit(IRCMessage *message); 71 void parseLiteralQuit(IRCMessage *message);
72 void parseLiteralError(IRCMessage *message); 72 void parseLiteralError(IRCMessage *message);
73 void parseLiteralMode(IRCMessage *message); 73 void parseLiteralMode(IRCMessage *message);
74 void parseLiteralKick(IRCMessage *message); 74 void parseLiteralKick(IRCMessage *message);
75 void parseNumerical001(IRCMessage *message); 75 void parseNumerical001(IRCMessage *message);
76 void parseNumerical002(IRCMessage *message); 76 void parseNumerical002(IRCMessage *message);
77 void parseNumerical003(IRCMessage *message); 77 void parseNumerical003(IRCMessage *message);
78 void parseNumerical004(IRCMessage *message); 78 void parseNumerical004(IRCMessage *message);
79 void parseNumerical005(IRCMessage *message); 79 void parseNumerical005(IRCMessage *message);
80 void parseNumericalStats(IRCMessage *message); 80 void parseNumericalStats(IRCMessage *message);
81 void parseNumericalNames(IRCMessage *message); 81 void parseNumericalNames(IRCMessage *message);
82 void parseNumericalEndOfNames(IRCMessage *message); 82 void parseNumericalEndOfNames(IRCMessage *message);
83 void parseNumericalNicknameInUse(IRCMessage *message); 83 void parseNumericalNicknameInUse(IRCMessage *message);
84 void parseNumericalNoSuchNick(IRCMessage *message);
84 void parseCTCPPing(IRCMessage *message); 85 void parseCTCPPing(IRCMessage *message);
85 void parseCTCPVersion(IRCMessage *message); 86 void parseCTCPVersion(IRCMessage *message);
86 void parseCTCPAction(IRCMessage *message); 87 void parseCTCPAction(IRCMessage *message);
87protected: 88protected:
88 IRCSession *m_session; 89 IRCSession *m_session;
89 /* Parser tables */ 90 /* Parser tables */
90 static IRCLiteralMessageParserStruct literalParserProcTable[]; 91 static IRCLiteralMessageParserStruct literalParserProcTable[];
91 static IRCNumericalMessageParserStruct numericalParserProcTable[]; 92 static IRCNumericalMessageParserStruct numericalParserProcTable[];
92 static IRCCTCPMessageParserStruct ctcpParserProcTable[]; 93 static IRCCTCPMessageParserStruct ctcpParserProcTable[];
93}; 94};
94 95
95#endif /* __IRCMESSAGEPARSER_H */ 96#endif /* __IRCMESSAGEPARSER_H */
diff --git a/noncore/net/opieirc/ircperson.cpp b/noncore/net/opieirc/ircperson.cpp
index bd6b8d6..bd341f1 100644
--- a/noncore/net/opieirc/ircperson.cpp
+++ b/noncore/net/opieirc/ircperson.cpp
@@ -1,41 +1,47 @@
1#include "ircperson.h" 1#include "ircperson.h"
2#include <stdio.h> 2#include <stdio.h>
3 3
4IRCPerson::IRCPerson() { 4IRCPerson::IRCPerson() {
5 m_nick = ""; 5 m_nick = "";
6 m_user = ""; 6 m_user = "";
7 m_host = ""; 7 m_host = "";
8} 8}
9 9
10IRCPerson::IRCPerson(const IRCPerson &person) {
11 m_nick = person.m_nick;
12 m_user = person.m_user;
13 m_host = person.m_host;
14}
15
10IRCPerson::IRCPerson(QString mask) { 16IRCPerson::IRCPerson(QString mask) {
11 IRCPerson(); 17 IRCPerson();
12 fromMask(mask); 18 fromMask(mask);
13} 19}
14 20
15void IRCPerson::fromMask(QString mask) { 21void IRCPerson::fromMask(QString mask) {
16 int sep1 = mask.find("!"); 22 int sep1 = mask.find("!");
17 int sep2 = mask.find("@"); 23 int sep2 = mask.find("@");
18 24
19 m_nick = mask.left(sep1); 25 m_nick = mask.left(sep1);
20 m_user = mask.mid(sep1+1, sep2-sep1-1); 26 m_user = mask.mid(sep1+1, sep2-sep1-1);
21 m_host = mask.right(mask.length()-sep2-1); 27 m_host = mask.right(mask.length()-sep2-1);
22} 28}
23 29
24QString IRCPerson::toMask() { 30QString IRCPerson::toMask() {
25 return m_nick + "!" + m_user + "@" + m_host; 31 return m_nick + "!" + m_user + "@" + m_host;
26} 32}
27 33
28void IRCPerson::setNick(QString nick) { 34void IRCPerson::setNick(QString nick) {
29 m_nick = nick; 35 m_nick = nick;
30} 36}
31 37
32void IRCPerson::setUser(QString user) { 38void IRCPerson::setUser(QString user) {
33 m_user = user; 39 m_user = user;
34} 40}
35 41
36void IRCPerson::setHost(QString host) { 42void IRCPerson::setHost(QString host) {
37 m_host = host; 43 m_host = host;
38} 44}
39 45
40QString IRCPerson::nick() { 46QString IRCPerson::nick() {
41 return m_nick; 47 return m_nick;
diff --git a/noncore/net/opieirc/ircperson.h b/noncore/net/opieirc/ircperson.h
index 850f91b..38732c4 100644
--- a/noncore/net/opieirc/ircperson.h
+++ b/noncore/net/opieirc/ircperson.h
@@ -2,49 +2,52 @@
2 OpieIRC - An embedded IRC client 2 OpieIRC - An embedded IRC client
3 Copyright (C) 2002 Wenzel Jakob 3 Copyright (C) 2002 Wenzel Jakob
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 18
19*/ 19*/
20 20
21#ifndef __IRCPERSON 21#ifndef __IRCPERSON
22#define __IRCPERSON 22#define __IRCPERSON
23 23
24#include <qstring.h> 24#include <qstring.h>
25 25
26/* This class requires all required information relating to a person 26/* This class requires all required information relating to a person
27 on the IRC network. This class can be used as an input mask for 27 on the IRC network. This class can be used as an input mask for
28 IRCMessage-prefixes too 28 IRCMessage-prefixes too
29*/ 29*/
30 30
31class IRCPerson { 31class IRCPerson {
32public: 32public:
33 IRCPerson(); 33 IRCPerson();
34 /* Create an IRCPerson from an IRC style description (nick!user@host) */
34 IRCPerson(QString mask); 35 IRCPerson(QString mask);
36 /* Copy constructor */
37 IRCPerson(const IRCPerson &person);
35 38
36 void fromMask(QString mask); 39 void fromMask(QString mask);
37 void setNick(QString name); 40 void setNick(QString name);
38 void setUser(QString user); 41 void setUser(QString user);
39 void setHost(QString host); 42 void setHost(QString host);
40 QString toMask(); 43 QString toMask();
41 QString nick(); 44 QString nick();
42 QString user(); 45 QString user();
43 QString host(); 46 QString host();
44protected: 47protected:
45 QString m_nick; 48 QString m_nick;
46 QString m_user; 49 QString m_user;
47 QString m_host; 50 QString m_host;
48}; 51};
49 52
50#endif /* __IRCPERSON */ 53#endif /* __IRCPERSON */
diff --git a/noncore/net/opieirc/ircquerytab.cpp b/noncore/net/opieirc/ircquerytab.cpp
index 6d24845..642cc5b 100644
--- a/noncore/net/opieirc/ircquerytab.cpp
+++ b/noncore/net/opieirc/ircquerytab.cpp
@@ -1,2 +1,78 @@
1#include <qhbox.h>
1#include "ircquerytab.h" 2#include "ircquerytab.h"
3#include "ircservertab.h"
4
5IRCQueryTab::IRCQueryTab(IRCPerson *person, IRCServerTab *parentTab, MainWindow *mainWindow, QWidget *parent, const char *name, WFlags f) : IRCTab(parent, name, f) {
6 m_mainWindow = mainWindow;
7 m_parentTab = parentTab;
8 m_person = new IRCPerson(*person); /* We need this (the person might sign off and the original IRCPerson gets deleted) */
9 m_description->setText(tr("Talking to ") + " <b>" + person->nick() + "</b>");
10 QHBox *hbox = new QHBox(this);
11 m_textview = new QTextView(hbox);
12 m_textview->setHScrollBarMode(QScrollView::AlwaysOff);
13 m_textview->setVScrollBarMode(QScrollView::AlwaysOn);
14 m_textview->setTextFormat(RichText);
15 m_field = new QLineEdit(this);
16 m_layout->add(hbox);
17 hbox->show();
18 m_layout->add(m_field);
19 m_field->setFocus();
20 connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand()));
21
22}
23
24void IRCQueryTab::appendText(QString text) {
25 /* not using append because it creates layout problems */
26 m_textview->setText(m_textview->text() + text);
27 m_textview->ensureVisible(0, m_textview->contentsHeight());
28}
29
30IRCQueryTab::~IRCQueryTab() {
31 m_parentTab->removeQueryTab(this);
32 delete m_person;
33}
34
35void IRCQueryTab::processCommand() {
36 QString text = m_field->text();
37 if (text.length()>0) {
38 if (session()->isSessionActive()) {
39 if (text.startsWith("/") && !text.startsWith("//")) {
40 /* Command mode */
41 m_parentTab->executeCommand(this, text);;
42 } else {
43 if (text.startsWith("//"))
44 text = text.right(text.length()-1);
45 session()->sendMessage(m_person, m_field->text());
46 appendText("&lt;<font color=\"#dd0000\">"+m_parentTab->server()->nick()+"</font>&gt; "+IRCOutput::toHTML(m_field->text())+"<br>");
47 }
48 } else {
49 appendText("<font color=\"#ff0000\">"+tr("Disconnected")+"</font><br>");
50 }
51 }
52 m_field->clear();
53}
54
55void IRCQueryTab::display(IRCOutput output) {
56 if (output.type() == OUTPUT_QUERYPRIVMSG) {
57 appendText("&lt;<font color=\"#0000dd\">"+m_person->nick()+"</font>&gt; " + output.htmlMessage() + "<br>");
58 } else if (output.type() == OUTPUT_QUERYACTION) {
59 appendText("<font color=\"#0000dd\">" + output.htmlMessage() + "<br>");
60 }
61}
62
63QString IRCQueryTab::title() {
64 return m_person->nick();
65}
66
67IRCSession *IRCQueryTab::session() {
68 return m_parentTab->session();
69}
70
71void IRCQueryTab::remove() {
72 m_mainWindow->killTab(this);
73}
74
75IRCPerson *IRCQueryTab::person() {
76 return m_person;
77}
2 78
diff --git a/noncore/net/opieirc/ircquerytab.h b/noncore/net/opieirc/ircquerytab.h
index fac976d..ea777f4 100644
--- a/noncore/net/opieirc/ircquerytab.h
+++ b/noncore/net/opieirc/ircquerytab.h
@@ -1,24 +1,51 @@
1/* 1/*
2 OpieIRC - An embedded IRC client 2 OpieIRC - An embedded IRC client
3 Copyright (C) 2002 Wenzel Jakob 3 Copyright (C) 2002 Wenzel Jakob
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 18
19*/ 19*/
20 20
21#ifndef __IRCQUERYTAB_H 21#ifndef __IRCQUERYTAB_H
22#define __IRCQUERYTAB_H 22#define __IRCQUERYTAB_H
23 23
24#include "ircsession.h"
25#include "mainwindow.h"
26
27class IRCServerTab;
28class IRCQueryTab : public IRCTab {
29 Q_OBJECT
30public:
31 /* IRCTab implementation */
32 IRCQueryTab(IRCPerson *person, IRCServerTab *parentTab, MainWindow *mainWindow, QWidget *parent = 0, const char *name = 0, WFlags f = 0);
33 ~IRCQueryTab();
34 QString title();
35 IRCSession *session();
36 IRCPerson *person();
37 void appendText(QString text);
38public slots:
39 void remove();
40 void processCommand();
41 void display(IRCOutput output);
42protected:
43 bool m_close;
44 MainWindow *m_mainWindow;
45 IRCServerTab *m_parentTab;
46 IRCPerson *m_person;
47 QTextView *m_textview;
48 QLineEdit *m_field;
49};
50
24#endif /* __IRCQUERYTAB_H */ 51#endif /* __IRCQUERYTAB_H */
diff --git a/noncore/net/opieirc/ircservertab.cpp b/noncore/net/opieirc/ircservertab.cpp
index 503a758..8b8771f 100644
--- a/noncore/net/opieirc/ircservertab.cpp
+++ b/noncore/net/opieirc/ircservertab.cpp
@@ -1,176 +1,224 @@
1#include <stdio.h> 1#include <stdio.h>
2#include <qtextstream.h> 2#include <qtextstream.h>
3#include "ircservertab.h" 3#include "ircservertab.h"
4 4
5IRCServerTab::IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *parent, const char *name, WFlags f) : IRCTab(parent, name, f) { 5IRCServerTab::IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *parent, const char *name, WFlags f) : IRCTab(parent, name, f) {
6 m_server = server; 6 m_server = server;
7 m_session = new IRCSession(&m_server); 7 m_session = new IRCSession(&m_server);
8 m_mainWindow = mainWindow; 8 m_mainWindow = mainWindow;
9 m_close = FALSE; 9 m_close = FALSE;
10 m_description->setText(tr("Connection to")+" <b>" + server.hostname() + ":" + QString::number(server.port()) + "</b>"); 10 m_description->setText(tr("Connection to")+" <b>" + server.hostname() + ":" + QString::number(server.port()) + "</b>");
11 m_textview = new QTextView(this); 11 m_textview = new QTextView(this);
12 m_textview->setHScrollBarMode(QScrollView::AlwaysOff); 12 m_textview->setHScrollBarMode(QScrollView::AlwaysOff);
13 m_textview->setVScrollBarMode(QScrollView::AlwaysOn); 13 m_textview->setVScrollBarMode(QScrollView::AlwaysOn);
14 m_textview->setTextFormat(RichText);
14 m_layout->add(m_textview); 15 m_layout->add(m_textview);
15 m_field = new QLineEdit(this); 16 m_field = new QLineEdit(this);
16 m_layout->add(m_field); 17 m_layout->add(m_field);
17 connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand())); 18 connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand()));
18 m_field->setFocus(); 19 m_field->setFocus();
19 connect(m_session, SIGNAL(outputReady(IRCOutput)), this, SLOT(display(IRCOutput))); 20 connect(m_session, SIGNAL(outputReady(IRCOutput)), this, SLOT(display(IRCOutput)));
20} 21}
21 22
22void IRCServerTab::appendText(QString text) { 23void IRCServerTab::appendText(QString text) {
23 /* not using append because it creates layout problems */ 24 /* not using append because it creates layout problems */
24 m_textview->setText(m_textview->text() + text); 25 m_textview->setText(m_textview->text() + text);
25 m_textview->ensureVisible(0, m_textview->contentsHeight()); 26 m_textview->ensureVisible(0, m_textview->contentsHeight());
26} 27}
27 28
28IRCServerTab::~IRCServerTab() { 29IRCServerTab::~IRCServerTab() {
29 delete m_session; 30 delete m_session;
30} 31}
31 32
32void IRCServerTab::removeChannelTab(IRCChannelTab *tab) { 33void IRCServerTab::removeChannelTab(IRCChannelTab *tab) {
33 m_channelTabs.remove(tab); 34 m_channelTabs.remove(tab);
34} 35}
35 36
37void IRCServerTab::removeQueryTab(IRCQueryTab *tab) {
38 m_queryTabs.remove(tab);
39}
40
36QString IRCServerTab::title() { 41QString IRCServerTab::title() {
37 return "Server"; 42 return "Server";
38} 43}
39 44
40IRCSession *IRCServerTab::session() { 45IRCSession *IRCServerTab::session() {
41 return m_session; 46 return m_session;
42} 47}
43 48
44IRCServer *IRCServerTab::server() { 49IRCServer *IRCServerTab::server() {
45 return &m_server; 50 return &m_server;
46} 51}
47 52
48void IRCServerTab::executeCommand(IRCTab *tab, QString line) { 53void IRCServerTab::executeCommand(IRCTab *tab, QString line) {
49 QTextIStream stream(&line); 54 QTextIStream stream(&line);
50 QString command; 55 QString command;
51 stream >> command; 56 stream >> command;
52 command = command.upper().right(command.length()-1); 57 command = command.upper().right(command.length()-1);
53 58
54 if (command == "JOIN") { 59 if (command == "JOIN") {
55 QString channel; 60 QString channel;
56 stream >> channel; 61 stream >> channel;
57 if (channel.length() > 0 && channel.startsWith("#")) { 62 if (channel.length() > 0 && channel.startsWith("#")) {
58 m_session->join(channel); 63 m_session->join(channel);
59 } else { 64 } else {
60 tab->appendText("<font color=\"#ff0000\">Unknown channel format!</font><br>"); 65 tab->appendText("<font color=\"#ff0000\">Unknown channel format!</font><br>");
61 } 66 }
62 } else if (command == "ME") { 67 } else if (command == "ME") {
63 QString text = IRCOutput::toHTML(line.right(line.length()-4)); 68 QString text = line.right(line.length()-4);
64 if (text.length() > 0) { 69 if (text.length() > 0) {
65 if (tab->isA("IRCChannelTab")) { 70 if (tab->isA("IRCChannelTab")) {
66 tab->appendText("<font color=\"#cc0000\">*" + m_server.nick() + " " + text + "</font><br>"); 71 tab->appendText("<font color=\"#cc0000\">*" + IRCOutput::toHTML(m_server.nick()) + " " + IRCOutput::toHTML(text) + "</font><br>");
67 m_session->sendAction(((IRCChannelTab *)tab)->channel(), text); 72 m_session->sendAction(((IRCChannelTab *)tab)->channel(), text);
68 } else if (tab->isA("IRCQueryTab")) { 73 } else if (tab->isA("IRCQueryTab")) {
74 tab->appendText("<font color=\"#cc0000\">*" + IRCOutput::toHTML(m_server.nick()) + " " + IRCOutput::toHTML(text) + "</font><br>");
75 m_session->sendAction(((IRCQueryTab *)tab)->person(), text);
69 } else { 76 } else {
70 tab->appendText("<font color=\"#ff0000\">Invalid tab for this command</font><br>"); 77 tab->appendText("<font color=\"#ff0000\">Invalid tab for this command</font><br>");
71 } 78 }
72 } 79 }
80 } else if (command == "MSG") {
81 QString nickname;
82 stream >> nickname;
83 if (nickname.length() > 0) {
84 if (line.length() > 6 + nickname.length()) {
85 QString text = line.right(line.length()-nickname.length()-6);
86 IRCPerson person;
87 person.setNick(nickname);
88 tab->appendText("&gt;<font color=\"#0000dd\">"+IRCOutput::toHTML(nickname)+"</font>&lt; "+IRCOutput::toHTML(text)+"<br>");
89 m_session->sendMessage(&person, text);
90 }
91 }
73 } else { 92 } else {
74 tab->appendText("<font color=\"#ff0000\">Unknown command</font><br>"); 93 tab->appendText("<font color=\"#ff0000\">Unknown command</font><br>");
75 } 94 }
76} 95}
77 96
78void IRCServerTab::processCommand() { 97void IRCServerTab::processCommand() {
79 QString text = m_field->text(); 98 QString text = m_field->text();
80 if (text.startsWith("/") && !text.startsWith("//")) { 99 if (text.startsWith("/") && !text.startsWith("//")) {
81 /* Command mode */ 100 /* Command mode */
82 executeCommand(this, text); 101 executeCommand(this, text);
83 } 102 }
84 m_field->clear(); 103 m_field->clear();
85} 104}
86 105
87void IRCServerTab::doConnect() { 106void IRCServerTab::doConnect() {
88 m_session->beginSession(); 107 m_session->beginSession();
89} 108}
90 109
91void IRCServerTab::remove() { 110void IRCServerTab::remove() {
92 /* Close requested */ 111 /* Close requested */
93 if (m_session->isSessionActive()) { 112 if (m_session->isSessionActive()) {
94 /* While there is a running session */ 113 /* While there is a running session */
95 m_close = TRUE; 114 m_close = TRUE;
96 m_session->endSession(); 115 m_session->endSession();
97 } else { 116 } else {
98 /* Session has previously been closed */ 117 /* Session has previously been closed */
99 m_channelTabs.first(); 118 m_channelTabs.first();
100 while (m_channelTabs.current() != 0) { 119 while (m_channelTabs.current() != 0) {
101 m_mainWindow->killTab(m_channelTabs.current()); 120 m_mainWindow->killTab(m_channelTabs.current());
102 } 121 }
122 m_queryTabs.first();
123 while (m_queryTabs.current() != 0) {
124 m_mainWindow->killTab(m_queryTabs.current());
125 }
103 m_mainWindow->killTab(this); 126 m_mainWindow->killTab(this);
104 } 127 }
105} 128}
106 129
107IRCChannelTab *IRCServerTab::getTabForChannel(IRCChannel *channel) { 130IRCChannelTab *IRCServerTab::getTabForChannel(IRCChannel *channel) {
108 QListIterator<IRCChannelTab> it(m_channelTabs); 131 QListIterator<IRCChannelTab> it(m_channelTabs);
109 132
110 for (; it.current(); ++it) { 133 for (; it.current(); ++it) {
111 if (it.current()->channel() == channel) 134 if (it.current()->channel() == channel)
112 return it.current(); 135 return it.current();
113 } 136 }
114 return 0; 137 return 0;
115} 138}
116 139
140IRCQueryTab *IRCServerTab::getTabForQuery(IRCPerson *person) {
141 QListIterator<IRCQueryTab> it(m_queryTabs);
142
143 for (; it.current(); ++it) {
144 if (it.current()->person()->nick() == person->nick())
145 return it.current();
146 }
147 return 0;
148}
149
117void IRCServerTab::display(IRCOutput output) { 150void IRCServerTab::display(IRCOutput output) {
118 151
119 /* All messages to be displayed inside the GUI get here */ 152 /* All messages to be displayed inside the GUI get here */
120 switch (output.type()) { 153 switch (output.type()) {
121 case OUTPUT_CONNCLOSE: 154 case OUTPUT_CONNCLOSE:
122 if (m_close) { 155 if (m_close) {
123 m_channelTabs.first(); 156 m_channelTabs.first();
124 while (m_channelTabs.current() != 0) { 157 while (m_channelTabs.current() != 0) {
125 m_mainWindow->killTab(m_channelTabs.current()); 158 m_mainWindow->killTab(m_channelTabs.current());
126 } 159 }
160 m_queryTabs.first();
161 while (m_queryTabs.current() != 0) {
162 m_mainWindow->killTab(m_queryTabs.current());
163 }
127 m_mainWindow->killTab(this); 164 m_mainWindow->killTab(this);
128 } else { 165 } else {
129 appendText("<font color=\"#0000dd\">" + output.htmlMessage() +"</font><br>"); 166 appendText("<font color=\"#0000dd\">" + output.htmlMessage() +"</font><br>");
130 QListIterator<IRCChannelTab> it(m_channelTabs); 167 QListIterator<IRCChannelTab> it(m_channelTabs);
131 for (; it.current(); ++it) { 168 for (; it.current(); ++it) {
132 it.current()->appendText("<font color=\"#0000dd\">" + output.htmlMessage() +"</font><br>"); 169 it.current()->appendText("<font color=\"#0000dd\">" + output.htmlMessage() +"</font><br>");
133 } 170 }
134 } 171 }
135 break; 172 break;
136 case OUTPUT_SELFJOIN: { 173 case OUTPUT_SELFJOIN: {
137 IRCChannelTab *channeltab = new IRCChannelTab((IRCChannel *)output.getParam(0), this, m_mainWindow, (QWidget *)parent()); 174 IRCChannelTab *channeltab = new IRCChannelTab((IRCChannel *)output.getParam(0), this, m_mainWindow, (QWidget *)parent());
138 m_channelTabs.append(channeltab); 175 m_channelTabs.append(channeltab);
139 m_mainWindow->addTab(channeltab); 176 m_mainWindow->addTab(channeltab);
140 } 177 }
141 break; 178 break;
142 case OUTPUT_CHANPRIVMSG: { 179 case OUTPUT_CHANPRIVMSG: {
143 IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0)); 180 IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0));
144 channelTab->appendText("&lt;<font color=\"#0000dd\">"+((IRCChannelPerson *)output.getParam(1))->person->nick()+"</font>&gt; "+output.htmlMessage()+"<br>"); 181 channelTab->appendText("&lt;<font color=\"#0000dd\">"+IRCOutput::toHTML(((IRCChannelPerson *)output.getParam(1))->person->nick())+"</font>&gt; "+output.htmlMessage()+"<br>");
182 }
183 break;
184 case OUTPUT_QUERYACTION:
185 case OUTPUT_QUERYPRIVMSG: {
186 IRCQueryTab *queryTab = getTabForQuery((IRCPerson *)output.getParam(0));
187 if (!queryTab) {
188 queryTab = new IRCQueryTab((IRCPerson *)output.getParam(0), this, m_mainWindow, (QWidget *)parent());
189 m_queryTabs.append(queryTab);
190 m_mainWindow->addTab(queryTab);
191 }
192 queryTab->display(output);
145 } 193 }
146 break; 194 break;
147 case OUTPUT_SELFPART: { 195 case OUTPUT_SELFPART: {
148 IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0)); 196 IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0));
149 if (channelTab) 197 if (channelTab)
150 m_mainWindow->killTab(channelTab); 198 m_mainWindow->killTab(channelTab);
151 } 199 }
152 break; 200 break;
153 case OUTPUT_SELFKICK: { 201 case OUTPUT_SELFKICK: {
154 appendText("<font color=\"#ff0000\">" + output.htmlMessage() + "</font><br>"); 202 appendText("<font color=\"#ff0000\">" + output.htmlMessage() + "</font><br>");
155 IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0)); 203 IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0));
156 if (channelTab) 204 if (channelTab)
157 m_mainWindow->killTab(channelTab); 205 m_mainWindow->killTab(channelTab);
158 } 206 }
159 break; 207 break;
160 case OUTPUT_CHANACTION: { 208 case OUTPUT_CHANACTION: {
161 IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0)); 209 IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0));
162 channelTab->appendText("<font color=\"#cc0000\">"+output.htmlMessage()+"</font><br>"); 210 channelTab->appendText("<font color=\"#cc0000\">"+output.htmlMessage()+"</font><br>");
163 } 211 }
164 break; 212 break;
165 case OUTPUT_QUIT: { 213 case OUTPUT_QUIT: {
166 QString nick = ((IRCPerson *)output.getParam(0))->nick(); 214 QString nick = ((IRCPerson *)output.getParam(0))->nick();
167 QListIterator<IRCChannelTab> it(m_channelTabs); 215 QListIterator<IRCChannelTab> it(m_channelTabs);
168 for (; it.current(); ++it) { 216 for (; it.current(); ++it) {
169 if (it.current()->list()->hasPerson(nick)) { 217 if (it.current()->list()->hasPerson(nick)) {
170 it.current()->appendText("<font color=\"#aa3e00\">"+output.htmlMessage()+"</font><br>"); 218 it.current()->appendText("<font color=\"#aa3e00\">"+output.htmlMessage()+"</font><br>");
171 it.current()->list()->update(); 219 it.current()->list()->update();
172 } 220 }
173 } 221 }
174 } 222 }
175 break; 223 break;
176 case OUTPUT_OTHERJOIN: 224 case OUTPUT_OTHERJOIN:
diff --git a/noncore/net/opieirc/ircservertab.h b/noncore/net/opieirc/ircservertab.h
index cfa0832..e439d84 100644
--- a/noncore/net/opieirc/ircservertab.h
+++ b/noncore/net/opieirc/ircservertab.h
@@ -1,63 +1,70 @@
1/* 1/*
2 OpieIRC - An embedded IRC client 2 OpieIRC - An embedded IRC client
3 Copyright (C) 2002 Wenzel Jakob 3 Copyright (C) 2002 Wenzel Jakob
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 18
19*/ 19*/
20 20
21#ifndef __IRCSERVERTAB_H 21#ifndef __IRCSERVERTAB_H
22#define __IRCSERVERTAB_H 22#define __IRCSERVERTAB_H
23 23
24#include "irctab.h" 24#include "irctab.h"
25#include "ircsession.h" 25#include "ircsession.h"
26#include "mainwindow.h" 26#include "mainwindow.h"
27#include "ircchanneltab.h" 27#include "ircchanneltab.h"
28#include "ircquerytab.h"
28 29
29class IRCServerTab : public IRCTab { 30class IRCServerTab : public IRCTab {
30 Q_OBJECT 31 Q_OBJECT
31public: 32public:
32 /* IRCTab implementation */ 33 /* IRCTab implementation */
33 IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *parent = 0, const char *name = 0, WFlags f = 0); 34 IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *parent = 0, const char *name = 0, WFlags f = 0);
34 ~IRCServerTab(); 35 ~IRCServerTab();
35 QString title(); 36 QString title();
36 IRCSession *session(); 37 IRCSession *session();
37 IRCServer *server(); 38 IRCServer *server();
38 39
39 /* Start the server session */ 40 /* Start the server session */
40 void doConnect(); 41 void doConnect();
42 /* Remove tabs from the internal tab lists */
41 void removeChannelTab(IRCChannelTab *tab); 43 void removeChannelTab(IRCChannelTab *tab);
44 void removeQueryTab(IRCQueryTab *tab);
42 45
43 /* Execute a user command such as /join */ 46 /* Execute a user command such as /join */
44 void executeCommand(IRCTab *tab, QString line); 47 void executeCommand(IRCTab *tab, QString line);
45protected: 48protected:
46 void appendText(QString text); 49 void appendText(QString text);
47 IRCChannelTab *getTabForChannel(IRCChannel *channel); 50 IRCChannelTab *getTabForChannel(IRCChannel *channel);
51 IRCQueryTab *getTabForQuery(IRCPerson *person);
48public slots: 52public slots:
49 void remove(); 53 void remove();
50 void processCommand(); 54 void processCommand();
51protected slots: 55protected slots:
52 void display(IRCOutput output); 56 void display(IRCOutput output);
53protected: 57protected:
54 bool m_close; 58 bool m_close;
55 IRCServer m_server; 59 IRCServer m_server;
56 IRCSession *m_session; 60 IRCSession *m_session;
57 MainWindow *m_mainWindow; 61 MainWindow *m_mainWindow;
58 QTextView *m_textview; 62 QTextView *m_textview;
59 QLineEdit *m_field; 63 QLineEdit *m_field;
64 /* Channel tabs associated with this server tab */
60 QList<IRCChannelTab> m_channelTabs; 65 QList<IRCChannelTab> m_channelTabs;
66 /* Query tabs associated with this server tab */
67 QList<IRCQueryTab> m_queryTabs;
61}; 68};
62 69
63#endif /* __IRCSERVERTAB_H */ 70#endif /* __IRCSERVERTAB_H */