internal bool PeerExists(BitChatNetwork.VirtualPeer.VirtualSession peer) { _seedersLock.EnterReadLock(); try { if (_seeders.Contains(peer)) { return(true); } } finally { _seedersLock.ExitReadLock(); } _peersLock.EnterReadLock(); try { return(_peers.Contains(peer)); } finally { _peersLock.ExitReadLock(); } }
internal void AddPeer(BitChatNetwork.VirtualPeer.VirtualSession peer) { bool peerWasAdded = false; _peersLock.EnterWriteLock(); try { if (!_peers.Contains(peer)) { _peers.Add(peer); peerWasAdded = true; } } finally { _peersLock.ExitWriteLock(); } if (peerWasAdded) { if (PeerCountUpdate != null) { RaiseEventPeerCountUpdate(); } } }
public void BlockAvailable(int blockNumber, BitChatNetwork.VirtualPeer.VirtualSession peerSession) { lock (_waitLock) { if (_blockNumber == blockNumber) { _peerSession = peerSession; Monitor.Pulse(_waitLock); } } }
internal void BlockAvailable(int blockNumber, BitChatNetwork.VirtualPeer.VirtualSession peerSession) { FileBlockDownloader downloader = null; lock (_downloaders) { foreach (FileBlockDownloader item in _downloaders) { if (item.BlockNumber == blockNumber) { downloader = item; break; } } } if (downloader != null) { downloader.BlockAvailable(blockNumber, peerSession); } }
internal void RemovePeerOrSeeder(BitChatNetwork.VirtualPeer.VirtualSession peer) { bool peerRemoved = false; //remove from peers _peersLock.EnterWriteLock(); try { if (_peers.Remove(peer)) { peerRemoved = true; } } finally { _peersLock.ExitWriteLock(); } //remove from seeds _seedersLock.EnterWriteLock(); try { if (_seeders.Remove(peer)) { peerRemoved = true; } } finally { _seedersLock.ExitWriteLock(); } if (peerRemoved) { if (PeerCountUpdate != null) { RaiseEventPeerCountUpdate(); } } }
internal void AddSeeder(BitChatNetwork.VirtualPeer.VirtualSession seeder) { //remove from peers _peersLock.EnterWriteLock(); try { _peers.Remove(seeder); } finally { _peersLock.ExitWriteLock(); } //add seeder bool seederWasAdded = false; _seedersLock.EnterWriteLock(); try { if (!_seeders.Contains(seeder)) { _seeders.Add(seeder); seederWasAdded = true; } } finally { _seedersLock.ExitWriteLock(); } if (seederWasAdded) { if (PeerCountUpdate != null) { RaiseEventPeerCountUpdate(); } } }
private void DownloadAsync() { try { while (true) { BitChatNetwork.VirtualPeer.VirtualSession peerSession = null; lock (_waitLock) { _blockNumber = _sharedFile.GetNextDownloadBlockNumber(); if (_blockNumber < 0) { return; } _sharedFile.SendAnnouncementBlockWanted(_sharedFile._metaData.FileID, _blockNumber); if (Monitor.Wait(_waitLock, 30000)) { peerSession = _peerSession; } } if (peerSession != null) { BitChatNetwork.VirtualPeer.VirtualSession.DataStream dataStream = null; try { //open data stream on peer session dataStream = peerSession.OpenDataStream(); //send file block request to peer byte[] packetData = BitChatMessage.CreateFileBlockRequest(_sharedFile._metaData.FileID, _blockNumber, dataStream.Port); peerSession.WriteMessage(packetData, 0, packetData.Length); //download block data via stream _sharedFile.DownloadBlock(_blockNumber, dataStream); } catch { //add the block number back to pending list _sharedFile.AddPendingDownloadBlockNumber(_blockNumber); } finally { if (dataStream != null) { dataStream.Dispose(); } } } else { //add the block number back to pending list and continue for next random block _sharedFile.AddPendingDownloadBlockNumber(_blockNumber); } } } catch (ThreadAbortException) { } catch (Exception ex) { Debug.Write("SharedFile.FileBlockDownloader", ex); } finally { lock (_downloaders) { _downloaders.Remove(this); if (_downloaders.Count < 1) { if (_sharedFile.GetNextDownloadBlockNumber() < 0) { _sharedFile.OnDownloadComplete(); } } } } }