#pragma once #include "stdafx.h" #include #include "GameConnection.h" #include "../Utilities/AutoResetEvent.h" #include "../Utilities/SimpleLock.h" #include "BaseControlDevice.h" #include "IInputProvider.h" #include "ControlDeviceState.h" #include "ClientConnectionData.h" class Console; class GameClientConnection : public GameConnection, public INotificationListener, public IInputProvider { private: std::deque _inputData[BaseControlDevice::PortCount]; atomic _inputSize[BaseControlDevice::PortCount]; AutoResetEvent _waitForInput[BaseControlDevice::PortCount]; SimpleLock _writeLock; atomic _shutdown; atomic _enableControllers; atomic _minimumQueueSize; vector _playerList; shared_ptr _controlDevice; shared_ptr _newControlDevice; ControlDeviceState _lastInputSent; bool _gameLoaded = false; uint8_t _controllerPort = GameConnection::SpectatorPort; ClientConnectionData _connectionData; string _serverSalt; private: void SendHandshake(); void SendControllerSelection(uint8_t port); void ClearInputData(); void PushControllerState(uint8_t port, ControlDeviceState state); void DisableControllers(); bool AttemptLoadGame(string filename, uint32_t crc32Hash); protected: void ProcessMessage(NetMessage* message) override; public: GameClientConnection(shared_ptr console, shared_ptr socket, ClientConnectionData &connectionData); virtual ~GameClientConnection(); void Shutdown(); void ProcessNotification(ConsoleNotificationType type, void* parameter) override; bool SetInput(BaseControlDevice *device) override; void InitControlDevice(); void SendInput(); void SelectController(uint8_t port); uint8_t GetAvailableControllers(); uint8_t GetControllerPort(); };