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(); } }
internal void SetNoNetworkStatus() { BitChatNetworkStatus oldStatus = _networkStatus; _networkStatus = BitChatNetworkStatus.NoNetwork; if (oldStatus != _networkStatus) { RaiseEventNetworkStatusUpdated(); } }
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; }
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(); }
internal void SetNoNetworkStatus() { BitChatNetworkStatus oldStatus = _networkStatus; _networkStatus = BitChatNetworkStatus.NoNetwork; if (oldStatus != _networkStatus) RaiseEventNetworkStatusUpdated(); }
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; } } }
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; } } }
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; } } }