#include "corenetwork.h"
#include "core.h"
-#include "coresession.h"
#include "coreidentity.h"
#include "corenetworkconfig.h"
-
-#include "ircserverhandler.h"
+#include "coresession.h"
#include "coreuserinputhandler.h"
-#include "ctcphandler.h"
+#include "networkevent.h"
INIT_SYNCABLE_OBJECT(CoreNetwork)
CoreNetwork::CoreNetwork(const NetworkId &networkid, CoreSession *session)
: Network(networkid, session),
_coreSession(session),
- _ircServerHandler(new IrcServerHandler(this)),
_userInputHandler(new CoreUserInputHandler(this)),
- _ctcpHandler(new CtcpHandler(this)),
_autoReconnectCount(0),
_quitRequested(false),
connect(&socket, SIGNAL(encrypted()), this, SLOT(socketInitialized()));
connect(&socket, SIGNAL(sslErrors(const QList<QSslError> &)), this, SLOT(sslErrors(const QList<QSslError> &)));
#endif
+ 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(socketDisconnected(const CoreIdentity*,QHostAddress,quint16,QHostAddress,quint16)), Core::instance()->oidentdConfigGenerator(), SLOT(removeSocket(const CoreIdentity*,QHostAddress,quint16,QHostAddress,quint16)));
+ }
}
CoreNetwork::~CoreNetwork() {
if(connectionState() != Disconnected && connectionState() != Network::Reconnecting)
disconnectFromIrc(false); // clean up, but this does not count as requested disconnect!
disconnect(&socket, 0, this, 0); // this keeps the socket from triggering events during clean up
- delete _ircServerHandler;
delete _userInputHandler;
- delete _ctcpHandler;
}
QString CoreNetwork::channelDecode(const QString &bufferName, const QByteArray &string) const {
_channelKeys.remove(channel.toLower());
}
+#ifdef HAVE_QCA2
+Cipher *CoreNetwork::cipher(const QString &target) const {
+ if(target.isEmpty())
+ return 0;
+
+ if(!Cipher::neededFeaturesAvailable())
+ return 0;
+
+ QByteArray key = cipherKey(target);
+ if(key.isEmpty())
+ return 0;
+
+ CoreIrcChannel *channel = qobject_cast<CoreIrcChannel *>(ircChannel(target));
+ if(channel) {
+ if(channel->cipher()->setKey(key))
+ return channel->cipher();
+ } else {
+ CoreIrcUser *user = qobject_cast<CoreIrcUser *>(ircUser(target));
+ if(user && user->cipher()->setKey(key))
+ return user->cipher();
+ }
+ return 0;
+}
+
+QByteArray CoreNetwork::cipherKey(const QString &recipient) const {
+ return _cipherKeys.value(recipient.toLower(), QByteArray());
+}
+
+void CoreNetwork::setCipherKey(const QString &recipient, const QByteArray &key) {
+ if(!key.isEmpty())
+ _cipherKeys[recipient.toLower()] = key;
+ else
+ _cipherKeys.remove(recipient.toLower());
+}
+#endif /* HAVE_QCA2 */
+
bool CoreNetwork::setAutoWhoDone(const QString &channel) {
QString chan = channel.toLower();
if(_autoWhoPending.value(chan, 0) <= 0)
void CoreNetwork::socketHasData() {
while(socket.canReadLine()) {
QByteArray s = socket.readLine().trimmed();
- ircServerHandler()->handleServerMsg(s);
+ NetworkDataEvent *event = new NetworkDataEvent(EventManager::NetworkIncoming, this, s);
+#if QT_VERSION >= 0x040700
+ event->setTimestamp(QDateTime::currentDateTimeUtc());
+#else
+ event->setTimestamp(QDateTime::currentDateTime().toUTC());
+#endif
+ emit newEvent(event);
}
}
return;
}
+ emit socketInitialized(identity, localAddress(), localPort(), peerAddress(), peerPort());
+
// TokenBucket to avoid sending too much at once
_messageDelay = 2200; // this seems to be a safe value (2.2 seconds delay)
_burstSize = 5;
setConnected(false);
emit disconnected(networkId());
+ emit socketDisconnected(identityPtr(), localAddress(), localPort(), peerAddress(), peerPort());
if(_quitRequested) {
_quitRequested = false;
setConnectionState(Network::Disconnected);
uint now = QDateTime::currentDateTime().toTime_t();
if(_pingCount != 0) {
qDebug() << "UserId:" << userId() << "Network:" << networkName() << "missed" << _pingCount << "pings."
- << "BA:" << socket.bytesAvailable() << "BTW:" << socket.bytesToWrite();
+ << "BA:" << socket.bytesAvailable() << "BTW:" << socket.bytesToWrite();
}
if((int)_pingCount >= networkConfig()->maxPingCount() && now - _lastPingTime <= (uint)(_pingTimer.interval() / 1000) + 1) {
// the second check compares the actual elapsed time since the last ping and the pingTimer interval