/***************************************************************************
- * Copyright (C) 2005-2020 by the Quassel Project *
+ * Copyright (C) 2005-2022 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
result.append(*it);
}
escaped = false;
- } else if (it->unicode() == '\\') {
+ }
+ else if (it->unicode() == '\\') {
escaped = true;
- } else {
+ }
+ else {
result.append(*it);
}
}
return result;
}
-/**
- * Extracts a space-delimited fragment from an IRC message
- * @param raw Raw Message
- * @param start Current index into the message, will be advanced automatically
- * @param end End of fragment, if already known. Default is -1, in which case it will be set to the next whitespace
- * character or the end of the string
- * @param prefix Required prefix. Default is 0. If set, this only parses a fragment if it starts with the given prefix.
- * @return Fragment
- */
-QByteArray extractFragment(const QByteArray& raw, int& start, int end = -1, char prefix = 0)
+QByteArray IrcDecoder::extractFragment(const QByteArray& raw, int& start, int end, char prefix)
{
// Try to set find the end of the space-delimited fragment
if (end == -1) {
return fragment;
}
-/**
- * Skips empty parts in the message
- * @param raw Raw Message
- * @param start Current index into the message, will be advanced automatically
- */
-void skipEmptyParts(const QByteArray& raw, int& start)
+void IrcDecoder::skipEmptyParts(const QByteArray& raw, int& start)
{
while (start < raw.length() && raw[start] == ' ') {
start++;
if (key.clientTag) {
rawKey.remove(0, 1);
}
- QList<QString> splitByVendorAndKey = rawKey.split('/');
- if (!splitByVendorAndKey.isEmpty()) key.key = splitByVendorAndKey.takeLast();
- if (!splitByVendorAndKey.isEmpty()) key.vendor = splitByVendorAndKey.takeLast();
+
+ int splitIndex = rawKey.lastIndexOf('/');
+ if (splitIndex > 0 && splitIndex + 1 < rawKey.length()) {
+ key.key = rawKey.mid(splitIndex + 1);
+ key.vendor = rawKey.left(splitIndex);
+ }
+ else {
+ key.key = rawKey;
+ }
tags[key] = parseTagValue(rawValue);
}
return tags;
}
}
-void IrcDecoder::parseMessage(const std::function<QString(const QByteArray&)>& decode, const QByteArray& rawMsg, QHash<IrcTagKey, QString>& tags, QString& prefix, QString& command, QList<QByteArray>& parameters)
+void IrcDecoder::parseMessage(const std::function<QString(const QByteArray&)>& decode,
+ const QByteArray& rawMsg,
+ QHash<IrcTagKey, QString>& tags,
+ QString& prefix,
+ QString& command,
+ QList<QByteArray>& parameters)
{
int start = 0;
skipEmptyParts(rawMsg, start);
QByteArray param = parseParameter(rawMsg, start);
skipEmptyParts(rawMsg, start);
params.append(param);
-
}
parameters = params;
}