コード例 #1
0
 private void Group_OnPeerJoinRequest(JoinGroupRequest request)
 {
     if (AuthenticatePeer(request.Peer))
     {
         request.Accept(null);
         OnPeerConnected(request.Peer);
     }
     else
     {
         request.Reject("", null);
     }
 }
コード例 #2
0
        public async Task <JoinGroupResponse> JoinAsync(IPeer peer, object arg)
        {
            // check if group is closed
            if (isClosed)
            {
                return(new JoinGroupResponse(GroupId, OperationCode, JoinGroupResponse.ResultType.Cancelled, string.Format("Group is closed.")));
            }

            // check if peer has joined
            if (peers.ContainsKey(peer.Id))
            {
                return(new JoinGroupResponse(GroupId, OperationCode, JoinGroupResponse.ResultType.HasJoined, string.Format("Has joined in group")));
            }

            // check if peer is in queue
            if (joinQueuing.Exists(req => req.Peer.Id == peer.Id))
            {
                return(new JoinGroupResponse(GroupId, OperationCode, JoinGroupResponse.ResultType.InQueue, string.Format("Join request is in queue.")));
            }

            // check if peer is been handling
            if (joinHandling.Exists(req => req.Peer.Id == peer.Id))
            {
                return(new JoinGroupResponse(GroupId, OperationCode, JoinGroupResponse.ResultType.Handling, string.Format("Join request is handling.")));
            }

            // add request into queue and waiting result
            JoinGroupRequest request = new JoinGroupRequest(GroupId, OperationCode, peer, arg);

            joinQueuing.Add(request);
            JoinGroupResponse result = await request.Task;

            joinHandling.Remove(request);       // remove request from handling (because finished)
            if (result.type == JoinGroupResponse.ResultType.Accepted)
            {
                lock (peers) peers.Add(peer.Id, peer);
                peer.TrackGroup(this);
                try
                {
                    if (OnPeerJoinedEvent != null)
                    {
                        OnPeerJoinedEvent.Invoke(peer);
                    }
                }
                catch (Exception e)
                {
                    debugger.LogError(e);
                }
            }
            return(result);
        }
コード例 #3
0
 public JoinGroupRequest DequeueJoinRequest()
 {
     lock (joinQueuing)
     {
         if (joinQueuing.Count < 0)
         {
             throw new InvalidOperationException("No queueing request.");
         }
         JoinGroupRequest request = joinQueuing[0];
         joinQueuing.RemoveAt(0);
         // add request into handling
         joinHandling.Add(request);
         return(request);
     }
 }