Esempio n. 1
0
 public void ReportSuccess(Block OfBlock, DownloadSource Source, byte[] data)
 {
     if (OfBlock.Completed)
     {
         return;
     }
     OfBlock.Completed = true;
     if (OfBlock.WorkingSource.Count > 1)
     {
         OfBlock.WorkingSource.ForEach(s => { if (s != Source)
                                              {
                                                  s.Abort();
                                              }
                                       });
     }
     lock (this)
     {
         WorkingBlocks.Remove(OfBlock);
         Downloaded += OfBlock.Length;
         if (LocalFile != null)
         {
             LocalFile.Seek(OfBlock.Start, SeekOrigin.Begin);
             LocalFile.Write(data, 0, data.Length);
             LocalFile.Flush();
         }
     }
 }
Esempio n. 2
0
 public void ReportFailure(Block OfBlock, DownloadSource Source)
 {
     lock (this)
     {
         OfBlock.WorkingSource.Remove(Source);
         if (OfBlock.WorkingSource.Count == 0)
         {
             WorkingBlocks.Remove(OfBlock);
             PendingBlocks.AddFirst(OfBlock);
         }
     }
 }
Esempio n. 3
0
        public Block GetBlock(DownloadSource Source)
        {
            Block ret = null;

            lock (this)
            {
                if (PendingBlocks.Count > 0)
                {
                    ret = PendingBlocks.First.Value;
                    PendingBlocks.RemoveFirst();
                    WorkingBlocks.AddLast(ret);
                }
                else if (WorkingBlocks.Count > 0)
                {
                    ret = WorkingBlocks.FirstOrDefault(b => b.WorkingSource.Count < 3 && b.WorkingSource.All(o => o.URL != Source.URL));
                }
                if (ret != null)
                {
                    ret.WorkingSource.Add(Source);
                }
            }
            return(ret);
        }