Encodings are now honored for both sending and receiving. Cleaned up encode/decode
authorManuel Nickschas <sputnick@quassel-irc.org>
Wed, 13 Feb 2008 02:46:51 +0000 (02:46 +0000)
committerManuel Nickschas <sputnick@quassel-irc.org>
Wed, 13 Feb 2008 02:46:51 +0000 (02:46 +0000)
stuff in the handlers and switched putCmd() et. al. to accepting (encoded) QByteArray only instead
of QString.
Also fixed notices being shown in a separate buffer upon reconnect, and the kick message problem (BR #99).
Oh, and the default kick reason defined in your identity is used if appropriate now.

src/common/network.cpp
src/core/basichandler.cpp
src/core/basichandler.h
src/core/ctcphandler.cpp
src/core/ircserverhandler.cpp
src/core/ircserverhandler.h
src/core/networkconnection.cpp
src/core/networkconnection.h
src/core/userinputhandler.cpp
src/qtui/settingspages/networkssettingspage.ui

index c62d446..be61b57 100644 (file)
@@ -456,8 +456,10 @@ void Network::setCurrentServer(const QString &currentServer) {
 
 void Network::setConnected(bool connected) {
   _connected = connected;
-  if(!connected)
+  if(!connected) {
     removeChansAndUsers();
+    setCurrentServer(QString());
+  }
   emit connectedSet(connected);
 }
 
index 3c98151..3820578 100644 (file)
 
 BasicHandler::BasicHandler(NetworkConnection *parent)
   : QObject(parent),
-    server(parent),
     defaultHandler(-1),
+    _networkConnection(parent),
     initDone(false)
 {
   connect(this, SIGNAL(displayMsg(Message::Type, BufferInfo::Type, QString, QString, QString, quint8)),
-         server, SIGNAL(displayMsg(Message::Type, BufferInfo::Type, QString, QString, QString, quint8)));
+         networkConnection(), SIGNAL(displayMsg(Message::Type, BufferInfo::Type, QString, QString, QString, quint8)));
 
-  connect(this, SIGNAL(putCmd(QString, QStringList, QString)),
-         server, SLOT(putCmd(QString, QStringList, QString)));
+  connect(this, SIGNAL(putCmd(QString, const QVariantList &, const QByteArray &)),
+         networkConnection(), SLOT(putCmd(QString, const QVariantList &, const QByteArray &)));
 
-  connect(this, SIGNAL(putRawLine(QString)),
-         server, SLOT(putRawLine(QString)));
+  connect(this, SIGNAL(putRawLine(const QByteArray &)),
+          networkConnection(), SLOT(putRawLine(const QByteArray &)));
 }
 
 QStringList BasicHandler::providesHandlers() {
@@ -92,11 +92,78 @@ void BasicHandler::handle(const QString &member, QGenericArgument val0,
   qt_metacall(QMetaObject::InvokeMetaMethod, handlerHash()[handler], param);
 }
 
+QString BasicHandler::serverDecode(const QByteArray &string) {
+  return networkConnection()->serverDecode(string);
+}
+
+QStringList BasicHandler::serverDecode(const QList<QByteArray> &stringlist) {
+  QStringList list;
+  foreach(QByteArray s, stringlist) list << networkConnection()->serverDecode(s);
+  return list;
+}
+
+QString BasicHandler::bufferDecode(const QString &bufferName, const QByteArray &string) {
+  return networkConnection()->bufferDecode(bufferName, string);
+}
+
+QStringList BasicHandler::bufferDecode(const QString &bufferName, const QList<QByteArray> &stringlist) {
+  QStringList list;
+  foreach(QByteArray s, stringlist) list << networkConnection()->bufferDecode(bufferName, s);
+  return list;
+}
+
+QString BasicHandler::userDecode(const QString &userNick, const QByteArray &string) {
+  return networkConnection()->userDecode(userNick, string);
+}
+
+QStringList BasicHandler::userDecode(const QString &userNick, const QList<QByteArray> &stringlist) {
+  QStringList list;
+  foreach(QByteArray s, stringlist) list << networkConnection()->userDecode(userNick, s);
+  return list;
+}
+
+/*** ***/
+
+QByteArray BasicHandler::serverEncode(const QString &string) {
+  return networkConnection()->serverEncode(string);
+}
+
+QList<QByteArray> BasicHandler::serverEncode(const QStringList &stringlist) {
+  QList<QByteArray> list;
+  foreach(QString s, stringlist) list << networkConnection()->serverEncode(s);
+  return list;
+}
+
+QByteArray BasicHandler::bufferEncode(const QString &bufferName, const QString &string) {
+  return networkConnection()->bufferEncode(bufferName, string);
+}
+
+QList<QByteArray> BasicHandler::bufferEncode(const QString &bufferName, const QStringList &stringlist) {
+  QList<QByteArray> list;
+  foreach(QString s, stringlist) list << networkConnection()->bufferEncode(bufferName, s);
+  return list;
+}
+
+QByteArray BasicHandler::userEncode(const QString &userNick, const QString &string) {
+  return networkConnection()->userEncode(userNick, string);
+}
+
+QList<QByteArray> BasicHandler::userEncode(const QString &userNick, const QStringList &stringlist) {
+  QList<QByteArray> list;
+  foreach(QString s, stringlist) list << networkConnection()->userEncode(userNick, s);
+  return list;
+}
+
 // ====================
 //  protected:
 // ====================
+
 Network *BasicHandler::network() const {
-  return server->network();
+  return networkConnection()->network();
+}
+
+NetworkConnection *BasicHandler::networkConnection() const {
+  return _networkConnection;
 }
 
 BufferInfo::Type BasicHandler::typeByTarget(const QString &target) const {
@@ -108,3 +175,15 @@ BufferInfo::Type BasicHandler::typeByTarget(const QString &target) const {
 
   return BufferInfo::QueryBuffer;
 }
+
+void BasicHandler::putCmd(const QString &cmd, const QByteArray &param, const QByteArray &prefix) {
+  QVariantList list;
+  list << param;
+  emit putCmd(cmd, list, prefix);
+}
+
+void BasicHandler::putCmd(const QString &cmd, const QList<QByteArray> &params, const QByteArray &prefix) {
+  QVariantList list;
+  foreach(QByteArray param, params) list << param;
+  emit putCmd(cmd, list, prefix);
+}
index e8f6798..a520087 100644 (file)
@@ -40,27 +40,45 @@ public:
 
   QStringList providesHandlers();
 
+  QString serverDecode(const QByteArray &string);
+  QStringList serverDecode(const QList<QByteArray> &stringlist);
+  QString bufferDecode(const QString &bufferName, const QByteArray &string);
+  QStringList bufferDecode(const QString &bufferName, const QList<QByteArray> &stringlist);
+  QString userDecode(const QString &userNick, const QByteArray &string);
+  QStringList userDecode(const QString &userNick, const QList<QByteArray> &stringlist);
+
+  QByteArray serverEncode(const QString &string);
+  QList<QByteArray> serverEncode(const QStringList &stringlist);
+  QByteArray bufferEncode(const QString &bufferName, const QString &string);
+  QList<QByteArray> bufferEncode(const QString &bufferName, const QStringList &stringlist);
+  QByteArray userEncode(const QString &userNick, const QString &string);
+  QList<QByteArray> userEncode(const QString &userNick, const QStringList &stringlist);
+
 signals:
   void displayMsg(Message::Type, BufferInfo::Type, QString target, QString text, QString sender = "", quint8 flags = Message::None);
-  void putCmd(QString cmd, QStringList params, QString prefix = 0);
-  void putRawLine(QString msg);
-  
+  void putCmd(const QString &cmd, const QVariantList &params, const QByteArray &prefix);
+  void putRawLine(const QByteArray &msg);
+
 protected:
+  void putCmd(const QString &cmd, const QByteArray &param, const QByteArray &prefix = QByteArray());
+  void putCmd(const QString &cmd, const QList<QByteArray> &params, const QByteArray &prefix = QByteArray());
+
   virtual void handle(const QString &member, QGenericArgument val0 = QGenericArgument(0),
-                     QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(),
-                     QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(),
-                     QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(),
-                     QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument());
-           
-  NetworkConnection *server;
+                      QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(),
+                      QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(),
+                      QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(),
+                      QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument());
+
 
-  Network *network() const;
+  Network * network() const;
+  NetworkConnection * networkConnection() const;
   BufferInfo::Type typeByTarget(const QString &target) const;
 
 private:
   const QHash<QString, int> &handlerHash();
   QHash<QString, int> _handlerHash;
   int defaultHandler;
+  NetworkConnection *_networkConnection;
   bool initDone;
 };
 #endif
index e7f1e30..1e5254d 100644 (file)
@@ -119,16 +119,17 @@ QString CtcpHandler::pack(QString ctcpTag, QString message) {
   return XDELIM + ctcpTag + ' ' + message + XDELIM;
 }
 
+// TODO handle encodings correctly!
 void CtcpHandler::query(QString bufname, QString ctcpTag, QString message) {
   QStringList params;
   params << bufname << pack(ctcpTag, message);
-  emit putCmd("PRIVMSG", params); 
+  emit putCmd("PRIVMSG", serverEncode(params));
 }
 
 void CtcpHandler::reply(QString bufname, QString ctcpTag, QString message) {
   QStringList params;
   params << bufname << pack(ctcpTag, message);
-  emit putCmd("NOTICE", params);
+  emit putCmd("NOTICE", serverEncode(params));
 }
 
 //******************************/
index 87bc7e5..4b848bd 100644 (file)
 
 #include <QDebug>
 
-IrcServerHandler::IrcServerHandler(NetworkConnection *parent)
-  : BasicHandler(parent),
-    networkConnection(parent) {
-      _whois = false;
+IrcServerHandler::IrcServerHandler(NetworkConnection *parent) : BasicHandler(parent) {
+  _whois = false;
 }
 
 IrcServerHandler::~IrcServerHandler() {
 
 }
 
-QString IrcServerHandler::serverDecode(const QByteArray &string) {
-  return networkConnection->serverDecode(string);
-}
-
-QStringList IrcServerHandler::serverDecode(const QList<QByteArray> &stringlist) {
-  QStringList list;
-  foreach(QByteArray s, stringlist) list << networkConnection->serverDecode(s);
-  return list;
-}
-
-QString IrcServerHandler::bufferDecode(const QString &bufferName, const QByteArray &string) {
-  return networkConnection->bufferDecode(bufferName, string);
-}
-
-QStringList IrcServerHandler::bufferDecode(const QString &bufferName, const QList<QByteArray> &stringlist) {
-  QStringList list;
-  foreach(QByteArray s, stringlist) list << networkConnection->bufferDecode(bufferName, s);
-  return list;
-}
-
-QString IrcServerHandler::userDecode(const QString &userNick, const QByteArray &string) {
-  return networkConnection->userDecode(userNick, string);
-}
-
-QStringList IrcServerHandler::userDecode(const QString &userNick, const QList<QByteArray> &stringlist) {
-  QStringList list;
-  foreach(QByteArray s, stringlist) list << networkConnection->userDecode(userNick, s);
-  return list;
-}
-
 /*! Handle a raw message string sent by the server. We try to find a suitable handler, otherwise we call a default handler. */
 void IrcServerHandler::handleServerMsg(QByteArray msg) {
   try {
@@ -285,7 +253,7 @@ void IrcServerHandler::handleNick(QString prefix, QList<QByteArray> params) {
 
 void IrcServerHandler::handleNotice(QString prefix, QList<QByteArray> params) {
   if(params.count() < 2) {
-    qWarning() << "IrcServerHandler::handleNotice(): not enoug Parameters:" << prefix << serverDecode(params);
+    qWarning() << "IrcServerHandler::handleNotice(): not enough Parameters:" << prefix << serverDecode(params);
     return;
   }
 
@@ -305,7 +273,7 @@ void IrcServerHandler::handleNotice(QString prefix, QList<QByteArray> params) {
     ? nickFromMask(prefix)
     : prefix;
 
-  networkConnection->ctcpHandler()->parse(Message::Notice, sender, target, userDecode(prefix, params[1]));
+  networkConnection()->ctcpHandler()->parse(Message::Notice, sender, target, userDecode(prefix, params[1]));
 }
 
 void IrcServerHandler::handlePart(QString prefix, QList<QByteArray> params) {
@@ -324,7 +292,7 @@ void IrcServerHandler::handlePart(QString prefix, QList<QByteArray> params) {
 
 void IrcServerHandler::handlePing(QString prefix, QList<QByteArray> params) {
   Q_UNUSED(prefix);
-  emit putCmd("PONG", serverDecode(params));
+  putCmd("PONG", params);
 }
 
 void IrcServerHandler::handlePrivmsg(QString prefix, QList<QByteArray> params) {
@@ -341,7 +309,7 @@ void IrcServerHandler::handlePrivmsg(QString prefix, QList<QByteArray> params) {
 
   // it's possible to pack multiple privmsgs into one param using ctcp
   // - > we let the ctcpHandler do the work
-  networkConnection->ctcpHandler()->parse(Message::Plain, prefix, target, userDecode(ircuser->nick(), params[1]));
+  networkConnection()->ctcpHandler()->parse(Message::Plain, prefix, target, userDecode(ircuser->nick(), params[1]));
 }
 
 void IrcServerHandler::handleQuit(QString prefix, QList<QByteArray> params) {
@@ -621,17 +589,17 @@ void IrcServerHandler::handle433(QString prefix, QList<QByteArray> params) {
 
   // if there is a problem while connecting to the server -> we handle it
   // but only if our connection has not been finished yet...
-  if(!networkConnection->network()->currentServer().isEmpty())
+  if(!network()->currentServer().isEmpty())
     return;
 
   tryNextNick(errnick);
 }
 
 void IrcServerHandler::tryNextNick(const QString &errnick) {
-  QStringList desiredNicks = networkConnection->coreSession()->identity(networkConnection->network()->identity())->nicks();
+  QStringList desiredNicks = networkConnection()->coreSession()->identity(network()->identity())->nicks();
   int nextNick = desiredNicks.indexOf(errnick) + 1;
   if(desiredNicks.size() > nextNick) {
-    putCmd("NICK", QStringList(desiredNicks[nextNick]));
+    putCmd("NICK", serverEncode(desiredNicks[nextNick]));
   } else {
     emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("No free and valid nicks in nicklist found. use: /nick <othernick> to continue"));
   }
index ec9f201..ace85f6 100644 (file)
@@ -32,14 +32,6 @@ public:
 
   void handleServerMsg(QByteArray rawMsg);
 
-  QString serverDecode(const QByteArray &string);
-  QStringList serverDecode(const QList<QByteArray> &stringlist);
-  QString bufferDecode(const QString &bufferName, const QByteArray &string);
-  QStringList bufferDecode(const QString &bufferName, const QList<QByteArray> &stringlist);
-  QString userDecode(const QString &userNick, const QByteArray &string);
-  QStringList userDecode(const QString &userNick, const QList<QByteArray> &stringlist);
-
-
 public slots:
   void handleJoin(QString, QList<QByteArray>);
   void handleKick(QString, QList<QByteArray>);
@@ -77,7 +69,6 @@ public slots:
 private:
   void tryNextNick(const QString &errnick);
   bool _whois;
-  NetworkConnection *networkConnection;
 };
 
 
index 912c2c0..ed1a72b 100644 (file)
@@ -44,7 +44,7 @@ NetworkConnection::NetworkConnection(Network *network, CoreSession *session, con
     _ctcpHandler(new CtcpHandler(this)),
     _previousState(state)
 {
-  connect(network, SIGNAL(currentServerSet(const QString &)), this, SLOT(networkInitialized()));
+  connect(network, SIGNAL(currentServerSet(const QString &)), this, SLOT(networkInitialized(const QString &)));
 
   connect(&socket, SIGNAL(connected()), this, SLOT(socketConnected()));
   connect(&socket, SIGNAL(disconnected()), this, SLOT(socketDisconnected()));
@@ -84,6 +84,10 @@ QString NetworkConnection::networkName() const {
   return network()->networkName();
 }
 
+Identity *NetworkConnection::identity() const {
+  return coreSession()->identity(network()->identity());
+}
+
 Network *NetworkConnection::network() const {
   return _network;
 }
@@ -155,15 +159,18 @@ void NetworkConnection::connectToIrc() {
   socket.connectToHost(host, port);
 }
 
-void NetworkConnection::networkInitialized() {
+void NetworkConnection::networkInitialized(const QString &currentServer) {
+  if(currentServer.isEmpty()) return;
+
   sendPerform();
 
     // rejoin channels we've been in
   QStringList chans = _previousState.toStringList();
   if(chans.count() > 0) {
     qDebug() << "autojoining" << chans;
-    QString list = chans.join(",");
-    putCmd("join", QStringList(list));  // FIXME check for 512 byte limit!
+    QVariantList list;
+    foreach(QString chan, chans) list << serverEncode(chan);
+    putCmd("JOIN", list);  // FIXME check for 512 byte limit!
   }
   // delete _previousState, we won't need it again
   _previousState = QVariant();
@@ -217,8 +224,8 @@ void NetworkConnection::socketConnected() {
     disconnectFromIrc();
     return;
   }
-  putRawLine(QString("NICK :%1").arg(identity->nicks()[0]));  // FIXME: try more nicks if error occurs
-  putRawLine(QString("USER %1 8 * :%2").arg(identity->ident(), identity->realName()));
+  putRawLine(serverEncode(QString("NICK :%1").arg(identity->nicks()[0])));  // FIXME: try more nicks if error occurs
+  putRawLine(serverEncode(QString("USER %1 8 * :%2").arg(identity->ident(), identity->realName())));
 }
 
 void NetworkConnection::socketStateChanged(QAbstractSocket::SocketState socketState) {
@@ -253,22 +260,22 @@ void NetworkConnection::userInput(BufferInfo buf, QString msg) {
   userInputHandler()->handleUserInput(buf, msg);
 }
 
-void NetworkConnection::putRawLine(QString s) {
+void NetworkConnection::putRawLine(QByteArray s) {
   s += "\r\n";
-  socket.write(s.toAscii());
+  socket.write(s);
 }
 
-void NetworkConnection::putCmd(QString cmd, QStringList params, QString prefix) {
-  QString msg;
+void NetworkConnection::putCmd(const QString &cmd, const QVariantList &params, const QByteArray &prefix) {
+  QByteArray msg;
   if(!prefix.isEmpty())
     msg += ":" + prefix + " ";
-  msg += cmd.toUpper();
-  
+  msg += cmd.toUpper().toAscii();
+
   for(int i = 0; i < params.size() - 1; i++) {
-    msg += " " + params[i];
+    msg += " " + params[i].toByteArray();
   }
   if(!params.isEmpty())
-    msg += " :" + params.last();
+    msg += " :" + params.last().toByteArray();
 
   putRawLine(msg);
 }
index c5694ca..a7aa1fd 100644 (file)
@@ -27,6 +27,7 @@
 #include <QTcpSocket>
 #include <QTimer>
 
+#include "identity.h"
 #include "message.h"
 #include "network.h"
 #include "signalproxy.h"
@@ -48,6 +49,7 @@ public:
   NetworkId networkId() const;
   QString networkName() const;
   Network *network() const;
+  Identity *identity() const;
   CoreSession *coreSession() const;
 
   bool isConnected() const;
@@ -84,8 +86,8 @@ public slots:
   void disconnectFromIrc();
   void userInput(BufferInfo bufferInfo, QString msg);
 
-  void putRawLine(QString input);
-  void putCmd(QString cmd, QStringList params, QString prefix = 0);
+  void putRawLine(QByteArray input);
+  void putCmd(const QString &cmd, const QVariantList &params, const QByteArray &prefix = QByteArray());
 
 
 private slots:
@@ -113,7 +115,7 @@ private slots:
   void socketDisconnected();
   void socketStateChanged(QAbstractSocket::SocketState);
   void setConnectionState(Network::ConnectionState);
-  void networkInitialized();
+  void networkInitialized(const QString &currentServer);
 
 private:
   QTcpSocket socket;
@@ -126,9 +128,6 @@ private:
   UserInputHandler *_userInputHandler;
   CtcpHandler *_ctcpHandler;
 
-  QVariantMap networkSettings;
-  QVariantMap identity;
-
   QVariant _previousState;
 
   class ParseError : public Exception {
index f4aa87c..a431f3d 100644 (file)
@@ -27,8 +27,7 @@
 
 #include <QDebug>
 
-UserInputHandler::UserInputHandler(NetworkConnection *parent)
-  : BasicHandler(parent) {
+UserInputHandler::UserInputHandler(NetworkConnection *parent) : BasicHandler(parent) {
 }
 
 void UserInputHandler::handleUserInput(const BufferInfo &bufferInfo, const QString &msg_) {
@@ -55,7 +54,7 @@ void UserInputHandler::handleUserInput(const BufferInfo &bufferInfo, const QStri
 
 void UserInputHandler::handleAway(const BufferInfo &bufferInfo, const QString &msg) {
   Q_UNUSED(bufferInfo)
-  emit putCmd("AWAY", QStringList(msg));
+  putCmd("AWAY", serverEncode(msg));
 }
 
 void UserInputHandler::handleBan(const BufferInfo &bufferInfo, const QString &msg) {
@@ -64,7 +63,7 @@ void UserInputHandler::handleBan(const BufferInfo &bufferInfo, const QString &ms
   
   //TODO: find suitable default hostmask if msg gives only nickname 
   // Example: MODE &oulu +b *!*@*
-  QStringList banMsg(bufferInfo.bufferName()+" +b "+msg);
+  QByteArray banMsg = serverEncode(bufferInfo.bufferName()) + " +b " + bufferEncode(bufferInfo.bufferName(), msg);
   emit putCmd("MODE", banMsg);
 }
 
@@ -74,14 +73,14 @@ void UserInputHandler::handleCtcp(const BufferInfo &bufferInfo, const QString &m
   QString ctcpTag = msg.section(' ', 1, 1).toUpper();
   if (ctcpTag.isEmpty()) return;
   QString message = "";
-  QString verboseMessage = tr("sending CTCP-%1-request").arg(ctcpTag);
+  QString verboseMessage = tr("sending CTCP-%1 request").arg(ctcpTag);
 
   if(ctcpTag == "PING") {
     uint now = QDateTime::currentDateTime().toTime_t();
     message = QString::number(now);
   }
 
-  server->ctcpHandler()->query(nick, ctcpTag, message);
+  networkConnection()->ctcpHandler()->query(nick, ctcpTag, message);
   emit displayMsg(Message::Action, BufferInfo::StatusBuffer, "", verboseMessage, network()->myNick());
 }
 
@@ -90,7 +89,7 @@ void UserInputHandler::handleDeop(const BufferInfo &bufferInfo, const QString &m
   QString m = "-"; for(int i = 0; i < nicks.count(); i++) m += 'o';
   QStringList params;
   params << bufferInfo.bufferName() << m << nicks;
-  emit putCmd("MODE", params);
+  emit putCmd("MODE", serverEncode(params));
 }
 
 void UserInputHandler::handleDevoice(const BufferInfo &bufferInfo, const QString &msg) {
@@ -98,13 +97,13 @@ void UserInputHandler::handleDevoice(const BufferInfo &bufferInfo, const QString
   QString m = "-"; for(int i = 0; i < nicks.count(); i++) m += 'v';
   QStringList params;
   params << bufferInfo.bufferName() << m << nicks;
-  emit putCmd("MODE", params);
+  emit putCmd("MODE", serverEncode(params));
 }
 
 void UserInputHandler::handleInvite(const BufferInfo &bufferInfo, const QString &msg) {
   QStringList params;
   params << msg << bufferInfo.bufferName();
-  emit putCmd("INVITE", params);
+  emit putCmd("INVITE", serverEncode(params));
 }
 
 void UserInputHandler::handleJ(const BufferInfo &bufferInfo, const QString &msg) {
@@ -113,46 +112,51 @@ void UserInputHandler::handleJ(const BufferInfo &bufferInfo, const QString &msg)
   if(params.size() > 0 && !params[0].startsWith("#")) {
     params[0] = QString("#%1").arg(params[0]);
   }
-  emit putCmd("JOIN", params);
+  emit putCmd("JOIN", serverEncode(params));
 }
 
 void UserInputHandler::handleJoin(const BufferInfo &bufferInfo, const QString &msg) {
   Q_UNUSED(bufferInfo)
-  emit putCmd("JOIN", msg.split(" "));
+  QStringList params = msg.split(" ");
+  emit putCmd("JOIN", serverEncode(params));
 }
 
 void UserInputHandler::handleKick(const BufferInfo &bufferInfo, const QString &msg) {
-  QStringList params;
-  params << bufferInfo.bufferName() << msg.split(' ', QString::SkipEmptyParts);
+  QString nick = msg.section(' ', 0, 0, QString::SectionSkipEmpty);
+  QString reason = msg.section(' ', 1, -1, QString::SectionSkipEmpty).trimmed();
+  if(reason.isEmpty()) reason = networkConnection()->identity()->kickReason();
+  QList<QByteArray> params;
+  params << serverEncode(bufferInfo.bufferName()) << serverEncode(nick) << bufferEncode(bufferInfo.bufferName(), reason);
   emit putCmd("KICK", params);
 }
 
 void UserInputHandler::handleList(const BufferInfo &bufferInfo, const QString &msg) {
   Q_UNUSED(bufferInfo)
-  emit putCmd("LIST", msg.split(' ', QString::SkipEmptyParts));
+  emit putCmd("LIST", serverEncode(msg.split(' ', QString::SkipEmptyParts)));
 }
 
 
 void UserInputHandler::handleMe(const BufferInfo &bufferInfo, const QString &msg) {
   if(bufferInfo.bufferName().isEmpty()) return; // server buffer
-  server->ctcpHandler()->query(bufferInfo.bufferName(), "ACTION", msg);
+  networkConnection()->ctcpHandler()->query(bufferInfo.bufferName(), "ACTION", bufferEncode(bufferInfo.bufferName(), msg));
   emit displayMsg(Message::Action, bufferInfo.type(), bufferInfo.bufferName(), msg, network()->myNick());
 }
 
 void UserInputHandler::handleMode(const BufferInfo &bufferInfo, const QString &msg) {
   Q_UNUSED(bufferInfo)
-  emit putCmd("MODE", msg.split(' ', QString::SkipEmptyParts));
+  // TODO handle correct encoding for buffer modes (bufferEncode())
+  emit putCmd("MODE", serverEncode(msg.split(' ', QString::SkipEmptyParts)));
 }
 
 // TODO: show privmsgs
 void UserInputHandler::handleMsg(const BufferInfo &bufferInfo, const QString &msg) {
-  Q_UNUSED(bufferInfo)
+  Q_UNUSED(bufferInfo);
   if(!msg.contains(' '))
     return;
-      
-  QStringList params;
-  params << msg.section(' ', 0, 0);
-  params << msg.section(' ', 1);
+
+  QList<QByteArray> params;
+  params << serverEncode(msg.section(' ', 0, 0));
+  params << userEncode(params[0], msg.section(' ', 1));
 
   emit putCmd("PRIVMSG", params);
 }
@@ -160,7 +164,7 @@ void UserInputHandler::handleMsg(const BufferInfo &bufferInfo, const QString &ms
 void UserInputHandler::handleNick(const BufferInfo &bufferInfo, const QString &msg) {
   Q_UNUSED(bufferInfo)
   QString nick = msg.section(' ', 0, 0);
-  emit putCmd("NICK", QStringList(nick));
+  emit putCmd("NICK", serverEncode(nick));
 }
 
 void UserInputHandler::handleOp(const BufferInfo &bufferInfo, const QString &msg) {
@@ -168,12 +172,12 @@ void UserInputHandler::handleOp(const BufferInfo &bufferInfo, const QString &msg
   QString m = "+"; for(int i = 0; i < nicks.count(); i++) m += 'o';
   QStringList params;
   params << bufferInfo.bufferName() << m << nicks;
-  emit putCmd("MODE", params);
+  emit putCmd("MODE", serverEncode(params));
 }
 
 void UserInputHandler::handlePart(const BufferInfo &bufferInfo, const QString &msg) {
-  QStringList params;
-  params << bufferInfo.bufferName() << msg;
+  QList<QByteArray> params;
+  params << serverEncode(bufferInfo.bufferName()) << bufferEncode(bufferInfo.bufferName(), msg);
   emit putCmd("PART", params);
 }
 
@@ -191,26 +195,26 @@ void UserInputHandler::handleQuery(const BufferInfo &bufferInfo, const QString &
 
 void UserInputHandler::handleQuit(const BufferInfo &bufferInfo, const QString &msg) {
   Q_UNUSED(bufferInfo)
-  emit putCmd("QUIT", QStringList(msg));
+  emit putCmd("QUIT", serverEncode(msg));
 }
 
 void UserInputHandler::handleQuote(const BufferInfo &bufferInfo, const QString &msg) {
   Q_UNUSED(bufferInfo)
-  emit putRawLine(msg);
+  emit putRawLine(serverEncode(msg));
 }
 
 void UserInputHandler::handleSay(const BufferInfo &bufferInfo, const QString &msg) {
   if(bufferInfo.bufferName().isEmpty()) return;  // server buffer
-  QStringList params;
-  params << bufferInfo.bufferName() << msg;
+  QList<QByteArray> params;
+  params << serverEncode(bufferInfo.bufferName()) << bufferEncode(bufferInfo.bufferName(), msg);
   emit putCmd("PRIVMSG", params);
-  emit displayMsg(Message::Plain, bufferInfo.type(), params[0], msg, network()->myNick(), Message::Self);
+  emit displayMsg(Message::Plain, bufferInfo.type(), bufferInfo.bufferName(), msg, network()->myNick(), Message::Self);
 }
 
 void UserInputHandler::handleTopic(const BufferInfo &bufferInfo, const QString &msg) {
   if(bufferInfo.bufferName().isEmpty()) return;
-  QStringList params;
-  params << bufferInfo.bufferName() << msg;
+  QList<QByteArray> params;
+  params << serverEncode(bufferInfo.bufferName()) << bufferEncode(bufferInfo.bufferName(), msg);
   emit putCmd("TOPIC", params);
 }
 
@@ -219,22 +223,22 @@ void UserInputHandler::handleVoice(const BufferInfo &bufferInfo, const QString &
   QString m = "+"; for(int i = 0; i < nicks.count(); i++) m += 'v';
   QStringList params;
   params << bufferInfo.bufferName() << m << nicks;
-  emit putCmd("MODE", params);
+  emit putCmd("MODE", serverEncode(params));
 }
 
 void UserInputHandler::handleWho(const BufferInfo &bufferInfo, const QString &msg) {
   Q_UNUSED(bufferInfo)
-  emit putCmd("WHO", msg.split(' '));
+  emit putCmd("WHO", serverEncode(msg.split(' ')));
 }
 
 void UserInputHandler::handleWhois(const BufferInfo &bufferInfo, const QString &msg) {
   Q_UNUSED(bufferInfo)
-  emit putCmd("WHOIS", msg.split(' '));
+  emit putCmd("WHOIS", serverEncode(msg.split(' ')));
 }
 
 void UserInputHandler::handleWhowas(const BufferInfo &bufferInfo, const QString &msg) {
   Q_UNUSED(bufferInfo)
-  emit putCmd("WHOWAS", msg.split(' '));
+  emit putCmd("WHOWAS", serverEncode(msg.split(' ')));
 }
 
 void UserInputHandler::defaultHandler(QString cmd, const BufferInfo &bufferInfo, const QString &msg) {
index c28c852..f473012 100644 (file)
                       <bool>true</bool>
                      </property>
                      <property name="echoMode" >
-                      <enum>QLineEdit::PasswordEchoOnEdit</enum>
+                      <enum>QLineEdit::Password</enum>
                      </property>
                     </widget>
                    </item>