示例#1
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);
        }
示例#2
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);
        }
示例#3
0
        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;
        }
示例#4
0
        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);
                    }
                }
            }
        }
示例#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);
        }