SignalProxy *p = signalProxy();
connect(p, SIGNAL(peerRemoved(QIODevice *)), this, SLOT(removeClient(QIODevice *)));
+ connect(p, SIGNAL(connected()), this, SLOT(clientsConnected()));
+ connect(p, SIGNAL(disconnected()), this, SLOT(clientsDisconnected()));
+
//p->attachSlot(SIGNAL(disconnectFromNetwork(NetworkId)), this, SLOT(disconnectFromNetwork(NetworkId))); // FIXME
p->attachSlot(SIGNAL(sendInput(BufferInfo, QString)), this, SLOT(msgFromClient(BufferInfo, QString)));
p->attachSignal(this, SIGNAL(displayMsg(Message)));
}
}
-UserId CoreSession::user() const {
- return _user;
-}
-
CoreNetwork *CoreSession::network(NetworkId id) const {
if(_networks.contains(id)) return _networks[id];
return 0;
foreach(IdentityId id, s.identityIds()) {
Identity *i = new Identity(s.identity(id), this);
if(!i->isValid()) {
- quWarning() << "Invalid identity! Removing...";
+ qWarning() << "Invalid identity! Removing...";
s.removeIdentity(id);
delete i;
continue;
}
if(_identities.contains(i->id())) {
- quWarning() << "Duplicate identity, ignoring!";
+ qWarning() << "Duplicate identity, ignoring!";
delete i;
continue;
}
void CoreSession::connectToNetwork(NetworkId id) {
CoreNetwork *net = network(id);
if(!net) {
- quWarning() << "Connect to unknown network requested! net:" << id << "user:" << user();
+ qWarning() << "Connect to unknown network requested! net:" << id << "user:" << user();
return;
}
void CoreSession::addClient(QIODevice *device) {
if(!device) {
- quError() << "Invoking CoreSession::addClient with a QObject that is not a QIODevice!";
+ qCritical() << "Invoking CoreSession::addClient with a QObject that is not a QIODevice!";
} else {
+ // if the socket is an orphan, the signalProxy adopts it.
+ // -> we don't need to care about it anymore
+ device->setParent(0);
signalProxy()->addPeer(device);
QVariantMap reply;
reply["MsgType"] = "SessionInit";
QTcpSocket *socket = qobject_cast<QTcpSocket *>(iodev);
if(socket)
quInfo() << qPrintable(tr("Client")) << qPrintable(socket->peerAddress().toString()) << qPrintable(tr("disconnected (UserId: %1).").arg(user().toInt()));
- iodev->deleteLater();
}
SignalProxy *CoreSession::signalProxy() const {
if(conn) {
conn->userInput(bufinfo, msg);
} else {
- quWarning() << "Trying to send to unconnected network:" << msg;
+ qWarning() << "Trying to send to unconnected network:" << msg;
}
}
void CoreSession::identityUpdated(const QVariantMap &data) {
IdentityId id = data.value("identityId", 0).value<IdentityId>();
if(!id.isValid() || !_identities.contains(id)) {
- quWarning() << "Update request for unknown identity received!";
+ qWarning() << "Update request for unknown identity received!";
return;
}
CoreUserSettings s(user());
Core::createNetwork(user(), info);
if(!info.networkId.isValid()) {
- quWarning() << qPrintable(tr("CoreSession::createNetwork(): Got invalid networkId from Core when trying to create network %1!").arg(info.networkName));
+ qWarning() << qPrintable(tr("CoreSession::createNetwork(): Got invalid networkId from Core when trying to create network %1!").arg(info.networkName));
return;
}
signalProxy()->synchronize(net);
emit networkCreated(id);
} else {
- quWarning() << qPrintable(tr("CoreSession::createNetwork(): Trying to create a network that already exists, updating instead!"));
+ qWarning() << qPrintable(tr("CoreSession::createNetwork(): Trying to create a network that already exists, updating instead!"));
_networks[info.networkId]->requestSetNetworkInfo(info);
}
}
void CoreSession::removeBufferRequested(BufferId bufferId) {
BufferInfo bufferInfo = Core::getBufferInfo(user(), bufferId);
if(!bufferInfo.isValid()) {
- quWarning() << "CoreSession::removeBufferRequested(): invalid BufferId:" << bufferId << "for User:" << user();
+ qWarning() << "CoreSession::removeBufferRequested(): invalid BufferId:" << bufferId << "for User:" << user();
return;
}
if(bufferInfo.type() == BufferInfo::StatusBuffer) {
- quWarning() << "CoreSession::removeBufferRequested(): Status Buffers cannot be removed!";
+ qWarning() << "CoreSession::removeBufferRequested(): Status Buffers cannot be removed!";
return;
}
if(bufferInfo.type() == BufferInfo::ChannelBuffer) {
CoreNetwork *net = network(bufferInfo.networkId());
if(!net) {
- quWarning() << "CoreSession::removeBufferRequested(): Received BufferInfo with unknown networkId!";
+ qWarning() << "CoreSession::removeBufferRequested(): Received BufferInfo with unknown networkId!";
return;
}
IrcChannel *chan = net->ircChannel(bufferInfo.bufferName());
if(chan) {
- quWarning() << "CoreSession::removeBufferRequested(): Unable to remove Buffer for joined Channel:" << bufferInfo.bufferName();
+ qWarning() << "CoreSession::removeBufferRequested(): Unable to remove Buffer for joined Channel:" << bufferInfo.bufferName();
return;
}
}
emit bufferRenamed(bufferId, newName);
}
}
+
+void CoreSession::clientsConnected() {
+ QHash<NetworkId, NetworkConnection *>::iterator conIter = _connections.begin();
+ Identity *identity = 0;
+ NetworkConnection *con = 0;
+ Network *network = 0;
+ IrcUser *me = 0;
+ QString awayReason;
+ while(conIter != _connections.end()) {
+ con = *conIter;
+ conIter++;
+
+ if(!con->isConnected())
+ continue;
+ identity = con->identity();
+ if(!identity)
+ continue;
+ network = con->network();
+ if(!network)
+ continue;
+ me = network->me();
+ if(!me)
+ continue;
+
+ if(identity->detachAwayEnabled() && me->isAway()) {
+ con->userInputHandler()->handleAway(BufferInfo(), QString());
+ }
+ }
+}
+
+void CoreSession::clientsDisconnected() {
+ QHash<NetworkId, NetworkConnection *>::iterator conIter = _connections.begin();
+ Identity *identity = 0;
+ NetworkConnection *con = 0;
+ Network *network = 0;
+ IrcUser *me = 0;
+ QString awayReason;
+ while(conIter != _connections.end()) {
+ con = *conIter;
+ conIter++;
+
+ if(!con->isConnected())
+ continue;
+ identity = con->identity();
+ if(!identity)
+ continue;
+ network = con->network();
+ if(!network)
+ continue;
+ me = network->me();
+ if(!me)
+ continue;
+
+ if(identity->detachAwayEnabled() && !me->isAway()) {
+ if(identity->detachAwayReasonEnabled())
+ awayReason = identity->detachAwayReason();
+ else
+ awayReason = identity->awayReason();
+ network->setAutoAwayActive(true);
+ con->userInputHandler()->handleAway(BufferInfo(), awayReason);
+ }
+ }
+}