Request request{socket, localPort, query, transactionId, _requestId++};
if (!success) {
- responseUnavailable(request);
- } else if (!responseAvailable(request)) {
- if (hasSocketsBelowId(transactionId)) {
- _requestQueue.emplace_back(request);
- } else {
- responseUnavailable(request);
- }
- }
-}
-
-bool IdentServer::responseAvailable(Request request) {
- QString user;
- bool success = true;
- if (_connections.contains(request.localPort)) {
- user = _connections[request.localPort];
+ request.respondError("NO-USER");
+ } else if (responseAvailable(request)) {
+ // success
+ } else if (lowestSocketId() < transactionId) {
+ _requestQueue.emplace_back(request);
} else {
- success = false;
+ request.respondError("NO-USER");
}
+}
- QString data;
- if (success) {
- data += request.query + " : USERID : Quassel : " + user + "\r\n";
+void Request::respondSuccess(const QString &user) {
+ QString data = query + " : USERID : Quassel : " + user + "\r\n";
- request.socket->write(data.toUtf8());
- request.socket->flush();
- request.socket->close();
- }
- return success;
+ socket->write(data.toUtf8());
+ socket->flush();
+ socket->close();
}
-void IdentServer::responseUnavailable(Request request) {
- QString data = request.query + " : ERROR : NO-USER\r\n";
+void Request::respondError(const QString &error) {
+ QString data = query + " : ERROR : " + error + "\r\n";
- request.socket->write(data.toUtf8());
- request.socket->flush();
- request.socket->close();
+ socket->write(data.toUtf8());
+ socket->flush();
+ socket->close();
}
+bool IdentServer::responseAvailable(Request request) {
+ if (!_connections.contains(request.localPort)) {
+ return false;
+ }
+
+ QString user = _connections[request.localPort];
+ request.respondSuccess(user);
+ return true;
+}
bool IdentServer::addSocket(const CoreIdentity *identity, const QHostAddress &localAddress, quint16 localPort,
const QHostAddress &peerAddress, quint16 peerPort, qint64 socketId) {
return newSocketId;
}
-bool IdentServer::hasSocketsBelowId(qint64 id) {
- return std::any_of(_waiting.begin(), _waiting.end(), [=](qint64 socketId) {
- return socketId <= id;
- });
+qint64 IdentServer::lowestSocketId() {
+ if (_waiting.empty()) {
+ return std::numeric_limits<qint64>::max();
+ }
+
+ return _waiting.front();
}
void IdentServer::removeWaitingSocket(qint64 socketId) {
}
void IdentServer::processWaiting(qint64 socketId) {
- qint64 lowestSocketId = std::numeric_limits<qint64 >::max();
- for (qint64 id : _waiting) {
- if (id < lowestSocketId) {
- lowestSocketId = id;
- }
- }
removeWaitingSocket(socketId);
_requestQueue.remove_if([=](Request request) {
- if (request.transactionId < lowestSocketId) {
- responseUnavailable(request);
+ if (socketId < request.transactionId && responseAvailable(request)) {
return true;
- } else if (request.transactionId > socketId) {
- return responseAvailable(request);
- } else {
+ } else if (lowestSocketId() < request.transactionId) {
return false;
+ } else {
+ request.respondError("NO-USER");
+ return true;
}
});
}