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); }
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); }
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; }
public XDocument PostToUsenet(FileSystemInfo toPost, String title, String rarPassword, Boolean saveNzb = true) { using (nntpMessagePoster poster = new nntpMessagePoster(configuration, folderConfiguration)) { poster.PartPosted += poster_PartPosted; DirectoryInfo processedFiles = null; try { DateTime StartTime = DateTime.Now; processedFiles = MakeProcessingFolder(toPost.NameWithoutExtension()); MakeRarAndParFiles(toPost, toPost.NameWithoutExtension(), processedFiles, rarPassword); List <FileToPost> filesToPost = processedFiles.GetFiles() .OrderBy(f => f.Name) .Select(f => new FileToPost(configuration, folderConfiguration, f)).ToList(); List <PostedFileInfo> postedFiles = new List <PostedFileInfo>(); TotalPartCount = filesToPost.Sum(f => f.TotalParts); UploadedPartCount = 0; TotalUploadedBytes = 0; UploadStartTime = DateTime.Now; Int32 fileCount = 1; foreach (var fileToPost in filesToPost) { DateTime filestartTime = DateTime.Now; String comment1 = String.Format("{0} [{1}/{2}]", title, fileCount++, filesToPost.Count); PostedFileInfo postInfo = fileToPost.PostYEncFile(poster, comment1, ""); if (log.IsInfoEnabled) { TimeSpan fileTimeElapsed = DateTime.Now - filestartTime; Double fileSpeed = (Double)fileToPost.File.Length / fileTimeElapsed.TotalSeconds; log.InfoFormat("Posted file {0} with a speed of {1}", fileToPost.File.Name, UploadSpeedReport.GetHumanReadableSpeed(fileSpeed)); } postedFiles.Add(postInfo); } poster.WaitTillCompletion(); if (log.IsInfoEnabled) { TimeSpan totalTimeElapsed = DateTime.Now - StartTime; TimeSpan uploadTimeElapsed = DateTime.Now - UploadStartTime; Double speed = TotalUploadedBytes / totalTimeElapsed.TotalSeconds; Double ulSpeed = TotalUploadedBytes / uploadTimeElapsed.TotalSeconds; log.InfoFormat("Upload of [{0}] has completed at {1} with an upload speed of {2}", title, UploadSpeedReport.GetHumanReadableSpeed(speed), UploadSpeedReport.GetHumanReadableSpeed(ulSpeed)); } Console.WriteLine(); XDocument nzbDoc = GenerateNzbFromPostInfo(toPost.Name, postedFiles, rarPassword); if (saveNzb && configuration.NzbOutputFolder != null) { nzbDoc.Save(Path.Combine(configuration.NzbOutputFolder.FullName, toPost.NameWithoutExtension() + ".nzb")); } return(nzbDoc); } finally { if (processedFiles != null && processedFiles.Exists) { log.Info("Deleting processed folder"); processedFiles.Delete(true); } } } }