X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Futil.h;h=bbe89f512b24ad80cb833e84e229b1adf8c2924a;hp=0179723344055936d6e99e16eb1c4be0614b7a78;hb=cc6e7c08709c4e761e2fd9c2e322751015497003;hpb=a762b470185f27dbca6d75e58a29e3a055b2969c diff --git a/src/common/util.h b/src/common/util.h index 01797233..bbe89f51 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -1,11 +1,11 @@ /*************************************************************************** - * Copyright (C) 2005/06 by The Quassel Team * + * Copyright (C) 2005-2019 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * + * (at your option) version 3. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * @@ -15,46 +15,117 @@ * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ -#ifndef _UTIL_H_ -#define _UTIL_H_ +#pragma once -#include -#include +#include "common-export.h" + +#include #include +#include + +COMMON_EXPORT QString nickFromMask(const QString& mask); +COMMON_EXPORT QString userFromMask(const QString& mask); +COMMON_EXPORT QString hostFromMask(const QString& mask); +COMMON_EXPORT bool isChannelName(const QString& str); -QString nickFromMask(QString mask); -QString userFromMask(QString mask); -QString hostFromMask(QString mask); +//! Strip mIRC format codes +COMMON_EXPORT QString stripFormatCodes(QString); + +//! Remove accelerator markers (&) from the string +COMMON_EXPORT QString stripAcceleratorMarkers(const QString&); + +COMMON_EXPORT QString secondsToString(int timeInSeconds); //! Take a string and decode it using the specified text codec, recognizing utf8. /** This function takes a string and first checks if it is encoded in utf8, in which case it is * decoded appropriately. Otherwise, the specified text codec is used to transform the string. * \param input The input string containing encoded data - * \param encoding The text encoding we assume if it's not utf8 + * \param codec The text codec we use if the input is not utf8 * \return The decoded string. */ -QString decodeString(QByteArray input, QString encoding = "ISO-8859-15"); +COMMON_EXPORT QString decodeString(const QByteArray& input, QTextCodec* codec = nullptr); + +COMMON_EXPORT uint editingDistance(const QString& s1, const QString& s2); + +template +QVariantList toVariantList(const QList& list) +{ + QVariantList variants; + for (int i = 0; i < list.count(); i++) { + variants << QVariant::fromValue(list[i]); + } + return variants; +} -bool isChannelName(QString str); +template +QList fromVariantList(const QVariantList& variants) +{ + QList list; + for (int i = 0; i < variants.count(); i++) { + list << variants[i].value(); + } + return list; +} + +COMMON_EXPORT QByteArray prettyDigest(const QByteArray& digest); /** - * Writes a QVariant to a device. The data item is prefixed with the resulting blocksize, - * so the corresponding function readDataFromDevice() can check if enough data is available - * at the device to reread the item. + * Format a string with %%%% to current date/timestamp via QDateTime. + * + * @param[in] formatStr String with format codes + * @return String with current date/time substituted in via formatting codes */ -void writeDataToDevice(QIODevice *, const QVariant &); +COMMON_EXPORT QString formatCurrentDateTimeInString(const QString& formatStr); -/** Reads a data item from a device that has previously been written by writeDataToDevice(). - * If not enough data bytes are available, the function returns false and the QVariant reference - * remains untouched. +/** + * Try to localize a given date/time in seconds from Unix epoch, pass through string if invalid + * + * Allows compatibility with date/time fields that may or may not be in Unix epoch format, + * localizing if possible, leaving alone if not. + * + * @param possibleEpochDate Date/time that might be in seconds since Unix epoch format + * @param dateFormat Desired format of the date/time string + * @param useUTC If true, use UTC timezone, otherwise use local time + * @return Localized date/time if parse succeeded, otherwise the source string */ -bool readDataFromDevice(QIODevice *, quint32 &, QVariant &); +COMMON_EXPORT QString tryFormatUnixEpoch(const QString& possibleEpochDate, + Qt::DateFormat dateFormat = Qt::DateFormat::TextDate, + bool useUTC = false); +/** + * Format the given date/time in ISO 8601 format with timezone offset + * + * @param dateTime Date/time of interest + * @return Date/time in ISO 8601 format with timezone offset + */ +COMMON_EXPORT QString formatDateTimeToOffsetISO(const QDateTime& dateTime); -uint editingDistance(const QString &s1, const QString &s2); +namespace detail { +template +struct SelectOverloadHelper +{ + template + constexpr auto operator()(R (C::*func)(Args...)) const noexcept -> decltype(func) + { + return func; + } +}; -#endif +} // namespace detail + +/** + * Helper for resolving ambiguous overloads when using the member function-based connect syntax. + * + * Example usage: + * @code + * connect(this, selectOverload(&MyClass::mySignal), other, &Other::mySlot); + * @endcode + * + * @tparam Args Argument types of the desired signature + */ +template +constexpr Q_DECL_UNUSED detail::SelectOverloadHelper selectOverload = {};