private void SendAnnouncementBlockWanted(BinaryNumber fileID, int blockNumber) { byte[] packetData = BitChatMessage.CreateFileBlockWanted(fileID, blockNumber); //announce to all peers _peersLock.EnterReadLock(); try { foreach (BitChatNetwork.VirtualPeer.VirtualSession peer in _peers) { peer.WriteMessage(packetData, 0, packetData.Length); } } finally { _peersLock.ExitReadLock(); } //announce to all seeds _seedersLock.EnterReadLock(); try { foreach (BitChatNetwork.VirtualPeer.VirtualSession seeder in _seeders) { seeder.WriteMessage(packetData, 0, packetData.Length); } } finally { _seedersLock.ExitReadLock(); } }
private void SendBroadcastFileShareUnparticipate() { byte[] packetData = BitChatMessage.CreateFileUnparticipate(_metaData.FileID); lock (_chats) { foreach (BitChat chat in _chats) { chat.WriteMessageBroadcast(packetData, 0, packetData.Length); } } }
private void SendBroadcastFileAdvertisement() { byte[] packetData = BitChatMessage.CreateFileAdvertisement(_metaData); lock (_chats) { foreach (BitChat chat in _chats) { chat.WriteMessageBroadcast(packetData, 0, packetData.Length); } } }
internal void RemoveChat(BitChat chat) { //announce no participation in chat byte[] packetData = BitChatMessage.CreateFileUnparticipate(_metaData.FileID); chat.WriteMessageBroadcast(packetData, 0, packetData.Length); //remove chat from list lock (_chats) { _chats.Remove(chat); if (_chats.Count == 0) { lock (_sharedFiles) { _sharedFiles.Remove(_metaData.FileID); } this.Dispose(); } } }
private void AnnounceBlockWanted(int blockNumber) { byte[] packetData = BitChatMessage.CreateFileBlockWanted(new FileBlockWanted(_metaData.FileID, blockNumber)); //announce to all peers lock (_peers) { foreach (BitChat.Peer peer in _peers) { peer.WritePacket(packetData, 0, packetData.Length); } } //announce to all seeds lock (_seeders) { foreach (BitChat.Peer seeder in _seeders) { seeder.WritePacket(packetData, 0, packetData.Length); } } }
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(); } } } } }
private void SendFileShareUnparticipate(BitChat chat) { byte[] packetData = BitChatMessage.CreateFileUnparticipate(_metaData.FileID); chat.WritePacketBroadcast(packetData, 0, packetData.Length); }