/// <summary> /// Control if there is the minimum number of uploader peers else get other uploader peers. /// </summary> /// <param name="download">The download object.</param> /// <returns>Return true if there is the minimum number of the uploader peers else return false.</returns> private static bool CheckMinNumberOfUploaderPeers(Objects.Download download) { if(download.ListUploaderPeers.Count < NumPeersForEachDownloads) { System.Random random = new Random(); while(download.ListUploaderPeers.Count < NumPeersForEachDownloads) { // control if there are peers that have this file if (download.ListPeers.Count == 0) { download.FindPeers(); } if (download.ListPeers.Count > download.ListUploaderPeers.Count) { // get a casual peer Objects.Peer peer = download.ListPeers[random.Next(download.ListPeers.Count)]; // control if the peer is already an uploader if (download.SearchUploaderPeer(peer.Key) == null) { // add the peer in the list of the uploader peers of the download download.AddUploaderPeer(peer); // send a FPR message to the new uploader peer if (StartDownloadNextFilePart(download, peer) == false) { DownloadFirstNotDownloadedFilePack(download, peer); } } } else { return false; } } return true; } else { return true; } }
/// <summary> /// Adds a download object. /// </summary> /// <param name="download">The download object.</param> public static void AddDownload(Objects.Download download) { download.Active = true; download.FindPeers(); if (List.Count > 0) { int n = 0; int max = List.Count - 1; int min = 0; int compare = 0; while (max >= min) { n = (max + min) / 2; compare = download.SHA1.CompareTo(List[n].SHA1); if (compare > 0) { min = n + 1; } else if (compare < 0) { max = n - 1; } else { return; } } if (compare < 0) { n--; } List.Add(List[List.Count - 1]); for(int i = List.Count - 1; i > n + 1; i--) { List[i] = List[i - 1]; } List[n + 1] = download; } else { List.Add(download); } NewOrUpdatedDownload = true; }