2013-07-22 04:21:56 -04:00
|
|
|
// Copyright 2013 Dolphin Emulator Project
|
2015-05-18 01:08:10 +02:00
|
|
|
// Licensed under GPLv2+
|
2013-07-22 04:21:56 -04:00
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
2014-02-10 13:54:46 -05:00
|
|
|
#pragma once
|
2013-07-22 04:21:56 -04:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
#include <SFML/Network/Packet.hpp>
|
2013-07-22 04:21:56 -04:00
|
|
|
#include <map>
|
2017-10-28 01:42:25 +02:00
|
|
|
#include <memory>
|
2015-05-26 17:23:43 -04:00
|
|
|
#include <mutex>
|
2013-07-22 04:21:56 -04:00
|
|
|
#include <queue>
|
|
|
|
#include <sstream>
|
2015-05-26 17:23:43 -04:00
|
|
|
#include <thread>
|
2015-06-05 19:00:26 -04:00
|
|
|
#include <unordered_map>
|
2015-02-02 01:27:06 -08:00
|
|
|
#include <unordered_set>
|
2017-10-28 01:42:25 +02:00
|
|
|
#include "Common/QoSSession.h"
|
2017-08-23 16:45:42 -07:00
|
|
|
#include "Common/SPSCQueue.h"
|
2014-02-17 05:18:15 -05:00
|
|
|
#include "Common/Timer.h"
|
2015-02-02 02:08:58 -08:00
|
|
|
#include "Common/TraversalClient.h"
|
2014-02-17 05:18:15 -05:00
|
|
|
#include "Core/NetPlayProto.h"
|
|
|
|
|
2018-07-06 19:39:42 -04:00
|
|
|
namespace NetPlay
|
|
|
|
{
|
2015-02-02 01:56:53 -08:00
|
|
|
class NetPlayUI;
|
2016-07-14 00:45:38 +02:00
|
|
|
enum class PlayerGameStatus;
|
2015-02-02 01:56:53 -08:00
|
|
|
|
|
|
|
class NetPlayServer : public TraversalClientClient
|
2013-07-22 04:21:56 -04:00
|
|
|
{
|
|
|
|
public:
|
2016-06-24 10:43:46 +02:00
|
|
|
void ThreadFunc();
|
2017-02-09 16:58:27 -08:00
|
|
|
void SendAsyncToClients(sf::Packet&& packet);
|
2013-07-22 04:21:56 -04:00
|
|
|
|
2017-08-07 00:27:04 -07:00
|
|
|
NetPlayServer(u16 port, bool forward_port, const NetTraversalConfig& traversal_config);
|
2016-06-24 10:43:46 +02:00
|
|
|
~NetPlayServer();
|
2013-07-22 04:21:56 -04:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
bool ChangeGame(const std::string& game);
|
2016-07-14 00:45:38 +02:00
|
|
|
bool ComputeMD5(const std::string& file_identifier);
|
|
|
|
bool AbortMD5();
|
2016-06-24 10:43:46 +02:00
|
|
|
void SendChatMessage(const std::string& msg);
|
2013-07-22 04:21:56 -04:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
void SetNetSettings(const NetSettings& settings);
|
2013-07-22 04:21:56 -04:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
bool StartGame();
|
2018-07-04 17:01:50 -04:00
|
|
|
bool RequestStartGame();
|
2013-07-22 04:21:56 -04:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
PadMappingArray GetPadMapping() const;
|
|
|
|
void SetPadMapping(const PadMappingArray& mappings);
|
2013-07-22 04:21:56 -04:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
PadMappingArray GetWiimoteMapping() const;
|
|
|
|
void SetWiimoteMapping(const PadMappingArray& mappings);
|
2013-08-06 23:48:52 -04:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
void AdjustPadBufferSize(unsigned int size);
|
2013-07-22 04:21:56 -04:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
void KickPlayer(PlayerId player);
|
2015-02-02 01:27:06 -08:00
|
|
|
|
2017-03-19 09:14:03 -04:00
|
|
|
u16 GetPort() const;
|
2014-05-29 18:59:07 -04:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
void SetNetPlayUI(NetPlayUI* dialog);
|
2017-03-19 09:14:03 -04:00
|
|
|
std::unordered_set<std::string> GetInterfaceSet() const;
|
|
|
|
std::string GetInterfaceHost(const std::string& inter) const;
|
2015-02-02 01:56:53 -08:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
bool is_connected = false;
|
2013-07-22 04:21:56 -04:00
|
|
|
|
|
|
|
private:
|
2016-06-24 10:43:46 +02:00
|
|
|
class Client
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PlayerId pid;
|
|
|
|
std::string name;
|
|
|
|
std::string revision;
|
2016-07-10 10:13:34 +02:00
|
|
|
PlayerGameStatus game_status;
|
2016-06-24 10:43:46 +02:00
|
|
|
|
|
|
|
ENetPeer* socket;
|
|
|
|
u32 ping;
|
|
|
|
u32 current_game;
|
|
|
|
|
2017-10-28 01:42:25 +02:00
|
|
|
Common::QoSSession qos_session;
|
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
bool operator==(const Client& other) const { return this == &other; }
|
|
|
|
};
|
|
|
|
|
2018-07-04 17:01:50 -04:00
|
|
|
bool SyncSaveData();
|
|
|
|
bool CompressFileIntoPacket(const std::string& file_path, sf::Packet& packet);
|
|
|
|
bool CompressBufferIntoPacket(const std::vector<u8>& in_buffer, sf::Packet& packet);
|
|
|
|
|
2017-03-19 09:14:03 -04:00
|
|
|
void SendToClients(const sf::Packet& packet, const PlayerId skip_pid = 0);
|
|
|
|
void Send(ENetPeer* socket, const sf::Packet& packet);
|
2016-06-24 10:43:46 +02:00
|
|
|
unsigned int OnConnect(ENetPeer* socket);
|
2017-03-19 09:14:03 -04:00
|
|
|
unsigned int OnDisconnect(const Client& player);
|
2016-06-24 10:43:46 +02:00
|
|
|
unsigned int OnData(sf::Packet& packet, Client& player);
|
|
|
|
|
|
|
|
void OnTraversalStateChanged() override;
|
|
|
|
void OnConnectReady(ENetAddress) override {}
|
|
|
|
void OnConnectFailed(u8) override {}
|
|
|
|
void UpdatePadMapping();
|
|
|
|
void UpdateWiimoteMapping();
|
2017-03-19 09:14:03 -04:00
|
|
|
std::vector<std::pair<std::string, std::string>> GetInterfaceListInternal() const;
|
2016-06-24 10:43:46 +02:00
|
|
|
|
|
|
|
NetSettings m_settings;
|
|
|
|
|
|
|
|
bool m_is_running = false;
|
|
|
|
bool m_do_loop = false;
|
|
|
|
Common::Timer m_ping_timer;
|
|
|
|
u32 m_ping_key = 0;
|
|
|
|
bool m_update_pings = false;
|
|
|
|
u32 m_current_game = 0;
|
|
|
|
unsigned int m_target_buffer_size = 0;
|
|
|
|
PadMappingArray m_pad_map;
|
|
|
|
PadMappingArray m_wiimote_map;
|
2018-07-04 17:01:50 -04:00
|
|
|
unsigned int m_save_data_synced_players = 0;
|
|
|
|
bool m_start_pending = false;
|
2016-06-24 10:43:46 +02:00
|
|
|
|
|
|
|
std::map<PlayerId, Client> m_players;
|
|
|
|
|
|
|
|
std::unordered_map<u32, std::vector<std::pair<PlayerId, u64>>> m_timebase_by_frame;
|
|
|
|
bool m_desync_detected;
|
|
|
|
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
std::recursive_mutex game;
|
|
|
|
// lock order
|
|
|
|
std::recursive_mutex players;
|
|
|
|
std::recursive_mutex async_queue_write;
|
|
|
|
} m_crit;
|
|
|
|
|
|
|
|
std::string m_selected_game;
|
|
|
|
std::thread m_thread;
|
2017-08-23 16:45:42 -07:00
|
|
|
Common::SPSCQueue<sf::Packet, false> m_async_queue;
|
2016-06-24 10:43:46 +02:00
|
|
|
|
|
|
|
ENetHost* m_server = nullptr;
|
|
|
|
TraversalClient* m_traversal_client = nullptr;
|
|
|
|
NetPlayUI* m_dialog = nullptr;
|
2015-02-05 22:16:34 -08:00
|
|
|
};
|
2018-07-06 19:39:42 -04:00
|
|
|
} // namespace NetPlay
|