X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fidentity.cpp;h=9d885e0e79ded3c2aea524b7fd2cb31aa8838233;hp=c2fdeaf52ba174d00f7b034323f9716e099b31cb;hb=8582c2ad5708a1972c85bea1cf8d81ad3ece4814;hpb=21d8d7f0a79eeeb541664aa80ce481fdbfc41f09 diff --git a/src/common/identity.cpp b/src/common/identity.cpp index c2fdeaf5..9d885e0e 100644 --- a/src/common/identity.cpp +++ b/src/common/identity.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel Project * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -15,354 +15,376 @@ * 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. * ***************************************************************************/ +#include "identity.h" + #include #include +#include + +#ifdef Q_OS_MAC +# include +# include "mac_utils.h" +#endif + +#ifdef Q_OS_UNIX +# include +# include +# include +#endif + +#ifdef Q_OS_WIN +# include +# include +# define SECURITY_WIN32 +# include +#endif + +Identity::Identity(IdentityId id, QObject *parent) + : SyncableObject(parent), + _identityId(id) +{ + init(); + setToDefaults(); +} + + +Identity::Identity(const Identity &other, QObject *parent) + : SyncableObject(parent), + _identityId(other.id()), + _identityName(other.identityName()), + _realName(other.realName()), + _nicks(other.nicks()), + _awayNick(other.awayNick()), + _awayNickEnabled(other.awayNickEnabled()), + _awayReason(other.awayReason()), + _awayReasonEnabled(other.awayReasonEnabled()), + _autoAwayEnabled(other.autoAwayEnabled()), + _autoAwayTime(other.autoAwayTime()), + _autoAwayReason(other.autoAwayReason()), + _autoAwayReasonEnabled(other.autoAwayReasonEnabled()), + _detachAwayEnabled(other.detachAwayEnabled()), + _detachAwayReason(other.detachAwayReason()), + _detachAwayReasonEnabled(other.detachAwayReasonEnabled()), + _ident(other.ident()), + _kickReason(other.kickReason()), + _partReason(other.partReason()), + _quitReason(other.quitReason()) +{ + init(); +} -#include "identity.h" -Identity::Identity(IdentityId id, QObject *parent) : QObject(parent), _identityId(id) { - init(); - setToDefaults(); +#ifdef Q_OS_WIN +#ifdef UNICODE +QString tcharToQString(TCHAR *tchar) +{ + return QString::fromUtf16(reinterpret_cast(tchar)); } -Identity::Identity(const Identity &other, QObject *parent) : QObject(parent), - _identityId(other.id()), - _identityName(other.identityName()), - _realName(other.realName()), - _nicks(other.nicks()), - _awayNick(other.awayNick()), - _awayNickEnabled(other.awayNickEnabled()), - _awayReason(other.awayReason()), - _awayReasonEnabled(other.awayReasonEnabled()), - _returnMessage(other.returnMessage()), - _returnMessageEnabled(other.returnMessageEnabled()), - _autoAwayEnabled(other.autoAwayEnabled()), - _autoAwayTime(other.autoAwayTime()), - _autoAwayReason(other.autoAwayReason()), - _autoAwayReasonEnabled(other.autoAwayReasonEnabled()), - _autoReturnMessage(other.autoReturnMessage()), - _autoReturnMessageEnabled(other.autoReturnMessageEnabled()), - _ident(other.ident()), - _kickReason(other.kickReason()), - _partReason(other.partReason()), - _quitReason(other.quitReason()) +#else +QString tcharToQString(TCHAR *tchar) { - init(); + return QString::fromLocal8Bit(tchar); } -void Identity::init() { - _initialized = false; - setObjectName(QString::number(id())); -} -void Identity::setToDefaults() { - setIdentityName(tr("Default Identity")); - setRealName(tr("Quassel IRC User")); - QStringList n; - n << QString("quassel%1").arg(qrand() & 0xff); // FIXME provide more sensible default nicks - setNicks(n); - setAwayNick(""); - setAwayNickEnabled(false); - setAwayReason(tr("Gone fishing.")); - setAwayReasonEnabled(true); - setReturnMessage(tr("Brought fish.")); - setReturnMessageEnabled(false); - setAutoAwayEnabled(false); - setAutoAwayTime(10); - setAutoAwayReason(tr("Not here. No, really. not here!")); - setAutoAwayReasonEnabled(false); - setAutoReturnMessage(tr("Back in action again!")); - setAutoReturnMessageEnabled(false); - setIdent("quassel"); - setKickReason(tr("Kindergarten is elsewhere!")); - setPartReason(tr("http://quassel-irc.org - Chat comfortably. Anywhere.")); - setQuitReason(tr("http://quassel-irc.org - Chat comfortably. Anywhere.")); +#endif +#endif +void Identity::init() +{ + setObjectName(QString::number(id().toInt())); + setAllowClientUpdates(true); } -bool Identity::isValid() const { - return (id() > 0); -} -bool Identity::initialized() const { - return _initialized; -} +QString Identity::defaultNick() +{ + QString nick = QString("quassel%1").arg(qrand() & 0xff); // FIXME provide more sensible default nicks + +#ifdef Q_OS_MAC + QString shortUserName = CFStringToQString(CSCopyUserName(true)); + if (!shortUserName.isEmpty()) + nick = shortUserName; + +#elif defined(Q_OS_UNIX) + QString userName; + struct passwd *pwd = getpwuid(getuid()); + if (pwd) + userName = pwd->pw_name; + if (!userName.isEmpty()) + nick = userName; + +#elif defined(Q_OS_WIN) + TCHAR infoBuf[128]; + DWORD bufCharCount = 128; + //if(GetUserNameEx(/* NameSamCompatible */ 1, infoBuf, &bufCharCount)) + if (GetUserNameEx(NameSamCompatible, infoBuf, &bufCharCount)) { + QString nickName(tcharToQString(infoBuf)); + int lastBs = nickName.lastIndexOf('\\'); + if (lastBs != -1) { + nickName = nickName.mid(lastBs + 1); + } + if (!nickName.isEmpty()) + nick = nickName; + } +#endif -void Identity::setInitialized() { - _initialized = true; + // cleaning forbidden characters from nick + QRegExp rx(QString("(^[\\d-]+|[^A-Za-z0-9\x5b-\x60\x7b-\x7d])")); // NOLINT(modernize-raw-string-literal) + nick.remove(rx); + return nick; } -IdentityId Identity::id() const { - return _identityId; -} -QString Identity::identityName() const { - return _identityName; +QString Identity::defaultRealName() +{ + QString generalDefault = tr("Quassel IRC User"); + +#ifdef Q_OS_MAC + return CFStringToQString(CSCopyUserName(false)); + +#elif defined(Q_OS_UNIX) + QString realName; + struct passwd *pwd = getpwuid(getuid()); + if (pwd) + realName = QString::fromUtf8(pwd->pw_gecos); + if (!realName.isEmpty()) + return realName; + else + return generalDefault; + +#elif defined(Q_OS_WIN) + TCHAR infoBuf[128]; + DWORD bufCharCount = 128; + if (GetUserName(infoBuf, &bufCharCount)) + return tcharToQString(infoBuf); + else + return generalDefault; +#else + return generalDefault; +#endif +} + + +void Identity::setToDefaults() +{ + setIdentityName(tr("")); + setRealName(defaultRealName()); + QStringList n = QStringList() << defaultNick(); + setNicks(n); + setAwayNick(""); + setAwayNickEnabled(false); + setAwayReason(tr("Gone fishing.")); + setAwayReasonEnabled(true); + setAutoAwayEnabled(false); + setAutoAwayTime(10); + setAutoAwayReason(tr("Not here. No, really. not here!")); + setAutoAwayReasonEnabled(false); + setDetachAwayEnabled(false); + setDetachAwayReason(tr("All Quassel clients vanished from the face of the earth...")); + setDetachAwayReasonEnabled(false); + setIdent("quassel"); + setKickReason(tr("Kindergarten is elsewhere!")); + setPartReason(tr("https://quassel-irc.org - Chat comfortably. Anywhere.")); + setQuitReason(tr("https://quassel-irc.org - Chat comfortably. Anywhere.")); } -QString Identity::realName() const { - return _realName; -} -QStringList Identity::nicks() const { - return _nicks; -} +/*** setters ***/ -QString Identity::awayNick() const { - return _awayNick; +void Identity::setId(IdentityId _id) +{ + _identityId = _id; + SYNC(ARG(_id)) + emit idSet(_id); + renameObject(QString::number(id().toInt())); } -bool Identity::awayNickEnabled() const { - return _awayNickEnabled; -} -QString Identity::awayReason() const { - return _awayReason; +void Identity::setIdentityName(const QString &identityName) +{ + _identityName = identityName; + SYNC(ARG(identityName)) } -bool Identity::awayReasonEnabled() const { - return _awayReasonEnabled; -} -QString Identity::returnMessage() const { - return _returnMessage; +void Identity::setRealName(const QString &realName) +{ + _realName = realName; + SYNC(ARG(realName)) } -bool Identity::returnMessageEnabled() const { - return _returnMessageEnabled; -} -bool Identity::autoAwayEnabled() const { - return _autoAwayEnabled; +void Identity::setNicks(const QStringList &nicks) +{ + _nicks = nicks; + SYNC(ARG(nicks)) + emit nicksSet(nicks); } -int Identity::autoAwayTime() const { - return _autoAwayTime; -} -QString Identity::autoAwayReason() const { - return _autoAwayReason; +void Identity::setAwayNick(const QString &nick) +{ + _awayNick = nick; + SYNC(ARG(nick)) } -bool Identity::autoAwayReasonEnabled() const { - return _autoAwayReasonEnabled; -} -QString Identity::autoReturnMessage() const { - return _autoReturnMessage; +void Identity::setAwayReason(const QString &reason) +{ + _awayReason = reason; + SYNC(ARG(reason)) } -bool Identity::autoReturnMessageEnabled() const { - return _autoReturnMessageEnabled; -} -QString Identity::ident() const { - return _ident; +void Identity::setAwayNickEnabled(bool enabled) +{ + _awayNickEnabled = enabled; + SYNC(ARG(enabled)) } -QString Identity::kickReason() const { - return _kickReason; + +void Identity::setAwayReasonEnabled(bool enabled) +{ + _awayReasonEnabled = enabled; + SYNC(ARG(enabled)) } -QString Identity::partReason() const -{return _partReason;} -QString Identity::quitReason() const { - return _quitReason; +void Identity::setAutoAwayEnabled(bool enabled) +{ + _autoAwayEnabled = enabled; + SYNC(ARG(enabled)) } -/*** setters ***/ -// NOTE: DO NOT USE ON SYNCHRONIZED OBJECTS! -void Identity::setId(IdentityId _id) { - _identityId = _id; - setObjectName(QString::number(id())); - //emit idSet(id); +void Identity::setAutoAwayTime(int time) +{ + _autoAwayTime = time; + SYNC(ARG(time)) } -void Identity::setIdentityName(const QString &identityName) { - _identityName = identityName; - emit identityNameSet(identityName); -} -void Identity::setRealName(const QString &realName) { - _realName = realName; - emit realNameSet(realName); +void Identity::setAutoAwayReason(const QString &reason) +{ + _autoAwayReason = reason; + SYNC(ARG(reason)) } -void Identity::setNicks(const QStringList &nicks) { - _nicks = nicks; - emit nicksSet(nicks); -} -void Identity::setAwayNick(const QString &nick) { - _awayNick = nick; - emit awayNickSet(nick); +void Identity::setAutoAwayReasonEnabled(bool enabled) +{ + _autoAwayReasonEnabled = enabled; + SYNC(ARG(enabled)) } -void Identity::setAwayReason(const QString &reason) { - _awayReason = reason; - emit awayReasonSet(reason); -} -void Identity::setReturnMessage(const QString &message) { - _returnMessage = message; - emit returnMessageSet(message); +void Identity::setDetachAwayEnabled(bool enabled) +{ + _detachAwayEnabled = enabled; + SYNC(ARG(enabled)) } -void Identity::setAwayNickEnabled(bool enabled) { - _awayNickEnabled = enabled; - emit awayNickEnabledSet(enabled); -} -void Identity::setAwayReasonEnabled(bool enabled) { - _awayReasonEnabled = enabled; - emit awayReasonEnabledSet(enabled); +void Identity::setDetachAwayReason(const QString &reason) +{ + _detachAwayReason = reason; + SYNC(ARG(reason)) } -void Identity::setReturnMessageEnabled(bool enabled) { - _returnMessageEnabled = enabled; - emit returnMessageEnabledSet(enabled); -} -void Identity::setAutoAwayEnabled(bool enabled) { - _autoAwayEnabled = enabled; - emit autoAwayEnabledSet(enabled); +void Identity::setDetachAwayReasonEnabled(bool enabled) +{ + _detachAwayReasonEnabled = enabled; + SYNC(ARG(enabled)) } -void Identity::setAutoAwayTime(int time) { - _autoAwayTime = time; - emit autoAwayTimeSet(time); -} -void Identity::setAutoAwayReason(const QString & reason) { - _autoAwayReason = reason; - emit autoAwayReasonSet(reason); +void Identity::setIdent(const QString &ident) +{ + _ident = ident; + SYNC(ARG(ident)) } -void Identity::setAutoAwayReasonEnabled(bool enabled) { - _autoAwayReasonEnabled = enabled; - emit autoAwayReasonEnabledSet(enabled); -} -void Identity::setAutoReturnMessage(const QString & message) { - _autoReturnMessage = message; - emit autoReturnMessageSet(message); +void Identity::setKickReason(const QString &reason) +{ + _kickReason = reason; + SYNC(ARG(reason)) } -void Identity::setAutoReturnMessageEnabled(bool enabled) { - _autoReturnMessageEnabled = enabled; - emit autoReturnMessageEnabledSet(enabled); -} -void Identity::setIdent(const QString & ident) { - _ident = ident; - emit identSet(ident); +void Identity::setPartReason(const QString &reason) +{ + _partReason = reason; + SYNC(ARG(reason)) } -void Identity::setKickReason(const QString & reason) { - _kickReason = reason; - emit kickReasonSet(reason); -} -void Identity::setPartReason(const QString & reason) { - _partReason = reason; - emit partReasonSet(reason); +void Identity::setQuitReason(const QString &reason) +{ + _quitReason = reason; + SYNC(ARG(reason)) } -void Identity::setQuitReason(const QString & reason) { - _quitReason = reason; - emit quitReasonSet(reason); -} /*** ***/ -void Identity::update(const Identity &other) { -for(int idx = metaObject()->propertyOffset(); idx < metaObject()->propertyCount(); idx++) { - QMetaProperty metaProp = metaObject()->property(idx); - Q_ASSERT(metaProp.isValid()); - if(this->property(metaProp.name()) != other.property(metaProp.name())) { - setProperty(metaProp.name(), other.property(metaProp.name())); +void Identity::copyFrom(const Identity &other) +{ + for (int idx = staticMetaObject.propertyOffset(); idx < staticMetaObject.propertyCount(); idx++) { + QMetaProperty metaProp = staticMetaObject.property(idx); + Q_ASSERT(metaProp.isValid()); + if (this->property(metaProp.name()) != other.property(metaProp.name())) { + setProperty(metaProp.name(), other.property(metaProp.name())); + } } - } -} -#include -bool Identity::operator==(const Identity &other) { - for(int idx = metaObject()->propertyOffset(); idx < metaObject()->propertyCount(); idx++) { - QMetaProperty metaProp = metaObject()->property(idx); - Q_ASSERT(metaProp.isValid()); - QVariant v1 = this->property(metaProp.name()); - QVariant v2 = other.property(metaProp.name()); //qDebug() << v1 << v2; - // QVariant cannot compare custom types, so we need to check for this case - if(QString(v1.typeName()) == "IdentityId") { - if(v1.value() != v2.value()) return false; - } else { - if(v1 != v2) return false; +} + + +bool Identity::operator==(const Identity &other) const +{ + for (int idx = staticMetaObject.propertyOffset(); idx < staticMetaObject.propertyCount(); idx++) { + QMetaProperty metaProp = staticMetaObject.property(idx); + Q_ASSERT(metaProp.isValid()); + QVariant v1 = this->property(metaProp.name()); + QVariant v2 = other.property(metaProp.name()); // qDebug() << v1 << v2; + // QVariant cannot compare custom types, so we need to check for this special case + if (QString(v1.typeName()) == "IdentityId") { + if (v1.value() != v2.value()) return false; + } + else { + if (v1 != v2) return false; + } } - } - return true; + return true; } -bool Identity::operator!=(const Identity &other) { - return !(*this == other); + +bool Identity::operator!=(const Identity &other) const +{ + return !(*this == other); } + /////////////////////////////// -// we use a hash, so we can easily extend identities without breaking saved ones -QDataStream &operator<<(QDataStream &out, const Identity &id) { - QVariantMap i; - i["IdentityId"] = id.id(); - i["IdentityName"] = id.identityName(); - i["RealName"] = id.realName(); - i["Nicks"] = id.nicks(); - i["AwayNick"] = id.awayNick(); - i["AwayNickEnabled"] = id.awayNickEnabled(); - i["AwayReason"] = id.awayReason(); - i["AwayReasonEnabled"] = id.awayReasonEnabled(); - i["ReturnMessage"] = id.returnMessage(); - i["ReturnMessageEnabled"] = id.returnMessageEnabled(); - i["AutoAwayEnabled"] = id.autoAwayEnabled(); - i["AutoAwayTime"] = id.autoAwayTime(); - i["AutoAwayReason"] = id.autoAwayReason(); - i["AutoAwayReasonEnabled"] = id.autoAwayReasonEnabled(); - i["AutoReturnMessage"] = id.autoReturnMessage(); - i["AutoReturnMessageEnabled"] = id.autoReturnMessageEnabled(); - i["Ident"] = id.ident(); - i["KickReason"] = id.kickReason(); - i["PartReason"] = id.partReason(); - i["QuitReason"] = id.quitReason(); - out << i; - return out; -} - -QDataStream &operator>>(QDataStream &in, Identity &id) { - QVariantMap i; - in >> i; - id._identityId = i["IdentityId"].toUInt(); - id.setIdentityName(i["IdentityName"].toString()); - id.setRealName(i["RealName"].toString()); - id.setNicks(i["Nicks"].toStringList()); - id.setAwayNick(i["AwayNick"].toString()); - id.setAwayNickEnabled(i["AwayNickEnabled"].toBool()); - id.setAwayReason(i["AwayReason"].toString()); - id.setAwayReasonEnabled(i["AwayReasonEnabled"].toBool()); - id.setReturnMessage(i["ReturnMessage"].toString()); - id.setReturnMessageEnabled(i["ReturnMessageEnabled"].toBool()); - id.setAutoAwayEnabled(i["AutoAwayEnabled"].toBool()); - id.setAutoAwayTime(i["AutoAwayTime"].toInt()); - id.setAutoAwayReason(i["AutoAwayReason"].toString()); - id.setAutoAwayReasonEnabled(i["AutoAwayReasonEnabled"].toBool()); - id.setAutoReturnMessage(i["AutoReturnMessage"].toString()); - id.setAutoReturnMessageEnabled(i["AutoReturnMessageEnabled"].toBool()); - id.setIdent(i["Ident"].toString()); - id.setKickReason(i["KickReason"].toString()); - id.setPartReason(i["PartReason"].toString()); - id.setQuitReason(i["QuitReason"].toString()); - return in; +QDataStream &operator<<(QDataStream &out, Identity id) +{ + out << id.toVariantMap(); + return out; } + +QDataStream &operator>>(QDataStream &in, Identity &id) +{ + QVariantMap i; + in >> i; + id.fromVariantMap(i); + return in; +}