Пример #1
0
 protected virtual void OnFilePartPosted(YEncFilePart e)
 {
     lock (monitor)
     {
         Monitor.Pulse(monitor);
     }
     PartPosted?.Invoke(this, e);
 }
Пример #2
0
 protected virtual void OnFilePartPosted(YEncFilePart e)
 {
     lock (monitor)
     {
         Monitor.Pulse(monitor);
     }
     if (PartPosted != null)
     {
         PartPosted(this, e);
     }
 }
Пример #3
0
        public PostedFileInfo PostYEncFile(InntpMessagePoster poster, String prefix, String suffix)
        {
            PostedFileInfo postedFileInfo = new PostedFileInfo();

            postedFileInfo.FromAddress = GetFromAddress(folderConfiguration.FromAddress);
            String subjectNameBase = ConstructSubjectNameBase(prefix, suffix);

            postedFileInfo.NzbSubjectName = String.Format(subjectNameBase, 1);
            postedFileInfo.PostedGroups.AddRange(folderConfiguration.GetTargetNewsGroups());
            postedFileInfo.PostedDateTime = DateTime.Now;

            var   yEncoder   = new YEncEncoder();
            Int32 partNumber = 0;

            using (var fileStream = File.Open(FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                while (fileStream.Position < fileStream.Length - 1) //If we have more blocks to encode.
                {
                    partNumber++;
                    Byte[] partBuffer        = new Byte[partSize];
                    Int32  partBufferPos     = 0;
                    Int32  bytesRead         = 0;
                    CRC32  partCRCCalculator = new CRC32();

                    var part = new YEncFilePart();
                    part.SourcefileName = File.Name;
                    part.Number         = partNumber;
                    part.Begin          = fileStream.Position + 1;

                    while (partBufferPos < partSize - 1 &&
                           (bytesRead = fileStream.Read(partBuffer, partBufferPos, partSize - partBufferPos)) > 0)
                    {
                        partBufferPos += bytesRead;
                    }

                    //TODO: this can be split in 2 threads to spread out CPU usage.
                    part.EncodedLines = yEncoder.EncodeBlock(configuration.YEncLineSize, partBuffer, 0, partBufferPos);

                    partCRCCalculator.TransformFinalBlock(partBuffer, 0, partBufferPos);
                    part.CRC32 = partCRCCalculator.HashAsHexString;

                    part.End = fileStream.Position;

                    PostPart(poster, postedFileInfo, part, subjectNameBase);
                }
            }

            return(postedFileInfo);
        }
Пример #4
0
        void poster_PartPosted(object sender, YEncFilePart e)
        {
            Int32 _uploadedPartCount;
            Int64 _totalUploadedBytes;

            lock (UploadLock)
            {
                UploadedPartCount++;
                _uploadedPartCount  = UploadedPartCount;
                TotalUploadedBytes += e.Size;
                _totalUploadedBytes = TotalUploadedBytes;
            }

            TimeSpan timeElapsed = DateTime.Now - UploadStartTime;
            Double   speed       = (Double)_totalUploadedBytes / timeElapsed.TotalSeconds;

            OnNewUploadSpeedReport(new UploadSpeedReport {
                TotalParts           = TotalPartCount,
                UploadedParts        = _uploadedPartCount,
                BytesPerSecond       = speed,
                CurrentlyPostingName = e.SourcefileName
            });
        }
Пример #5
0
        private void PostPart(InntpMessagePoster poster, PostedFileInfo postedFileInfo, YEncFilePart part,
                              String subjectNameBase)
        {
            var message = new nntpMessage();

            message.Subject = String.Format(subjectNameBase, part.Number);

            message.YEncFilePart = part;
            message.PostInfo     = postedFileInfo;

            if (TotalParts > 1)
            {
                message.Prefix.Add(String.Format("=ybegin part={0} total={1} line={2} size={3} name={4}",
                                                 part.Number, TotalParts, configuration.YEncLineSize, File.Length, File.Name));

                message.Prefix.Add(String.Format("=ypart begin={0} end={1}",
                                                 part.Begin, part.End));

                message.Suffix.Add(String.Format("=yend size={0} part={1} pcrc32={2}",
                                                 part.Size, part.Number, part.CRC32));
            }
            else
            {
                message.Prefix.Add(String.Format("=ybegin line={0} size={1} name={2}",
                                                 configuration.YEncLineSize, File.Length, File.Name));

                message.Suffix.Add(String.Format("=yend size={0} crc32={1}",
                                                 File.Length, part.CRC32));
            }

            poster.PostMessage(message);
        }