Esempio n. 1
0
            internal void UpdateNetworkStatus(List <PeerInfo> uniqueConnectedPeerList)
            {
                BitChatNetworkStatus oldStatus = _networkStatus;

                lock (_connectedPeerList)
                {
                    //compare this peer's connected peer list to the other peer list to find disconnected peer list
                    _disconnectedPeerList = GetMissingPeerList(_connectedPeerList, uniqueConnectedPeerList);
                    //remove self from the disconnected list
                    _disconnectedPeerList.Remove(_virtualPeer.GetPeerInfo());

                    if (_disconnectedPeerList.Count > 0)
                    {
                        _networkStatus = BitChatNetworkStatus.PartialNetwork;
                    }
                    else
                    {
                        _networkStatus = BitChatNetworkStatus.FullNetwork;
                    }
                }

                if (oldStatus != _networkStatus)
                {
                    RaiseEventNetworkStatusUpdated();
                }
            }
Esempio n. 2
0
            internal void SetNoNetworkStatus()
            {
                BitChatNetworkStatus oldStatus = _networkStatus;

                _networkStatus = BitChatNetworkStatus.NoNetwork;

                if (oldStatus != _networkStatus)
                {
                    RaiseEventNetworkStatusUpdated();
                }
            }
Esempio n. 3
0
 public BitChatInfo(BitChatNetworkType type, string networkNameOrPeerEmailAddress, string sharedSecret, BinaryNumber hashedPeerEmailAddress, BinaryNumber networkID, BinaryNumber networkSecret, string messageStoreID, byte[] messageStoreKey, long groupImageDateModified, byte[] groupImage, Certificate[] peerCerts, SharedFileInfo[] sharedFiles, Uri[] trackerURIs, bool enableTracking, bool sendInvitation, string invitationSender, string invitationMessage, BitChatNetworkStatus networkStatus, bool mute)
 {
     _type = type;
     _networkNameOrPeerEmailAddress = networkNameOrPeerEmailAddress;
     _sharedSecret           = sharedSecret;
     _hashedPeerEmailAddress = hashedPeerEmailAddress;
     _networkID              = networkID;
     _networkSecret          = networkSecret;
     _messageStoreID         = messageStoreID;
     _messageStoreKey        = messageStoreKey;
     _groupImageDateModified = groupImageDateModified;
     _groupImage             = groupImage;
     _peerCerts              = peerCerts;
     _sharedFiles            = sharedFiles;
     _trackerURIs            = trackerURIs;
     _enableTracking         = enableTracking;
     _sendInvitation         = sendInvitation;
     _invitationSender       = invitationSender;
     _invitationMessage      = invitationMessage;
     _networkStatus          = networkStatus;
     _mute = mute;
 }
Esempio n. 4
0
            internal void UpdateNetworkStatus(List<PeerInfo> uniqueConnectedPeerList)
            {
                BitChatNetworkStatus oldStatus = _networkStatus;

                lock (_connectedPeerList)
                {
                    //compare this peer's connected peer list to the other peer list to find disconnected peer list
                    _disconnectedPeerList = GetMissingPeerList(_connectedPeerList, uniqueConnectedPeerList);
                    //remove self from the disconnected list
                    _disconnectedPeerList.Remove(_virtualPeer.GetPeerInfo());

                    if (_disconnectedPeerList.Count > 0)
                        _networkStatus = BitChatNetworkStatus.PartialNetwork;
                    else
                        _networkStatus = BitChatNetworkStatus.FullNetwork;
                }

                if (oldStatus != _networkStatus)
                    RaiseEventNetworkStatusUpdated();
            }
Esempio n. 5
0
            internal void SetNoNetworkStatus()
            {
                BitChatNetworkStatus oldStatus = _networkStatus;

                _networkStatus = BitChatNetworkStatus.NoNetwork;

                if (oldStatus != _networkStatus)
                    RaiseEventNetworkStatusUpdated();
            }
Esempio n. 6
0
        private void UpdateNetworkStatusCallback(object state)
        {
            lock (_updateNetworkStatusLock)
            {
                if (_updateNetworkStatusRunning)
                    return;

                _updateNetworkStatusRunning = true;
                _updateNetworkStatusTriggered = false;
            }

            try
            {
                BitChatNetworkStatus oldStatus = _networkStatus;

                //find network wide connected peer ep list
                List<PeerInfo> uniqueConnectedPeerList = new List<PeerInfo>();

                List<Peer> onlinePeers = new List<Peer>();
                List<Peer> offlinePeers = new List<Peer>();

                lock (_peers)
                {
                    foreach (Peer currentPeer in _peers)
                    {
                        if (currentPeer.IsOnline)
                            onlinePeers.Add(currentPeer);
                        else
                            offlinePeers.Add(currentPeer);
                    }
                }

                foreach (Peer onlinePeer in onlinePeers)
                {
                    onlinePeer.UpdateUniqueConnectedPeerList(uniqueConnectedPeerList);
                }

                //find self connected & disconnected peer list
                List<PeerInfo> connectedPeerList;
                List<PeerInfo> disconnectedPeerList;

                connectedPeerList = _network.GetConnectedPeerList();

                //update self connected list
                UpdateUniquePeerList(uniqueConnectedPeerList, connectedPeerList);

                //remove self from unique connected peer list
                PeerInfo selfPeerInfo = _network.GetSelfPeerInfo();
                uniqueConnectedPeerList.Remove(selfPeerInfo);

                //update connected peer's network status
                foreach (Peer onlinePeer in onlinePeers)
                {
                    onlinePeer.UpdateNetworkStatus(uniqueConnectedPeerList);
                }

                foreach (Peer offlinePeer in offlinePeers)
                {
                    offlinePeer.SetNoNetworkStatus();
                }

                //find disconnected list
                disconnectedPeerList = GetMissingPeerList(connectedPeerList, uniqueConnectedPeerList);

                //update disconnected peer's network status
                List<PeerInfo> dummyUniqueConnectedPeerList = new List<PeerInfo>(1);
                dummyUniqueConnectedPeerList.Add(selfPeerInfo);

                foreach (PeerInfo peerInfo in disconnectedPeerList)
                {
                    //search all offline peers for comparison
                    foreach (Peer offlinePeer in offlinePeers)
                    {
                        if (offlinePeer.PeerCertificate.IssuedTo.EmailAddress.Address.Equals(peerInfo.PeerEmail))
                        {
                            offlinePeer.UpdateNetworkStatus(dummyUniqueConnectedPeerList);
                            break;
                        }
                    }
                }

                BitChatNetworkStatus networkStatus;

                if (disconnectedPeerList.Count > 0)
                {
                    networkStatus = BitChatNetworkStatus.PartialNetwork;

                    _network.MakeConnection(disconnectedPeerList);
                }
                else
                {
                    networkStatus = BitChatNetworkStatus.FullNetwork;
                }

                lock (_connectedPeerList)
                {
                    _connectedPeerList.Clear();
                    _connectedPeerList.AddRange(connectedPeerList);
                    _disconnectedPeerList = disconnectedPeerList;
                    _networkStatus = networkStatus;
                }

                if (_network.Type == BitChatNetworkType.PrivateChat)
                {
                    if (connectedPeerList.Count > 0)
                    {
                        _manager.PauseLocalAnnouncement(_network.NetworkID);
                        StopTracking();
                    }
                    else
                    {
                        _manager.ResumeLocalAnnouncement(_network.NetworkID);
                        StartTracking();
                    }
                }
                else
                {
                    if (connectedPeerList.Count > 0)
                        _manager.PauseLocalAnnouncement(_network.NetworkID);
                    else
                        _manager.ResumeLocalAnnouncement(_network.NetworkID);
                }

                if (oldStatus != networkStatus)
                    _selfPeer.RaiseEventNetworkStatusUpdated();
            }
            catch
            { }
            finally
            {
                lock (_updateNetworkStatusLock)
                {
                    if (_updateNetworkStatusTriggered)
                    {
                        _updateNetworkStatusTimer.Change(NETWORK_STATUS_TIMER_INTERVAL, Timeout.Infinite);
                    }
                    else
                    {
                        _updateNetworkStatusTriggered = false;

                        if (_networkStatus == BitChatNetworkStatus.PartialNetwork)
                            _reCheckNetworkStatusTimer.Change(NETWORK_STATUS_RECHECK_TIMER_INTERVAL, Timeout.Infinite);
                    }

                    _updateNetworkStatusRunning = false;
                }
            }
        }
Esempio n. 7
0
            public BitChatInfo(Stream s)
            {
                BincodingDecoder decoder = new BincodingDecoder(s, "BI");

                while (true)
                {
                    Bincoding value = decoder.DecodeNext();

                    if (value.Type == BincodingType.NULL)
                    {
                        break;
                    }

                    KeyValuePair <string, Bincoding> pair = value.GetKeyValuePair();

                    switch (pair.Key)
                    {
                    case "type":
                        _type = (BitChatNetworkType)pair.Value.GetByteValue();
                        break;

                    case "network_name":
                        _networkNameOrPeerEmailAddress = pair.Value.GetStringValue();
                        break;

                    case "shared_secret":
                        _sharedSecret = pair.Value.GetStringValue();
                        break;

                    case "enable_tracking":
                        _enableTracking = pair.Value.GetBooleanValue();
                        break;

                    case "send_invitation":
                        _sendInvitation = pair.Value.GetBooleanValue();
                        break;

                    case "invitation_sender":
                        _invitationSender = pair.Value.GetStringValue();
                        break;

                    case "invitation_message":
                        _invitationMessage = pair.Value.GetStringValue();
                        break;

                    case "network_status":
                        _networkStatus = (BitChatNetworkStatus)pair.Value.GetByteValue();
                        break;

                    case "hashed_peer_email_address":
                        _hashedPeerEmailAddress = new BinaryNumber(pair.Value.Value);
                        break;

                    case "network_id":
                        _networkID = new BinaryNumber(pair.Value.Value);
                        break;

                    case "network_secret":
                        _networkSecret = new BinaryNumber(pair.Value.Value);
                        break;

                    case "message_store_id":
                        _messageStoreID = pair.Value.GetStringValue();
                        break;

                    case "message_store_key":
                        _messageStoreKey = pair.Value.Value;
                        break;

                    case "group_image_date_modified":
                        _groupImageDateModified = pair.Value.GetLongValue();
                        break;

                    case "group_image":
                        _groupImage = pair.Value.Value;
                        break;

                    case "mute":
                        _mute = pair.Value.GetBooleanValue();
                        break;

                    case "peer_certs":
                    {
                        List <Bincoding> peerCerts = pair.Value.GetList();

                        _peerCerts = new Certificate[peerCerts.Count];
                        int i = 0;

                        foreach (Bincoding item in peerCerts)
                        {
                            _peerCerts[i++] = new Certificate(item.GetValueStream());
                        }
                    }
                    break;

                    case "shared_files":
                    {
                        List <Bincoding> sharedFiles = pair.Value.GetList();

                        _sharedFiles = new SharedFileInfo[sharedFiles.Count];
                        int i = 0;

                        foreach (Bincoding item in sharedFiles)
                        {
                            _sharedFiles[i++] = new SharedFileInfo(item.GetValueStream());
                        }
                    }
                    break;

                    case "tracker_list":
                    {
                        List <Bincoding> trackerList = pair.Value.GetList();

                        _trackerURIs = new Uri[trackerList.Count];
                        int i = 0;

                        foreach (Bincoding item in trackerList)
                        {
                            _trackerURIs[i++] = new Uri(item.GetStringValue());
                        }
                    }
                    break;
                    }
                }
            }
Esempio n. 8
0
        private void UpdateNetworkStatusCallback(object state)
        {
            lock (_updateNetworkStatusLock)
            {
                if (_updateNetworkStatusRunning)
                {
                    return;
                }

                _updateNetworkStatusRunning   = true;
                _updateNetworkStatusTriggered = false;
            }

            try
            {
                BitChatNetworkStatus oldStatus = _networkStatus;

                //find network wide connected peer ep list
                List <PeerInfo> uniqueConnectedPeerList = new List <PeerInfo>();

                List <Peer> onlinePeers  = new List <Peer>();
                List <Peer> offlinePeers = new List <Peer>();

                lock (_peers)
                {
                    foreach (Peer currentPeer in _peers)
                    {
                        if (currentPeer.IsOnline)
                        {
                            onlinePeers.Add(currentPeer);
                        }
                        else
                        {
                            offlinePeers.Add(currentPeer);
                        }
                    }
                }

                foreach (Peer onlinePeer in onlinePeers)
                {
                    onlinePeer.UpdateUniqueConnectedPeerList(uniqueConnectedPeerList);
                }

                //find self connected & disconnected peer list
                List <PeerInfo> connectedPeerList;
                List <PeerInfo> disconnectedPeerList;

                connectedPeerList = _network.GetConnectedPeerList();

                //update self connected list
                UpdateUniquePeerList(uniqueConnectedPeerList, connectedPeerList);

                //remove self from unique connected peer list
                PeerInfo selfPeerInfo = _network.GetSelfPeerInfo();
                uniqueConnectedPeerList.Remove(selfPeerInfo);

                //update connected peer's network status
                foreach (Peer onlinePeer in onlinePeers)
                {
                    onlinePeer.UpdateNetworkStatus(uniqueConnectedPeerList);
                }

                foreach (Peer offlinePeer in offlinePeers)
                {
                    offlinePeer.SetNoNetworkStatus();
                }

                //find disconnected list
                disconnectedPeerList = GetMissingPeerList(connectedPeerList, uniqueConnectedPeerList);

                //update disconnected peer's network status
                List <PeerInfo> dummyUniqueConnectedPeerList = new List <PeerInfo>(1);
                dummyUniqueConnectedPeerList.Add(selfPeerInfo);

                foreach (PeerInfo peerInfo in disconnectedPeerList)
                {
                    //search all offline peers for comparison
                    foreach (Peer offlinePeer in offlinePeers)
                    {
                        if (offlinePeer.PeerCertificate.IssuedTo.EmailAddress.Address.Equals(peerInfo.PeerEmail))
                        {
                            offlinePeer.UpdateNetworkStatus(dummyUniqueConnectedPeerList);
                            break;
                        }
                    }
                }

                BitChatNetworkStatus networkStatus;

                if (disconnectedPeerList.Count > 0)
                {
                    networkStatus = BitChatNetworkStatus.PartialNetwork;

                    _network.MakeConnection(disconnectedPeerList);
                }
                else
                {
                    networkStatus = BitChatNetworkStatus.FullNetwork;
                }

                lock (_connectedPeerList)
                {
                    _connectedPeerList.Clear();
                    _connectedPeerList.AddRange(connectedPeerList);
                    _disconnectedPeerList = disconnectedPeerList;
                    _networkStatus        = networkStatus;
                }

                if (_network.Type == BitChatNetworkType.PrivateChat)
                {
                    if (connectedPeerList.Count > 0)
                    {
                        _manager.PauseLocalAnnouncement(_network.NetworkID);
                        StopTracking();
                    }
                    else
                    {
                        _manager.ResumeLocalAnnouncement(_network.NetworkID);
                        StartTracking();
                    }
                }
                else
                {
                    if (connectedPeerList.Count > 0)
                    {
                        _manager.PauseLocalAnnouncement(_network.NetworkID);
                    }
                    else
                    {
                        _manager.ResumeLocalAnnouncement(_network.NetworkID);
                    }
                }

                if (oldStatus != networkStatus)
                {
                    _selfPeer.RaiseEventNetworkStatusUpdated();
                }
            }
            catch
            { }
            finally
            {
                lock (_updateNetworkStatusLock)
                {
                    if (_updateNetworkStatusTriggered)
                    {
                        _updateNetworkStatusTimer.Change(NETWORK_STATUS_TIMER_INTERVAL, Timeout.Infinite);
                    }
                    else
                    {
                        _updateNetworkStatusTriggered = false;

                        if (_networkStatus == BitChatNetworkStatus.PartialNetwork)
                        {
                            _reCheckNetworkStatusTimer.Change(NETWORK_STATUS_RECHECK_TIMER_INTERVAL, Timeout.Infinite);
                        }
                    }

                    _updateNetworkStatusRunning = false;
                }
            }
        }