Example #1
0
void GameHandler::on_link_lost(SEGSEvent *ev)
{
    GameLink * lnk = (GameLink *)ev->src();
    GameSession &session = m_session_store.session_from_event(ev);

    if(session.is_connected_to_map_server_id==0)
    {
        if(session.m_direction==GameSession::EXITING_TO_MAP)
        {
            SessionStore::MTGuard guard(m_session_store.reap_lock());
            m_session_store.mark_session_for_reaping(&session,lnk->session_token());
            m_session_store.session_link_lost(lnk->session_token());
        }
        else
        {
            EventProcessor * tgt = HandlerLocator::getAuth_Handler();
            tgt->putq(new ClientDisconnectedMessage({lnk->session_token()}));
            m_session_store.session_link_lost(lnk->session_token());
            m_session_store.remove_by_token(lnk->session_token(), session.auth_id());
        }
    }
    else
        m_session_store.session_link_lost(lnk->session_token());
    // Post disconnect event to link, will close it's processing loop
    lnk->putq(new DisconnectEvent(lnk->session_token()));
}
Example #2
0
void GameHandler::on_disconnect(DisconnectRequest *ev)
{
    GameLink * lnk = (GameLink *)ev->src();
    GameSession &session = m_session_store.session_from_event(ev);
    if(session.is_connected_to_map_server_id==0)
    {
        if(session.m_direction==GameSession::EXITING_TO_MAP)
        {
            SessionStore::MTGuard guard(m_session_store.reap_lock());
            m_session_store.mark_session_for_reaping(&session,lnk->session_token());
            m_session_store.session_link_lost(lnk->session_token());
        }
        else
        {
            EventProcessor * tgt = HandlerLocator::getAuth_Handler();
            tgt->putq(new ClientDisconnectedMessage({lnk->session_token()}));
            m_session_store.session_link_lost(lnk->session_token());
            m_session_store.remove_by_token(lnk->session_token(), session.auth_id());
        }
    }
    else
        m_session_store.session_link_lost(lnk->session_token());
    lnk->putq(new DisconnectResponse);
    // Post disconnect event to link, will close it's processing loop, after it sends the response
    lnk->putq(new DisconnectEvent(lnk->session_token())); // this should work, event if different threads try to do it in parallel
}
Example #3
0
void GameHandler::reap_stale_links()
{
    SessionStore::MTGuard guard(m_session_store.reap_lock());
    EventProcessor *            tgt      = HandlerLocator::getAuth_Handler();
    m_session_store.reap_stale_links("GameInstance", link_is_stale_if_disconnected_for,
                                     [tgt](uint64_t tok) {
                                         tgt->putq(new ClientDisconnectedMessage({tok}));
                                     });
}
Example #4
0
void COgreKeyboard::init ( RenderWindow *theWindow )
{
	if (eventProcessor)
		kill();

	eventProcessor = new EventProcessor();
	eventProcessor->initialise(theWindow);
	eventProcessor->addKeyListener(this);

	eventProcessor->startProcessingEvents();
}
Example #5
0
///
/// \brief This handler is called when we get the account information for a
/// \param ev
///
void GameHandler::on_account_data(GameAccountResponse *ev)
{
    GameSession &session(m_session_store.session_from_event(ev));
    // we've got db answer, session is ok again
    m_session_store.locked_unmark_session_for_reaping(&session);
    session.m_game_account = ev->m_data;
    // Inform auth server about succesful client connection
    EventProcessor *tgt      = HandlerLocator::getAuth_Handler();
    tgt->putq(new ClientConnectedMessage({ev->session_token(),m_server->getId(),0 }));

    m_session_store.add_to_active_sessions(&session);
    CharacterSlots *slots_event=new CharacterSlots;
    slots_event->set_account_data(&session.m_game_account);
    session.link()->putq(slots_event);
}
Example #6
0
/*!
 * @brief       Add a user
 * @param[in]   username
 * @param[in]   password
 * @param[in]   access_level
 * @return      Returns a string, if successful "OK" otherwise an error
 */
QString AdminRPC::addUser(const QString &username, const QString &password, int access_level)
{
    QString result;
    uint64_t fake_session_token = s_last_token++;
    int token = static_cast<int>(fake_session_token);

    // Create and insert a record of this request into m_completion_state
    m_completion_state.insert(token, "");

    qCDebug(logRPC) << "addUser call in progress";

    EventProcessor *tgt = HandlerLocator::getAuthDB_Handler();
    tgt->putq(new CreateAccountMessage({username, password, access_level}, fake_session_token, this));

    QTimer response_timer;
    QTimer timeout;
    timeout.setSingleShot(true);
    QEventLoop loop;
    loop.connect(&timeout, SIGNAL(timeout()), SLOT(quit()));
    loop.connect(this, SIGNAL(responseRecieved()), SLOT(quit()));
    loop.connect(&response_timer, &QTimer::timeout, [=] () {
        if (!m_completion_state[token].isEmpty())
        {
            emit responseRecieved(); // Response recieved we can break out of event loop
            return;
        }
        else
            return;
    });
    response_timer.start(500); // Checks completion status every 500ms
    timeout.start(5000); // Timeout of 5 seconds in case something goes wrong.
    loop.exec();

    if (!m_completion_state[token].isEmpty())
    {
        result = m_completion_state[token];
        response_timer.stop();
        m_completion_state.remove(token); // Tidy up
    }
    else
    {
        result = "Something went wrong";
        response_timer.stop();
        m_completion_state.remove(token);
    }

    return result;
}
Example #7
0
void LoadBBY::loadEvents(API::Progress &prog, const char *progMsg,
                         ANSTO::Tar::File &tarFile,
                         EventProcessor &eventProcessor) {
  prog.doReport(progMsg);

  // select bin file
  int64_t fileSize = 0;
  const std::vector<std::string> &files = tarFile.files();
  for (const auto &file : files)
    if (file.rfind(".bin") == file.length() - 4) {
      tarFile.select(file.c_str());
      fileSize = tarFile.selected_size();
      break;
    }

  // for progress notifications
  ANSTO::ProgressTracker progTracker(prog, progMsg, fileSize,
                                     Progress_LoadBinFile);

  uint64_t x = 0; // 9 bits [0-239] tube number
  uint64_t y = 0; // 8 bits [0-255] position along tube

  // uint v = 0; // 0 bits [     ]
  // uint w = 0; // 0 bits [     ] energy
  uint64_t dt = 0;
  double tof = 0.0;

  if ((fileSize == 0) || !tarFile.skip(128))
    return;

  int state = 0;
  uint64_t c;
  while ((c = static_cast<unsigned int>(tarFile.read_byte())) !=
         static_cast<unsigned int>(-1)) {

    bool event_ended = false;
    switch (state) {
    case 0:
      x = (c & 0xFF) >> 0; // set bit 1-8
      break;

    case 1:
      x |= (c & 0x01) << 8; // set bit 9
      y = (c & 0xFE) >> 1;  // set bit 1-7
      break;

    case 2:
      event_ended = (c & 0xC0) != 0xC0;
      if (!event_ended)
        c &= 0x3F;

      y |= (c & 0x01) << 7; // set bit 8
      dt = (c & 0xFE) >> 1; // set bit 1-5(7)
      break;

    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
    case 8:
      event_ended = (c & 0xC0) != 0xC0;
      if (!event_ended)
        c &= 0x3F;

      dt |= (c & 0xFF) << (5 + 6 * (state - 3)); // set bit 6...
      break;
    }
    state++;

    if (event_ended || (state == 8)) {
      state = 0;

      if ((x == 0) && (y == 0) && (dt == 0xFFFFFFFF)) {
        tof = 0.0;
        eventProcessor.newFrame();
      } else if ((x >= HISTO_BINS_X) || (y >= HISTO_BINS_Y)) {
        // ignore
      } else {
        // conversion from 100 nanoseconds to 1 microsecond
        tof += static_cast<int>(dt) * 0.1;

        eventProcessor.addEvent(x, y, tof);
      }

      progTracker.update(tarFile.selected_position());
    }
  }
}