Beispiel #1
0
void MySQLClient::onTCPSocketEvent(TCPSocketEvent e)
{
  DBG("Event %d in MySQLClient::onTCPSocketEvent()\n", e);

  if(m_closed)
  {
    DBG("WARN: Discarded\n");
    return;
  }
  
  switch(e)
  {
  case TCPSOCKET_READABLE: //Incoming data
    resetTimeout();
    if(m_state == MYSQL_HANDSHAKE)
      handleHandshake();
    else if(m_state == MYSQL_AUTH)
      handleAuthResult();
    else if(m_state == MYSQL_COMMANDS)
      handleCommandResult();
    break;
  case TCPSOCKET_WRITEABLE: //We can send data
    resetTimeout();
    break;
  case TCPSOCKET_CONNECTED: //Connected, wait for handshake packet
    resetTimeout();
    break;
  case TCPSOCKET_CONTIMEOUT:
  case TCPSOCKET_CONRST:
  case TCPSOCKET_CONABRT:
  case TCPSOCKET_ERROR:
    DBG("Connection error.\n");
    onResult(MYSQL_CONN);
  case TCPSOCKET_DISCONNECTED:
    //There might still be some data available for reading
    //So if we are in a reading state, do not close the socket yet
    if(m_state != MYSQL_CLOSED)
    {
      onResult(MYSQL_CONN);
    }
    DBG("Connection closed by remote host.\n");
    break;
  }
}
void PacketHandler::readRaw(ConstBuffer buffer) {
  PacketReader packet(buffer);
  std::int32_t type = packet.readVarInt();
  PacketUniquePtr ptr;

  switch (mSession.getConnectionState()) {
  case ConnectionState::Handshake: {
    switch (type) {
    case 0x00: {
      packets::Handshake handshake(packet);
      handleHandshake(handshake);
      return;
    } break;

    default:
      break;
    }
  }
    break;

  case ConnectionState::Login: {
    switch (type) {
    case 0x00: {
      packets::LoginStart ls(packet);
      handleLoginStart(ls);
      return;
    }

    default:
      break;
    }
  } break;

  case ConnectionState::Status: {
    switch (type) {
    case 0x00:
      ptr = std::make_unique<packets::Request>(packet);
      break;

    case 0x01:
      ptr = std::make_unique<packets::Ping>(packet);
      break;

    default:
      break;
    }
  } break;

  case ConnectionState::Play: {
    switch (type) {
    case 0x02:
      ptr = std::make_unique<packets::ChatMessage>(packet);
      break;

    case 0x0D:
      ptr = std::make_unique<packets::PlayerPositionAndLook>(packet);
      break;

    case 0x0C:
      ptr = std::make_unique<packets::PlayerPosition>(packet);
      break;

    case 0x0E:
      ptr = std::make_unique<packets::PlayerLook>(packet);
      break;

    default:
      break;
    }
  } break;
  }

  addPacket(std::move(ptr));
}