public BitTorrentService(BitTorrentManager manager,
                          PieceLevelTorrentManager pieceLevelManager)
 {
     _manager           = manager;
     _pieceLevelManager = pieceLevelManager;
     _cacheRegistry     = _manager.CacheRegistry;
 }
        public BitTorrentManager(BitTorrentCache bittorrentCache, string selfNameSpace,
            DictionaryServiceProxy dhtProxy, DictionaryServiceTracker dhtTracker, ClientEngine clientEngine,
            TorrentSettings torrentDefaults, TorrentHelper torrentHelper,
            bool startSeedingAtStartup)
        {
            _bittorrentCache = bittorrentCache;
              SelfNameSpace = selfNameSpace;
              _dictProxy = dhtProxy;
              _dictTracker = dhtTracker;
              _torrentDefaults = torrentDefaults;
              _startSeedingAtStartup = startSeedingAtStartup;

              RegisterClientEngineEventHandlers(clientEngine);
              _clientEngine = clientEngine;

              _torrentHelper = torrentHelper;

              try {
            _fastResumeData = BEncodedValue.Decode<BEncodedDictionary>(
              File.ReadAllBytes(_bittorrentCache.FastResumeFilePath));
              } catch {
            _fastResumeData = new BEncodedDictionary();
              }

              // CacheRegistry is created here because the default cache registry file path is
              // defined here.
              CacheRegistry = new CacheRegistry(_bittorrentCache.CacheRegistryFilePath, selfNameSpace);
              CacheRegistry.LoadCacheDir(_bittorrentCache.DownloadsDirPath);
        }
Exemple #3
0
        public BitTorrentManager(BitTorrentCache bittorrentCache, string selfNameSpace,
                                 DictionaryServiceProxy dhtProxy, DictionaryServiceTracker dhtTracker, ClientEngine clientEngine,
                                 TorrentSettings torrentDefaults, TorrentHelper torrentHelper,
                                 bool startSeedingAtStartup)
        {
            _bittorrentCache       = bittorrentCache;
            SelfNameSpace          = selfNameSpace;
            _dictProxy             = dhtProxy;
            _dictTracker           = dhtTracker;
            _torrentDefaults       = torrentDefaults;
            _startSeedingAtStartup = startSeedingAtStartup;

            RegisterClientEngineEventHandlers(clientEngine);
            _clientEngine = clientEngine;

            _torrentHelper = torrentHelper;

            try {
                _fastResumeData = BEncodedValue.Decode <BEncodedDictionary>(
                    File.ReadAllBytes(_bittorrentCache.FastResumeFilePath));
            } catch {
                _fastResumeData = new BEncodedDictionary();
            }

            // CacheRegistry is created here because the default cache registry file path is
            // defined here.
            CacheRegistry = new CacheRegistry(_bittorrentCache.CacheRegistryFilePath, selfNameSpace);
            CacheRegistry.LoadCacheDir(_bittorrentCache.DownloadsDirPath);
        }
 public BitTorrentService(BitTorrentManager manager, 
     PieceLevelTorrentManager pieceLevelManager)
 {
     _manager = manager;
       _pieceLevelManager = pieceLevelManager;
       _cacheRegistry = _manager.CacheRegistry;
 }
Exemple #5
0
        /// <summary>
        /// Gets the data from the given dht name.
        /// </summary>
        /// <param name="nameSpace">The name space.</param>
        /// <param name="name">The name.</param>
        /// <param name="waitHandle">The wait handle.</param>
        /// <param name="downloadPath">The download path.</param>
        /// <returns>Torrent bytes</returns>
        /// <exception cref="DictionaryKeyNotFoundException">Torrent at the given key is
        /// invalid.</exception>
        /// <remarks>MonoTorrent library provides easy conversion from bytes to
        /// Torrent object but not vise versa so we return bytes.</remarks>
        byte[] GetData(string nameSpace, string name, out string downloadPath, bool peek)
        {
            ManualResetEvent waitHandle = new ManualResetEvent(false);

            byte[] torrentDhtKey = ServiceUtil.GetDictKeyBytes(nameSpace, name);
            downloadPath =
                _bittorrentCache.GetPathOfItemInDownloads(nameSpace, name);
            // @TODO Check integrity of the data -- How do we know the download is complete?
            // A possbile solution. Use the name <name.part> and change it to <name> after
            // download completes.
            byte[] torrentBytes;
            if (!CacheRegistry.IsInCacheRegistry(nameSpace, name))
            {
                try {
                    var torrentSavePath = _bittorrentCache.GetTorrentFilePath(nameSpace, name);
                    torrentBytes = _torrentHelper.ReadOrDownloadTorrent(nameSpace,
                                                                        name, _dictProxy);
                    var torrent = Torrent.Load(torrentBytes);
                    if (!peek)
                    {
                        GetDataInternal(torrentDhtKey, torrent, downloadPath,
                                        waitHandle);

                        // Wait until downloading finishes
                        waitHandle.WaitOne();
                        // Download completed.
                        CacheRegistry.AddPathToRegistry(downloadPath, true);
                    }
                    else
                    {
                        // If we are only peeking, we don't add it to the registry.
                    }
                } catch (TorrentException ex) {
                    throw new DictionaryKeyNotFoundException(string.Format(
                                                                 "Torrent at key {0} (UrlBase64) is invalid.",
                                                                 UrlBase64.Encode(torrentDhtKey)), ex);
                }
            }
            else
            {
                torrentBytes = _torrentHelper.ReadOrDownloadTorrent(nameSpace,
                                                                    name, _dictProxy);
                var torrent = Torrent.Load(torrentBytes);
                if (!_clientEngine.Contains(torrent))
                {
                    // This is the case where the manager start seeding data when it boots up.
                    GetDataInternal(torrentDhtKey, torrent, downloadPath, null);
                }
                else
                {
                    // If the data is already there and the client engine is busily downloading or
                    // seeding, we don't need to do it again.
                    return(torrentBytes);
                }
            }
            return(torrentBytes);
        }
Exemple #6
0
        /// <summary>
        /// Serves the file over BitTorrent.
        /// </summary>
        /// <param name="dhtKey">The DHT name to be used to put the torrent info</param>
        /// <param name="nameSpace">The name space.</param>
        /// <param name="path">The file or directory path.</param>
        /// <param name="unique">if set to <c>true</c>, the manager uses Create
        /// instead of Put to insert torrent to Dht.</param>
        void PublishDataInternal(string nameSpace, string name, bool unique)
        {
            byte[] dhtKey          = ServiceUtil.GetDictKeyBytes(nameSpace, name);
            var    dataPath        = _bittorrentCache.GetPathOfItemInDownloads(nameSpace, name);
            var    torrentSavePath = _bittorrentCache.GetTorrentFilePath(nameSpace, name);

            // Create torrent
            BEncodedDictionary bdict   = _torrentHelper.CreateTorrent(dataPath);
            Torrent            torrent = Torrent.Load(bdict);

            // Dump torrent to the torrent folder so that tracker could load it.
            byte[] torrentBytes = bdict.Encode();
            TorrentHelper.WriteTorrent(torrentBytes, torrentSavePath);

            string torrentUrl = _torrentHelper.GetTorrentFileUrlToPublish(nameSpace, name);
            // Put the Url bytes to the dictionary.
            var torrentUrlBytes = Encoding.UTF8.GetBytes(torrentUrl);

            if (unique)
            {
                _dictProxy.CreateTorrent(dhtKey, torrentUrlBytes, TorrentTtl);
                CacheRegistry.AddPathToRegistry(dataPath, true);
            }
            else
            {
                _dictProxy.PutTorrent(dhtKey, torrentUrlBytes, TorrentTtl);
                CacheRegistry.UpdatePathInRegistry(dataPath, true);
            }

            Logger.WriteLineIf(LogLevel.Verbose, _log_props,
                               string.Format("{0}: Succesfully registered torrent url to dictionary.",
                                             torrent.Name));

            var saveDir = IOUtil.GetParent(dataPath, true).FullName;

            // Download without blocking.
            StartDownload(torrent, saveDir, null);
        }