X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fctcphandler.cpp;h=5442206b9fae8ca905d00277334e93174e5d8a27;hp=a864fe6494d4e4675a5bfc5c618db6c086bbb3aa;hb=dc2aa39d20b60e7cd8e0ba66ca6c9ed729add008;hpb=c8f0fad36b10552494f8ec3c3a45b52a3f0d2663 diff --git a/src/core/ctcphandler.cpp b/src/core/ctcphandler.cpp index a864fe64..5442206b 100644 --- a/src/core/ctcphandler.cpp +++ b/src/core/ctcphandler.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel Project * + * Copyright (C) 2005-09 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -19,20 +19,20 @@ ***************************************************************************/ #include "ctcphandler.h" -#include "global.h" -#include "util.h" #include "message.h" #include "network.h" +#include "quassel.h" +#include "util.h" -CtcpHandler::CtcpHandler(NetworkConnection *parent) +CtcpHandler::CtcpHandler(CoreNetwork *parent) : BasicHandler(parent), XDELIM("\001") { QByteArray MQUOTE = QByteArray("\020"); - ctcpMDequoteHash[MQUOTE + '0'] = QByteArray("\000"); - ctcpMDequoteHash[MQUOTE + 'n'] = QByteArray("\n"); - ctcpMDequoteHash[MQUOTE + 'r'] = QByteArray("\r"); + ctcpMDequoteHash[MQUOTE + '0'] = QByteArray(1, '\000'); + ctcpMDequoteHash[MQUOTE + 'n'] = QByteArray(1, '\n'); + ctcpMDequoteHash[MQUOTE + 'r'] = QByteArray(1, '\r'); ctcpMDequoteHash[MQUOTE + MQUOTE] = MQUOTE; QByteArray XQUOTE = QByteArray("\134"); @@ -40,11 +40,27 @@ CtcpHandler::CtcpHandler(NetworkConnection *parent) ctcpXDelimDequoteHash[XQUOTE + QByteArray("a")] = XDELIM; } -QByteArray CtcpHandler::dequote(const QByteArray &message) { +QByteArray CtcpHandler::lowLevelQuote(const QByteArray &message) { + QByteArray quotedMessage = message; + + QHash quoteHash = ctcpMDequoteHash; + QByteArray MQUOTE = QByteArray("\020"); + quoteHash.remove(MQUOTE + MQUOTE); + quotedMessage.replace(MQUOTE, MQUOTE + MQUOTE); + + QHash::const_iterator quoteIter = quoteHash.constBegin(); + while(quoteIter != quoteHash.constEnd()) { + quotedMessage.replace(quoteIter.value(), quoteIter.key()); + quoteIter++; + } + return quotedMessage; +} + +QByteArray CtcpHandler::lowLevelDequote(const QByteArray &message) { QByteArray dequotedMessage; QByteArray messagepart; QHash::iterator ctcpquote; - + // copy dequote Message for(int i = 0; i < message.size(); i++) { messagepart = message.mid(i,1); @@ -62,6 +78,15 @@ QByteArray CtcpHandler::dequote(const QByteArray &message) { return dequotedMessage; } +QByteArray CtcpHandler::xdelimQuote(const QByteArray &message) { + QByteArray quotedMessage = message; + QHash::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; @@ -86,14 +111,14 @@ QByteArray CtcpHandler::xdelimDequote(const QByteArray &message) { void CtcpHandler::parse(Message::Type messageType, const QString &prefix, const QString &target, const QByteArray &message) { QByteArray ctcp; - + //lowlevel message dequote - QByteArray dequotedMessage = dequote(message); + QByteArray dequotedMessage = lowLevelDequote(message); CtcpType ctcptype = messageType == Message::Notice ? CtcpReply : CtcpQuery; - + Message::Flags flags = (messageType == Message::Notice && !network()->isChannelName(target)) ? Message::Redirected : Message::None; @@ -129,25 +154,24 @@ void CtcpHandler::parse(Message::Type messageType, const QString &prefix, const handle(ctcpcmd, Q_ARG(CtcpType, ctcptype), Q_ARG(QString, prefix), Q_ARG(QString, target), Q_ARG(QString, ctcpparam)); } - + if(!dequotedMessage.isEmpty()) displayMsg(messageType, target, userDecode(target, dequotedMessage), prefix, flags); } 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 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 params; - params << serverEncode(bufname) << pack(serverEncode(ctcpTag), userEncode(bufname, message)); + params << serverEncode(bufname) << lowLevelQuote(pack(serverEncode(ctcpTag), userEncode(bufname, message))); emit putCmd("NOTICE", params); } @@ -176,7 +200,8 @@ void CtcpHandler::handleVersion(CtcpType ctcptype, const QString &prefix, const Q_UNUSED(target) if(ctcptype == CtcpQuery) { reply(nickFromMask(prefix), "VERSION", QString("Quassel IRC %1 (built on %2) -- http://www.quassel-irc.org") - .arg(Global::quasselVersion).arg(Global::quasselBuildDate)); + .arg(Quassel::buildInfo().plainVersionString) + .arg(Quassel::buildInfo().buildDate)); emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Received CTCP VERSION request by %1").arg(prefix)); } else { // display Version answer