* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
+#include <QHostInfo>
+
#include "corenetwork.h"
#include "core.h"
connect(this, SIGNAL(newEvent(Event *)), coreSession()->eventManager(), SLOT(postEvent(Event *)));
if (Quassel::isOptionSet("oidentd")) {
- connect(this, SIGNAL(socketInitialized(const CoreIdentity*, QHostAddress, quint16, QHostAddress, quint16)), Core::instance()->oidentdConfigGenerator(), SLOT(addSocket(const CoreIdentity*, QHostAddress, quint16, QHostAddress, quint16)), Qt::BlockingQueuedConnection);
+ connect(this, SIGNAL(socketOpen(const CoreIdentity*, QHostAddress, quint16, QHostAddress, quint16)), Core::instance()->oidentdConfigGenerator(), SLOT(addSocket(const CoreIdentity*, QHostAddress, quint16, QHostAddress, quint16)), Qt::BlockingQueuedConnection);
connect(this, SIGNAL(socketDisconnected(const CoreIdentity*, QHostAddress, quint16, QHostAddress, quint16)), Core::instance()->oidentdConfigGenerator(), SLOT(removeSocket(const CoreIdentity*, QHostAddress, quint16, QHostAddress, quint16)));
}
}
enablePingTimeout();
+ // Qt caches DNS entries for a minute, resulting in round-robin (e.g. for chat.freenode.net) not working if several users
+ // connect at a similar time. QHostInfo::fromName(), however, always performs a fresh lookup, overwriting the cache entry.
+ QHostInfo::fromName(server.host);
+
#ifdef HAVE_SSL
- socket.setProtocol((QSsl::SslProtocol)server.sslVersion);
if (server.useSsl) {
CoreIdentity *identity = identityPtr();
if (identity) {
if (!prefix.isEmpty())
msg += ":" + prefix + " ";
- msg += cmd.toUpper().toAscii();
+ msg += cmd.toUpper().toLatin1();
+
+ for (int i = 0; i < params.size(); i++) {
+ msg += " ";
- for (int i = 0; i < params.size() - 1; i++) {
- msg += " " + params[i];
+ if (i == params.size() - 1 && (params[i].contains(' ') || (!params[i].isEmpty() && params[i][0] == ':')))
+ msg += ":";
+
+ msg += params[i];
}
- if (!params.isEmpty())
- msg += " :" + params.last();
putRawLine(msg);
}
{
while (socket.canReadLine()) {
QByteArray s = socket.readLine();
- s.chop(2);
+ if (s.endsWith("\r\n"))
+ s.chop(2);
+ else if (s.endsWith("\n"))
+ s.chop(1);
NetworkDataEvent *event = new NetworkDataEvent(EventManager::NetworkIncoming, this, s);
#if QT_VERSION >= 0x040700
event->setTimestamp(QDateTime::currentDateTimeUtc());
void CoreNetwork::socketInitialized()
{
- Server server = usedServer();
-#ifdef HAVE_SSL
- if (server.useSsl && !socket.isEncrypted())
- return;
-#endif
-
- socket.setSocketOption(QAbstractSocket::KeepAliveOption, true);
-
CoreIdentity *identity = identityPtr();
if (!identity) {
qCritical() << "Identity invalid!";
disconnectFromIrc();
return;
}
+
+ emit socketOpen(identity, localAddress(), localPort(), peerAddress(), peerPort());
+
+ Server server = usedServer();
+#ifdef HAVE_SSL
+ if (server.useSsl && !socket.isEncrypted())
+ return;
+#endif
+#if QT_VERSION >= 0x040600
+ socket.setSocketOption(QAbstractSocket::KeepAliveOption, true);
+#endif
emit socketInitialized(identity, localAddress(), localPort(), peerAddress(), peerPort());