qmlfrontend/net_session.cpp
changeset 14915 a3ad06ac390e
child 15039 a4a058dcbbd6
equal deleted inserted replaced
14914:9ab78e08a34c 14915:a3ad06ac390e
       
     1 #include "net_session.h"
       
     2 
       
     3 NetSession::NetSession(QObject *parent) : QObject(parent) {}
       
     4 
       
     5 QUrl NetSession::url() const { return m_url; }
       
     6 
       
     7 QAbstractSocket::SocketState NetSession::state() const {
       
     8   if (m_socket)
       
     9     return m_socket->state();
       
    10   else
       
    11     return QAbstractSocket::UnconnectedState;
       
    12 }
       
    13 
       
    14 void NetSession::open() {
       
    15   m_socket.reset(new QTcpSocket());
       
    16 
       
    17   connect(m_socket.data(), &QAbstractSocket::stateChanged, this,
       
    18           &NetSession::stateChanged);
       
    19   connect(m_socket.data(), &QTcpSocket::readyRead, this,
       
    20           &NetSession::onReadyRead);
       
    21 
       
    22   m_socket->connectToHost(m_url.host(),
       
    23                           static_cast<quint16>(m_url.port(46631)));
       
    24 }
       
    25 
       
    26 QString NetSession::nickname() const { return m_nickname; }
       
    27 
       
    28 QString NetSession::password() const { return m_password; }
       
    29 
       
    30 NetSession::SessionState NetSession::sessionState() const {
       
    31   return m_sessionState;
       
    32 }
       
    33 
       
    34 void NetSession::setUrl(const QUrl &url) {
       
    35   if (m_url == url) return;
       
    36 
       
    37   m_url = url;
       
    38   emit urlChanged(m_url);
       
    39 }
       
    40 
       
    41 void NetSession::setNickname(const QString &nickname) {
       
    42   if (m_nickname == nickname) return;
       
    43 
       
    44   m_nickname = nickname;
       
    45   emit nicknameChanged(m_nickname);
       
    46 }
       
    47 
       
    48 void NetSession::setPassword(const QString &password) {
       
    49   if (m_password == password) return;
       
    50 
       
    51   m_password = password;
       
    52   emit passwordChanged(m_password);
       
    53 }
       
    54 
       
    55 void NetSession::close() {
       
    56   if (!m_socket.isNull()) {
       
    57     m_socket->disconnectFromHost();
       
    58     m_socket.clear();
       
    59 
       
    60     setSessionState(NotConnected);
       
    61   }
       
    62 }
       
    63 
       
    64 void NetSession::onReadyRead() {
       
    65   while (m_socket->canReadLine()) {
       
    66     auto line = QString::fromUtf8(m_socket->readLine().simplified());
       
    67 
       
    68     if (line.isEmpty()) {
       
    69       parseNetMessage(m_buffer);
       
    70       m_buffer.clear();
       
    71     } else {
       
    72       m_buffer.append(line);
       
    73     }
       
    74   }
       
    75 }
       
    76 
       
    77 void NetSession::parseNetMessage(const QStringList &message) {
       
    78   if (message.isEmpty()) {
       
    79     qWarning() << "Empty net message received";
       
    80     return;
       
    81   }
       
    82 
       
    83   qDebug() << "[SERVER]" << message;
       
    84 
       
    85   using Handler = std::function<void(NetSession *, const QStringList &)>;
       
    86   static QMap<QString, Handler> commandsMap{
       
    87       {"CONNECTED", &NetSession::handleConnected},
       
    88       {"PING", &NetSession::handlePing},
       
    89       {"BYE", &NetSession::handleBye}};
       
    90 
       
    91   auto handler =
       
    92       commandsMap.value(message[0], &NetSession::handleUnknownCommand);
       
    93 
       
    94   handler(this, message.mid(1));
       
    95 }
       
    96 
       
    97 void NetSession::handleConnected(const QStringList &parameters) {
       
    98   setSessionState(Login);
       
    99 }
       
   100 
       
   101 void NetSession::handlePing(const QStringList &parameters) {
       
   102   send("PONG", parameters);
       
   103 }
       
   104 
       
   105 void NetSession::handleBye(const QStringList &parameters) { close(); }
       
   106 
       
   107 void NetSession::handleUnknownCommand(const QStringList &parameters) {
       
   108   Q_UNUSED(parameters);
       
   109 
       
   110   qWarning() << "Command is not recognized";
       
   111 }
       
   112 
       
   113 void NetSession::send(const QString &message) { send(QStringList(message)); }
       
   114 
       
   115 void NetSession::send(const QString &message, const QString &param) {
       
   116   send(QStringList{message, param});
       
   117 }
       
   118 
       
   119 void NetSession::send(const QString &message, const QStringList &parameters) {
       
   120   send(QStringList(message) + parameters);
       
   121 }
       
   122 
       
   123 void NetSession::send(const QStringList &message) {
       
   124   Q_ASSERT(!m_socket.isNull());
       
   125 
       
   126   qDebug() << "[CLIENT]" << message;
       
   127 
       
   128   m_socket->write(message.join('\n').toUtf8() + "\n\n");
       
   129 }
       
   130 
       
   131 void NetSession::setSessionState(NetSession::SessionState sessionState) {
       
   132   if (m_sessionState == sessionState) return;
       
   133 
       
   134   m_sessionState = sessionState;
       
   135 
       
   136   emit sessionStateChanged(sessionState);
       
   137 }