Exemple #1
0
        /// <summary>
        /// Parses peers from raw bytes.
        /// </summary>
        /// <param name="a_rawPeers">Contains peers.</param>
        /// <remarks>
        /// ParsePeers()
        ///
        /// SYNOPSIS
        ///
        ///     ParsePeers(byte[] a_rawPeers);
        ///
        /// DESCRIPTION
        ///
        ///     This function will parse peers from a byte array. It must go
        ///     through the array and form an ip address and port. The first four
        ///     bytes are each segment of the ip where a '.' must be added between
        ///     them. The next 2 bytes make up the port where a ":" must be added
        ///     and the bytes must be converted before the address is added to the
        ///     peers list.
        ///
        /// </remarks>
        protected void ParsePeers(byte[] a_rawPeers)
        {
            var index = 0;

            while (index < a_rawPeers.Length)
            {
                // Forms ip address.
                StringBuilder address = new StringBuilder();
                for (var i = index; i < (index + 4); i++)
                {
                    address.Append(a_rawPeers[i]);
                    if (i != (index + 3))
                    {
                        address.Append(".");
                    }
                }
                // Start of port.
                address.Append(":");
                index += 4;

                // You must add the high and low bytes to get the port number.
                var highByte = a_rawPeers[index];
                var lowByte  = a_rawPeers[index + 1];
                address.Append((highByte * 256 + lowByte));
                index += 2;

                // Add to peers list.
                Peers.Add(address.ToString());
            }
        }
Exemple #2
0
        private static void HandleClient(IAsyncResult result)
        {
            if (result.AsyncState is not TcpListener listener)
            {
                return;
            }
            var client   = listener.EndAcceptTcpClient(result);
            var endpoint = client.Client.RemoteEndPoint;

            Logger.Log($"A client connected from {endpoint}.");
            listener.BeginAcceptTcpClient(HandleClient, listener);
            var connection = new TcpConnection(client);

            connection.OnMessageReceived += async(_, args) =>
            {
                Logger.Log($"{args.Message.Username}: {args.Message.Content}");
                foreach (var peer in Peers)
                {
                    await peer.SendAsync(args.Message);
                }
            };
            connection.OnConnectionLost += (_, args) =>
            {
                connection.Dispose();
                Peers.Remove(connection);
                Logger.Log($"A client disconnected from {endpoint}. Reason: {args.Reason}");
            };
            Peers.Add(connection);
        }
        public void SyncPeers()
        {
            for (int port = 5555; port < 5560; port++)
            {
                string url = $"http://localhost:{port}";
                if (url == Current.Url)
                {
                    continue;
                }
                RestClient cl = new RestClient(url);
                try
                {
                    PeerApiModel pm = new PeerApiModel()
                    {
                        Url = Current.Url, Name = Current.Name
                    };
                    PeerApiModel foundNode = cl.Post <PeerApiModel, PeerApiModel>("api/peers/connect", pm);
                    if (foundNode != null)
                    {
                        Console.Write($"{Current.Url} found node:{foundNode.Name}/{foundNode.Url}");
                        if (!IsPeerExists(foundNode.Url))
                        {
                            Peers.Add(new Peer(foundNode.Url, foundNode.Name));
                        }
                    }
                }
                catch (Exception ex)
                {
                }
            }

            Console.WriteLine($"Peers found:{Peers.Count}");
        }
Exemple #4
0
        private static async void Server_OnConnect(object sender, ENetConnectEventArgs connectEventArgs)
        {
            int count = 1;
            //WorldDatabase.GetWorld("START");
            //WorldDatabase.GetWorld("ADMIN");
            //WorldDatabase.GetWorld("HELLO");
            ENetPeer Peer = connectEventArgs.Peer;

            Console.WriteLine("Peer connected. IP : " + Peer.RemoteEndPoint.Address);
            foreach (var currentPeer in Peers)
            {
                if (currentPeer.State != ENetPeerState.Connected)
                {
                    continue;
                }
                if (currentPeer.RemoteEndPoint.Equals(Peer.RemoteEndPoint))
                {
                    count++;
                }
            }
            Peer.Data = new Player();
            if (count > 3)
            {
                await Peer.OnConsoleMessage("`oToo many accounts are logged in this IP. Please try again later.");
            }
            else
            {
                await Peer.SendData(1, BitConverter.GetBytes(0), 1);

                Peers.Add(Peer);
            }
            connectEventArgs.Peer.OnReceive    += Peer_OnReceive;
            connectEventArgs.Peer.OnDisconnect += Peer_OnDisconnect;
        }
Exemple #5
0
 public void RegisterPeer(Peer peer)
 {
     if (peer.Port != Configurations.Config.MainPort)
     {
         Peers.Add(peer);
     }
 }
Exemple #6
0
 public void MapTo(params GraphNode <TValueType>[] nodes)
 {
     foreach (var n in nodes)
     {
         Peers.Add(n);
         n.Peers.Add(this);
     }
 }
Exemple #7
0
 public void CreateOverlay()
 {
     if (this.Peers.Count == 0)
     {
         //create overlay SP first
         Nod superPeer = new Nod(0, 0, true);
         Peers.Add(superPeer);
         LastNode = superPeer;
     }
 }
Exemple #8
0
        private void OnPeerConnected(PeerConnected data)
        {
            Notifications.Enqueue(new PeerConnectedNotification(data.Peer));

            Peers.Add(data.Peer);
            DataMap?.Handle(data);

            Sender?.Add(data.Peer, data.Connection);
            Receiver?.StartProcessing(data.Peer, data.Connection);
        }
        public PeerApiModel AddNewlyConnectedPeer(PeerApiModel p)
        {
            if (!IsPeerExists(p.Url))
            {
                Peer peer = new Peer(p.Url, p.Name);
                Peers.Add(peer);
            }

            return(PeerApiModel.FromPeer(Current));
        }
Exemple #10
0
        public Peer AddPeer(int computingPower)
        {
            //var peer = new Peer(computingPower, BlockChain.GetCopy());
            var peer = new Peer(computingPower, BlockChain);

            Peers.Add(peer);

            EventHub.Publish_NewPeerConected(new BlockChainEventArgs(peer, peer));
            Logger.LogInformation($"New Peer Connected :{peer.ToString()} Peers Count:{Peers.Count}");
            return(peer);
        }
Exemple #11
0
        /// <summary>
        /// Adds the peer to the tracker
        /// </summary>
        /// <param name="peer"></param>
        internal void Add(Peer peer)
        {
            if (peer == null)
            {
                throw new ArgumentNullException(nameof(peer));
            }

            Debug.WriteLine($"Adding: {peer.ClientAddress}");
            Peers.Add(peer.DictionaryKey, peer);
            lock (PeersList)
                PeersList.Clear();
            UpdateCounts();
        }
Exemple #12
0
        private void OnConnectPeer(Connection connection)
        {
            var existPeer = Peers.FirstOrDefault(p => p.Address.Equals(connection.ConnectionInfo.RemoteEndPoint));

            if (existPeer == null && (connection.ConnectionInfo.RemoteEndPoint as IPEndPoint).Port != CommonHelpers.TrackerPort)
            {
                var peer = new Peer(connection, Peers, t);

                Peers.Add(peer);
            }
            else
            {
                existPeer.SetupConnection(connection);
            }
        }
 /// <summary>
 /// Add this station to the group!
 /// </summary>
 /// <param name="peer">The address of the station to add.</param>
 /// <param name="peerPublicAsymmetricKey">The public AsymmetricKey of the station to add.</param>
 public void AddPeer(IPEndPoint peer, AsymmetricKey peerPublicAsymmetricKey)
 {
     Contract.Requires(peer != null);
     Contract.Requires(!Peers.ContainsKey(peer));
     Contract.Ensures(Peers.ContainsKey(peer));
     Peers.Add(peer, peerPublicAsymmetricKey);
     if (EnoughStations)
     {
         UI.EnoughPeers();
     }
     if (Logger != null)
     {
         Logger.Log("Peer added: " + peer, Level.Info);
     }
 }
Exemple #14
0
        public void PopulateOverlay()
        {
            Nod superPeer = new Nod(0, 0, true);

            Peers.Add(superPeer);
            for (int i = 1; i <= NrChains; i++)
            {
                for (int j = 1; j <= NrRings; j++)
                {
                    Nod newNode = new Nod(i, j, false);

                    Peers.Add(newNode);
                }
            }
        }
        private void AddPeer(EndPoint address, Tracker tracker = null, bool withTracker = false)
        {
            if (!(Peers.Any(peer => peer.Address.Equals(address))) &&
                !(address.Equals(CommonHelpers.GetLocalEndPoint(CommonHelpers.PeerPort, true))))
            {
                var peer = new Peer(address, Peers, tracker);
                Peers.Add(peer);

                //перенаправляем события пира
                peer.OnRequestBlocksMessage += (s, e) =>
                {
                    OnRequestBlocksMessage?.Invoke(s, e);
                };

                peer.OnRequestTransactionsMessage += (s, e) =>
                {
                    OnRequestTransactionsMessage?.Invoke(s, e);
                };

                peer.OnBlocksMessage += (s, e) =>
                {
                    OnBlocksMessage?.Invoke(s, e);
                };

                peer.OnTransactionsMessage += (s, e) =>
                {
                    OnTransactionsMessage?.Invoke(s, e);
                };

                peer.OnPeersMessage += (s, e) => OnPeersMessage(s, e);



                peer.Connect(withTracker);


                //вызов события подключения пира
                Task.Run(() =>
                {
                    System.Threading.Thread.Sleep(CommonHelpers.MessagesInterval * 5);

                    OnPeerConnected?.Invoke(this, new MessageEventArgs(new Message(), peer.Hash, peer.Address));
                });
            }
        }
Exemple #16
0
        public void Connect(string ip, int port, long connId)
        {
            var address = IPAddress.Parse(ip);

            _endPoint      = new IPEndPoint(address, port);
            RealTimeSocket = new Socket(_endPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
            var peer = new UdpPeer(_endPoint, RealTimeSocket);

            peer.OnConnected();
            peer.OnDisconnectListener += OnDisconnected;
            Peers.Add(_endPoint, peer);
            if (null != OnConnectListener)
            {
                OnConnectListener(peer);
            }
            StartReceive();
            IsConnected = true;
        }
Exemple #17
0
        // Handles a new peer client
        private void AddPeer(P2pPeer Peer)
        {
            // Lock peer list to prevent race conditions
            lock (Peers)
            {
                // Check that we have space for this peer
                if (Peers.Count < MaxConnections)
                {
                    Peer.Start();
                    Peers.Add(Peer);
                }

                // No space available, close connection
                else
                {
                    Peer.Stop();
                }
            }
        }
 private void SyncPeersCollection()
 {
     if (this.currentDispatcher.CheckAccess())
     {
         if (SelectedTorrent != null)
         {
             Peers.Clear();
             foreach (Peer peer in SelectedTorrent.Peers)
             {
                 Peers.Add(peer);
             }
         }
     }
     else
     {
         Action dispatchAction = () => SyncPeersCollection();
         this.currentDispatcher.BeginInvoke(dispatchAction);
     }
 }
Exemple #19
0
        public void ReadBytes(byte[] data)
        {
            Bytes = data.CopyArray(0, 20);
            var peerByteArray = data.CopyArray(20, 4);
            var peerSize      = BitConverter.ToInt32(peerByteArray, 0);

            if (Peers == null)
            {
                Peers = new HashSet <IPEndPoint>(peerSize);
            }
            if (peerSize <= 0)
            {
                return;
            }
            var peerArray = data.CopyArray(24, data.Length - 24);

            for (var i = 0; i < peerArray.Length; i += 8)
            {
                var ip   = new IPAddress(peerArray.CopyArray(i, 4));
                var port = BitConverter.ToInt32(peerArray.CopyArray(i + 4, 4), 0);
                Peers.Add(new IPEndPoint(ip, port));
            }
        }
Exemple #20
0
 /// <summary>
 /// Add this station to the group!
 /// </summary>
 /// <param name="peer">
 /// The address of the station to add.
 /// </param>
 /// <param name="peerPublicAsymmetricKey">
 /// The public AsymmetricKey of the station to add.
 /// </param>
 public void AddPeer(IPEndPoint peer, AsymmetricKey peerPublicAsymmetricKey)
 {
     Contract.Requires(peer != null);
     Contract.Requires(!Peers.ContainsKey(peer));
     Contract.Ensures(Peers.ContainsKey(peer));
     Peers.Add(peer, peerPublicAsymmetricKey);
     if (PeerStatuses.ContainsKey(peer))
     {
         PeerStatuses[peer].ConnectionState = "Connected";
     }
     else
     {
         PeerStatuses.Add(peer, new StationStatus(peer, Communicator.GetIdentifyingStringForStation(peer), "Connected"));
     }
     if (EnoughStations)
     {
         UI.EnoughPeers();
     }
     if (Logger != null)
     {
         Logger.Log("Peer added: " + peer, Level.Info);
     }
 }
Exemple #21
0
 public void JoinTo(IGraphNode <T> other)
 {
     Peers.Add(other);
     other.Peers.Add(this);
 }
Exemple #22
0
        private Peers GetColumnPeersForValueCell(Int32 column, Int32 row)
        {
            var peers = new Peers();

              /* Backtrack until a SumCell is hit. */
              var startRow = row;
              while (!(this._cells[column, --startRow] is SumCell))
            ;

              peers.Sum = (this._cells[column, startRow] as SumCell).Down;

              /* Go forward until another SumCell or the edge of the puzzle's column is hit. */
              while ((++startRow < this._height) && !(this._cells[column, startRow] is SumCell))
            peers.Add(this._cells[column, startRow] as ValueCell);

              return peers;
        }
Exemple #23
0
        private Peers GetRowPeersForValueCell(Int32 column, Int32 row)
        {
            var peers = new Peers();

              /* Backtrack until a SumCell is hit. */
              var startColumn = column;
              while (!(this._cells[--startColumn, row] is SumCell))
            ;

              peers.Sum = (this._cells[startColumn, row] as SumCell).Right;

              /* Go forward until another SumCell or the edge of the puzzle's row is hit. */
              while ((++startColumn < this._width) && !(this._cells[startColumn, row] is SumCell))
            peers.Add(this._cells[startColumn, row] as ValueCell);

              return peers;
        }
Exemple #24
0
        public void Initialize()
        {
            WebRTC.Initialize(_uiDispatcher);
            Conductor.Instance.ETWStatsEnabled = false;

            Cameras             = new ObservableCollection <MediaDevice>();
            Microphones         = new ObservableCollection <MediaDevice>();
            AudioPlayoutDevices = new ObservableCollection <MediaDevice>();

            // WebRTCUWP M58 library does not support audio capture/playout devices
            //foreach (MediaDevice audioCaptureDevice in Conductor.Instance.Media.GetAudioCaptureDevices())
            //{
            //    Microphones.Add(audioCaptureDevice);
            //}

            //foreach (MediaDevice audioPlayoutDevice in Conductor.Instance.Media.GetAudioPlayoutDevices())
            //{
            //    AudioPlayoutDevices.Add(audioPlayoutDevice);
            //}

            // HACK Remove Automatic Device Assignment
            if (SelectedCamera == null && Cameras.Count > 0)
            {
                SelectedCamera = Cameras.First();
            }

            if (SelectedMicrophone == null && Microphones.Count > 0)
            {
                SelectedMicrophone = Microphones.First();
            }

            Debug.WriteLine("Device Status: SelectedCamera: {0} - SelectedMic: {1}", SelectedCamera == null ? "NULL" : "OK", SelectedMicrophone == null ? "NULL" : "OK");
            if (SelectedAudioPlayoutDevice == null && AudioPlayoutDevices.Count > 0)
            {
                SelectedAudioPlayoutDevice = AudioPlayoutDevices.First();
            }

            Conductor.Instance.Media.OnMediaDevicesChanged += OnMediaDevicesChanged;
            Conductor.Instance.Signaller.OnPeerConnected   += (peerId, peerName) =>
            {
                RunOnUiThread(() =>
                {
                    if (Peers == null)
                    {
                        Peers = new ObservableCollection <Peer>();
                        Conductor.Instance.Peers = Peers;
                    }

                    Peers.Add(new Peer {
                        Id = peerId, Name = peerName
                    });
                });
            };

            Conductor.Instance.Signaller.OnPeerDisconnected += peerId =>
            {
                RunOnUiThread(() =>
                {
                    var peerToRemove = Peers?.FirstOrDefault(p => p.Id == peerId);
                    if (peerToRemove != null)
                    {
                        Peers.Remove(peerToRemove);
                    }
                });
            };

            Conductor.Instance.Signaller.OnSignedIn += () =>
            {
                RunOnUiThread(() =>
                {
                    IsConnected         = true;
                    IsMicrophoneEnabled = false;
                    IsCameraEnabled     = false;
                    IsConnecting        = false;

                    OnStatusMessageUpdate?.Invoke("Signed-In");
                });
            };

            Conductor.Instance.Signaller.OnServerConnectionFailure += (Exception ex) =>
            {
                RunOnUiThread(() =>
                {
                    IsConnecting = false;
                    OnStatusMessageUpdate?.Invoke("Server Connection Failure: " + ex.Message + "\n" + ex.StackTrace);
                });
            };

            Conductor.Instance.Signaller.OnDisconnected += () =>
            {
                RunOnUiThread(() =>
                {
                    IsConnected         = false;
                    IsMicrophoneEnabled = false;
                    IsCameraEnabled     = false;
                    IsDisconnecting     = false;
                    Peers?.Clear();
                    OnStatusMessageUpdate?.Invoke("Disconnected");
                });
            };

            Conductor.Instance.Signaller.OnMessageFromPeer += (id, message) =>
            {
                RunOnUiThread(() =>
                {
                    // TODO: Handles All Peer Messages (Signal Channel)
                });
            };

            Conductor.Instance.Signaller.OnPeerConnected += (id, name) =>
            {
                RunOnUiThread(() =>
                {
                    SelectedPeer = Peers.First(x => x.Id == id);
                    OnStatusMessageUpdate?.Invoke(string.Format("Connected Peer: {0}-{1}", SelectedPeer.Id, SelectedPeer.Name));
                });
            };

            // TODO: Restore Event Handler in Utility Wrapper
            // Implemented in Unity Consumer due to Event Handling Issue
            // Conductor.Instance.OnAddRemoteStream += Conductor_OnAddRemoteStream does not propagate

            Conductor.Instance.OnRemoveRemoteStream    += Conductor_OnRemoveRemoteStream;
            Conductor.Instance.OnAddLocalStream        += Conductor_OnAddLocalStream;
            Conductor.Instance.OnConnectionHealthStats += Conductor_OnPeerConnectionHealthStats;
            Conductor.Instance.OnPeerConnectionCreated += () =>
            {
                RunOnUiThread(() =>
                {
                    IsReadyToConnect    = false;
                    IsConnectedToPeer   = true;
                    IsReadyToDisconnect = false;
                    IsMicrophoneEnabled = false;
                    OnStatusMessageUpdate?.Invoke("Peer Connection Created");
                });
            };

            Conductor.Instance.OnPeerConnectionClosed += () =>
            {
                RunOnUiThread(() =>
                {
                    IsConnectedToPeer   = false;
                    _peerVideoTrack     = null;
                    _selfVideoTrack     = null;
                    IsMicrophoneEnabled = false;
                    IsCameraEnabled     = false;

                    // TODO: Clean-up References
                    //GC.Collect(); // Ensure all references are truly dropped.

                    OnStatusMessageUpdate?.Invoke("Peer Connection Closed");
                });
            };

            Conductor.Instance.OnPeerMessageDataReceived += (peerId, message) =>
            {
                OnPeerMessageDataReceived?.Invoke(peerId, message);
            };

            // DATA Channel Setup
            Conductor.Instance.OnPeerMessageDataReceived += (i, s) =>
            {
            };

            Conductor.Instance.OnReadyToConnect += () => { RunOnUiThread(() => { IsReadyToConnect = true; }); };

            IceServers   = new ObservableCollection <IceServer>();
            NewIceServer = new IceServer();
            AudioCodecs  = new ObservableCollection <CodecInfo>();
            var audioCodecList = WebRTC.GetAudioCodecs();

            string[] incompatibleAudioCodecs = new string[] { "CN32000", "CN16000", "CN8000", "red8000", "telephone-event8000" };
            VideoCodecs = new ObservableCollection <CodecInfo>();

            // TODO: REMOVE DISPLAY LIST SUPPORT
            var videoCodecList = WebRTC.GetVideoCodecs().OrderBy(codec =>
            {
                switch (codec.Name)
                {
                case "VP8": return(1);

                case "VP9": return(2);

                case "H264": return(3);

                default: return(99);
                }
            });

            RunOnUiThread(() =>
            {
                foreach (var audioCodec in audioCodecList)
                {
                    if (!incompatibleAudioCodecs.Contains(audioCodec.Name + audioCodec.ClockRate))
                    {
                        AudioCodecs.Add(audioCodec);
                    }
                }

                if (AudioCodecs.Count > 0)
                {
                    SelectedAudioCodec = AudioCodecs.FirstOrDefault(x => x.Name.Contains("PCMU"));
                }

                foreach (var videoCodec in videoCodecList)
                {
                    VideoCodecs.Add(videoCodec);
                }

                if (VideoCodecs.Count > 0)
                {
                    SelectedVideoCodec = VideoCodecs.FirstOrDefault(x => x.Name.Contains("H264"));
                }
            });

            RunOnUiThread(() =>
            {
                OnInitialized?.Invoke();
            });
        }
        /// <summary>
        /// The initializer for MainViewModel.
        /// </summary>
        /// <param name="uiDispatcher">The UI dispatcher.</param>
        public void Initialize(CoreDispatcher uiDispatcher)
        {
            WebRTC.Initialize(uiDispatcher);

            // For the HoloLens
            if (_isHoloLens)
            {
                WebRTC.SetPreferredVideoCaptureFormat(896, 504, 30);
            }

            // Pick the codec
            var videoCodecs = WebRTC.GetVideoCodecs();

            foreach (var codec in videoCodecs)
            {
                if (codec.Name == "H264")
                {
                    Conductor.Instance.VideoCodec = codec;
                    break;
                }
            }

            // Pick the bitrate
            Conductor.Instance.VideoBitrate = 512;

            var settings = ApplicationData.Current.LocalSettings;

            // A Peer is connected to the server event handler
            Conductor.Instance.Signaller.OnPeerConnected += (peerId, peerName) =>
            {
                RunOnUiThread(() =>
                {
                    if (Peers == null)
                    {
                        Peers = new ObservableCollection <Peer>();
                        Conductor.Instance.Peers = Peers;
                    }
                    Peers.Add(new Peer {
                        Id = peerId, Name = peerName
                    });
                });
            };

            // A Peer is disconnected from the server event handler
            Conductor.Instance.Signaller.OnPeerDisconnected += peerId =>
            {
                RunOnUiThread(() =>
                {
                    var peerToRemove = Peers?.FirstOrDefault(p => p.Id == peerId);
                    if (peerToRemove != null)
                    {
                        Peers.Remove(peerToRemove);
                    }
                });
            };

            // The user is Signed in to the server event handler
            Conductor.Instance.Signaller.OnSignedIn += () =>
            {
                RunOnUiThread(() =>
                {
                    IsConnected         = true;
                    IsMicrophoneEnabled = true;
                    IsCameraEnabled     = true;
                    IsConnecting        = false;
                });
            };

            // Failed to connect to the server event handler
            Conductor.Instance.Signaller.OnServerConnectionFailure += () =>
            {
                RunOnUiThread(async() =>
                {
                    IsConnecting            = false;
                    MessageDialog msgDialog = new MessageDialog("Failed to connect to server!");
                    await msgDialog.ShowAsync();
                });
            };

            // The current user is disconnected from the server event handler
            Conductor.Instance.Signaller.OnDisconnected += () =>
            {
                RunOnUiThread(() =>
                {
                    IsConnected         = false;
                    IsMicrophoneEnabled = false;
                    IsCameraEnabled     = false;
                    IsDisconnecting     = false;
                    Peers?.Clear();
                });
            };

            LoadSettings();

            Connect();


            // Event handlers for managing the media streams

            Conductor.Instance.OnAddRemoteStream    += Conductor_OnAddRemoteStream;
            Conductor.Instance.OnRemoveRemoteStream += Conductor_OnRemoveRemoteStream;
            Conductor.Instance.OnAddLocalStream     += Conductor_OnAddLocalStream;

            /**
             * // Connected to a peer event handler
             * Conductor.Instance.OnPeerConnectionCreated += () =>
             * {
             *  RunOnUiThread(() =>
             *  {
             *      IsReadyToConnect = false;
             *      IsConnectedToPeer = true;
             *      if (SettingsButtonChecked)
             *      {
             *          // close settings screen if open
             *          SettingsButtonChecked = false;
             *          ScrollBarVisibilityType = ScrollBarVisibility.Disabled;
             *      }
             *      IsReadyToDisconnect = false;
             *      if (SettingsButtonChecked)
             *      {
             *          // close settings screen if open
             *          SettingsButtonChecked = false;
             *          ScrollBarVisibilityType = ScrollBarVisibility.Disabled;
             *      }
             *
             *      // Make sure the screen is always active while on call
             *      if (!_keepOnScreenRequested)
             *      {
             *          _keepScreenOnRequest.RequestActive();
             *          _keepOnScreenRequested = true;
             *      }
             *
             *      UpdateScrollBarVisibilityTypeHelper();
             *  });
             * };
             *
             * // Connection between the current user and a peer is closed event handler
             * Conductor.Instance.OnPeerConnectionClosed += () =>
             * {
             *  RunOnUiThread(() =>
             *  {
             *      IsConnectedToPeer = false;
             *      Conductor.Instance.Media.RemoveVideoTrackMediaElementPair(_peerVideoTrack);
             *      //PeerVideo.Source = null;
             *
             *      Conductor.Instance.Media.RemoveVideoTrackMediaElementPair(_selfVideoTrack);
             *      //SelfVideo.Stop();
             *      //SelfVideo.ClearValue(MediaElement.SourceProperty);
             *      //SelfVideo.Source = null;
             *
             *      _peerVideoTrack = null;
             *      _selfVideoTrack = null;
             *      GC.Collect(); // Ensure all references are truly dropped.
             *      IsMicrophoneEnabled = true;
             *      IsCameraEnabled = true;
             *      SelfVideoFps = PeerVideoFps = "";
             *
             *      // Make sure to allow the screen to be locked after the call
             *      if (_keepOnScreenRequested)
             *      {
             *          _keepScreenOnRequest.RequestRelease();
             *          _keepOnScreenRequested = false;
             *      }
             *      UpdateScrollBarVisibilityTypeHelper();
             *  });
             * };
             *
             * // Ready to connect to the server event handler
             * Conductor.Instance.OnReadyToConnect += () => { RunOnUiThread(() => { IsReadyToConnect = true; }); };
             *
             * // Initialize the Ice servers list
             * IceServers = new ObservableCollection<IceServer>();
             * NewIceServer = new IceServer();
             *
             * // Prepare to list supported audio codecs
             * AudioCodecs = new ObservableCollection<CodecInfo>();
             * var audioCodecList = WebRTC.GetAudioCodecs();
             *
             * // These are features added to existing codecs, they can't decode/encode real audio data so ignore them
             * string[] incompatibleAudioCodecs = new string[] { "CN32000", "CN16000", "CN8000", "red8000", "telephone-event8000" };
             *
             * // Prepare to list supported video codecs
             * VideoCodecs = new ObservableCollection<CodecInfo>();
             *
             * // Order the video codecs so that the stable VP8 is in front.
             * var videoCodecList = WebRTC.GetVideoCodecs().OrderBy(codec =>
             * {
             *  switch (codec.Name)
             *  {
             *      case "VP8": return 1;
             *      case "VP9": return 2;
             *      case "H264": return 3;
             *      default: return 99;
             *  }
             * });
             *
             * // Load the supported audio/video information into the Settings controls
             * RunOnUiThread(() =>
             * {
             *  foreach (var audioCodec in audioCodecList)
             *  {
             *      if (!incompatibleAudioCodecs.Contains(audioCodec.Name + audioCodec.ClockRate))
             *      {
             *          AudioCodecs.Add(audioCodec);
             *      }
             *  }
             *
             *  if (AudioCodecs.Count > 0)
             *  {
             *      if (settings.Values["SelectedAudioCodecId"] != null)
             *      {
             *
             *          int id = Convert.ToInt32(settings.Values["SelectedAudioCodecId"]);
             *
             *          foreach (var audioCodec in AudioCodecs)
             *          {
             *
             *              int audioCodecId = audioCodec.Id;
             *              if (audioCodecId == id)
             *              {
             *                  SelectedAudioCodec = audioCodec;
             *                  break;
             *              }
             *          }
             *      }
             *      if (SelectedAudioCodec == null)
             *      {
             *          SelectedAudioCodec = AudioCodecs.First();
             *      }
             *  }
             *
             *  foreach (var videoCodec in videoCodecList)
             *  {
             *      VideoCodecs.Add(videoCodec);
             *  }
             *
             *  if (VideoCodecs.Count > 0)
             *  {
             *      if (settings.Values["SelectedVideoCodecId"] != null)
             *      {
             *
             *          int id = Convert.ToInt32(settings.Values["SelectedVideoCodecId"]);
             *          foreach (var videoCodec in VideoCodecs)
             *          {
             *              int videoCodecId = videoCodec.Id;
             *              if (videoCodecId == id)
             *              {
             *                  SelectedVideoCodec = videoCodec;
             *                  break;
             *              }
             *          }
             *      }
             *      if (SelectedVideoCodec == null)
             *      {
             *          SelectedVideoCodec = VideoCodecs.First();
             *      }
             *  }
             * });
             * LoadSettings();
             * RunOnUiThread(() =>
             * {
             *  OnInitialized?.Invoke();
             * });*/
        }
Exemple #26
0
        public void JoinOverlay(Nod existingNode)
        {
            Nod newNode = new Nod();

            if (this.Peers.Count == 1)
            {
                // join with the SP
                newNode.Chain  = 1;
                newNode.Ring   = 1;
                newNode.Id     = newNode.Chain.ToString() + "-" + newNode.Ring.ToString() + " ";
                newNode.Status = new Neighbour(false, true, false, false);
                if (!IsNodeInOverlay(newNode))
                {
                    Peers.Add(newNode);
                }
            }
            else
            {
                //rest of the cases
                Neighbour status = existingNode.GetStatus();
                if (!status.left)
                {
                    if (existingNode.Chain + 1 > NrChains)
                    {
                        newNode.Chain = existingNode.Chain + 1 - NrChains;
                    }
                    else
                    {
                        newNode.Chain = existingNode.Chain + 1;
                    }

                    newNode.Ring = existingNode.Ring;
                    newNode.Id   = newNode.Chain.ToString() + "-" + newNode.Ring.ToString() + " ";
                    if (newNode.Chain == NrChains)
                    {
                        newNode.Status = new Neighbour(false, true, true, true);
                    }
                    else
                    {
                        newNode.Status = new Neighbour(false, true, false, true);
                    }

                    //existingNode.status.left = true;
                    Peers.Where(item => item.Id == existingNode.Id).ToList().ForEach(s => s.Status.left = true);
                    if (!IsNodeInOverlay(newNode))
                    {
                        Peers.Add(newNode);
                    }
                }
                else
                {
                    if (!status.right)
                    {
                        if (existingNode.Chain - 1 == 0)
                        {
                            newNode.Chain = NrChains;
                        }
                        else
                        {
                            newNode.Chain = existingNode.Chain - 1;
                        }

                        newNode.Ring = existingNode.Ring;
                        newNode.Id   = newNode.Chain.ToString() + "-" + newNode.Ring.ToString() + " ";
                        if (newNode.Chain == NrChains)
                        {
                            newNode.Status = new Neighbour(false, true, true, true);
                        }
                        else
                        {
                            newNode.Status = new Neighbour(false, true, false, true);
                        }
                        Peers.Where(item => item.Id == existingNode.Id).ToList().ForEach(s => s.Status.right = true);
                        //existingNode.status.right = true;
                        if (!IsNodeInOverlay(newNode))
                        {
                            Peers.Add(newNode);
                        }
                    }
                    else
                    {
                        if (!status.up)
                        {
                            newNode.Chain  = existingNode.Chain;
                            newNode.Ring   = existingNode.Ring + 1;
                            newNode.Id     = newNode.Chain.ToString() + "-" + newNode.Ring.ToString() + " ";
                            newNode.Status = new Neighbour(false, true, false, false);
                            Peers.Where(item => item.Id == existingNode.Id).ToList().ForEach(s => s.Status.up = true);
                            //existingNode.status.up = true;
                            if (!IsNodeInOverlay(newNode))
                            {
                                Peers.Add(newNode);
                            }
                        }
                    }
                }
            }
            LastNode = newNode;
        }
        public void Initialize()
        {
            // WebRTCライブラリの初期化
            // WebRTC.Initialize(_uiDispathcer);
            // Conductor.Instance.ETWStatsEnabled = false;

            /*
             * Cameras = new List<MediaDevice>();
             * Microphones = new List<MediaDevice>();
             * AudioPlayoutDevices = new List<MediaDevice>();
             * // マシン上で使用できるメディアデバイスをすべて取得する
             * foreach(var videoCaptureDevice in Conductor.Instance.Media.GetVideoCaptureDevices())
             * {
             *  Cameras.Add(videoCaptureDevice);
             * }
             * foreach(var audioCaptureDevice in Conductor.Instance.Media.GetAudioCaptureDevices())
             * {
             *  Microphones.Add(audioCaptureDevice);
             * }
             * foreach(var audioPlayoutDevice in Conductor.Instance.Media.GetAudioPlayoutDevices())
             * {
             *  AudioPlayoutDevices.Add(audioPlayoutDevice);
             * }
             */

            // 各種メディアデバイスはリストの先頭のものを使用する
            // Holoはいいけど、Immersiveの場合は考え直すべきです

            /*
             * if(SelectedCamera == null && Cameras.Count > 0)
             * {
             *  SelectedCamera = Cameras.First();
             * }
             *
             * if(SelectedMicrophone == null && Microphones.Count > 0)
             * {
             *  SelectedMicrophone = Microphones.First();
             * }
             *
             * if(SelectedAudioPlayoutDevice == null && AudioPlayoutDevices.Count >0)
             * {
             *  SelectedAudioPlayoutDevice = AudioPlayoutDevices.First();
             * }
             */

            // ================================
            // シグナリング関連のイベントハンドラ
            // ================================

            // マシンに接続されたメディアデバイスが変更されたときのイベントハンドラ
            // Conductor.Instance.Media.OnMediaDevicesChanged += OnMediaDeviceChanged;
            // リモートユーザがシグナリングサーバに接続してきたときのハンドラ
            // 自分の初回ログイン、ポーリング時の新規ユーザ追加時にコールされる
            // TODO 接続ユーザの選択方法を工夫したいところ
            Conductor.Instance.Signaller.OnPeerConnected += (peerId, peerName) =>
            {
                // リモートユーザのリストを行進する
                if (Peers == null)
                {
                    Peers = new List <Peer>();
                    Conductor.Instance.Peers = Peers;
                }
                Peers.Add(new Peer {
                    Id = peerId, Name = peerName
                });
                // 接続してきたリモートユーザをPeer候補とする
                SelectedPeer = Peers.First(x => x.Id == peerId);
            };
            // リモートユーザがシグナリングサーバからログアウトしたときのハンドラ
            Conductor.Instance.Signaller.OnPeerDisconnected += (peerId) =>
            {
                var peerToRemove = Peers?.FirstOrDefault(p => p.Id == peerId);
                if (peerToRemove != null)
                {
                    Peers.Remove(peerToRemove);
                }
            };
            // シグナリングサーバへの接続が完了したときのハンドラ
            Conductor.Instance.Signaller.OnSignedIn += () =>
            {
                IsConnected         = true;
                IsMicrophoneEnabled = false;
                IsCameraEnabled     = false;
                IsConnecting        = false;

                OnStatusMessageUpdate?.Invoke("Signed in");
            };
            // シグナリングサーバへの接続が失敗したときのハンドラ
            Conductor.Instance.Signaller.OnServerConnectionFailure += () =>
            {
                IsConnecting = false;

                OnStatusMessageUpdate?.Invoke("Server Connection Failure");
            };
            // シグナリングサーバからログアウトしたときのハンドラ
            Conductor.Instance.Signaller.OnDisconnected += () =>
            {
                IsConnected         = false;
                IsMicrophoneEnabled = false;
                IsCameraEnabled     = false;
                IsDisconnecting     = false;
                Peers?.Clear();

                OnStatusMessageUpdate?.Invoke("Disconnected");
            };
            //
            Conductor.Instance.OnReadyToConnect += () =>
            {
                IsReadyToConnect = true;
            };


            // =============================
            // Peerコネクション関連のイベントハンドラ
            // =============================

            // Peerコネクションが生成されたときのイベントハンドラ(通話開始)
            Conductor.Instance.OnPeerConnectionCreated += () =>
            {
                IsReadyToConnect    = false;
                IsConnectedToPeer   = true;
                IsReadyToDisconnect = false;

                IsCameraEnabled     = true;
                IsMicrophoneEnabled = true; // ??

                OnStatusMessageUpdate?.Invoke("Peer Connection Created");
            };
            // Peerコネクションが破棄されたときのイベントハンドラ
            Conductor.Instance.OnPeerConnectionClosed += () =>
            {
                IsConnectedToPeer   = false;
                _peerVideoTrack     = null;
                _selfVideoTrack     = null;
                IsMicrophoneEnabled = false;
                IsCameraEnabled     = false;
            };
            // Peer(リモートユーザ)からメッセージを受信したときのハンドラ
            Conductor.Instance.OnPeerMessageDataReceived += (peerId, message) =>
            {
                OnPeerMessageDataReceived?.Invoke(peerId, message);
            };

            // =============================
            // コーデック設定
            // =============================

            /*
             * // オーディオコーデックの設定
             * AudioCodecs = new List<CodecInfo>();
             * var audioCodecList = WebRTC.GetAudioCodecs();
             * string[] incompatibleAudioCodecs = new string[] { "CN32000", "CN16000", "CN8000", "red8000", "telephone-event8000" };
             *
             * foreach (var audioCodec in audioCodecList)
             * {
             *  if (!incompatibleAudioCodecs.Contains(audioCodec.Name + audioCodec.ClockRate))
             *  {
             *      AudioCodecs.Add(audioCodec);
             *  }
             * }
             * if (AudioCodecs.Count > 0)
             * {
             *  SelectedAudioCodec = AudioCodecs.First();
             * }
             *
             * // ビデオコーデックの設定。デフォルトはH.264を使う
             * VideoCodecs = new List<CodecInfo>();
             * var videoCodecList = WebRTC.GetVideoCodecs().OrderBy(codec =>
             * {
             *  switch (codec.Name)
             *  {
             *      case "VP8": return 1;
             *      case "VP9": return 2;
             *      case "H264": return 3;
             *      default: return 99;
             *  }
             * });
             *
             * foreach (var videoCodec in videoCodecList)
             * {
             *  VideoCodecs.Add(videoCodec);
             * }
             * if (VideoCodecs.Count > 0)
             * {
             *  SelectedVideoCodec = VideoCodecs.FirstOrDefault(codec => codec.Name.Contains("H264"));
             * }
             */
            /*
             * // =============================
             * // Iceサーバの設定
             * // =============================
             * IceServers = new List<IceServer>();
             * NewIceServer = new IceServer();
             *
             * IceServers.Add(new IceServer("stun.l.google.com:19302", IceServer.ServerType.STUN));
             * IceServers.Add(new IceServer("stun1.l.google.com:19302", IceServer.ServerType.STUN));
             * IceServers.Add(new IceServer("stun2.l.google.com:19302", IceServer.ServerType.STUN));
             * IceServers.Add(new IceServer("stun3.l.google.com:19302", IceServer.ServerType.STUN));
             * IceServers.Add(new IceServer("stun4.l.google.com:19302", IceServer.ServerType.STUN));
             *
             * Conductor.Instance.ConfigureIceServers(IceServers);
             */
            OnInitialized?.Invoke();
        }