public void Init(out SAMNetworkConnection.ErrorType error)
        {
            if (_client == null)
            {
                error = SAMNetworkConnection.ErrorType.BluetoothAdapterNotFound; return;
            }

            _client.StartAdapter();

            _lastState         = _client.State;
            _currentConnDevice = null;
            _lastScanDevices.Clear();
            Events.Clear();
            _isScanning    = false;
            _scanStartTime = MonoSAMGame.CurrentTime.TotalElapsedSeconds;

            if (_client.State == BluetoothAdapterState.AdapterNotFound)
            {
                error = SAMNetworkConnection.ErrorType.BluetoothAdapterNotFound;
            }
            else if (_client.State == BluetoothAdapterState.AdapterNotFound)
            {
                error = SAMNetworkConnection.ErrorType.BluetoothAdapterNoPermission;
            }
            else if (_client.State == BluetoothAdapterState.Error)
            {
                error = SAMNetworkConnection.ErrorType.NetworkMediumInternalError;
            }
            else
            {
                error = SAMNetworkConnection.ErrorType.None;
            }
        }
Example #2
0
 public void Update(out SAMNetworkConnection.ErrorType err)
 {
     err = SAMNetworkConnection.ErrorType.None;
 }
Example #3
0
 public void Init(out SAMNetworkConnection.ErrorType error)
 {
     _client.Connect(_ip, _port);
     error = SAMNetworkConnection.ErrorType.None;
 }
Example #4
0
        public static string FormatNetworkErrorMessage(SAMNetworkConnection.ErrorType type, object data)
        {
            switch (type)
            {
            case SAMNetworkConnection.ErrorType.None:
                return(string.Empty);

            case SAMNetworkConnection.ErrorType.ProxyServerTimeout:
                return(L10N.T(STR_MP_TIMEOUT));

            case SAMNetworkConnection.ErrorType.ServerUserTimeout:
                return(L10N.T(STR_MP_TIMEOUT));

            case SAMNetworkConnection.ErrorType.UserTimeout:
                return(L10N.TF(STR_MP_TIMEOUT_USER, data));

            case SAMNetworkConnection.ErrorType.NotInLobby:
                return(L10N.T(STR_MP_NOTINLOBBY));

            case SAMNetworkConnection.ErrorType.SessionNotFound:
                return(L10N.T(STR_MP_SESSIONNOTFOUND));

            case SAMNetworkConnection.ErrorType.AuthentificationFailed:
                return(L10N.T(STR_MP_AUTHFAILED));

            case SAMNetworkConnection.ErrorType.LobbyFull:
                return(L10N.T(STR_MP_LOBBYFULL));

            case SAMNetworkConnection.ErrorType.GameVersionMismatch:
                return(L10N.TF(STR_MP_VERSIONMISMATCH, GDConstants.Version.ToString()));

            case SAMNetworkConnection.ErrorType.LevelNotFound:
                return(L10N.T(STR_MP_LEVELNOTFOUND));

            case SAMNetworkConnection.ErrorType.LevelVersionMismatch:
                return(L10N.T(STR_MP_LEVELMISMATCH));

            case SAMNetworkConnection.ErrorType.UserDisconnect:
                return(L10N.TF(STR_MP_USERDISCONNECT, data));

            case SAMNetworkConnection.ErrorType.ServerDisconnect:
                return(L10N.T(STR_MP_SERVERDISCONNECT));

            case SAMNetworkConnection.ErrorType.BluetoothAdapterNotFound:
                return(L10N.T(STR_MP_BTADAPTERNULL));

            case SAMNetworkConnection.ErrorType.BluetoothAdapterNoPermission:
                return(L10N.T(STR_MP_BTADAPTERPERMDENIED));

            case SAMNetworkConnection.ErrorType.BluetoothInternalError:
                return(L10N.T(STR_MP_INTERNAL));

            case SAMNetworkConnection.ErrorType.BluetoothNotEnabled:
                return(L10N.T(STR_MP_BTDISABLED));

            case SAMNetworkConnection.ErrorType.P2PConnectionFailed:
                return(L10N.T(STR_MP_DIRECTCONNFAIL));

            case SAMNetworkConnection.ErrorType.P2PConnectionLost:
                return(L10N.T(STR_MP_DIRECTCONNLOST));

            default:
                SAMLog.Error("L10NI::EnumSwitch_FNEM", "type = " + type);
                return(string.Empty);
            }
        }
        public void Update(out SAMNetworkConnection.ErrorType error)
        {
            var xlastState = _lastState;

            _lastState = _client.State;

            _client.Update();

            if (_client.State == BluetoothAdapterState.AdapterNotFound)
            {
                error = SAMNetworkConnection.ErrorType.BluetoothAdapterNotFound;
                return;
            }

            if (_client.State == BluetoothAdapterState.PermissionNotGranted)
            {
                error = SAMNetworkConnection.ErrorType.BluetoothAdapterNoPermission;
                return;
            }

            if (_client.State == BluetoothAdapterState.Error)
            {
                error = SAMNetworkConnection.ErrorType.NetworkMediumInternalError;
                return;
            }

            if (_client.State == BluetoothAdapterState.NotEnabledByUser)
            {
                error = SAMNetworkConnection.ErrorType.BluetoothNotEnabled;
                return;
            }

            if (_client.State == BluetoothAdapterState.ConnectionFailed)
            {
                if (_lastScanDevices.Any())
                {
                    if (_currentConnDevice != null)
                    {
                        SAMLog.Warning("BNM::ConnectionFailed", $"Connection to {_currentConnDevice.Name} failed");

                        Events.Enqueue(new BluetoothMediumEvent(BluetoothMediumEvent.BTEvent.ConnectionFailed, _currentConnDevice.Name));
                    }

                    _currentConnDevice = _lastScanDevices.First();
                    _lastScanDevices.Remove(_currentConnDevice);

                    _isScanning = false;

                    SAMLog.Debug($"Try connect to {_currentConnDevice.Name} ({_currentConnDevice.Address}|{_currentConnDevice.DeviceClass}|{_currentConnDevice.Type})");
                    Events.Enqueue(new BluetoothMediumEvent(BluetoothMediumEvent.BTEvent.TryConnection, _currentConnDevice.Name));
                    _client.Connect(_currentConnDevice);

                    error = SAMNetworkConnection.ErrorType.None;
                }
                else
                {
                    _isScanning = true;
                    _client.StartScan();
                    _scanStartTime = MonoSAMGame.CurrentTime.TotalElapsedSeconds;

                    error = SAMNetworkConnection.ErrorType.None;
                }
                return;
            }

            if (_client.State == BluetoothAdapterState.ConnectionLost)
            {
                error = SAMNetworkConnection.ErrorType.P2PConnectionLost;
                return;
            }

            if (_client.State == BluetoothAdapterState.Active)
            {
                if (_isScanning)
                {
                    _lastScanDevices = _client.FoundDevices;

                    SAMLog.Debug($"Scanning finished {_lastScanDevices.Count} devices found");

                    if (_lastScanDevices.Any())
                    {
                        foreach (var dd in _lastScanDevices)
                        {
                            SAMLog.Debug($"Device found: {dd.Name} ({dd.Address}|{dd.DeviceClass}|{dd.Type})");
                        }

                        _currentConnDevice = _lastScanDevices.First();
                        _lastScanDevices.Remove(_currentConnDevice);

                        SAMLog.Debug($"Try connect to {_currentConnDevice.Name} ({_currentConnDevice.Address}|{_currentConnDevice.DeviceClass}|{_currentConnDevice.Type})");

                        _isScanning = false;
                        _client.Connect(_currentConnDevice);
                    }
                    else
                    {
                        _isScanning = true;
                        _client.StartScan();
                        _scanStartTime = MonoSAMGame.CurrentTime.TotalElapsedSeconds;
                    }
                }
            }

            if (_client.State == BluetoothAdapterState.Scanning)
            {
                if (_isScanning && !_client.IsDiscovering && MonoSAMGame.CurrentTime.TotalElapsedSeconds - _scanStartTime > 30)
                {
                    error = SAMNetworkConnection.ErrorType.None;
                    SAMLog.Warning("BNM::ForceScanCancel", "Cancel scan by force");
                    _client.CancelScan();
                    return;
                }
            }

            if (_client.State == BluetoothAdapterState.Listen)
            {
                error = SAMNetworkConnection.ErrorType.None;
                if (!_client.IsDiscoverable)
                {
                    _client.ContinueWaiting();
                }
                return;
            }

            if (_client.State == BluetoothAdapterState.Connected)
            {
                if (xlastState == BluetoothAdapterState.Connecting && _currentConnDevice != null)
                {
                    Events.Enqueue(new BluetoothMediumEvent(BluetoothMediumEvent.BTEvent.ConnectionSucceeded, _currentConnDevice.Name));
                }
            }

            error = SAMNetworkConnection.ErrorType.None;
        }