Ejemplo n.º 1
0
        static public XmlDictionaryWriter CreateBinaryWriter(Stream stream, IXmlDictionary dictionary, XmlBinaryWriterSession session, bool ownsStream)
        {
            XmlBinaryWriter writer = new XmlBinaryWriter();

            writer.SetOutput(stream, dictionary, session, ownsStream);
            return(writer);
        }
Ejemplo n.º 2
0
        public void Write(System.IO.Stream fileStream, XMLType convertType)
        {
            if (convertType == XMLType.Text)
            {
                using (fileStream)
                {
                    doc.Save(fileStream);
                }
            }
            else if (convertType == XMLType.BinXML)
            {
                Dictionary<string, int> valuesToID = new Dictionary<string, int>();
                List<BinaryXmlElement> xmlElems = new List<BinaryXmlElement>();
                List<BinaryXmlAttribute> xmlAttrs = new List<BinaryXmlAttribute>();
                List<int> valueLocations = new List<int>();

                BuildBinXml(doc.DocumentElement, valuesToID, xmlElems, xmlAttrs);
                valueLocations.Add(0);

                using (XmlBinaryWriter writer = new XmlBinaryWriter(new LittleEndianBitConverter(), fileStream))
                {
                    writer.Write(0x7252221A);
                    writer.Write(0);

                    // Section 2: Sections 3 and 4 Header and Total Size
                    writer.Write(0x72522217);
                    writer.Write(0); // 16 as Extra, Rest from Section 3 and 4 Length

                    // Section 3: Values/Strings
                    writer.Write(0x7252221D);
                    writer.Write(0);
                    foreach (string s in valuesToID.Keys)
                    {
                        valueLocations.Add(writer.WriteTerminatedString(s) + valueLocations[valueLocations.Count - 1] + 1);
                    }
                    // Write zero bytes to make length the same way CM made it
                    int remainder = (int)writer.BaseStream.Position % 16;
                    byte[] pad = new byte[remainder > 8 ? 24 - remainder : 8 - remainder];
                    writer.Write(pad);

                    // Section 4: Value/String Locations
                    writer.Write(0x7252221E);
                    writer.Write(4 * valuesToID.Count);
                    for (int i = 0; i < valueLocations.Count - 1; i++)
                    {
                        writer.Write(valueLocations[i]);
                    }

                    // Section 5: Element Definitions
                    writer.Write(0x7252221B);
                    writer.Write(24 * xmlElems.Count);
                    for (int i = 0; i < xmlElems.Count; i++)
                    {
                        writer.WriteBinaryXmlElement(xmlElems[i]);
                    }

                    // Section 6: Attribute Definitions
                    writer.Write(0x7252221C);
                    writer.Write(8 * xmlAttrs.Count);
                    for (int i = 0; i < xmlAttrs.Count; i++)
                    {
                        writer.WriteBinaryXmlAttribute(xmlAttrs[i]);
                    }

                    // Update Section Lenghts/Sizes
                    writer.Seek(4, System.IO.SeekOrigin.Begin);
                    writer.Write((int)writer.BaseStream.Length - 8); // Section 1: Total File

                    writer.Seek(12, System.IO.SeekOrigin.Begin);
                    writer.Write(valueLocations[valueLocations.Count - 1] + 4 * valuesToID.Count + 16 + pad.Length); // Section 2

                    writer.Seek(20, System.IO.SeekOrigin.Begin);
                    writer.Write(valueLocations[valueLocations.Count - 1] + pad.Length); // Section 3
                }
            }
            else if (convertType == XMLType.BXMLBig)
            {
                using (XmlBinaryWriter writer = new XmlBinaryWriter(EndianBitConverter.Big, fileStream))
                {
                    writer.Write((byte)0);
                    writer.Write(Encoding.UTF8.GetBytes("BXML"));
                    writer.WriteBxmlElement(doc.DocumentElement);

                    // File Ending: "0004 06000000" x2
                    writer.Write((Int16)0x0004);
                    writer.Write((Int16)0x0600);
                    writer.Write((Int16)0);
                    writer.Write((Int16)0x0004);
                    writer.Write((Int16)0x0600);
                    writer.Write((Int16)0);
                }
            }
            else if (convertType == XMLType.BXMLLittle)
            {
                using (XmlBinaryWriter writer = new XmlBinaryWriter(EndianBitConverter.Little, fileStream))
                {
                    writer.Write((byte)1);
                    writer.Write(Encoding.UTF8.GetBytes("BXML"));
                    writer.WriteBxmlElement(doc.DocumentElement);

                    // File Ending: "0004 06000000" x2
                    writer.Write((Int16)0x0004);
                    writer.Write((Int16)0x0006);
                    writer.Write((Int16)0);
                    writer.Write((Int16)0x0004);
                    writer.Write((Int16)0x0006);
                    writer.Write((Int16)0);
                }
            }
        }