Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "socket.h"
- #include "irc/replycodes.h"
- #include "irc/rfc2812.h"
- #include <KDateTime>
- #include <KDebug>
- #include <QSslSocket>
- #include <QStringList>
- #include <QTextCodec>
- #include <QTimer>
- using namespace Aki::Irc;
- namespace Aki
- {
- namespace Irc
- {
- class SocketPrivate
- {
- public:
- SocketPrivate(Aki::Irc::Socket *qq)
- : q(qq),
- socket(0),
- name("Default"),
- data(QString()),
- realName(QString()),
- identName("akiirc"),
- serviceName(QString()),
- servicePassword(QString()),
- currentAddress(QString()),
- codec(QTextCodec::codecForName("UTF-8")),
- queueTimer(0),
- autoReconnection(false),
- ssl(false),
- selfDisconnection(false),
- autoIdentify(false),
- connected(false),
- retryAttempts(10),
- retryInterval(10)
- {
- addressList.clear();
- channelList.clear();
- nickList.clear();
- }
- void readyRead()
- {
- data += codec->toUnicode(socket->readAll());
- bool isFinished = data.right(2) != "\r\n" ? false : true;
- QStringList lines = data.split("\r\n", QString::SkipEmptyParts);
- if (isFinished) {
- data.clear();
- } else {
- data = lines.last();
- lines.removeLast();
- }
- QStringListIterator msgIter(lines);
- while (msgIter.hasNext()) {
- processData(msgIter.next());
- }
- }
- void updateQueue()
- {
- }
- void error(QAbstractSocket::SocketError error)
- {
- switch (error) {
- case QAbstractSocket::ConnectionRefusedError:
- case QAbstractSocket::RemoteHostClosedError:
- case QAbstractSocket::HostNotFoundError:
- case QAbstractSocket::SocketAccessError:
- case QAbstractSocket::SocketResourceError:
- case QAbstractSocket::SocketTimeoutError:
- case QAbstractSocket::NetworkError:
- case QAbstractSocket::UnsupportedSocketOperationError:
- case QAbstractSocket::UnfinishedSocketOperationError:
- case QAbstractSocket::ProxyAuthenticationRequiredError:
- case QAbstractSocket::SslHandshakeFailedError:
- case QAbstractSocket::ProxyConnectionRefusedError:
- case QAbstractSocket::ProxyConnectionClosedError:
- case QAbstractSocket::ProxyConnectionTimeoutError:
- case QAbstractSocket::ProxyNotFoundError:
- case QAbstractSocket::ProxyProtocolError:
- /*case KTcpSocket::ConnectionRefusedError:
- case KTcpSocket::HostNotFoundError:
- case KTcpSocket::NetworkError:
- case KTcpSocket::RemoteHostClosedError:
- case KTcpSocket::SocketAccessError:
- case KTcpSocket::SocketResourceError:
- case KTcpSocket::SocketTimeoutError:
- case KTcpSocket::UnknownError:
- case KTcpSocket::UnsupportedSocketOperationError:*/
- if (q->isAutoReconnectionEnabled()) {
- QTimer::singleShot(q->retryInterval(), q, SLOT(connectToHost()));
- //emit q->updateRetryAttemptCount();
- }
- break;
- default: {
- break;
- }
- }
- emit q->error(error);
- }
- void stateChanged(QAbstractSocket::SocketState state)
- {
- switch (state) {
- case QAbstractSocket::UnconnectedState:
- case QAbstractSocket::HostLookupState:
- case QAbstractSocket::ConnectingState:
- case QAbstractSocket::ClosingState:
- /*case KTcpSocket::ConnectingState:
- case KTcpSocket::HostLookupState:
- case KTcpSocket::UnconnectedState:
- case KTcpSocket::ClosingState:*/ {
- queueTimer->stop();
- connected = false;
- break;
- }
- case QAbstractSocket::ConnectedState: {
- //case KTcpSocket::ConnectedState: {
- queueTimer->start();
- q->rfcUser(q->identName(), false, q->realName());
- q->rfcNick(q->currentNick());
- connected = true;
- break;
- }
- default: {
- break;
- }
- }
- emit q->stateChanged(state);
- }
- void sslErrors(const QList<QSslError> &errors)
- {
- Q_UNUSED(errors);
- }
- void write(const QString &data)
- {
- socket->write(codec->fromUnicode(data));
- }
- void processData(const QString &data)
- {
- QString line = data;
- QString server;
- QString prefix;
- QString command;
- QStringList params;
- bool isNumeric = false;
- #ifdef IRC_DEBUG_OUTPUT
- kDebug() << data;
- #endif
- if (line.startsWith(QChar(':'))) {
- prefix = line.mid(1, line.indexOf(QChar(' ')) - 1);
- line.remove(0, prefix.length() + 2);
- }
- command = line.left(line.indexOf(QChar(' ')));
- line.remove(0, command.length() + 1);
- quint16 code = command.toUShort(&isNumeric);
- while (!line.isEmpty()) {
- if (line.startsWith(QChar(':'))) {
- line.remove(0, 1);
- params << line;
- line.clear();
- } else {
- QString param = line.left(line.indexOf(QChar(' ')));
- line.remove(0, param.length() + 1);
- params << param;
- }
- }
- #ifndef IRC_DEBUG_OUTPUT
- if (isNumeric) {
- kDebug() << code << ' ' << params;
- } else {
- kDebug() << command << ' ' << params;
- }
- #endif
- if (command == "JOIN") {
- QString nick = Aki::Irc::Rfc2812::nickFromMask(prefix);
- if (nick == q->currentNick()) {
- emit q->onSelfJoin(params.value(0));
- } else {
- emit q->onUserJoin(prefix, params.value(0));
- }
- } else if (command == "PART") {
- if (params.count() == 1) {
- emit q->onUserPart(prefix, params.value(0));
- } else {
- emit q->onUserPart(prefix, params.value(0), params.value(1));
- }
- } else if (command == "INVITE") {
- QString from = Aki::Irc::Rfc2812::nickFromMask(prefix);
- if (params.value(0) == q->currentNick()) {
- emit q->onInvite(from, params.value(1));
- }
- } else if (command == "PRIVMSG") {
- } else if (command == "NOTICE") {
- if (params.value(0) == "AUTH") {
- emit q->onNoticeAuth(params.value(1));
- } else if (params.value(1).startsWith(QChar('\1')) &&
- params.value(1).endsWith(QChar('\1'))) {
- params.value(1).remove(0, 1);
- params.value(1).remove(params.value(1).length() - 1, 1);
- QString type = params.value(1).left(params.value(1).indexOf(QChar(' ')));
- if (type == "VERSION") {
- QString from = Aki::Irc::Rfc2812::nickFromMask(prefix);
- emit q->onNoticeCtcpVersion(from, params.value(1));
- }
- }
- } else if (command == "KICK") {
- emit q->onKick(params.value(0), params.value(1), params.value(2));
- } else if (command == "NICK") {
- QString oldNick = Aki::Irc::Rfc2812::nickFromMask(prefix);
- emit q->onNick(oldNick, params.value(0));
- } else if (command == "QUIT") {
- if (params.count() == 0) {
- emit q->onUserQuit(prefix);
- } else {
- emit q->onUserQuit(prefix, params.value(0));
- }
- } else if (command == "PING") {
- q->rfcPong(params.value(0));
- } else if (command == "PONG") {
- emit q->onPong(params.value(1));
- } else if (command == "MODE") {
- QString from = Aki::Irc::Rfc2812::nickFromMask(prefix);
- if (Aki::Irc::Rfc2812::isValidNickname(from)) {
- if (from == q->currentNick()) {
- if (params.value(0) == q->currentNick()) {
- emit q->onSelfUMode(params.value(1));
- } else if (Aki::Irc::Rfc2812::isValidChannel(params.value(0))) {
- if (params.count() == 3 && Aki::Irc::Rfc2812::isValidNickname(params.value(2))) {
- emit q->onMode(from, params.value(0), params.value(1), params.value(2));
- } else {
- QStringList modes;
- if (params.count() >= 2) {
- for (int i = 2; i < params.count(); ++i) {
- modes << params.value(i);
- }
- emit q->onMode(from, params.value(0), params.value(1), params.value(2));
- }
- }
- }
- } else {
- if (Aki::Irc::Rfc2812::isValidChannel(params.value(0))) {
- emit q->onMode(from, params.value(0), params.value(1), params.value(2));
- }
- }
- } else {
- if (params.value(0) == q->currentNick()) {
- emit q->onUMode(from, params.value(1));
- } else if (Aki::Irc::Rfc2812::isValidChannel(params.value(0))) {
- QStringList modes;
- if (params.count() >= 2) {
- for (int i = 2; i < params.count(); ++i) {
- modes << params.value(i);
- }
- }
- emit q->onMode(from, params.value(0), params.value(1), modes);
- }
- }
- } else if (command == "TOPIC") {
- QString from = Aki::Irc::Rfc2812::nickFromMask(prefix);
- emit q->onTopicChanged(from, params.value(0), params.value(1));
- } else if (isNumeric) {
- switch (code) {
- case RPL_WELCOME: {
- emit q->onWelcome(params.at(1));
- break;
- }
- case RPL_YOURHOST: {
- emit q->onYourHost(params.at(1));
- break;
- }
- case RPL_CREATED: {
- emit q->onCreated(params.at(1));
- break;
- }
- case RPL_MYINFO: {
- QString tmp;
- for (int i = 0; i < params.count(); ++i) {
- tmp.append(params.at(i) + QChar(' '));
- }
- tmp.remove(tmp.length() - 1, 1);
- emit q->onMyInfo(tmp);
- break;
- }
- case RPL_ISUPPORT: {
- QString tmp;
- for (int i = 0; i < params.count(); ++i) {
- tmp.append(params.at(i) + QChar(' '));
- }
- tmp.remove(tmp.length() - 1, 1);
- emit q->onISupport(tmp);
- break;
- }
- case RPL_TRACELINK:
- case RPL_TRACECONNECTING:
- case RPL_TRACEHANDSHAKE:
- case RPL_TRACEUNKNOWN:
- case RPL_TRACEOPERATOR:
- case RPL_TRACEUSER:
- case RPL_TRACESERVER:
- case RPL_TRACENEWTYPE:
- case RPL_TRACECLASS:
- case RPL_TRACERECONNECT:
- case RPL_STATSLINKINFO:
- case RPL_STATSCOMMANDS:
- case RPL_STATSCLINE:
- case RPL_STATSNLINE:
- case RPL_STATSILINE:
- case RPL_STATSKLINE:
- case RPL_STATSYLINE:
- case RPL_ENDOFSTATS:
- break;
- case RPL_UMODEIS: {
- emit q->onUModeIs(params.at(1));
- break;
- }
- case RPL_HIGHCONNECTCOUNT: {
- emit q->onHighConnectCount(params.at(1));
- break;
- }
- case RPL_LUSERCLIENT: {
- emit q->onLUserClient(params.at(1));
- break;
- }
- case RPL_LUSEROP: {
- emit q->onLUserOp(params.at(1).toInt(), params.at(2));
- break;
- }
- case RPL_LUSERUNKNOWN: {
- emit q->onLUserUnknown(params.at(1).toInt(), params.at(2));
- break;
- }
- case RPL_LUSERCHANNELS: {
- emit q->onLUserChannels(params.at(1).toInt(), params.at(2));
- break;
- }
- case RPL_LUSERME: {
- emit q->onLUserMe(params.at(1));
- break;
- }
- case RPL_ADMINME:
- case RPL_ADMINLOC1:
- case RPL_ADMINLOC2:
- case RPL_ADMINEMAIL:
- case RPL_TRACELOG:
- case RPL_TRACEEND:
- case RPL_LOCALUSERS: {
- emit q->onLocalUsers(params.at(1));
- break;
- }
- case RPL_GLOBALUSERS: {
- emit q->onGlobalUsers(params.at(1));
- break;
- }
- case RPL_CAPAB:
- case RPL_NONE:
- break;
- case RPL_AWAY: {
- emit q->onAway(params.at(1), params.at(2));
- break;
- }
- case RPL_USERHOST:
- case RPL_ISON:
- break;
- case RPL_UNAWAY: {
- emit q->onUnAway(params.at(1));
- break;
- }
- case RPL_NOWAWAY: {
- emit q->onNowAway(params.at(1));
- break;
- }
- case RPL_WHOISIDENTIFY:
- case RPL_WHOISHELPER:
- break;
- case RPL_WHOISUSER: {
- emit q->onWhoIsUser(params.at(1), params.at(2), params.at(3), params.at(5));
- break;
- }
- case RPL_WHOISSERVER: {
- emit q->onWhoIsServer(params.at(1), params.at(2), params.at(3));
- break;
- }
- case RPL_WHOISOPERATOR:
- break;
- case RPL_WHOWASUSER: {
- emit q->onWhoWasUser(params.at(1), params.at(2), params.at(3), params.at(5));
- break;
- }
- case RPL_ENDOFWHO: {
- emit q->onEndOfWho(params.at(1), params.at(2));
- break;
- }
- case RPL_WHOISIDLE:
- case RPL_ENDOFWHOIS:
- break;
- case RPL_WHOISCHANNELS: {
- emit q->onWhoIsChannels(params.at(1), params.at(2));
- break;
- }
- case RPL_IDENTIFIED: {
- emit q->onWhoIsIdentified(params.at(1), params.at(2));
- break;
- }
- case RPL_LISTSTART:
- case RPL_LIST:
- case RPL_LISTEND:
- break;
- case RPL_CHANNELMODEIS: {
- QStringList modes;
- if (params.count() > 2) {
- for (int i = 3; i < params.count(); ++i) {
- modes << params.at(i);
- }
- }
- emit q->onChannelModeIs(params.at(1), params.at(2), modes);
- break;
- }
- case RPL_UNIQOPIS:
- break;
- case RPL_CHANNELURLIS: {
- emit q->onChannelUrlIs(params.at(1), params.at(2));
- break;
- }
- case RPL_CHANNELCREATED: {
- KDateTime time;
- time.setTime_t(params.at(2).toUInt());
- time = time.toClockTime();
- emit q->onChannelCreated(params.at(1), time.toString("%B %d %Y %H:%M:%S"));
- break;
- }
- case RPL_WHOSISACCOUNT:
- break;
- case RPL_NOTOPIC: {
- emit q->onNoTopic(params.at(1), params.at(2));
- break;
- }
- case RPL_TOPIC: {
- emit q->onTopic(params.at(1), params.at(2));
- break;
- }
- case RPL_TOPICSETBY: {
- KDateTime time;
- time.setTime_t(params.at(3).toUInt());
- time = time.toClockTime();
- emit q->onTopicSetBy(params.at(2), params.at(1), time.toString("%B %d %Y %H:%M:%S"));
- break;
- }
- case RPL_WHOISACTUALLY:
- break;
- case RPL_INVITING: {
- emit q->onInviting(params.at(1), params.at(2));
- break;
- }
- case RPL_SUMMONING:
- case RPL_INVITELIST:
- case RPL_ENDOFEXCEPTLIST:
- case RPL_VERSION: {
- QString version;
- for (int i = 1; i < params.count(); ++i) {
- if (i == params.count()) {
- version.append(params.at(i));
- } else {
- version.append(params.at(i) + QChar(' '));
- }
- }
- emit q->onVersion(version);
- break;
- }
- case RPL_WHOREPLY: {
- QString param7 = params.at(7);
- QString tmp = param7.left(param7.indexOf(QChar(' ')));
- param7.remove(0, tmp.length() + 1);
- emit q->onWho(params.at(1), params.at(2), params.at(3), params.at(4), params.at(5),
- params.at(6), tmp.toInt(), param7);
- break;
- }
- case RPL_NAMREPLY: {
- emit q->onNameReply(params.at(2), params.at(3));
- break;
- }
- case RPL_TRYAGAIN:
- case RPL_LINKS:
- case RPL_ENDOFLINKS:
- case RPL_ENDOFNAMES: {
- emit q->onEndOfNames(params.at(1), params.at(2));
- break;
- }
- case RPL_BANLIST: {
- KDateTime time;
- time.setTime_t(params.at(4).toUInt());
- time = time.toClockTime();
- emit q->onBanList(params.at(1), params.at(2), params.at(3),
- time.toString("%m-%d-%Y %H:%M:%S"));
- break;
- }
- case RPL_ENDOFBANLIST: {
- emit q->onEndOfBanList(params.at(1), params.at(2));
- break;
- }
- case RPL_ENDOFWHOWAS: {
- emit q->onEndOfWhoWas(params.at(1), params.at(2));
- break;
- }
- case RPL_INFO:
- case RPL_MOTD: {
- emit q->onMotd(params.at(1));
- break;
- }
- case RPL_ENDOFINFO:
- break;
- case RPL_MOTDSTART: {
- emit q->onMotdStart(params.at(1));
- break;
- }
- case RPL_ENDOFMOTD: {
- emit q->onEndOfMotd(params.at(1));
- break;
- }
- case RPL_YOUREOPER:
- case RPL_REHASHING:
- case RPL_YOURESERVICE:
- break;
- case RPL_TIME: {
- emit q->onTime(params.at(1), params.at(2));
- break;
- }
- case RPL_USERSSTART:
- case RPL_USERS:
- case RPL_ENDOFUSERS:
- case RPL_NOUSERS:
- break;
- case ERR_NOSUCHNICK: {
- emit q->onErrorNoSuchNick(params.at(1), params.at(2));
- break;
- }
- case ERR_NOSUCHSERVER: {
- emit q->onErrorNoSuchServer(params.at(1), params.at(2));
- break;
- }
- case ERR_NOSUCHCHANNEL: {
- emit q->onErrorNoSuchChannel(params.at(1), params.at(2));
- break;
- }
- case ERR_CANNOTSENDTOCHAN: {
- emit q->onErrorCannotSendToChannel(params.at(1), params.at(2));
- break;
- }
- case ERR_TOOMANYCHANNELS: {
- emit q->onErrorTooManyChannels(params.at(1), params.at(2));
- break;
- }
- case ERR_WASNOSUCHNICK: {
- emit q->onErrorWasNoSuchNick(params.at(1), params.at(2));
- break;
- }
- case ERR_TOOMANYTARGETS:
- break;
- case ERR_NOSUCHSERVICE: {
- emit q->onErrorNoSuchService(params.at(1), params.at(2));
- break;
- }
- case ERR_NORECIPIENT: {
- emit q->onErrorNoRecipient(params.at(1));
- break;
- }
- case ERR_NOTEXTTOSEND: {
- emit q->onErrorNoTextToSend(params.at(1));
- break;
- }
- case ERR_NOTOPLEVEL: {
- emit q->onErrorNoTopLevel(params.at(1), params.at(2));
- break;
- }
- case ERR_WILDTOPLEVEL: {
- emit q->onErrorWildTopLevel(params.at(1), params.at(2));
- break;
- }
- case ERR_BADMASK: {
- break;
- }
- case ERR_UNKNOWNCOMMAND: {
- emit q->onErrorUnknownCommand(params.at(1), params.at(2));
- break;
- }
- case ERR_NOMOTD: {
- emit q->onErrorNoMotd(params.at(1));
- break;
- }
- case ERR_NOADMININFO: {
- emit q->onErrorNoAdminInfo(params.at(1), params.at(2));
- break;
- }
- case ERR_FILEERROR: {
- emit q->onErrorFileError(params.at(1));
- break;
- }
- case ERR_NONICKNAMEGIVEN: {
- emit q->onErrorNoNicknameGiven(params.at(1));
- break;
- }
- case ERR_ERRONEUSNICKNAME: {
- emit q->onErrorErroneusNickname(params.at(1), params.at(2));
- break;
- }
- case ERR_NICKNAMEINUSE: {
- emit q->onErrorNicknameInUse(params.at(1), params.at(2));
- break;
- }
- case ERR_NICKCOLLISION: {
- emit q->onErrorNickCollision(params.at(1), params.at(2));
- break;
- }
- case ERR_UNAVAILRESOURCE:
- case ERR_USERNOTINCHANNEL:
- break;
- case ERR_NOTONCHANNEL: {
- emit q->onErrorNotOnChannel(params.at(1), params.at(2));
- break;
- }
- case ERR_USERONCHANNEL: {
- emit q->onErrorUserOnChannel(params.at(1), params.at(2), params.at(3));
- break;
- }
- case ERR_NOLOGIN: {
- emit q->onErrorNoLogin(params.at(1), params.at(2));
- break;
- }
- case ERR_SUMMONDISABLED:
- case ERR_USERSDISABLED:
- case ERR_NOTREGISTERED:
- case ERR_NEEDMOREPARAMS:
- case ERR_ALREADYREGISTERED:
- case ERR_NOPERMFOROST:
- case ERR_PASSWDMISMATCH:
- break;
- case ERR_YOUREBANNEDCREEP: {
- emit q->onErrorYoureBannedCreep(params.at(1));
- break;
- }
- case ERR_YOUWILLBEBANNED:
- break;
- case ERR_KEYSET: {
- emit q->onErrorKeySet(params.at(1), params.at(2));
- break;
- }
- case ERR_CHANNELISFULL: {
- emit q->onErrorChannelIsFull(params.at(1), params.at(2));
- break;
- }
- case ERR_UNKNOWNMODE: {
- emit q->onErrorUnknownMode(params.at(1), params.at(2));
- break;
- }
- case ERR_INVITEONLYCHAN: {
- emit q->onErrorInviteOnlyChannel(params.at(1), params.at(2));
- break;
- }
- case ERR_BANNEDFROMCHAN: {
- emit q->onErrorBannedFromChannel(params.at(1), params.at(2));
- break;
- }
- case ERR_BADCHANNELKEY: {
- emit q->onErrorBadChannelKey(params.at(1), params.at(2));
- break;
- }
- case ERR_BADCHANMASK: {
- emit q->onErrorBadChanMask(params.at(1), params.at(2));
- break;
- }
- case ERR_NOCHANMODES: {
- emit q->onErrorNoChanModes(params.at(1), params.at(2));
- break;
- }
- case ERR_BANLISTFULL: {
- emit q->onErrorBanListFull(params.at(1), params.at(2), params.at(3));
- break;
- }
- case ERR_NOPRIVILEGES: {
- emit q->onErrorNoPrivileges(params.at(1));
- break;
- }
- case ERR_CHANOPRIVSNEEDED: {
- emit q->onErrorChannelPrivilegesNeeded(params.at(1), params.at(2));
- break;
- }
- case ERR_CANTKILLSERVER:
- case ERR_RESTRICTED:
- case ERR_UNIQOPPRIVSNEEDED:
- case ERR_NOOPERHOST:
- break;
- case ERR_UMODEUNKNOWNFLAG: {
- emit q->onErrorUModeUnknownFlag(params.at(1));
- break;
- }
- case ERR_USERSDONTMATCH: {
- emit q->onErrorUsersDontMatch(params.at(1));
- break;
- }
- default: {
- break;
- }
- }
- }
- }
- Aki::Irc::Socket *q;
- QSslSocket *socket;
- QStringList addressList;
- QStringList channelList;
- QStringList nickList;
- QString name;
- QString data;
- QString realName;
- QString identName;
- QString serviceName;
- QString servicePassword;
- QString currentAddress;
- QTextCodec *codec;
- QTimer *queueTimer;
- bool autoReconnection;
- bool ssl;
- bool selfDisconnection;
- bool autoIdentify;
- bool connected;
- quint16 currentPort;
- int retryAttempts;
- int retryInterval;
- static int addressListIndex;
- }; // End of class SocketPrivate.
- } // End of namespace Irc.
- } // End of namespace Aki.
- int Aki::Irc::SocketPrivate::addressListIndex = 0;
- Socket::Socket(QObject *parent)
- : QObject(parent),
- d(new SocketPrivate(this))
- {
- d->socket = new QSslSocket(this);
- d->queueTimer = new QTimer(this);
- d->queueTimer->setInterval(500);
- connect(d->socket, SIGNAL(readyRead()),
- SLOT(readyRead()));
- connect(d->queueTimer, SIGNAL(timeout()),
- SLOT(updateQueue()));
- //connect(d->socket, SIGNAL(sslErrors(QList<KSslError>)),
- // SLOT(sslErrors(QList<KSslError>)));
- //connect(d->socket, SIGNAL(stateChanged(State)),
- // SLOT(stateChanged(KTcpSocket::State)));
- //connect(d->socket, SIGNAL(error(KTcpSocket::Error)),
- //SLOT(error(KTcpSocket::Error)));
- }
- Socket::Socket(const QString &name, QObject *parent)
- : QObject(parent),
- d(new SocketPrivate(this))
- {
- d->socket = new QSslSocket(this);
- d->name = name;
- d->queueTimer = new QTimer(this);
- d->queueTimer->setInterval(500);
- connect(d->socket, SIGNAL(readyRead()),
- this, SLOT(readyRead()));
- connect(d->queueTimer, SIGNAL(timeout()),
- this, SLOT(updateQueue()));
- connect(d->socket, SIGNAL(sslErrors(QList<QSslError>)),
- SLOT(sslErrors(QList<QSslError>)));
- connect(d->socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
- SLOT(stateChanged(QAbstractSocket::SocketState)));
- connect(d->socket, SIGNAL(error(QAbstractSocket::SocketError)),
- SLOT(error(QAbstractSocket::SocketError)));
- }
- Socket::~Socket()
- {
- delete d;
- }
- QStringList
- Socket::addressList() const
- {
- return d->addressList;
- }
- void
- Socket::setAddressList(const QStringList &addressList)
- {
- d->addressList = addressList;
- }
- void
- Socket::appendNick(const QString &nick)
- {
- if (!d->nickList.contains(nick)) {
- d->nickList.append(nick);
- setCurrentNick(nick);
- }
- }
- void
- Socket::setCurrentNick(const QString &nick)
- {
- const int index = d->nickList.indexOf(nick);
- if (index >= 0) {
- //
- }
- }
- bool
- Socket::isConnected() const
- {
- return d->connected;
- }
- QString
- Socket::currentAddress() const
- {
- return d->currentAddress;
- }
- quint16
- Socket::currentPort() const
- {
- return d->currentPort;
- }
- QString
- Socket::currentNick() const
- {
- return d->nickList[0];
- }
- bool
- Socket::isAutoIdentifyEnabled() const
- {
- return d->autoIdentify;
- }
- bool
- Socket::isAutoReconnectionEnabled() const
- {
- return d->autoReconnection;
- }
- QStringList
- Socket::channelList() const
- {
- return d->channelList;
- }
- void
- Socket::setChannelList(const QStringList &channels)
- {
- d->channelList = channels;
- }
- QString
- Socket::identName() const
- {
- return d->identName;
- }
- void
- Socket::setIdentName(const QString &ident)
- {
- d->identName = ident;
- }
- QString
- Socket::name() const
- {
- return d->name;
- }
- void
- Socket::setName(const QString &name)
- {
- d->name = name;
- }
- void
- Socket::setNickList(const QStringList &nicks)
- {
- d->nickList = nicks;
- }
- QStringList
- Socket::nickList() const
- {
- return d->nickList;
- }
- void
- Socket::setRealName(const QString &name)
- {
- d->realName = name;
- }
- QString
- Socket::realName() const
- {
- return d->realName;
- }
- int
- Socket::retryInterval() const
- {
- return d->retryInterval;
- }
- int
- Socket::retryAttemptCount() const
- {
- return d->retryAttempts;
- }
- void
- Socket::setRetryInterval(int seconds)
- {
- d->retryInterval = seconds;
- }
- void
- Socket::setRetryAttemptCount(int count)
- {
- d->retryAttempts = count;
- }
- void
- Socket::rfcAdmin(const QString &target)
- {
- if (target.isEmpty()) {
- rfcRaw("ADMIN");
- } else {
- rfcRaw(QString("ADMIN %1").arg(target));
- }
- }
- void
- Socket::rfcAway(const QString &message)
- {
- if (message.isEmpty()) {
- rfcRaw("AWAY");
- } else {
- rfcRaw(QString("AWAY :%1").arg(message));
- }
- }
- void
- Socket::rfcConnect(const QString &targetServer, const QString &port, const QString &remoteServer)
- {
- if (remoteServer.isEmpty()) {
- rfcRaw(QString("CONNECT %1 %2").arg(targetServer, port));
- } else {
- rfcRaw(QString("CONNECT %1 %2 %3").arg(targetServer, port, remoteServer));
- }
- }
- void
- Socket::rfcCtcpAction(const QString &target, const QString &message)
- {
- rfcPrivmsg(target, QString("\x01" "ACTION %1\x01").arg(message));
- }
- void
- Socket::rfcDie()
- {
- rfcRaw("DIE");
- }
- void
- Socket::rfcError(const QString &message)
- {
- rfcRaw(QString("ERROR :%1").arg(message));
- }
- void
- Socket::rfcInfo(const QString &target)
- {
- if (target.isEmpty()) {
- rfcRaw("INFO");
- } else {
- rfcRaw(QString("INFO %1").arg(target));
- }
- }
- void
- Socket::rfcInvite(const QString &nick, const QString &channel)
- {
- rfcRaw(QString("INVITE %1 %2").arg(nick, channel));
- }
- void
- Socket::rfcIson(const QString &nick)
- {
- rfcRaw(QString("ISON %1").arg(nick));
- }
- void
- Socket::rfcIson(const QStringList &nicks)
- {
- QString nickList = nicks.join(QChar(','));
- rfcIson(nickList);
- }
- void
- Socket::rfcJoin(const QString &channel, const QString &key)
- {
- if (key.isEmpty()) {
- rfcRaw(QString("JOIN %1").arg(channel));
- } else {
- rfcRaw(QString("JOIN %1 %2").arg(channel, key));
- }
- }
- void
- Socket::rfcJoin(const QStringList &channels, const QStringList &keys)
- {
- QString channelList = channels.join(QChar(','));
- if (keys.isEmpty()) {
- rfcJoin(channelList);
- } else {
- QString keyList = keys.join(QChar(','));
- rfcJoin(channelList, keyList);
- }
- }
- void
- Socket::rfcKick(const QString &channel, const QString &nick, const QString &comment)
- {
- if (comment.isEmpty()) {
- rfcRaw(QString("KICK %1 %2").arg(channel, nick));
- } else {
- rfcRaw(QString("KICK %1 %2 :%3").arg(channel, nick, comment));
- }
- }
- void
- Socket::rfcKick(const QStringList &channels, const QString &nick, const QString &comment)
- {
- QString channelList = channels.join(QChar(','));
- rfcKick(channelList, nick, comment);
- }
- void
- Socket::rfcKick(const QString &channel, const QStringList &nicks, const QString &comment)
- {
- QString nickList = nicks.join(QChar(','));
- rfcKick(channel, nickList, comment);
- }
- void
- Socket::rfcKick(const QStringList &channels, const QStringList &nicks, const QString &comment)
- {
- QString channelList = channels.join(QChar(','));
- QString nickList = nicks.join(QChar(','));
- rfcKick(channelList, nickList, comment);
- }
- void
- Socket::rfcLinks(const QString &remoteServer, const QString &serverMask)
- {
- if (remoteServer.isEmpty() && serverMask.isEmpty()) {
- rfcRaw("LINKS");
- } else if (serverMask.isEmpty()) {
- rfcRaw(QString("LINKS %1").arg(remoteServer));
- } else {
- rfcRaw(QString("LINKS %1 %2").arg(remoteServer, serverMask));
- }
- }
- void
- Socket::rfcList(const QString &channel, const QString &target)
- {
- if (channel.isEmpty() && target.isEmpty()) {
- rfcRaw("LIST");
- } else if (target.isEmpty()) {
- rfcRaw(QString("LIST %1").arg(channel));
- } else {
- rfcRaw(QString("LIST %1 %2").arg(channel, target));
- }
- }
- void
- Socket::rfcList(const QStringList &channels, const QString &target)
- {
- QString channelList = channels.join(QChar(','));
- rfcList(channelList, target);
- }
- void
- Socket::rfcLUsers(const QString &mask, const QString &target)
- {
- if (mask.isEmpty() && target.isEmpty()) {
- rfcRaw("LUSERS");
- } else if (target.isEmpty()) {
- rfcRaw(QString("LUSERS %1").arg(mask));
- } else {
- rfcRaw(QString("LUSERS %1 %2").arg(mask, target));
- }
- }
- void
- Socket::rfcMode(const QString &target, const QString &mode)
- {
- if (mode.isEmpty()) {
- rfcRaw(QString("MODE %1").arg(target));
- } else {
- rfcRaw(QString("MODE %1 %2").arg(target, mode));
- }
- }
- void
- Socket::rfcMotd(const QString &target)
- {
- if (target.isEmpty()) {
- rfcRaw("MOTD");
- } else {
- rfcRaw(QString("MOTD %1").arg(target));
- }
- }
- void
- Socket::rfcNames()
- {
- rfcRaw("NAMES");
- }
- void
- Socket::rfcNames(const QString &channel, const QString &target)
- {
- if (target.isEmpty()) {
- rfcRaw(QString("NAMES %1").arg(channel));
- } else {
- rfcRaw(QString("NAMES %1 %2").arg(channel, target));
- }
- }
- void
- Socket::rfcNames(const QStringList &channels, const QString &target)
- {
- QString channelList = channels.join(QChar(','));
- rfcNames(channelList, target);
- }
- void
- Socket::rfcNick(const QString &nick)
- {
- rfcRaw(QString("NICK %1").arg(nick));
- }
- void
- Socket::rfcNotice(const QString &destination, const QString &message)
- {
- rfcRaw(QString("NOTICE %1 :%2").arg(destination, message));
- }
- void
- Socket::rfcOper(const QString &name, const QString &password)
- {
- rfcRaw(QString("OPER %1 %2").arg(name, password));
- }
- void
- Socket::rfcPart(const QString &channel, const QString &message)
- {
- if (message.isEmpty()) {
- rfcRaw(QString("PART %1").arg(channel));
- } else {
- rfcRaw(QString("PART %1 :%2").arg(channel, message));
- }
- }
- void
- Socket::rfcPart(const QStringList &channels, const QString &message)
- {
- QString channelList = channels.join(QChar(','));
- if (message.isEmpty()) {
- rfcPart(channelList);
- } else {
- rfcPart(channelList, message);
- }
- }
- void
- Socket::rfcPass(const QString &password)
- {
- rfcRaw(QString("PASS %1").arg(password));
- }
- void
- Socket::rfcPing(const QString &server, const QString &server2)
- {
- if (server2.isEmpty()) {
- rfcRaw(QString("PING %1").arg(server));
- } else {
- rfcRaw(QString("PING %1 %2").arg(server, server2));
- }
- }
- void
- Socket::rfcPong(const QString &server, const QString &server2)
- {
- if (server2.isEmpty()) {
- rfcRaw(QString("PONG %1").arg(server));
- } else {
- rfcRaw(QString("PONG %1 %2").arg(server, server2));
- }
- }
- void
- Socket::rfcPrivmsg(const QString &destination, const QString &message)
- {
- rfcRaw(QString("PRIVMSG %1 :%2").arg(destination, message));
- }
- void
- Socket::rfcQuit(const QString &message)
- {
- if (message.isEmpty()) {
- rfcRaw("QUIT");
- } else {
- rfcRaw(QString("QUIT :%1").arg(message));
- }
- }
- void
- Socket::rfcRaw(const QString &command)
- {
- const QString type = command.left(command.indexOf(' '));
- d->socket->write(codec()->fromUnicode(command + "\r\n"));
- /*if (type == "WHO" || type == "MODE") {
- d->queue.append(QPair<Socket::QueueType, QString>(Socket::Lowest, message));
- } else if (type == "PRIVMSG" || type == "NOTICE") {
- d->queue.append(QPair<Socket::QueueType, QString>(Socket::Low, message));
- } else {
- d->queue.append(QPair<Socket::QueueType, QString>(Socket::Normal, message));
- }*/
- }
- void
- Socket::rfcReHash()
- {
- rfcRaw("REHASH");
- }
- void
- Socket::rfcRestart()
- {
- rfcRaw("RESTART");
- }
- void
- Socket::rfcService(const QString &nick, const QString &distribution, const QString &info)
- {
- rfcRaw(QString("SERVICE %1 * %2 0 0 :%3").arg(nick, distribution, info));
- }
- void
- Socket::rfcServList(const QString &mask, const QString &type)
- {
- if (mask.isEmpty() && type.isEmpty()) {
- rfcRaw("SERVLIST");
- } else if (type.isEmpty()) {
- rfcRaw(QString("SERVLIST %1").arg(mask));
- } else {
- rfcRaw(QString("SERVLIST %1 %2").arg(mask, type));
- }
- }
- void
- Socket::rfcStats(const QString &query, const QString &target)
- {
- if (query.isEmpty() && target.isEmpty()) {
- rfcRaw("STATS");
- } else if (target.isEmpty()) {
- rfcRaw(QString("STATS %1").arg(query));
- } else {
- rfcRaw(QString("STATS %1 %2").arg(query, target));
- }
- }
- void
- Socket::rfcSQuit(const QString &server, const QString &comment)
- {
- rfcRaw(QString("SQUIT %1 :%2").arg(server, comment));
- }
- void
- Socket::rfcSummon(const QString &user, const QString &target, const QString &channel)
- {
- if (target.isEmpty() && channel.isEmpty()) {
- rfcRaw(QString("SUMMON %1").arg(user));
- } else if (channel.isEmpty()) {
- rfcRaw(QString("SUMMON %1 %2").arg(user, target));
- } else {
- rfcRaw(QString("SUMMON %1 %2 %3").arg(user, target, channel));
- }
- }
- void
- Socket::rfcTime(const QString &target)
- {
- if (target.isEmpty()) {
- rfcRaw("TIME");
- } else {
- rfcRaw(QString("TIME %1").arg(target));
- }
- }
- void
- Socket::rfcTopic(const QString &channel, const QString &topic)
- {
- if (topic.isEmpty() && topic.isNull()) {
- rfcRaw(QString("TOPIC %1").arg(channel));
- } else if (topic.isEmpty() && !topic.isNull()) {
- rfcRaw(QString("TOPIC %1 : ").arg(channel));
- } else {
- rfcRaw(QString("TOPIC %1 :%2").arg(channel, topic));
- }
- }
- void
- Socket::rfcTrace(const QString &target)
- {
- if (target.isEmpty()) {
- rfcRaw("TRACE");
- } else {
- rfcRaw(QString("TRACE %1").arg(target));
- }
- }
- void
- Socket::rfcUser(const QString &identity, bool isInvisible, const QString &realName)
- {
- rfcRaw(QString("USER %1 %2 * :%3").arg(identity, isInvisible ? "8" : "0", realName));
- }
- void
- Socket::rfcUserHost(const QString &nick)
- {
- rfcRaw(QString("USERHOST %1").arg(nick));
- }
- void
- Socket::rfcUserHost(const QStringList &nicks)
- {
- QString nickList = nicks.join(QChar(','));
- rfcRaw(nickList);
- }
- void
- Socket::rfcUsers(const QString &target)
- {
- if (target.isEmpty()) {
- rfcRaw("USERS");
- } else {
- rfcRaw(QString("USERS %1").arg(target));
- }
- }
- void
- Socket::rfcVersion(const QString &target)
- {
- if (target.isEmpty()) {
- rfcRaw("VERSION");
- } else {
- rfcRaw(QString("VERSION %1").arg(target));
- }
- }
- void
- Socket::rfcWallOps(const QString &text)
- {
- rfcRaw(QString("WALLOPS %1").arg(text));
- }
- void
- Socket::rfcWho(const QString &mask, bool ircOp)
- {
- if (mask.isEmpty() && !ircOp) {
- rfcRaw("WHO\r\n");
- } else if (!ircOp) {
- rfcRaw(QString("WHO %1").arg(mask));
- } else {
- rfcRaw(QString("WHO %1 o").arg(mask));
- }
- }
- void
- Socket::rfcWhoIs(const QString &mask)
- {
- rfcRaw(QString("WHOIS %1").arg(mask));
- }
- void
- Socket::rfcWhoIs(const QStringList &masks)
- {
- QString maskList = masks.join(QChar(','));
- rfcWhoIs(maskList);
- }
- void
- Socket::rfcWhoIs(const QString &target, const QString &mask)
- {
- rfcRaw(QString("WHOIS %1 %2").arg(target, mask));
- }
- void
- Socket::rfcWhoWas(const QString &nick, const QString &count, const QString &target)
- {
- if (count.isEmpty() && target.isEmpty()) {
- rfcRaw(QString("WHOWAS %1").arg(nick));
- } else if (target.isEmpty()) {
- rfcRaw(QString("WHOWAS %1 %2").arg(nick, count));
- } else {
- rfcRaw(QString("WHOWAS %1 %2 %3").arg(nick, count, target));
- }
- }
- void
- Socket::rfcWhoIs(const QString &target, const QStringList &masks)
- {
- QString maskList = masks.join(QChar(','));
- rfcWhoIs(target, maskList);
- }
- void
- Socket::rfcWhoWas(const QStringList &nicks, const QString &count, const QString &target)
- {
- QString nickList = nicks.join(QChar(','));
- rfcWhoWas(nickList, count, target);
- }
- QTextCodec*
- Socket::codec()
- {
- return d->codec;
- }
- void
- Socket::connectToHost()
- {
- if (addressList()[d->addressListIndex].contains('/')) {
- QStringList tmp = addressList()[d->addressListIndex].split('/');
- d->currentAddress = tmp[0];
- d->currentPort = tmp[1].toUShort();
- } else {
- d->currentAddress = addressList()[d->addressListIndex];
- d->currentPort = 6667;
- }
- connectToHost(currentAddress(), currentPort());
- }
- void
- Socket::connectToHost(const QString &address, quint16 port)
- {
- if (isSslEnabled()) {
- kDebug() << "Connecting via SSL";
- d->socket->connectToHostEncrypted(address, port);
- } else {
- kDebug() << "Connecting via Normal";
- d->socket->connectToHost(address, port);
- }
- }
- void
- Socket::setAutoIdentify(bool enable)
- {
- d->autoIdentify = enable;
- }
- void
- Socket::setAutoReconnect(bool enable)
- {
- d->autoReconnection = enable;
- }
- void
- Socket::setEncoding(const QByteArray &name)
- {
- d->codec = QTextCodec::codecForName(name);
- }
- void
- Socket::setServiceName(const QString &name)
- {
- d->serviceName = name;
- }
- void
- Socket::setServicePassword(const QString &password)
- {
- d->servicePassword = password;
- }
- void
- Socket::setSsl(bool enable)
- {
- d->ssl = enable;
- }
- bool
- Socket::isSslEnabled() const
- {
- return d->ssl;
- }
- #include "socket.moc"
Add Comment
Please, Sign In to add comment