/***************************************************************************
- * 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 *
#include "coresession.h"
#include "ctcpevent.h"
#include "messageevent.h"
+#include "coreuserinputhandler.h"
const QByteArray XDELIM = "\001";
_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)
{
{
QList<QByteArray> 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));
}