/*! \brief Called when a player votes for a major race mode.
 *  \param event : Event providing the information.
 *
 *  Format of the data :
 *  Byte 0   1            5   6           7   8      9   10                  11
 *       ---------------------------------------------------------------------
 *  Size | 1 |      4     | 1 |     1     | 1 |   1  | 1 |       1           |
 *  Data | 4 | priv token | 1 | player id | 1 | laps | 1 | track number (gp) |
 *       ---------------------------------------------------------------------
 */
void ClientLobbyRoomProtocol::playerLapsVote(Event* event)
{
    const NetworkString &data = event->data();
    if (!checkDataSizeAndToken(event, 9))
        return;
    if (!isByteCorrect(event, 5, 1))
        return;
    if (!isByteCorrect(event, 7, 1))
        return;
    m_setup->getRaceConfig()->setPlayerLapsVote(data[6], data[8], data[10]);
}   // playerLapsVote
/*! \brief Called when a player votes for a track.
 *  \param event : Event providing the information.
 *
 *  Format of the data :
 *  Byte 0   1            5   6           7   8            N+8 N+9                 N+10
 *       ---------------------------------------------------------------------------
 *  Size | 1 |      4     | 1 |      1    | 1 |      N     | 1 |       1           |
 *  Data | 4 | priv token | 1 | player id | N | track name | 1 | track number (gp) |
 *       ---------------------------------------------------------------------------
 */
void ClientLobbyRoomProtocol::playerTrackVote(Event* event)
{
    const NetworkString &data = event->data();
    if (!checkDataSizeAndToken(event, 10))
        return;
    if (!isByteCorrect(event, 5, 1))
        return;
    int N = data[7];
    std::string track_name = data.getString(8, N);
    if (!isByteCorrect(event, N+8, 1))
        return;
    m_setup->getRaceConfig()->setPlayerTrackVote(data[6], track_name, data[N+9]);
}   // playerTrackVote
/*! \brief Called when a player votes for a major race mode.
 *  \param event : Event providing the information.
 *
 *  Format of the data :
 *  Byte 0   1            5   6      7   8                   9
 *       -----------------------------------------------------
 *  Size | 1 |      4     | 1 |   1  | 1 |       1           |
 *  Data | 4 | priv token | 1 | laps | 1 | track number (gp) |
 *       -----------------------------------------------------
 */
void ServerLobbyRoomProtocol::playerLapsVote(Event* event)
{
    NetworkString &data = event->data();
    STKPeer* peer = event->getPeer();
    if (!checkDataSizeAndToken(event, 9))
        return;
    if (!isByteCorrect(event, 5, 1))
        return;
    if (!isByteCorrect(event, 7, 1))
        return;
    uint8_t player_id = peer->getPlayerProfile()->getGlobalPlayerId();
    m_setup->getRaceConfig()->setPlayerLapsVote(player_id, data[6], data[8]);
    // Send the vote to everybody (including the sender)
    data.removeFront(5); // remove the token
    NetworkString other(2+data.size());
    other.ai8(1).ai8(player_id); // add the player id
    other += data; // add the data
    sendMessageToPeersChangingToken(LE_VOTE_LAPS, other);
}   // playerLapsVote
/*! \brief Called when a player votes for a major race mode.
 *  \param event : Event providing the information.
 *
 *  Format of the data :
 *  Byte 0   1            5   6      7   8                   9
 *       -----------------------------------------------------
 *  Size | 1 |      4     | 1 |   1  | 1 |       1           |
 *  Data | 4 | priv token | 1 | laps | 1 | track number (gp) |
 *       -----------------------------------------------------
 */
void ServerLobbyRoomProtocol::playerLapsVote(Event* event)
{
    NetworkString data = event->data();
    STKPeer* peer = *(event->peer);
    if (!checkDataSizeAndToken(event, 9))
        return;
    if (!isByteCorrect(event, 5, 1))
        return;
    if (!isByteCorrect(event, 7, 1))
        return;
    uint8_t player_id = peer->getPlayerProfile()->race_id;
    m_setup->getRaceConfig()->setPlayerLapsVote(player_id, data[6], data[8]);
    // Send the vote to everybody (including the sender)
    NetworkString other;
    other.ai8(1).ai8(player_id); // add the player id
    data.removeFront(5); // remove the token
    other += data; // add the data
    NetworkString prefix;
    prefix.ai8(0xc5); // prefix the token with the ype
    sendMessageToPeersChangingToken(prefix, other);
}
/*! \brief Called when a player votes for a track.
 *  \param event : Event providing the information.
 *
 *  Format of the data :
 *  Byte 0   1            5   6            N+6 N+7                 N+8
 *       -----------------------------------------------------------
 *  Size | 1 |      4     | 1 |      N     | 1 |       1           |
 *  Data | 4 | priv token | N | track name | 1 | track number (gp) |
 *       -----------------------------------------------------------
 */
void ServerLobbyRoomProtocol::playerTrackVote(Event* event)
{
    NetworkString &data = event->data();
    STKPeer* peer = event->getPeer();
    if (!checkDataSizeAndToken(event, 8))
        return;
    std::string track_name;
    int N = data.decodeString(5, &track_name);
    if (!isByteCorrect(event, N+5, 1))
        return;
    uint8_t player_id = peer->getPlayerProfile()->getGlobalPlayerId();
    m_setup->getRaceConfig()->setPlayerTrackVote(player_id, track_name, data[N+6]);
    // Send the vote to everybody (including the sender)
    data.removeFront(5); // remove the token
    NetworkString other(2+data.size());
    other.ai8(1).ai8(player_id); // add the player id
    other += data; // add the data
    sendMessageToPeersChangingToken(LE_VOTE_TRACK, other);
    if(m_setup->getRaceConfig()->getNumTrackVotes()==m_setup->getPlayerCount())
        startGame();
}   // playerTrackVote