Beispiel #1
0
        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();
            }
        }
Beispiel #2
0
        private void SendBroadcastFileShareUnparticipate()
        {
            byte[] packetData = BitChatMessage.CreateFileUnparticipate(_metaData.FileID);

            lock (_chats)
            {
                foreach (BitChat chat in _chats)
                {
                    chat.WriteMessageBroadcast(packetData, 0, packetData.Length);
                }
            }
        }
Beispiel #3
0
        private void SendBroadcastFileAdvertisement()
        {
            byte[] packetData = BitChatMessage.CreateFileAdvertisement(_metaData);

            lock (_chats)
            {
                foreach (BitChat chat in _chats)
                {
                    chat.WriteMessageBroadcast(packetData, 0, packetData.Length);
                }
            }
        }
Beispiel #4
0
        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();
                }
            }
        }
Beispiel #5
0
        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);
                }
            }
        }
Beispiel #6
0
            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();
                            }
                        }
                    }
                }
            }
Beispiel #7
0
 private void SendFileShareUnparticipate(BitChat chat)
 {
     byte[] packetData = BitChatMessage.CreateFileUnparticipate(_metaData.FileID);
     chat.WritePacketBroadcast(packetData, 0, packetData.Length);
 }