示例#1
0
        public void Setup()
        {
            int pieceCount  = 40;
            int pieceLength = 256 * 1024;
            var torrentData = new TestTorrentData {
                Files       = TorrentFileInfo.Create(pieceLength, ("File", pieceLength * pieceCount, "full/path/File")),
                PieceLength = pieceLength,
                Size        = pieceLength * pieceCount
            };

            peers = new List <PeerId> ();

            torrentManager = TestRig.CreateSingleFileManager(torrentData.Size, torrentData.PieceLength);
            torrentManager.LoadFastResume(new FastResume(torrentManager.InfoHash, new BitField(pieceCount).SetAll(true), new BitField(pieceCount).SetAll(false)));

            manager = new PieceManager(torrentManager);
            manager.Initialise();

            peer = PeerId.CreateNull(pieceCount);
            for (int i = 0; i < 20; i++)
            {
                PeerId p = PeerId.CreateNull(pieceCount);
                p.SupportsFastPeer = true;
                peers.Add(p);
            }
        }
        public void Setup()
        {
            int pieceLength = 16 * Constants.BlockSize;
            int pieces      = 40;
            int size        = pieces * pieceLength;

            bitfield    = new MutableBitField(pieces);
            torrentData = new TestTorrentData {
                Files       = TorrentFileInfo.Create(pieceLength, ("Test", size, "Full/Path/Test")),
                PieceLength = pieceLength,
                Size        = size
            };

            checker = new PiecePickerFilterChecker();
            picker  = new RarestFirstPicker(checker);
            picker.Initialise(torrentData);

            peer = PeerId.CreateNull(pieces);
            peer.BitField.SetAll(true);

            peers = new List <PeerId> ();
            for (int i = 0; i < 5; i++)
            {
                peers.Add(PeerId.CreateNull(pieces));
            }
        }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var files = new List <TorrentFileInfo>();

            var fileInfo = JObject.Load(reader);

            var fileNamesArray   = fileInfo.SelectToken("file_names") as JArray;
            var fileLengthsArray = fileInfo.SelectToken("file_lengths") as JArray;

            if (fileNamesArray != null && fileLengthsArray != null)
            {
                var fileNames   = new List <string>(fileNamesArray.Values <string>());
                var fileLengths = new List <long>(fileLengthsArray.Values <long>());

                //increment using lengths since 'file_names'
                //includes directories as well
                var total = fileLengths.Count;
                for (var i = 0; i < total; i++)
                {
                    var fi = new TorrentFileInfo(fileNames[i].Trim(), fileLengths[i]);
                    files.Add(fi);
                }
            }

            return(files);
        }
示例#4
0
        public async Task Setup()
        {
            int pieceCount  = 40;
            int pieceLength = 256 * 1024;
            var torrentData = TestTorrentManagerInfo.Create(
                files: TorrentFileInfo.Create(pieceLength, ("File", pieceLength * pieceCount, "full/path/File")),
                pieceLength: pieceLength,
                size: pieceLength * pieceCount
                );

            peers = new List <PeerId> ();

            torrentManager = TestRig.CreateSingleFileManager(torrentData.TorrentInfo.Size, torrentData.TorrentInfo.PieceLength);
            await torrentManager.LoadFastResumeAsync(new FastResume (torrentManager.InfoHashes, new BitField(pieceCount).SetAll(true), new BitField(pieceCount).SetAll(false)));

            manager = new PieceManager(torrentManager);
            manager.Initialise();

            peer = PeerId.CreateNull(pieceCount);
            for (int i = 0; i < 20; i++)
            {
                PeerId p = PeerId.CreateNull(pieceCount);
                p.SupportsFastPeer = true;
                peers.Add(p);
            }
        }
 private void Page_Loaded(object sender, RoutedEventArgs e)
 {
     if (Application.Current.Properties["tfinfo"] != null)
     {
         tfinfo = Application.Current.Properties["tfinfo"] as TorrentFileInfo;
         try
         {
             Player.LoadMedia(tfinfo.FilePath);
         }
         catch
         {
             string message = string.Format("Couldn't open file {0}", tfinfo.FilePath);
             MessageBox.Show(message, "WebTorrentX", MessageBoxButton.OK);
             GoBack();
         }
         Thread t = new Thread(() =>
         {
             while (Player.VlcMediaPlayer.State != Meta.Vlc.Interop.Media.MediaState.Stopped)
             {
                 ThreadTask();
                 Thread.Sleep(500);
             }
         });
         t.Start();
     }
 }
示例#6
0
 TestTorrentManagerInfo CreateTestTorrentData()
 {
     return(TestTorrentManagerInfo.Create(
                size: 64 * 1024 * 40,
                pieceLength: 64 * 1024,
                files: TorrentFileInfo.Create(64 * 1024, 64 * 1024 * 40)
                ));
 }
        ITorrentManagerInfo CreateTorrentInfo()
        {
            var files = TorrentFileInfo.Create(Constants.BlockSize * 8, 1024 * 1024 * 8);

            return(TestTorrentManagerInfo.Create(
                       size: files.Single().Length,
                       pieceLength: Constants.BlockSize * 8,
                       files: files
                       ));
        }
        public void Setup()
        {
            var pieceLength = Constants.BlockSize * 8;
            var files       = TorrentFileInfo.Create(pieceLength, ("Relative/Path.txt", Constants.BlockSize * 5, "Full/Path/Relative/Path.txt"));

            torrent = TestTorrentManagerInfo.Create(pieceLength: pieceLength, size: files.Single().Length, files: files);

            writer = new MemoryWriter();
            cache  = new MemoryCache(new MemoryPool(), Constants.BlockSize * 4, writer);
        }
        static TestTorrentData CreateSingleFile()
        {
            int pieceLength = Piece.BlockSize * 16;
            var file        = new TorrentFileInfo(new TorrentFile("Single", pieceLength * 32 + 123, 0, 33));

            return(new TestTorrentData {
                Files = new[] { file },
                PieceLength = pieceLength,
                Size = file.Length
            });
        }
示例#10
0
        static ITorrentManagerInfo CreateSingleFile()
        {
            int pieceLength = 1024 * 16 * 16;
            var size        = pieceLength * 32 + 123;

            return(TestTorrentManagerInfo.Create(
                       pieceLength: pieceLength,
                       size: size,
                       files: TorrentFileInfo.Create(pieceLength, ("Single", size, "full/path/Single"))
                       ));
        }
示例#11
0
        static TestTorrentData CreateSingleFile()
        {
            int pieceLength = 1024 * 16 * 16;
            var size        = pieceLength * 32 + 123;
            var files       = TorrentFileInfo.Create(pieceLength, ("Single", size, "full/path/Single"));

            return(new TestTorrentData {
                Files = files,
                PieceLength = pieceLength,
                Size = files.Single().Length
            });
        }
示例#12
0
        public void Setup()
        {
            var pieceLength = Constants.BlockSize * 8;
            var files       = TorrentFileInfo.Create(pieceLength, ("Relative/Path.txt", Constants.BlockSize * 5, "Full/Path/Relative/Path.txt"));

            torrent = new TorrentData {
                Files       = files,
                PieceLength = pieceLength,
                Size        = files.Single().Length,
            };

            writer = new MemoryWriter();
            cache  = new MemoryCache(new MemoryPool(), Constants.BlockSize * 4, writer);
        }
        public void Setup()
        {
            var pieceLength = Constants.BlockSize * 2;

            Temp = Path.GetTempPath() + "monotorrent_tests";

            var files = TorrentFileInfo.Create(pieceLength,
                                               ("test1.file", 12345, Path.Combine(Temp, "test1.file")),
                                               ("test2.file", 12345, Path.Combine(Temp, "test2.file")),
                                               ("test3.file", 12345, Path.Combine(Temp, "test3.file")),
                                               ("test4.file", 12345, Path.Combine(Temp, "test4.file"))
                                               );

            TorrentFile = files.First();
            Others      = files.Skip(1).ToArray();
        }
示例#14
0
        private void Button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog1 = new OpenFileDialog();

            openFileDialog1.InitialDirectory = "C:\\";
            openFileDialog1.Filter           = "torrent文件|*.torrent";
            openFileDialog1.FilterIndex      = 1;
            openFileDialog1.RestoreDirectory = true;
            string filepath = "";

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                filepath = openFileDialog1.FileName;
            }
            StreamReader    sr              = new StreamReader(filepath);
            string          s               = sr.ReadToEnd();
            FileStream      file            = File.OpenRead(filepath);
            BinaryReader    binaryReader    = new BinaryReader(file);
            TorrentFileInfo torrentFileInfo = BencodeUtil.GetTorrentFileInfo(binaryReader);
            SHA1            hash            = new SHA1CryptoServiceProvider();
        }
        public void Setup()
        {
            int pieceCount  = 40;
            int pieceLength = 256 * 1024;

            bitfield    = new BitField(pieceCount);
            torrentData = new TestTorrentData {
                Files       = TorrentFileInfo.Create(pieceLength, ("File", pieceLength * pieceCount, "Full/Path/File")),
                PieceLength = pieceLength,
                Size        = pieceLength * pieceCount
            };
            peers = new List <PeerId> ();

            picker = new StandardPicker();
            picker.Initialise(torrentData);

            peer = PeerId.CreateNull(pieceCount);
            for (int i = 0; i < 20; i++)
            {
                PeerId p = PeerId.CreateNull(pieceCount);
                p.SupportsFastPeer = true;
                peers.Add(p);
            }
        }
示例#16
0
        static TestTorrentData CreateMultiFile()
        {
            int pieceLength = 1024 * 16 * 16;

            long[] sizes =
            {
                pieceLength * 10,
                   pieceLength * 7 + 123,
                   pieceLength * 32 + 123,
                   pieceLength * 16 + 543,
                   pieceLength * 19 + 591,
                   pieceLength * 22 + 591,
                   pieceLength * 0 + 12, // 12 byte file!
                   pieceLength * 7,
            };

            var files = TorrentFileInfo.Create(pieceLength, sizes);

            return(new TestTorrentData {
                Files = files,
                PieceLength = pieceLength,
                Size = files.Sum(t => t.Length)
            });
        }
示例#17
0
        static ITorrentManagerInfo CreateMultiFile()
        {
            int pieceLength = 1024 * 16 * 16;

            long[] sizes =
            {
                pieceLength * 10,
                   pieceLength * 7 + 123,
                   pieceLength * 32 + 123,
                   pieceLength * 16 + 543,
                   pieceLength * 19 + 591,
                   pieceLength * 22 + 591,
                   pieceLength * 0 + 12, // 12 byte file!
                   pieceLength * 7,
            };

            var files = TorrentFileInfo.Create(pieceLength, sizes);

            return(TestTorrentManagerInfo.Create(
                       files: files,
                       pieceLength: pieceLength,
                       size: files.Sum(t => t.Length)
                       ));
        }
示例#18
0
        private static void ParseInfo(TorrentInfo torrent, TorrentFileInfo singleFile, ref bool isSingleFile, BDictionary dictionary)
        {
            Contract.Requires(torrent != null);
            Contract.Requires(singleFile != null);
            Contract.Requires(dictionary != null);

            foreach (var info in dictionary)
            {
                if (info.Key == null)
                    continue;

                if (info.Key.Value == "name")
                {
                    if (info.Value != null)
                    {
                        torrent.Name = info.Value.ToString();
                    }
                }
                else if (info.Key.Value == "piece length")
                {
                    BInteger integer = info.Value as BInteger;
                    if (integer != null)
                    {
                        torrent.PieceLength = integer.Value;
                    }
                }
                else if (info.Key.Value == "pieces")
                {
                    if (info.Value != null)
                    {
                        torrent.Pieces = info.Value.ToString();
                    }
                }
                else if (info.Key.Value == "private")
                {
                    BInteger integer = info.Value as BInteger;
                    if (integer != null)
                    {
                        torrent.Private = integer.Value != 0;
                    }
                }
                else if (info.Key.Value == "files")
                {
                    BList files = info.Value as BList;
                    if (files != null)
                    {
                        foreach (var file in files)
                        {
                            BDictionary dict = file as BDictionary;
                            if (dict != null)
                            {
                                torrent.Files.Add(TorrentFileInfo.Parse(dict));
                            }
                        }
                    }
                }
                else if (info.Key.Value == "file-duration")
                {
                    isSingleFile = true;
                    BList items = info.Value as BList;
                    if (items != null)
                    {
                        foreach (var item in items)
                        {
                            BInteger integer = item as BInteger;
                            if (integer != null)
                            {
                                singleFile.Duration.Add(integer.Value);
                            }
                        }
                    }
                }
                else if (info.Key.Value == "file-media")
                {
                    isSingleFile = true;
                    BList items = info.Value as BList;
                    if (items != null)
                    {
                        foreach (var item in items)
                        {
                            BInteger integer = item as BInteger;
                            if (integer != null)
                            {
                                singleFile.Media.Add(integer.Value);
                            }
                        }
                    }
                }
                else if (info.Key.Value == "profiles")
                {
                    isSingleFile = true;

                    BList items = info.Value as BList;
                    if (items != null)
                    {
                        foreach (var item in items)
                        {
                            BDictionary dictItems = item as BDictionary;
                            if (dictItems != null)
                            {
                                TorrentFileProfileCollection profiles = new TorrentFileProfileCollection();
                                profiles.AddRange(dictItems.Select(dictItem => new TorrentFileProfile
                                {
                                    Name = dictItem.Key.ToString(),
                                    Value = dictItem.Value.ToString()
                                }));
                                singleFile.Profiles.Add(profiles);
                            }
                        }
                    }
                }
            }
        }
        public void PiecesRootNotNull()
        {
            TorrentFileInfo wrapper = new TorrentFileInfo(V2OnlyTorrent.Files[0], @"c:\test.a");

            Assert.AreEqual(V2OnlyTorrent.Files[0].PiecesRoot, wrapper.PiecesRoot);
        }
示例#20
0
        /// <summary>
        /// 对付INFO的结构
        /// </summary>
        /// <param name="TorrentBytes"></param>
        /// <param name="StarIndex"></param>
        /// <param name="ListCount"></param>
        private void GetFileInfo(byte[] TorrentBytes, ref int StarIndex, ref int ListCount)
        {
            if ((char)TorrentBytes[StarIndex] != 'd')
            {
                return;
            }
            StarIndex++;

            String getkey = GetKeyText(TorrentBytes, ref StarIndex).ToString().ToUpper();

            while (getkey != "FILES" && getkey != "LENGTH")
            {
                object PieceLengthNumb = GetKeyNumb(TorrentBytes, ref StarIndex);
                char   temp1           = (char)TorrentBytes[StarIndex];
                while (temp1 == 'i')
                {
                    object temp2 = GetKeyNumb(TorrentBytes, ref StarIndex);
                    temp1 = (char)TorrentBytes[StarIndex];
                }

                getkey = GetKeyText(TorrentBytes, ref StarIndex).ToString().ToUpper();
            }
            if (getkey == "FILES")
            {
                TorrentFileInfoClass Info = new TorrentFileInfoClass();
                while (true)
                {
                    string TextStar = Encoding.UTF8.GetString(TorrentBytes, StarIndex, 1);
                    switch (TextStar)
                    {
                    case "l":
                        StarIndex++;
                        ListCount++;
                        break;

                    case "e":
                        ListCount--;
                        StarIndex++;
                        if (ListCount == 1)
                        {
                            TorrentFileInfo.Add(Info);
                        }
                        if (ListCount == 0)
                        {
                            return;
                        }
                        break;

                    case "d":
                        Info = new TorrentFileInfoClass();
                        ListCount++;
                        StarIndex++;
                        break;

                    default:
                        object ListText = GetKeyText(TorrentBytes, ref StarIndex);
                        if (ListText == null)
                        {
                            return;
                        }
                        switch (ListText.ToString().ToUpper())       //转换为大写
                        {
                        case "ED2K":
                            Info.De2K = GetKeyText(TorrentBytes, ref StarIndex).ToString();
                            break;

                        case "FILEHASH":
                            Info.FileHash = GetKeyText(TorrentBytes, ref StarIndex).ToString();
                            break;

                        case "LENGTH":
                            Info.Length = Convert.ToInt64(GetKeyNumb(TorrentBytes, ref StarIndex));
                            break;

                        case "PATH":
                            int       PathCount = 0;
                            ArrayList PathList  = GetKeyData(TorrentBytes, ref StarIndex, ref PathCount);
                            string    Temp      = "";
                            for (int i = 0; i != PathList.Count; i++)
                            {
                                Temp += PathList[i].ToString();
                            }
                            Info.Path = Temp;
                            break;

                        case "PATH.UTF-8":
                            int       PathUtf8Count = 0;
                            ArrayList Pathutf8List  = GetKeyData(TorrentBytes, ref StarIndex, ref PathUtf8Count);
                            string    UtfTemp       = "";
                            for (int i = 0; i != Pathutf8List.Count; i++)
                            {
                                UtfTemp += Pathutf8List[i].ToString();
                            }
                            Info.PathUTF8 = UtfTemp;
                            break;
                        }
                        break;
                    }
                }
            }
            else if (getkey == "LENGTH")
            {
                //单一文件结构时
                TorrentFileInfoClass Info = new TorrentFileInfoClass();
                Info.Length = Convert.ToInt64(GetKeyNumb(TorrentBytes, ref StarIndex));
                string test = Encoding.UTF8.GetString(TorrentBytes, StarIndex, TorrentBytes.Length - StarIndex > 500 ? 500 : TorrentBytes.Length - StarIndex);

                string TextStar = Encoding.UTF8.GetString(TorrentBytes, StarIndex, 1);

                object ListText = GetKeyText(TorrentBytes, ref StarIndex);
                if (ListText.ToString().ToUpper() == "NAME")
                {
                    Info.Path = GetKeyText(TorrentBytes, ref StarIndex).ToString();
                    TorrentFileInfo.Add(Info);
                    TorrentName = Info.Path;
                }
            }
        }
示例#21
0
        ///<summary>
        ///To deal with the structure of the INFO
        ///</ Summary>
        ///<param Name="TorrentBytes"> </ param>
        ///<param Name="StarIndex"> </ param>
        ///<param Name="ListCount"> </ param>
        private void GetFileInfo(byte[] TorrentBytes, ref int StarIndex, ref int ListCount)
        {
            if ((char)TorrentBytes[StarIndex] != 'd')
            {
                return;
            }
            StarIndex++;
            if (GetKeyText(TorrentBytes, ref StarIndex).ToString().ToUpper() == "FILES")
            {
                TorrentFileInfoClass Info = new TorrentFileInfoClass();
                while (true)
                {
                    string TextStar = Encoding.UTF8.GetString(TorrentBytes, StarIndex, 1);

                    switch (TextStar)
                    {
                    case "l":
                        StarIndex++;
                        ListCount++;
                        break;

                    case "e":
                        ListCount--;
                        StarIndex++;
                        if (ListCount == 1)
                        {
                            TorrentFileInfo.Add(Info);
                        }
                        if (ListCount == 0)
                        {
                            return;
                        }
                        break;

                    case "d":
                        Info = new TorrentFileInfoClass();
                        ListCount++;
                        StarIndex++;
                        break;

                    default:
                        object ListText = GetKeyText(TorrentBytes, ref StarIndex);
                        if (ListText == null)
                        {
                            return;
                        }
                        switch (ListText.ToString().ToUpper())     // convert to uppercase
                        {
                        case "ED2K":
                            Info.De2K = GetKeyText(TorrentBytes, ref StarIndex).ToString();
                            break;

                        case "THE FILEHASH":
                            Info.FileHash = GetKeyText(TorrentBytes, ref StarIndex).ToString();
                            break;

                        case "LENGTH":
                            Info.Length = Convert.ToInt64(GetKeyNumb(TorrentBytes, ref StarIndex));
                            break;

                        case "PATH":
                            int       pathcount = 0;
                            ArrayList PathList  = GetKeyData(TorrentBytes, ref StarIndex, ref pathcount);
                            string    Temp      = "";
                            for (int i = 0; i != PathList.Count; i++)
                            {
                                Temp += PathList[i].ToString();
                            }
                            Info.Path = Temp;
                            break;

                        case "PATH.UTF-8":
                            int       PathUtf8Count = 0;
                            ArrayList Pathutf8List  = GetKeyData(TorrentBytes, ref StarIndex, ref PathUtf8Count);
                            string    UtfTemp       = "";
                            for (int i = 0; i != Pathutf8List.Count; i++)
                            {
                                UtfTemp += Pathutf8List[i].ToString();
                            }
                            Info.PathUTF8 = UtfTemp;
                            break;
                        }

                        break;
                    }
                }
            }
        }
示例#22
0
        public static TorrentInfo Parse(BDictionary dictionary)
        {
            Contract.Requires(dictionary != null);

            if (dictionary == null)
                throw new ArgumentNullException("dictionary");

            var torrent = new TorrentInfo();

            TorrentFileInfo singleFile = new TorrentFileInfo();
            bool isSingleFile = false;

            foreach (var item in dictionary)
            {
                if (item.Key == null)
                    continue;

                if (item.Key.Value == "announce")
                {
                    if (item.Value != null)
                    {
                        torrent.Announce = item.Value.ToString();
                    }
                }
                else if (item.Key.Value == "created by")
                {
                    if (item.Value != null)
                    {
                        torrent.CreatedBy = item.Value.ToString();
                    }
                }
                else if (item.Key.Value == "creation date")
                {
                    BInteger integer = item.Value as BInteger;
                    if (integer != null)
                    {
                        torrent.CreationDate = new DateTime(1970, 1, 1).AddSeconds(integer.Value);
                    }
                }
                else if (item.Key.Value == "encoding")
                {
                    if (item.Value != null)
                    {
                        torrent.Encoding = item.Value.ToString();
                    }
                }
                else if (item.Key.Value == "info")
                {
                    BDictionary dict = item.Value as BDictionary;
                    if (dict != null)
                    {
                        ParseInfo(torrent, singleFile, ref isSingleFile, item.Value as BDictionary);
                    }
                }
            }

            if (isSingleFile)
            {
                if (singleFile.Path != null)
                {
                    singleFile.Path.Add(torrent.Name);
                }
                torrent.Files.Add(singleFile);
            }

            return torrent;
        }