* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
-
-#include "util.h"
-#include "global.h"
#include "server.h"
-#include "message.h"
#include <QMetaObject>
+#include <QMetaMethod>
#include <QDateTime>
+#include "util.h"
+#include "core.h"
+#include "coresession.h"
+
Server::Server(UserId uid, QString net) : user(uid), network(net) {
QString MQUOTE = QString('\020');
ctcpMDequoteHash[MQUOTE + '0'] = QString('\000');
QString XQUOTE = QString('\134');
ctcpXDelimDequoteHash[XQUOTE + XQUOTE] = XQUOTE;
ctcpXDelimDequoteHash[XQUOTE + QString('a')] = XDELIM;
+
+ serverinfo = new ServerInfo();
}
Server::~Server() {
-
+ delete serverinfo;
}
void Server::run() {
}
void Server::sendState() {
- VarMap s;
- VarMap n, t;
+ QVariantMap s;
+ QVariantMap n, t;
foreach(QString key, nicks.keys()) { n[key] = nicks[key]; }
foreach(QString key, topics.keys()) { t[key] = topics[key];}
s["Nicks"] = n;
void Server::connectToIrc(QString net) {
if(net != network) return; // not me!
- networkSettings = Global::data(user, "Networks").toMap()[net].toMap();
- identity = Global::data(user, "Identities").toMap()[networkSettings["Identity"].toString()].toMap();
+ CoreSession *sess = Core::session(user);
+ //networkSettings = Global::data(user, "Networks").toMap()[net].toMap();
+ networkSettings = sess->retrieveSessionData("Networks").toMap()[net].toMap();
+ //identity = Global::data(user, "Identities").toMap()[networkSettings["Identity"].toString()].toMap();
+ identity = sess->retrieveSessionData("Identities").toMap()[networkSettings["Identity"].toString()].toMap();
QList<QVariant> servers = networkSettings["Servers"].toList();
QString host = servers[0].toMap()["Address"].toString();
quint16 port = servers[0].toMap()["Port"].toUInt();
void Server::socketHasData() {
while(socket.canReadLine()) {
- QString s = socket.readLine().trimmed();
+ QByteArray s = socket.readLine().trimmed();
//qDebug() << "Read" << s;
- emit recvRawServerMsg(s);
+ //emit recvRawServerMsg(s); // signal not needed, and we should make sure we consider encodings where we need them
//Message *msg = Message::createFromServerString(this, s);
handleServerMsg(s);
}
QString host = hostFromMask(mask);
QString nick = nickFromMask(mask);
if(nicks.contains(nick) && !user.isEmpty() && !host.isEmpty()) {
- VarMap n = nicks[nick];
+ QVariantMap n = nicks[nick];
if(n["User"].toString() != user || n["Host"].toString() != host) {
if(!n["User"].toString().isEmpty() || !n["Host"].toString().isEmpty())
qWarning(QString("Strange: Hostmask for nick %1 has changed!").arg(nick).toAscii());
socket.write(m.toAscii());
}
-/** Handle a raw message string sent by the server. We try to find a suitable handler, otherwise we call a default handler. */
-void Server::handleServerMsg(QString msg) {
+/*! Handle a raw message string sent by the server. We try to find a suitable handler, otherwise we call a default handler. */
+void Server::handleServerMsg(QByteArray rawmsg) {
try {
- if(msg.isEmpty()) {
+ if(rawmsg.isEmpty()) {
qWarning() << "Received empty string from server!";
return;
}
+ // TODO Implement encoding conversion
+ /* At this point, we have a raw message as a byte array. This needs to be converted to a QString somewhere.
+ * Problem is, that at this point we don't know which encoding to use for the various parts of the message.
+ * This is something the command handler needs to take care of (e.g. PRIVMSG needs to first parse for CTCP,
+ * and then convert the raw strings into the correct encoding.
+ * We _can_ safely assume Server encoding for prefix and cmd, but not for the params. Therefore, we need to
+ * change from a QStringList to a QList<QByteArray> in all the handlers, and have the handlers call decodeString
+ * where needed...
+ */
+ QString msg = QString::fromLatin1(rawmsg);
+
// OK, first we split the raw message into its various parts...
QString prefix = "";
QString cmd;
topics[params[0]] = "";
emit topicSet(network, params[0], "");
} //else {
- VarMap n;
+ QVariantMap n;
if(nicks.contains(nick)) {
n = nicks[nick];
- VarMap chans = n["Channels"].toMap();
+ QVariantMap chans = n["Channels"].toMap();
// Q_ASSERT(!chans.keys().contains(params[0])); TODO uncomment
- chans[params[0]] = VarMap();
+ chans[params[0]] = QVariantMap();
n["Channels"] = chans;
- nicks[nick] = n;
+ nicks[nick] = n; qDebug() << network << nick << n;
emit nickUpdated(network, nick, n);
} else {
- VarMap chans;
- chans[params[0]] = VarMap();
+ QVariantMap chans;
+ chans[params[0]] = QVariantMap();
n["Channels"] = chans;
n["User"] = userFromMask(prefix);
n["Host"] = hostFromMask(prefix);
QString kicker = updateNickFromMask(prefix);
QString nick = params[1];
Q_ASSERT(nicks.contains(nick));
- VarMap n = nicks[nick];
- VarMap chans = n["Channels"].toMap();
+ QVariantMap n = nicks[nick];
+ QVariantMap chans = n["Channels"].toMap();
Q_ASSERT(chans.contains(params[0]));
chans.remove(params[0]);
QString msg = nick;
Q_ASSERT(params.count() > m);
QString nick = params[p++];
if(nicks.contains(nick)) { // sometimes, a server might try to set a MODE on a nick that is no longer there
- VarMap n = nicks[nick]; VarMap clist = n["Channels"].toMap(); VarMap chan = clist[params[0]].toMap();
+ QVariantMap n = nicks[nick]; QVariantMap clist = n["Channels"].toMap(); QVariantMap chan = clist[params[0]].toMap();
QString mstr = chan["Mode"].toString();
add ? mstr += modes[m] : mstr.remove(modes[m]);
chan["Mode"] = mstr; clist[params[0]] = chan; n["Channels"] = clist; nicks[nick] = n;
emit displayMsg(Message::Mode, params[0], params.join(" "), prefix);
} else {
//Q_ASSERT(nicks.contains(params[0]));
- //VarMap n = nicks[params[0]].toMap();
+ //QVariantMap n = nicks[params[0]].toMap();
//QString mode = n["Mode"].toString();
emit displayMsg(Message::Mode, "", params.join(" "));
}
void Server::handleServerNick(QString prefix, QStringList params) {
QString oldnick = updateNickFromMask(prefix);
QString newnick = params[0];
- VarMap v = nicks.take(oldnick);
+ QVariantMap v = nicks.take(oldnick);
nicks[newnick] = v;
- VarMap chans = v["Channels"].toMap();
+ QVariantMap chans = v["Channels"].toMap();
foreach(QString c, chans.keys()) {
if(oldnick != ownNick) { emit displayMsg(Message::Nick, c, newnick, prefix); }
else { emit displayMsg(Message::Nick, c, newnick, newnick); }
void Server::handleServerPart(QString prefix, QStringList params) {
QString nick = updateNickFromMask(prefix);
Q_ASSERT(nicks.contains(nick));
- VarMap n = nicks[nick];
- VarMap chans = n["Channels"].toMap();
+ QVariantMap n = nicks[nick];
+ QVariantMap chans = n["Channels"].toMap();
Q_ASSERT(chans.contains(params[0]));
chans.remove(params[0]);
QString msg;
void Server::handleServerQuit(QString prefix, QStringList params) {
QString nick = updateNickFromMask(prefix);
Q_ASSERT(nicks.contains(nick));
- VarMap chans = nicks[nick]["Channels"].toMap();
+ QVariantMap chans = nicks[nick]["Channels"].toMap();
QString msg;
if(params.count()) msg = params[0];
foreach(QString c, chans.keys()) {
// there should be only one param: "Welcome to the Internet Relay Network <nick>!<user>@<host>"
currentServer = prefix;
ownNick = params[0].section(' ', -1, -1).section('!', 0, 0);
- VarMap n;
- n["Channels"] = VarMap();
+ QVariantMap n;
+ n["Channels"] = QVariantMap();
nicks[ownNick] = n;
emit ownNickSet(network, ownNick);
- emit nickAdded(network, ownNick, VarMap());
+ emit nickAdded(network, ownNick, QVariantMap());
emit displayMsg(Message::Server, "", params[0], prefix);
// send performlist
QStringList performList = networkSettings["Perform"].toString().split( "\n" );
serverSupports[key] = val;
// handle some special cases
if(key == "PREFIX") {
- VarMap foo; QString modes, prefixes;
+ QVariantMap foo; QString modes, prefixes;
Q_ASSERT(val.contains(')') && val.startsWith('('));
int m = 1, p;
for(p = 2; p < val.length(); p++) if(val[p] == ')') break;
if(prefixes[i] == nick[0]) { mode = serverSupports["PrefixModes"].toString()[i]; break; }
nick.remove(0,1);
}
- VarMap c; c["Mode"] = mode; c["Prefix"] = pfx;
+ QVariantMap c; c["Mode"] = mode; c["Prefix"] = pfx;
if(nicks.contains(nick)) {
- VarMap n = nicks[nick];
- VarMap chans = n["Channels"].toMap();
+ QVariantMap n = nicks[nick];
+ QVariantMap chans = n["Channels"].toMap();
chans[buf] = c;
n["Channels"] = chans;
nicks[nick] = n;
emit nickUpdated(network, nick, n);
} else {
- VarMap n; VarMap c; VarMap chans;
+ QVariantMap n; QVariantMap c; QVariantMap chans;
c["Mode"] = mode;
chans[buf] = c;
n["Channels"] = chans;