-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 | |||
@@ -15,4 +15,5 @@ IRCChannelTab::IRCChannelTab(IRCChannel *channel, IRCServerTab *parentTab, MainW | |||
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); |
@@ -48,8 +49,6 @@ void IRCChannelTab::processCommand() { | |||
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 { |
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 | |||
@@ -78,5 +78,4 @@ IRCMessage::IRCMessage(QString line) { | |||
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 | } |
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 | |||
@@ -45,5 +45,7 @@ IRCNumericalMessageParserStruct IRCMessageParser::numericalParserProcTable[] = { | |||
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 } |
@@ -173,5 +175,5 @@ void IRCMessageParser::parseLiteralPrivMsg(IRCMessage *message) { | |||
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); |
@@ -480,2 +482,6 @@ void IRCMessageParser::parseNumericalNicknameInUse(IRCMessage *) { | |||
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 | |||
@@ -82,4 +82,5 @@ private: | |||
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); |
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 | |||
@@ -8,4 +8,10 @@ IRCPerson::IRCPerson() { | |||
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(); |
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 | |||
@@ -32,5 +32,8 @@ 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); |
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 | |||
@@ -22,3 +22,30 @@ | |||
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 | |||
@@ -12,4 +12,5 @@ IRCServerTab::IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *pa | |||
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); |
@@ -34,4 +35,8 @@ void IRCServerTab::removeChannelTab(IRCChannelTab *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"; |
@@ -61,14 +66,28 @@ void IRCServerTab::executeCommand(IRCTab *tab, QString line) { | |||
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>"); |
@@ -101,4 +120,8 @@ void IRCServerTab::remove() { | |||
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 | } |
@@ -115,4 +138,14 @@ IRCChannelTab *IRCServerTab::getTabForChannel(IRCChannel *channel) { | |||
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 | ||
@@ -125,4 +158,8 @@ void IRCServerTab::display(IRCOutput output) { | |||
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 { |
@@ -142,5 +179,16 @@ void IRCServerTab::display(IRCOutput output) { | |||
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; |
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 | |||
@@ -26,4 +26,5 @@ | |||
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 { |
@@ -39,5 +40,7 @@ public: | |||
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 */ |
@@ -46,4 +49,5 @@ 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(); |
@@ -58,5 +62,8 @@ protected: | |||
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 | ||