-rw-r--r-- | noncore/net/opieirc/ircchanneltab.cpp | 7 | ||||
-rw-r--r-- | noncore/net/opieirc/ircmessage.cpp | 1 | ||||
-rw-r--r-- | noncore/net/opieirc/ircmessageparser.cpp | 10 | ||||
-rw-r--r-- | noncore/net/opieirc/ircmessageparser.h | 1 | ||||
-rw-r--r-- | noncore/net/opieirc/ircperson.cpp | 6 | ||||
-rw-r--r-- | noncore/net/opieirc/ircperson.h | 3 | ||||
-rw-r--r-- | noncore/net/opieirc/ircquerytab.cpp | 76 | ||||
-rw-r--r-- | noncore/net/opieirc/ircquerytab.h | 27 | ||||
-rw-r--r-- | noncore/net/opieirc/ircservertab.cpp | 54 | ||||
-rw-r--r-- | noncore/net/opieirc/ircservertab.h | 7 |
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,77 +1,76 @@ | |||
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 | ||
5 | IRCChannelTab::IRCChannelTab(IRCChannel *channel, IRCServerTab *parentTab, MainWindow *mainWindow, QWidget *parent, const char *name, WFlags f) : IRCTab(parent, name, f) { | 5 | IRCChannelTab::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 | ||
30 | void IRCChannelTab::appendText(QString text) { | 31 | void 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 | ||
36 | IRCChannelTab::~IRCChannelTab() { | 37 | IRCChannelTab::~IRCChannelTab() { |
37 | m_parentTab->removeChannelTab(this); | 38 | m_parentTab->removeChannelTab(this); |
38 | } | 39 | } |
39 | 40 | ||
40 | void IRCChannelTab::processCommand() { | 41 | void 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("<<font color=\"#dd0000\">"+m_parentTab->server()->nick()+"</font>> "+IRCOutput::toHTML(m_field->text())+"<br>"); |
52 | appendText("<<font color=\"#dd0000\">"+m_parentTab->server()->nick()+"</font>> "+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 | ||
62 | void IRCChannelTab::toggleList() { | 61 | void 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 | ||
73 | QString IRCChannelTab::title() { | 72 | QString IRCChannelTab::title() { |
74 | return m_channel->channelname(); | 73 | return m_channel->channelname(); |
75 | } | 74 | } |
76 | 75 | ||
77 | IRCSession *IRCChannelTab::session() { | 76 | IRCSession *IRCChannelTab::session() { |
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 | |||
@@ -56,49 +56,48 @@ IRCMessage::IRCMessage(QString line) { | |||
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 | ||
84 | QString IRCMessage::param(int param) { | 83 | QString IRCMessage::param(int param) { |
85 | return m_parameters[param]; | 84 | return m_parameters[param]; |
86 | } | 85 | } |
87 | 86 | ||
88 | QString IRCMessage::prefix() { | 87 | QString IRCMessage::prefix() { |
89 | return m_prefix; | 88 | return m_prefix; |
90 | } | 89 | } |
91 | 90 | ||
92 | QString IRCMessage::command() { | 91 | QString IRCMessage::command() { |
93 | return m_command; | 92 | return m_command; |
94 | } | 93 | } |
95 | 94 | ||
96 | QString IRCMessage::ctcpCommand() { | 95 | QString IRCMessage::ctcpCommand() { |
97 | return m_ctcpCommand; | 96 | return m_ctcpCommand; |
98 | } | 97 | } |
99 | 98 | ||
100 | QString IRCMessage::ctcpDestination() { | 99 | QString IRCMessage::ctcpDestination() { |
101 | return m_ctcpDestination; | 100 | return m_ctcpDestination; |
102 | } | 101 | } |
103 | 102 | ||
104 | unsigned short IRCMessage::commandNumber() { | 103 | unsigned short IRCMessage::commandNumber() { |
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 | |||
@@ -23,49 +23,51 @@ IRCLiteralMessageParserStruct IRCMessageParser::literalParserProcTable[] = { | |||
23 | IRCCTCPMessageParserStruct IRCMessageParser::ctcpParserProcTable[] = { | 23 | IRCCTCPMessageParserStruct 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 */ |
31 | IRCNumericalMessageParserStruct IRCMessageParser::numericalParserProcTable[] = { | 31 | IRCNumericalMessageParserStruct 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 | ||
52 | IRCMessageParser::IRCMessageParser(IRCSession *session) { | 54 | IRCMessageParser::IRCMessageParser(IRCSession *session) { |
53 | m_session = session; | 55 | m_session = session; |
54 | } | 56 | } |
55 | 57 | ||
56 | void IRCMessageParser::parse(IRCMessage *message) { | 58 | void 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; |
@@ -151,49 +153,49 @@ void IRCMessageParser::parseLiteralPart(IRCMessage *message) { | |||
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 | ||
165 | void IRCMessageParser::parseLiteralPrivMsg(IRCMessage *message) { | 167 | void 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 | ||
@@ -458,24 +460,28 @@ void IRCMessageParser::parseNumericalNames(IRCMessage *message) { | |||
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 | ||
463 | void IRCMessageParser::parseNumericalEndOfNames(IRCMessage *message) { | 465 | void 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 | ||
478 | void IRCMessageParser::parseNumericalNicknameInUse(IRCMessage *) { | 480 | void 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 | |||
485 | void 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 | |||
@@ -60,36 +60,37 @@ signals: | |||
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); |
62 | private: | 62 | private: |
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); |
87 | protected: | 88 | protected: |
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,33 +1,39 @@ | |||
1 | #include "ircperson.h" | 1 | #include "ircperson.h" |
2 | #include <stdio.h> | 2 | #include <stdio.h> |
3 | 3 | ||
4 | IRCPerson::IRCPerson() { | 4 | IRCPerson::IRCPerson() { |
5 | m_nick = ""; | 5 | m_nick = ""; |
6 | m_user = ""; | 6 | m_user = ""; |
7 | m_host = ""; | 7 | m_host = ""; |
8 | } | 8 | } |
9 | 9 | ||
10 | IRCPerson::IRCPerson(const IRCPerson &person) { | ||
11 | m_nick = person.m_nick; | ||
12 | m_user = person.m_user; | ||
13 | m_host = person.m_host; | ||
14 | } | ||
15 | |||
10 | IRCPerson::IRCPerson(QString mask) { | 16 | IRCPerson::IRCPerson(QString mask) { |
11 | IRCPerson(); | 17 | IRCPerson(); |
12 | fromMask(mask); | 18 | fromMask(mask); |
13 | } | 19 | } |
14 | 20 | ||
15 | void IRCPerson::fromMask(QString mask) { | 21 | void 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 | ||
24 | QString IRCPerson::toMask() { | 30 | QString IRCPerson::toMask() { |
25 | return m_nick + "!" + m_user + "@" + m_host; | 31 | return m_nick + "!" + m_user + "@" + m_host; |
26 | } | 32 | } |
27 | 33 | ||
28 | void IRCPerson::setNick(QString nick) { | 34 | void IRCPerson::setNick(QString nick) { |
29 | m_nick = nick; | 35 | m_nick = nick; |
30 | } | 36 | } |
31 | 37 | ||
32 | void IRCPerson::setUser(QString user) { | 38 | void IRCPerson::setUser(QString user) { |
33 | m_user = user; | 39 | m_user = user; |
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 | |||
@@ -10,41 +10,44 @@ | |||
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 | ||
31 | class IRCPerson { | 31 | class IRCPerson { |
32 | public: | 32 | public: |
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(); |
44 | protected: | 47 | protected: |
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 | |||
5 | IRCQueryTab::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 | |||
24 | void 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 | |||
30 | IRCQueryTab::~IRCQueryTab() { | ||
31 | m_parentTab->removeQueryTab(this); | ||
32 | delete m_person; | ||
33 | } | ||
34 | |||
35 | void 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("<<font color=\"#dd0000\">"+m_parentTab->server()->nick()+"</font>> "+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 | |||
55 | void IRCQueryTab::display(IRCOutput output) { | ||
56 | if (output.type() == OUTPUT_QUERYPRIVMSG) { | ||
57 | appendText("<<font color=\"#0000dd\">"+m_person->nick()+"</font>> " + output.htmlMessage() + "<br>"); | ||
58 | } else if (output.type() == OUTPUT_QUERYACTION) { | ||
59 | appendText("<font color=\"#0000dd\">" + output.htmlMessage() + "<br>"); | ||
60 | } | ||
61 | } | ||
62 | |||
63 | QString IRCQueryTab::title() { | ||
64 | return m_person->nick(); | ||
65 | } | ||
66 | |||
67 | IRCSession *IRCQueryTab::session() { | ||
68 | return m_parentTab->session(); | ||
69 | } | ||
70 | |||
71 | void IRCQueryTab::remove() { | ||
72 | m_mainWindow->killTab(this); | ||
73 | } | ||
74 | |||
75 | IRCPerson *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 | |||
27 | class IRCServerTab; | ||
28 | class IRCQueryTab : public IRCTab { | ||
29 | Q_OBJECT | ||
30 | public: | ||
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); | ||
38 | public slots: | ||
39 | void remove(); | ||
40 | void processCommand(); | ||
41 | void display(IRCOutput output); | ||
42 | protected: | ||
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,168 +1,216 @@ | |||
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 | ||
5 | IRCServerTab::IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *parent, const char *name, WFlags f) : IRCTab(parent, name, f) { | 5 | IRCServerTab::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 | ||
22 | void IRCServerTab::appendText(QString text) { | 23 | void 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 | ||
28 | IRCServerTab::~IRCServerTab() { | 29 | IRCServerTab::~IRCServerTab() { |
29 | delete m_session; | 30 | delete m_session; |
30 | } | 31 | } |
31 | 32 | ||
32 | void IRCServerTab::removeChannelTab(IRCChannelTab *tab) { | 33 | void IRCServerTab::removeChannelTab(IRCChannelTab *tab) { |
33 | m_channelTabs.remove(tab); | 34 | m_channelTabs.remove(tab); |
34 | } | 35 | } |
35 | 36 | ||
37 | void IRCServerTab::removeQueryTab(IRCQueryTab *tab) { | ||
38 | m_queryTabs.remove(tab); | ||
39 | } | ||
40 | |||
36 | QString IRCServerTab::title() { | 41 | QString IRCServerTab::title() { |
37 | return "Server"; | 42 | return "Server"; |
38 | } | 43 | } |
39 | 44 | ||
40 | IRCSession *IRCServerTab::session() { | 45 | IRCSession *IRCServerTab::session() { |
41 | return m_session; | 46 | return m_session; |
42 | } | 47 | } |
43 | 48 | ||
44 | IRCServer *IRCServerTab::server() { | 49 | IRCServer *IRCServerTab::server() { |
45 | return &m_server; | 50 | return &m_server; |
46 | } | 51 | } |
47 | 52 | ||
48 | void IRCServerTab::executeCommand(IRCTab *tab, QString line) { | 53 | void 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("><font color=\"#0000dd\">"+IRCOutput::toHTML(nickname)+"</font>< "+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 | ||
78 | void IRCServerTab::processCommand() { | 97 | void 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 | ||
87 | void IRCServerTab::doConnect() { | 106 | void IRCServerTab::doConnect() { |
88 | m_session->beginSession(); | 107 | m_session->beginSession(); |
89 | } | 108 | } |
90 | 109 | ||
91 | void IRCServerTab::remove() { | 110 | void 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 | ||
107 | IRCChannelTab *IRCServerTab::getTabForChannel(IRCChannel *channel) { | 130 | IRCChannelTab *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 | ||
140 | IRCQueryTab *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 | |||
117 | void IRCServerTab::display(IRCOutput output) { | 150 | void 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("<<font color=\"#0000dd\">"+((IRCChannelPerson *)output.getParam(1))->person->nick()+"</font>> "+output.htmlMessage()+"<br>"); | 181 | channelTab->appendText("<<font color=\"#0000dd\">"+IRCOutput::toHTML(((IRCChannelPerson *)output.getParam(1))->person->nick())+"</font>> "+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) { |
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 | |||
@@ -4,60 +4,67 @@ | |||
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 | ||
29 | class IRCServerTab : public IRCTab { | 30 | class IRCServerTab : public IRCTab { |
30 | Q_OBJECT | 31 | Q_OBJECT |
31 | public: | 32 | public: |
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); |
45 | protected: | 48 | protected: |
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); | ||
48 | public slots: | 52 | public slots: |
49 | void remove(); | 53 | void remove(); |
50 | void processCommand(); | 54 | void processCommand(); |
51 | protected slots: | 55 | protected slots: |
52 | void display(IRCOutput output); | 56 | void display(IRCOutput output); |
53 | protected: | 57 | protected: |
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 */ |