コード例 #1
0
        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();
            }
        }
コード例 #2
0
        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();
                }
            }
        }
コード例 #3
0
 public void BlockAvailable(int blockNumber, BitChatNetwork.VirtualPeer.VirtualSession peerSession)
 {
     lock (_waitLock)
     {
         if (_blockNumber == blockNumber)
         {
             _peerSession = peerSession;
             Monitor.Pulse(_waitLock);
         }
     }
 }
コード例 #4
0
        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);
            }
        }
コード例 #5
0
        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();
                }
            }
        }
コード例 #6
0
        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();
                }
            }
        }
コード例 #7
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();
                            }
                        }
                    }
                }
            }