X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fcore%2Fctcpparser.cpp;h=fba3d13e9a61dfb463b40c6f16879188b90ed698;hb=446caa053a85a00ef1f2ed393b5a0da761d6f2d1;hp=ee300df8c5638ec2fb842de7f6056aac70d10f04;hpb=a272baf28f926a9e66be767936dd38b6b4aa94da;p=quassel.git diff --git a/src/core/ctcpparser.cpp b/src/core/ctcpparser.cpp index ee300df8..fba3d13e 100644 --- a/src/core/ctcpparser.cpp +++ b/src/core/ctcpparser.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2013 by the Quassel Project * + * Copyright (C) 2005-2015 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -24,6 +24,7 @@ #include "coresession.h" #include "ctcpevent.h" #include "messageevent.h" +#include "coreuserinputhandler.h" const QByteArray XDELIM = "\001"; @@ -37,14 +38,24 @@ CtcpParser::CtcpParser(CoreSession *coreSession, QObject *parent) _ctcpMDequoteHash[MQUOTE + 'r'] = QByteArray(1, '\r'); _ctcpMDequoteHash[MQUOTE + MQUOTE] = MQUOTE; - QByteArray XQUOTE = QByteArray("\134"); - _ctcpXDelimDequoteHash[XQUOTE + XQUOTE] = XQUOTE; - _ctcpXDelimDequoteHash[XQUOTE + QByteArray("a")] = XDELIM; + setStandardCtcp(_coreSession->networkConfig()->standardCtcp()); + connect(_coreSession->networkConfig(), SIGNAL(standardCtcpSet(bool)), this, SLOT(setStandardCtcp(bool))); connect(this, SIGNAL(newEvent(Event *)), _coreSession->eventManager(), SLOT(postEvent(Event *))); } +void CtcpParser::setStandardCtcp(bool enabled) +{ + QByteArray XQUOTE = QByteArray("\134"); + if (enabled) + _ctcpXDelimDequoteHash[XQUOTE + XQUOTE] = XQUOTE; + else + _ctcpXDelimDequoteHash.remove(XQUOTE + XQUOTE); + _ctcpXDelimDequoteHash[XQUOTE + QByteArray("a")] = XDELIM; +} + + void CtcpParser::displayMsg(NetworkEvent *event, Message::Type msgType, const QString &msg, const QString &sender, const QString &target, Message::Flags msgFlags) { @@ -303,7 +314,27 @@ void CtcpParser::query(CoreNetwork *net, const QString &bufname, const QString & { QList params; params << net->serverEncode(bufname) << lowLevelQuote(pack(net->serverEncode(ctcpTag), net->userEncode(bufname, message))); + + static const char *splitter = " .,-!?"; + int maxSplitPos = message.count(); + int splitPos = maxSplitPos; + + int overrun = net->userInputHandler()->lastParamOverrun("PRIVMSG", params); + if (overrun) { + maxSplitPos = message.count() - overrun -2; + splitPos = -1; + for (const char *splitChar = splitter; *splitChar != 0; splitChar++) { + splitPos = qMax(splitPos, message.lastIndexOf(*splitChar, maxSplitPos) + 1); // keep split char on old line + } + if (splitPos <= 0 || splitPos > maxSplitPos) + splitPos = maxSplitPos; + + params = params.mid(0, 1) << lowLevelQuote(pack(net->serverEncode(ctcpTag), net->userEncode(bufname, message.left(splitPos)))); + } net->putCmd("PRIVMSG", params); + + if (splitPos < message.count()) + query(net, bufname, ctcpTag, message.mid(splitPos)); }