コード例 #1
0
        protected override void ExtractFromXML(Stream inputXmlFile, MultiStream outputStream, Action <MultiStream, IDContainer, bool> writeItem, bool withLocal = true)
        {
            var xmlDoc = new XmlDocument();

            xmlDoc.Load(inputXmlFile);

            XmlNode rootNode = xmlDoc.DocumentElement;
            var     first    = true;

            foreach (XmlNode node in rootNode.ChildNodes)
            {
                if (node.NodeType == XmlNodeType.Element)
                {
                    var locID = node.Attributes["id"]?.Value;
                    if (string.IsNullOrEmpty(locID))
                    {
                        continue;
                    }
                    var locName = node.Attributes["displayname"].Value;

                    writeItem(outputStream, new IDContainer()
                    {
                        Index      = locID,
                        UniqueName = locName
                    }, first);
                    if (first)
                    {
                        first = false;
                    }
                }
            }
        }
コード例 #2
0
        protected override void ExtractFromXML(Stream inputXmlFile, MultiStream outputStream, Action <MultiStream, IDContainer, bool> writeItem, LocalizationData localizationData = default)
        {
            var xmlDoc = new XmlDocument();

            xmlDoc.Load(inputXmlFile);

            var rootNode = xmlDoc.LastChild.FirstChild;
            var first    = true;

            foreach (XmlNode node in rootNode.ChildNodes)
            {
                if (node.NodeType == XmlNodeType.Element)
                {
                    var locID   = node.Attributes["id"].Value;
                    var locName = node.Attributes["displayname"].Value;

                    writeItem(outputStream, new IDContainer()
                    {
                        Index      = locID,
                        UniqueName = locName
                    }, first);
                    if (first)
                    {
                        first = false;
                    }
                }
            }
        }
コード例 #3
0
 private void WriteItem(MultiStream multiStream, IDContainer idContainer, bool first = false)
 {
     foreach (var streamType in multiStream.StreamTypes)
     {
         var output = new StringBuilder();
         if (streamType.ExportType == ExportType.TextList)
         {
             output.AppendFormat("{0,4}: {1,-65}", idContainer.Index, idContainer.UniqueName);
             if (idContainer is ItemContainer itemContainer && itemContainer.LocalizedNames != null)
             {
                 var englishNames = itemContainer.LocalizedNames.Where(x => x.Key == "EN-US");
                 if (englishNames.Any())
                 {
                     output.AppendFormat(": {0}", englishNames.First().Value);
                 }
             }
             output.AppendLine();
         }
         else if (streamType.ExportType == ExportType.Json)
         {
             if (!first)
             {
                 output.AppendLine(",");
             }
             output.Append(idContainer.ToJSON());
         }
         WriteString(streamType, output.ToString());
         output.Clear();
     }
 }
コード例 #4
0
        public void RedirectsConsoleOutput()
        {
            var originalOutWriter = Console.Out;

            try
            {
                var originalOut        = Console.OpenStandardOutput();
                var movingMemoryStream = new MovingMemoryStream();

                var multiOut = new MultiStream(originalOut, movingMemoryStream);
                var writer   = new StreamWriter(multiOut)
                {
                    AutoFlush = true
                };

                Console.SetOut(writer);

                Console.WriteLine("Test");

                var reader = new StreamReader(movingMemoryStream);
                var line1  = reader.ReadLine();

                Assert.Equal("Test", line1);
            }
            finally
            {
                Console.SetOut(originalOutWriter);
            }
        }
コード例 #5
0
        private void extractMultipleFromFolder(ulong outputStreamIndexOffset, bool[] matches, ulong folderIndex, ulong packIndex, Func <ulong, Stream> onStreamRequest, Action <ulong, Stream> onStreamClose)
        {
            using (var decoder = createDecoderStream(folderIndex, packIndex))
            {
                // define output stream
                Stream outStream = null;
                if (matches == null)
                {
                    outStream = onStreamRequest(outputStreamIndexOffset);
                }
                else
                {
                    ulong numStreams = streamsInfo.SubStreamsInfo.NumUnPackStreamsInFolders[folderIndex];

                    // create complex multistream
                    MultiStream multi = new MultiStream(numStreams,
                                                        (ulong innerIndex) =>
                    {
                        Stream innerStream = null;
                        if (matches[innerIndex])
                        {
                            innerStream = onStreamRequest(outputStreamIndexOffset + innerIndex);
                            if (innerStream == null)
                            {
                                matches[innerIndex] = false;
                            }
                        }

                        return(innerStream ??
                               new NullStream((long)streamsInfo.SubStreamsInfo.UnPackSizes[(int)(outputStreamIndexOffset + innerIndex)]));
                    },
                                                        (ulong innerIndex, Stream stream) =>
                    {
                        if (matches[innerIndex])
                        {
                            onStreamClose(outputStreamIndexOffset + innerIndex, stream);
                        }
                    });

                    // set sizes in multistream
                    for (ulong i = 0; i < numStreams; ++i)
                    {
                        multi.Sizes[i] = (long)streamsInfo.SubStreamsInfo.UnPackSizes[(int)(outputStreamIndexOffset + i)];
                    }

                    // set new stream as output stream
                    outStream = multi;
                }

                // actual extraction is done here (some decoder streams require knowing output size in advance, like PPMd)
                Util.TransferTo(decoder, outStream, (long)streamsInfo.UnPackInfo.Folders[folderIndex].GetUnPackSize());

                // call stream close delegate if only one stream and delegate present
                if (matches == null)
                {
                    onStreamClose?.Invoke(outputStreamIndexOffset, outStream);
                }
            }
        }
コード例 #6
0
        public void SingleStreamWrite()
        {
            byte[] data = { 1, 2, 3, 4, 5 };
            using (var stream1 = new MemoryStream())
            {
                using (var stream = new MultiStream(stream1))
                {
                    stream.Write(data, 0, data.Length);
                }

                Assert.Equal(data, stream1.ToArray());
            }
        }
コード例 #7
0
 public MockMailReference(
     string id,
     string sender,
     IImmutableList <string> recipients,
     bool saved,
     byte[] body,
     IMailStore store)
 {
     Id               = id;
     Sender           = sender;
     Recipients       = recipients;
     BackupBodyStream = body == null ? new MemoryStream() : new MemoryStream(body);
     BodyStream       = new MultiStream(new Stream[] { BackupBodyStream }, true);
     IsSaved          = saved;
     Store            = store;
 }
コード例 #8
0
 public MockMailboxItemReference(
     string id,
     string mailbox,
     string folder,
     MailboxFlags flags,
     bool saved,
     byte[] body,
     IWriter store)
 {
     Id               = id;
     Flags            = flags;
     BackupBodyStream = body == null ? new MemoryStream() : new MemoryStream(body);
     BodyStream       = new MultiStream(new[] { BackupBodyStream }, true);
     IsSaved          = saved;
     Store            = store;
     Mailbox          = mailbox;
     Folder           = folder;
 }
コード例 #9
0
ファイル: MailDispatcher.cs プロジェクト: garath/mail-server
        private async Task DispatchSingleMailReferenceAsync(
            IMailReadReference readReference,
            Stream bodyStream,
            CancellationToken token)
        {
            string sender = readReference.Sender;

            IDictionary <string, IEnumerable <string> > headers =
                await MailUtilities.ParseHeadersAsync(bodyStream);

            ISet <string> recipients =
                AugmentRecipients(sender, readReference.Recipients, headers);

            if (!recipients.Any())
            {
                _log.Warning($"{readReference.Id} had no recipients");
            }

            (bodyStream, sender) = await ReplaceSenderAsync(headers, bodyStream, sender, token);

            IWritable[] dispatchReferences = await CreateDispatchesAsync(
                readReference.Id,
                recipients,
                sender,
                token);

            if (!dispatchReferences.Any())
            {
                _log.Warning($"Failed to locate any processor for {readReference.Id}");
            }

            using (var targetStream = new MultiStream(dispatchReferences.Select(r => r.BodyStream)))
            {
                await bodyStream.CopyToAsync(targetStream, token);
            }

            await Task.WhenAll(dispatchReferences.Select(r => r.Store.SaveAsync(r, token)));
        }
コード例 #10
0
        public void Extract(bool withLocal = true)
        {
            var xmlPath = DecryptBinFile(GetBinFilePath());

            using (var inputFile = File.OpenRead(xmlPath))
            {
                var streamTypes = new List <StreamType>();
                if (Program.ExportType == ExportType.TextList || Program.ExportType == ExportType.Both)
                {
                    const ExportType exportType = ExportType.TextList;
                    streamTypes.Add(new StreamType
                    {
                        Stream     = GetExportStream(exportType),
                        ExportType = exportType
                    });
                }
                if (Program.ExportType == ExportType.Json || Program.ExportType == ExportType.Both)
                {
                    const ExportType exportType = ExportType.Json;
                    streamTypes.Add(new StreamType
                    {
                        Stream     = GetExportStream(exportType),
                        ExportType = exportType
                    });
                }
                var multiStream = new MultiStream(streamTypes.ToArray());

                ExtractFromXML(inputFile, multiStream, WriteItem, withLocal);

                foreach (var streamType in streamTypes)
                {
                    CloseExportStream(streamType.Stream, streamType.ExportType);
                    streamType.Stream.Close();
                }
            }
        }
コード例 #11
0
        public void Extract(LocalizationData localizationData = default)
        {
            var xmlPath = DecryptBinFile(GetBinFilePath(), outputFolderPath);

            using (var inputFile = File.OpenRead(xmlPath))
            {
                var streamTypes = new List <StreamType>();
                if (exportType == ExportType.TextList || exportType == ExportType.Both)
                {
                    const ExportType exportType = ExportType.TextList;
                    streamTypes.Add(new StreamType
                    {
                        Stream     = GetExportStream(exportType),
                        ExportType = exportType
                    });
                }
                if (exportType == ExportType.Json || exportType == ExportType.Both)
                {
                    const ExportType exportType = ExportType.Json;
                    streamTypes.Add(new StreamType
                    {
                        Stream     = GetExportStream(exportType),
                        ExportType = exportType
                    });
                }
                var multiStream = new MultiStream(streamTypes.ToArray());

                ExtractFromXML(inputFile, multiStream, WriteItem, localizationData);

                foreach (var streamType in streamTypes)
                {
                    CloseExportStream(streamType.Stream, streamType.ExportType);
                    streamType.Stream.Close();
                }
            }
        }
コード例 #12
0
 protected abstract void ExtractFromXML(Stream inputXmlFile, MultiStream outputStream, Action <MultiStream, IDContainer, bool> writeItem, bool withLocal = true);
コード例 #13
0
        private void extractMultipleFromFolder(ulong outputStreamIndexOffset, bool[] matches, ulong folderIndex, ulong packIndex, Func <ulong, Stream> onStreamRequest, Action <ulong, Stream> onStreamClose, SevenZipProgressProvider progressProvider)
        {
            using (var decoder = createDecoderStream(folderIndex, packIndex))
            {
                ulong unPackSize       = streamsInfo.UnPackInfo.Folders[folderIndex].GetUnPackSize();
                ulong neededUnPackSize = 0;

                // define output stream
                Stream outStream = null;
                if (matches == null)
                {
                    // single stream
                    outStream        = onStreamRequest(outputStreamIndexOffset);
                    neededUnPackSize = unPackSize;
                }
                else
                {
                    // find actual number of needed streams
                    ulong numStreams = streamsInfo.SubStreamsInfo.NumUnPackStreamsInFolders[folderIndex];
                    ulong lastStream = checked ((ulong)Array.LastIndexOf(matches, true));
                    numStreams = lastStream + 1;

                    // create complex multistream
                    MultiStream multi = new MultiStream(numStreams,
                                                        (ulong innerIndex) =>
                    {
                        Stream innerStream = null;
                        if (matches[innerIndex])
                        {
                            innerStream = onStreamRequest(outputStreamIndexOffset + innerIndex);
                            if (innerStream == null)
                            {
                                matches[innerIndex] = false;
                            }
                        }

                        return(innerStream ??
                               new NullStream((long)streamsInfo.SubStreamsInfo.UnPackSizes[(int)(outputStreamIndexOffset + innerIndex)]));
                    },
                                                        (ulong innerIndex, Stream stream) =>
                    {
                        if (onStreamClose != null && matches[innerIndex])
                        {
                            onStreamClose(outputStreamIndexOffset + innerIndex, stream);
                        }
                    });

                    // set sizes in multistream and define needed data size
                    for (ulong i = 0; i < numStreams; i++)
                    {
                        ulong ss = streamsInfo.SubStreamsInfo.UnPackSizes[(int)(outputStreamIndexOffset + i)];
                        multi.Sizes[i]    = (long)ss;
                        neededUnPackSize += ss;
                    }

                    // set new stream as output stream
                    outStream = multi;
                }

                // actual extraction is done here (some decoder streams require knowing output size in advance, like PPMd)
                Util.TransferTo(decoder, outStream, (long)neededUnPackSize, progressProvider);
                if (progressProvider != null)
                {
                    progressProvider.IncreaseOffsetBy((long)unPackSize, 0);
                    progressProvider.SetProgress(0, 0);
                }

                // call stream close delegate if only one stream and delegate present
                if (matches == null)
                {
                    onStreamClose?.Invoke(outputStreamIndexOffset, outStream);
                }
            }
        }
コード例 #14
0
 protected abstract void ExtractFromXML(Stream inputXmlFile, MultiStream outputStream, Action <MultiStream, IDContainer, bool> writeItem, LocalizationData localizationData = default);
コード例 #15
0
        protected override void ExtractFromXML(Stream inputXmlFile, MultiStream outputStream, Action <MultiStream, IDContainer, bool> writeItem, bool withLocal = true)
        {
            var journals = new List <IDContainer>();
            var xmlDoc   = new XmlDocument();

            xmlDoc.Load(inputXmlFile);

            var rootNode = xmlDoc.LastChild;

            var localizationData = default(LocalizationData);

            if (withLocal)
            {
                localizationData = ExtractLocalization();
            }

            var index = 0;
            var first = true;

            foreach (XmlNode node in rootNode.ChildNodes)
            {
                if (node.NodeType == XmlNodeType.Element && !string.IsNullOrEmpty(node.Attributes["uniquename"]?.Value))
                {
                    var uniqueName       = node.Attributes["uniquename"].Value;
                    var enchantmentLevel = node.Attributes["enchantmentlevel"];
                    var description      = node.Attributes["descriptionlocatag"];
                    var name             = node.Attributes["descvariable0"];
                    var enchantment      = "";
                    if (enchantmentLevel != null && enchantmentLevel.Value != "0")
                    {
                        enchantment = "@" + enchantmentLevel.Value;
                    }
                    var localizationNameVariable = name != null ? name.Value : LocalizationItemPrefix + uniqueName;
                    if (uniqueName.Contains("ARTEFACT"))
                    {
                        localizationNameVariable = LocalizationItemPrefix + uniqueName;
                    }
                    var container = new ItemContainer()
                    {
                        Index      = index.ToString(),
                        UniqueName = uniqueName + enchantment,
                        LocalizationDescriptionVariable = description != null ? description.Value : LocalizationItemPrefix + uniqueName + LocalizationItemDescPostfix,
                        LocalizationNameVariable        = localizationNameVariable
                    };
                    SetLocalization(localizationData, container);
                    writeItem(outputStream, container, first);
                    if (first)
                    {
                        first = false;
                    }
                    index++;

                    if (node.Name == "journalitem")
                    {
                        journals.Add(new ItemContainer()
                        {
                            UniqueName = uniqueName
                        });
                    }

                    var element = FindElement(node, "enchantments");
                    if (element != null)
                    {
                        foreach (XmlElement childNode in element.ChildNodes)
                        {
                            var enchantmentName = node.Attributes["uniquename"].Value + "@" + childNode.Attributes["enchantmentlevel"].Value;
                            container = new ItemContainer()
                            {
                                Index      = index.ToString(),
                                UniqueName = enchantmentName,
                                LocalizationDescriptionVariable = description != null ? description.Value : LocalizationItemPrefix + uniqueName + LocalizationItemDescPostfix,
                                LocalizationNameVariable        = name != null ? name.Value : LocalizationItemPrefix + uniqueName
                            };
                            SetLocalization(localizationData, container);
                            writeItem(outputStream, container, false);

                            index++;
                        }
                    }
                }
            }

            foreach (ItemContainer j in journals)
            {
                var container = new ItemContainer()
                {
                    Index      = index.ToString(),
                    UniqueName = j.UniqueName + "_EMPTY",
                    LocalizationDescriptionVariable = LocalizationItemPrefix + j.UniqueName + "_EMPTY" + LocalizationItemDescPostfix,
                    LocalizationNameVariable        = LocalizationItemPrefix + j.UniqueName + "_EMPTY"
                };
                SetLocalization(localizationData, container);
                writeItem(outputStream, container, false);
                index++;
                container = new ItemContainer()
                {
                    Index      = index.ToString(),
                    UniqueName = j.UniqueName + "_FULL",
                    LocalizationDescriptionVariable = LocalizationItemPrefix + j.UniqueName + "_FULL" + LocalizationItemDescPostfix,
                    LocalizationNameVariable        = LocalizationItemPrefix + j.UniqueName + "_FULL"
                };
                SetLocalization(localizationData, container);
                writeItem(outputStream, container, false);
                index++;
            }
        }
コード例 #16
0
ファイル: HttpClient.cs プロジェクト: RoboterYang/ECode
        public static Stream BuildMultipartData(IDictionary formData, string boundary, Encoding encoding = null)
        {
            AssertUtil.ArgumentNotNull(formData, nameof(formData));
            AssertUtil.ArgumentNotEmpty(boundary, nameof(boundary));

            encoding = encoding == null ? Encoding.UTF8 : encoding;

            var stream = new MultiStream();

            string keyValTemplate = $"--{boundary}\r\n"
                                    + "Content-Disposition: form-data; name=\"{0}\"\r\n"
                                    + "\r\n";

            string fileValTemplate = $"--{boundary}\r\n"
                                     + "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n"
                                     + "Content-Type: application/octet-stream\r\n"
                                     + "\r\n";

            foreach (var key in formData.Keys)
            {
                if (!(key is string))
                {
                    throw new ArgumentException("Key isnot typeof string.");
                }

                if (string.IsNullOrWhiteSpace((string)key))
                {
                    throw new ArgumentException("Key cannot be null or empty.");
                }

                if (formData[key] is IEnumerable)
                {
                    foreach (var value in (IEnumerable)formData[key])
                    {
                        if (value is FileStream)
                        {
                            var fileValStrm = new MemoryStream();
                            using (var writer = new SmartStream(fileValStrm, false))
                            {
                                writer.Encoding = encoding;

                                writer.Write(string.Format(fileValTemplate, ((string)key).Trim(), Path.GetFileName(((FileStream)value).Name)));
                                writer.Flush();
                            }

                            fileValStrm.Position = 0;
                            stream.AppendStream(fileValStrm);

                            stream.AppendStream((FileStream)value);
                            stream.AppendStream(new MemoryStream(new byte[] { (byte)'\r', (byte)'\n' }));
                        }
                        else
                        {
                            var keyValStrm = new MemoryStream();
                            using (var writer = new SmartStream(keyValStrm, false))
                            {
                                writer.Encoding = encoding;

                                writer.Write(string.Format(keyValTemplate, ((string)key).Trim()));
                                writer.Write(value.ToString());
                                writer.Write("\r\n");
                                writer.Flush();
                            }

                            keyValStrm.Position = 0;
                            stream.AppendStream(keyValStrm);
                        }
                    }
                }
                else
                {
                    if (formData[key] is FileStream)
                    {
                        var fileValStrm = new MemoryStream();
                        using (var writer = new SmartStream(fileValStrm, false))
                        {
                            writer.Encoding = encoding;

                            writer.Write(string.Format(fileValTemplate, ((string)key).Trim(), Path.GetFileName(((FileStream)formData[key]).Name)));
                            writer.Flush();
                        }

                        fileValStrm.Position = 0;
                        stream.AppendStream(fileValStrm);

                        stream.AppendStream((FileStream)formData[key]);
                        stream.AppendStream(new MemoryStream(new byte[] { (byte)'\r', (byte)'\n' }));
                    }
                    else
                    {
                        var keyValStrm = new MemoryStream();
                        using (var writer = new SmartStream(keyValStrm, false))
                        {
                            writer.Encoding = encoding;

                            writer.Write(string.Format(keyValTemplate, ((string)key).Trim()));
                            writer.Write(formData[key]?.ToString());
                            writer.Write("\r\n");
                            writer.Flush();
                        }

                        keyValStrm.Position = 0;
                        stream.AppendStream(keyValStrm);
                    }
                }
            }

            // add end boundary string line.
            stream.AppendStream(new MemoryStream(encoding.GetBytes($"--{boundary}--\r\n")));

            return(stream);
        }
コード例 #17
0
 public LogFile(string fileName)
 {
     _fileName      = fileName;
     _writer        = new MultiStream(fileName);
     _infoLogPrefix = new InfoLogPrefix();
 }