stateMachine->addState(recieveState);
stateMachine->addState(recieveFailState);
stateMachine->setInitialState(disconnectedState);
- stateMachine->setErrorState(errorState);
connectedState->setInitialState(sendState);
connectedHistoryState->setDefaultState(sendState);
idleTimeoutState->addTransition(this, SIGNAL(startSending()), sendState);
recieveState->addTransition(this, SIGNAL(authenticated()), authenticatingState);
- recieveFailState->addTransition(this, SIGNAL(connectionError()), errorState);
+ recieveState->addTransition(this, SIGNAL(connectionError()), errorState);
+ recieveState->addTransition(this, SIGNAL(replyRecieved()), connectedHistoryState);
+
- recieveState->addTransition(connectedHistoryState);
+ recieveFailState->addTransition(this, SIGNAL(connectionError()), errorState);
recieveFailState->addTransition(sendState);
// ------------ END Transitions -------------------
void Client::enterErrorState()
{
qDebug() << "Entering Error State";
+ disconnect();
}
void Client::enterDisconnectedState()
.arg(senderPort)
.arg(reply);
-/*
+
// Check if it is a 6xx error.
{
- QRegExp rx("6[0-9]{2} ");
+ QRegExp rx("(?:50[34]|555|6[0-9]{2}) ");
if (rx.exactMatch(tmp.mid(0, 4)))
{
qDebug() << QString("SERVER ERROR %1").arg(replyCode);
}
emit connectionError();
+ goto endLoop;
break;
}
+ continue;
}
- continue;
}
-*/
+
QByteArray commandId = tmp.mid(0, 5);
commandsTimedOut = 0;
// Do not parse reply for unknown commands.
if (!sentCommands.contains(commandId))
{
- qDebug() << QString("Unknown command with id: %1, discarding")
- .arg(commandId.constData());
+qDebug() << QString("Unknown command with id: %1, discarding")
+ .arg(commandId.constData());
continue;
}
- qDebug() << QString("Sending reply to command with id: %1")
- .arg(commandId.constData());
+qDebug() << QString("Sending reply to command with id: %1")
+ .arg(commandId.constData());
// tag + space = 5 + 1
QByteArray replyCodeText = tmp.mid(6, 3);
case LOGGED_OUT:
m_sessionId.clear();
break;
+ case CLIENT_VERSION_OUTDATED:
+ m_error = ClientVersionOutdatedError;
+ m_errorString = tr("Client version outdated");
+ emit connectionError();
+ goto endLoop;
+ break;
+ case CLIENT_BANNED:
+ m_error = ClientBannedError;
+ m_errorString = tr("UDP Client banned");
+ emit connectionError();
+ goto endLoop;
+ break;
case BANNED:
m_error = BannedError;
- m_errorString = reply.mid(10);
+ m_errorString = tr("User banned from UDP API: %1").arg(reply.mid(10));
emit connectionError();
goto endLoop;
break;
m_errorString = tr("Server busy. Try again later. Wait at least 30 minutes.");
emit connectionError();
goto endLoop;
+ break;
default:
if (replyCode > 601 && replyCode < 700)
{
continueLoop:
;
}
+ // replyRecieved() should be emitted on success
+ // all connection errors go directly to endLoops
+ emit replyRecieved();
endLoop:
;
}