Implementing ctcp level quoting and ctcp low level quoting. This fixes a crucial...
authorMarcus Eggenberger <egs@quassel-irc.org>
Sat, 25 Oct 2008 14:39:07 +0000 (16:39 +0200)
committerMarcus Eggenberger <egs@quassel-irc.org>
Sat, 25 Oct 2008 14:39:07 +0000 (16:39 +0200)
src/core/ctcphandler.cpp
src/core/ctcphandler.h

index 420693a..ec21f4c 100644 (file)
@@ -40,7 +40,17 @@ CtcpHandler::CtcpHandler(NetworkConnection *parent)
   ctcpXDelimDequoteHash[XQUOTE + QByteArray("a")] = XDELIM;
 }
 
   ctcpXDelimDequoteHash[XQUOTE + QByteArray("a")] = XDELIM;
 }
 
-QByteArray CtcpHandler::dequote(const QByteArray &message) {
+QByteArray CtcpHandler::lowLevelQuote(const QByteArray &message) {
+  QByteArray quotedMessage = message;
+  QHash<QByteArray, QByteArray>::const_iterator quoteIter = ctcpMDequoteHash.constBegin();
+  while(quoteIter != ctcpMDequoteHash.constEnd()) {
+    quotedMessage.replace(quoteIter.value(), quoteIter.key());
+    quoteIter++;
+  }
+  return quotedMessage;
+}
+
+QByteArray CtcpHandler::lowLevelDequote(const QByteArray &message) {
   QByteArray dequotedMessage;
   QByteArray messagepart;
   QHash<QByteArray, QByteArray>::iterator ctcpquote;
   QByteArray dequotedMessage;
   QByteArray messagepart;
   QHash<QByteArray, QByteArray>::iterator ctcpquote;
@@ -62,6 +72,15 @@ QByteArray CtcpHandler::dequote(const QByteArray &message) {
   return dequotedMessage;
 }
 
   return dequotedMessage;
 }
 
+QByteArray CtcpHandler::xdelimQuote(const QByteArray &message) {
+  QByteArray quotedMessage = message;
+  QHash<QByteArray, QByteArray>::const_iterator quoteIter = ctcpXDelimDequoteHash.constBegin();
+  while(quoteIter != ctcpXDelimDequoteHash.constEnd()) {
+    quotedMessage.replace(quoteIter.value(), quoteIter.key());
+    quoteIter++;
+  }
+  return quotedMessage;
+}
 
 QByteArray CtcpHandler::xdelimDequote(const QByteArray &message) {
   QByteArray dequotedMessage;
 
 QByteArray CtcpHandler::xdelimDequote(const QByteArray &message) {
   QByteArray dequotedMessage;
@@ -88,7 +107,7 @@ void CtcpHandler::parse(Message::Type messageType, const QString &prefix, const
   QByteArray ctcp;
 
   //lowlevel message dequote
   QByteArray ctcp;
 
   //lowlevel message dequote
-  QByteArray dequotedMessage = dequote(message);
+  QByteArray dequotedMessage = lowLevelDequote(message);
 
   CtcpType ctcptype = messageType == Message::Notice
     ? CtcpReply
 
   CtcpType ctcptype = messageType == Message::Notice
     ? CtcpReply
@@ -135,19 +154,18 @@ void CtcpHandler::parse(Message::Type messageType, const QString &prefix, const
 }
 
 QByteArray CtcpHandler::pack(const QByteArray &ctcpTag, const QByteArray &message) {
 }
 
 QByteArray CtcpHandler::pack(const QByteArray &ctcpTag, const QByteArray &message) {
-  return XDELIM + ctcpTag + ' ' + message + XDELIM;
+  return XDELIM + ctcpTag + ' ' + xdelimQuote(message) + XDELIM;
 }
 
 }
 
-// TODO handle encodings correctly!
 void CtcpHandler::query(const QString &bufname, const QString &ctcpTag, const QString &message) {
   QList<QByteArray> params;
 void CtcpHandler::query(const QString &bufname, const QString &ctcpTag, const QString &message) {
   QList<QByteArray> params;
-  params << serverEncode(bufname) << pack(serverEncode(ctcpTag), userEncode(bufname, message));
+  params << serverEncode(bufname) << lowLevelQuote(pack(serverEncode(ctcpTag), userEncode(bufname, message)));
   emit putCmd("PRIVMSG", params);
 }
 
 void CtcpHandler::reply(const QString &bufname, const QString &ctcpTag, const QString &message) {
   QList<QByteArray> params;
   emit putCmd("PRIVMSG", params);
 }
 
 void CtcpHandler::reply(const QString &bufname, const QString &ctcpTag, const QString &message) {
   QList<QByteArray> params;
-  params << serverEncode(bufname) << pack(serverEncode(ctcpTag), userEncode(bufname, message));
+  params << serverEncode(bufname) << lowLevelQuote(pack(serverEncode(ctcpTag), userEncode(bufname, message)));
   emit putCmd("NOTICE", params);
 }
 
   emit putCmd("NOTICE", params);
 }
 
index aa42bf9..cac2f56 100644 (file)
@@ -36,7 +36,9 @@ public:
 
   void parse(Message::Type, const QString &prefix, const QString &target, const QByteArray &message);
 
 
   void parse(Message::Type, const QString &prefix, const QString &target, const QByteArray &message);
 
-  QByteArray dequote(const QByteArray &);
+  QByteArray lowLevelQuote(const QByteArray &);
+  QByteArray lowLevelDequote(const QByteArray &);
+  QByteArray xdelimQuote(const QByteArray &);
   QByteArray xdelimDequote(const QByteArray &);
 
   QByteArray pack(const QByteArray &ctcpTag, const QByteArray &message);
   QByteArray xdelimDequote(const QByteArray &);
 
   QByteArray pack(const QByteArray &ctcpTag, const QByteArray &message);