public PostedFileInfo PostYEncFile(InntpMessagePoster poster, String prefix, String suffix) { PostedFileInfo postedFileInfo = new PostedFileInfo(); String subjectNameBase = ConstructSubjectNameBase(prefix, suffix); postedFileInfo.NzbSubjectName = String.Format(subjectNameBase, 1); postedFileInfo.PostedGroups.AddRange(folderConfiguration.TargetNewsgroups); 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; }
protected virtual void OnFilePartPosted(YEncFilePart e) { lock (monitor) { Monitor.Pulse(monitor); } if (PartPosted != null) PartPosted(this, e); }
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 }); }
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); }