// Copyright 2013 Dolphin Emulator Project // Licensed under GPLv2 // Refer to the license.txt file included. #ifndef _NETPLAY_H #define _NETPLAY_H #include "Common.h" #include "CommonTypes.h" #include "Thread.h" #include "Timer.h" #include #include "NetPlayProto.h" #include "GCPadStatus.h" #include #include #include #include #include "FifoQueue.h" class NetPad { public: NetPad(); NetPad(const SPADStatus* const); u32 nHi; u32 nLo; }; class NetPlayUI { public: virtual ~NetPlayUI() {}; virtual void BootGame(const std::string& filename) = 0; virtual void StopGame() = 0; virtual void Update() = 0; virtual void AppendChat(const std::string& msg) = 0; virtual void OnMsgChangeGame(const std::string& filename) = 0; virtual void OnMsgStartGame() = 0; virtual void OnMsgStopGame() = 0; }; extern NetSettings g_NetPlaySettings; class NetPlayClient { public: void ThreadFunc(); NetPlayClient(const std::string& address, const u16 port, NetPlayUI* dialog, const std::string& name); ~NetPlayClient(); void GetPlayerList(std::string& list, std::vector& pid_list); bool is_connected; bool StartGame(const std::string &path); bool StopGame(); bool ChangeGame(const std::string& game); void SendChatMessage(const std::string& msg); // Send and receive pads values bool WiimoteUpdate(int _number, u8* data, u8 size); bool GetNetPads(const u8 pad_nb, const SPADStatus* const, NetPad* const netvalues); u8 GetPadNum(u8 numPAD); protected: void ClearBuffers(); struct { std::recursive_mutex game; // lock order std::recursive_mutex players, send; } m_crit; class Player { public: Player(); std::string ToString() const; PlayerId pid; std::string name; PadMapping pad_map[4]; PadMapping wiimote_map[4]; std::string revision; u32 ping; }; Common::FifoQueue m_pad_buffer[4]; Common::FifoQueue m_wiimote_buffer[4]; NetWiimote m_wiimote_input[4]; NetPlayUI* m_dialog; sf::SocketTCP m_socket; std::thread m_thread; sf::Selector m_selector; std::string m_selected_game; volatile bool m_is_running; volatile bool m_do_loop; unsigned int m_target_buffer_size; Player* m_local_player; u32 m_current_game; private: void SendPadState(const PadMapping local_nb, const NetPad& np); void SendWiimoteState(const PadMapping local_nb, const NetWiimote& nw); unsigned int OnData(sf::Packet& packet); PlayerId m_pid; std::map m_players; }; namespace NetPlay { bool IsNetPlayRunning(); }; void NetPlay_Enable(NetPlayClient* const np); void NetPlay_Disable(); #endif