コード例 #1
0
 public ResXMLParser(Stream source)
 {
     _source = source;
     _reader = new ResReader(_source);
     _eventCode = XmlParserEventCode.NOT_STARTED;
     _parserIterator = ParserIterator().GetEnumerator();
 }
コード例 #2
0
        private Resource FixResxResource(
            AssemblyDefinition containingAssembly,
            EmbeddedResource er,
            List <IResProcessor> resourcePrcessors,
            IEmbeddedResourceProcessor embeddedResourceProcessor)
        {
            MemoryStream stream = (MemoryStream)er.GetResourceStream();
            var          output = new MemoryStream((int)stream.Length);
            var          rw     = new ResourceWriter(output);

            using (var rr = new ResReader(stream))
            {
                foreach (var res in rr)
                {
                    foreach (var processor in resourcePrcessors)
                    {
                        if (processor.Process(res, containingAssembly, er, rr, rw))
                        {
                            break;
                        }
                    }
                }
            }

            // do a final processing, if any, on the embeddedResource itself
            embeddedResourceProcessor?.Process(er, rw);

            rw.Generate();
            output.Position = 0;
            return(new EmbeddedResource(er.Name, er.Attributes, output));
        }
コード例 #3
0
 public ResXMLParser(Stream source)
 {
     _source         = source;
     _reader         = new ResReader(_source);
     _eventCode      = XmlParserEventCode.NOT_STARTED;
     _parserIterator = ParserIterator().GetEnumerator();
 }
コード例 #4
0
        public void ReadStringPoolTest2()
        {
            using (Stream stream = File.OpenRead("resources.arsc"))
                using (ResReader reader = new ResReader(stream))
                {
                    // The first chunk must be of the type res_table_type; if not,
                    // it is not an Android resources file.
                    var header = reader.ReadResChunk_header();
                    Assert.Equal(ResourceType.RES_TABLE_TYPE, header.Type);

                    // From here, we can read the resTableHeader. It indicates the number
                    // of packages that are contained in this file.
                    var tableHeader = reader.ReadResTable_header(header);

                    Assert.Equal(1u, tableHeader.PackageCount);

                    header = reader.ReadResChunk_header();
                    Assert.Equal(ResourceType.RES_STRING_POOL_TYPE, header.Type);

                    var stringPoolHeader = reader.ReadResStringPool_header(header);
                    var strings          = reader.ReadResStringPool(stringPoolHeader);

                    var value = strings.StringData[0x109];
                }
        }
コード例 #5
0
ファイル: Table.Map.cs プロジェクト: Xtremrules/dot42
            /// <summary>
            /// Read ctor
            /// </summary>
            internal Map(EntryInstance parent, ResReader reader)
            {
                this.parent = parent;

                // header
                nameRef = TableRef.Read(reader);
                value = new Value(reader);
            }
コード例 #6
0
ファイル: Table.Map.cs プロジェクト: yuva2achieve/dot42
            /// <summary>
            /// Read ctor
            /// </summary>
            internal Map(EntryInstance parent, ResReader reader)
            {
                this.parent = parent;

                // header
                nameRef = TableRef.Read(reader);
                value   = new Value(reader);
            }
コード例 #7
0
        public bool Process(AssemblyDefinition containingAssembly,
            Res resource, ResReader resourceReader, ResourceWriter resourceWriter)
        {
            if (!resource.IsBamlStream)
                return false;

            _bamlStreams.Add(resource, containingAssembly);
            return true;
        }
コード例 #8
0
        public bool Process(
            AssemblyDefinition containingAssembly, Res resource, ResReader resourceReader, ResourceWriter resourceWriter)
        {
            if (!resource.IsBamlStream)
                return false;

            resource.data = GetProcessedResource(resource, containingAssembly);

            return false;
        }
コード例 #9
0
        public bool Process(AssemblyDefinition containingAssembly, Res resource, ResReader resourceReader, ResourceWriter resourceWriter)
        {
            if (!resource.IsString)
                return false;

            string content = (string)resourceReader.GetObject(resource);
            content = _repackContext.FixStr(content);
            resourceWriter.AddResource(resource.name, content);

            return true;
        }
コード例 #10
0
        public bool Process(AssemblyDefinition containingAssembly,
                            Res resource, ResReader resourceReader, ResourceWriter resourceWriter)
        {
            if (!resource.IsBamlStream)
            {
                return(false);
            }

            _bamlStreams.Add(resource, containingAssembly);
            return(true);
        }
コード例 #11
0
        public bool Process(
            AssemblyDefinition containingAssembly, Res resource, ResReader resourceReader, ResourceWriter resourceWriter)
        {
            if (!resource.IsBamlStream)
            {
                return(false);
            }

            resource.data = GetProcessedResource(resource, containingAssembly);

            return(false);
        }
コード例 #12
0
        public bool Process(AssemblyDefinition containingAssembly, Res resource, ResReader resourceReader, ResourceWriter resourceWriter)
        {
            if (!resource.IsString)
            {
                return(false);
            }

            string content = (string)resourceReader.GetObject(resource);

            content = _repackContext.FixStr(content);
            resourceWriter.AddResource(resource.name, content);

            return(true);
        }
コード例 #13
0
        public bool Process(AssemblyDefinition containingAssembly, Res resource, ResReader resourceReader, ResourceWriter resourceWriter)
        {
            string fix = _repackContext.FixStr(resource.type);
            if (fix == resource.type)
            {
                resourceWriter.AddResourceData(resource.name, resource.type, resource.data);
            }
            else
            {
                var output2 = new MemoryStream(resource.data.Length);
                var sr = new SerReader(_repackContext, new MemoryStream(resource.data), output2);
                sr.Stream();
                resourceWriter.AddResourceData(resource.name, fix, output2.ToArray());
            }

            return true;
        }
コード例 #14
0
        public bool Process(AssemblyDefinition containingAssembly, Res resource, ResReader resourceReader, ResourceWriter resourceWriter)
        {
            string fix = _repackContext.FixStr(resource.type);

            if (fix == resource.type)
            {
                resourceWriter.AddResourceData(resource.name, resource.type, resource.data);
            }
            else
            {
                var output2 = new MemoryStream(resource.data.Length);
                var sr      = new SerReader(_repackContext, new MemoryStream(resource.data), output2);
                sr.Stream();
                resourceWriter.AddResourceData(resource.name, fix, output2.ToArray());
            }

            return(true);
        }
コード例 #15
0
ファイル: XmlTree.Namespace.cs プロジェクト: Xtremrules/dot42
 /// <summary>
 /// Reading ctor
 /// </summary>
 protected NamespaceNode(ResReader reader, XmlTree tree, ChunkTypes expectedType)
     : base(reader, tree, expectedType)
 {
     Prefix = StringPoolRef.Read(reader, tree.StringPool);
     Uri = StringPoolRef.Read(reader, tree.StringPool);
 }
コード例 #16
0
ファイル: TableRef.cs プロジェクト: Xtremrules/dot42
        /**
 *  This is a reference to a unique entry (a ResTable_entry structure)
 *  in a resource table.  The value is structured as: 0xpptteeee,
 *  where pp is the package index, tt is the type index in that
 *  package, and eeee is the entry index in that type.  The package
 *  and type values start at 1 for the first item, to help catch cases
 *  where they have not been supplied.
 */

        /// <summary>
        /// Reading ctor
        /// </summary>
        internal static int Read(ResReader reader)
        {
            return reader.ReadInt32();
        }
コード例 #17
0
 /// <summary>
 /// Reading ctor
 /// </summary>
 protected NamespaceNode(ResReader reader, XmlTree tree, ChunkTypes expectedType)
     : base(reader, tree, expectedType)
 {
     Prefix = StringPoolRef.Read(reader, tree.StringPool);
     Uri    = StringPoolRef.Read(reader, tree.StringPool);
 }
コード例 #18
0
ファイル: XmlTree.Element.cs プロジェクト: Xtremrules/dot42
 /// <summary>
 /// Reading ctor
 /// </summary>
 protected Element(ResReader reader, XmlTree tree, ChunkTypes expectedType)
     : base(reader, tree, expectedType)
 {
     Namespace = StringPoolRef.Read(reader, tree.StringPool);
     Name = StringPoolRef.Read(reader, tree.StringPool);
 }
コード例 #19
0
        /// <summary>
        /// Reading ctor
        /// </summary>
        internal static string Read(ResReader reader, StringPool pool)
        {
            var index = reader.ReadInt32();

            return((index < 0) ? null : pool[index]);
        }
コード例 #20
0
        private IEnumerable <XmlParserEventCode> ParserIterator()
        {
            while (true)
            {
                ClearState();

                if (_reader.BaseStream.Position >= _reader.BaseStream.Length)
                {
                    // If we're at the end of the file, stop reading chunks.
                    // Don't try to catch an EndOfStreamException - this way,
                    // we avoid an exception being created.
                    break;
                }

                ResChunk_header header;
                try
                {
                    header = _reader.ReadResChunk_header();
                }
                catch (EndOfStreamException)
                {
                    // Keep this just in case.
                    break;
                }

                var subStream = new BoundedStream(_reader.BaseStream, header.Size - 8);
                var subReader = new ResReader(subStream);
                switch (header.Type)
                {
                case ResourceType.RES_XML_TYPE:
                    yield return(XmlParserEventCode.START_DOCUMENT);

                    _reader = subReader; // Bound whole file
                    continue;            // Don't skip content

                case ResourceType.RES_STRING_POOL_TYPE:
                    ResStringPool_header stringPoolHeader = subReader.ReadResStringPool_header(header);
                    _strings = subReader.ReadResStringPool(stringPoolHeader);
                    break;

                case ResourceType.RES_XML_RESOURCE_MAP_TYPE:
                    ResResourceMap resourceMap = subReader.ReadResResourceMap(header);
                    _resourceMap = resourceMap;
                    break;

                case ResourceType.RES_XML_START_NAMESPACE_TYPE:
                    _currentNode      = subReader.ReadResXMLTree_node(header);
                    _currentExtension = subReader.ReadResXMLTree_namespaceExt();
                    yield return(XmlParserEventCode.START_NAMESPACE);

                    break;

                case ResourceType.RES_XML_END_NAMESPACE_TYPE:
                    _currentNode      = subReader.ReadResXMLTree_node(header);
                    _currentExtension = subReader.ReadResXMLTree_namespaceExt();
                    yield return(XmlParserEventCode.END_NAMESPACE);

                    break;

                case ResourceType.RES_XML_START_ELEMENT_TYPE:
                    _currentNode = subReader.ReadResXMLTree_node(header);
                    ResXMLTree_attrExt attrExt = subReader.ReadResXMLTree_attrExt();
                    _currentExtension = attrExt;

                    _attributes = new List <ResXMLTree_attribute>();
                    for (int i = 0; i < attrExt.AttributeCount; i++)
                    {
                        _attributes.Add(subReader.ReadResXMLTree_attribute());
                    }
                    yield return(XmlParserEventCode.START_TAG);

                    break;

                case ResourceType.RES_XML_END_ELEMENT_TYPE:
                    _currentNode      = subReader.ReadResXMLTree_node(header);
                    _currentExtension = subReader.ReadResXMLTree_endElementExt();
                    yield return(XmlParserEventCode.END_TAG);

                    break;

                case ResourceType.RES_XML_CDATA_TYPE:
                    _currentNode      = subReader.ReadResXMLTree_node(header);
                    _currentExtension = subReader.ReadResXMLTree_cdataExt();
                    yield return(XmlParserEventCode.TEXT);

                    break;

                default:
#if !CORECLR
                    Console.WriteLine("Warning: Skipping chunk of type {0} (0x{1:x4})",
                                      header.Type, (int)header.Type);
#endif
                    break;
                }
                byte[] junk = subStream.ReadFully();
                if (junk.Length > 0)
                {
#if !CORECLR
                    Console.WriteLine("Warning: Skipping {0} bytes at the end of a {1} (0x{2:x4}) chunk.",
                                      junk.Length, header.Type, (int)header.Type);
#endif
                }
            }
        }
コード例 #21
0
ファイル: XmlTree.Element.cs プロジェクト: yuva2achieve/dot42
 /// <summary>
 /// Reading ctor
 /// </summary>
 protected Element(ResReader reader, XmlTree tree, ChunkTypes expectedType)
     : base(reader, tree, expectedType)
 {
     Namespace = StringPoolRef.Read(reader, tree.StringPool);
     Name      = StringPoolRef.Read(reader, tree.StringPool);
 }
コード例 #22
0
        public bool Process(Res resource, AssemblyDefinition containingAssembly, EmbeddedResource embeddedResource, ResReader resourceReader, ResourceWriter resourceWriter)
        {
            if (!resource.IsBamlStream && !embeddedResource.Name.EndsWith(".g.resources"))
            {
                return(false);
            }

            _bamlStreams.Add(resource, containingAssembly);
            return(true);
        }
コード例 #23
0
        private Resource FixResxResource(
            AssemblyDefinition containingAssembly,
            EmbeddedResource er,
            List<IResProcessor> resourcePrcessors,
            IEmbeddedResourceProcessor embeddedResourceProcessor)
        {
            MemoryStream stream = (MemoryStream)er.GetResourceStream();
            var output = new MemoryStream((int)stream.Length);
            var rw = new ResourceWriter(output);

            using (var rr = new ResReader(stream))
            {
                foreach (var res in rr)
                {
                    foreach (var processor in resourcePrcessors)
                    {
                        if (processor.Process(containingAssembly, res, rr, rw))
                            break;
                    }
                }
            }

            // do a final processing, if any, on the embeddedResource itself
            embeddedResourceProcessor?.Process(er, rw);

            rw.Generate();
            output.Position = 0;
            return new EmbeddedResource(er.Name, er.Attributes, output);
        }
コード例 #24
0
        private IEnumerable<XmlParserEventCode> ParserIterator()
        {
            while (true)
            {
                ClearState();
                ResChunk_header header;
                try
                {
                    header = _reader.ReadResChunk_header();
                }
                catch (EndOfStreamException)
                {
                    break;
                }
                var subStream = new BoundedStream(_reader.BaseStream, header.Size - 8);
                var subReader = new ResReader(subStream);
                switch (header.Type)
                {
                    case ResourceType.RES_XML_TYPE:
                        yield return XmlParserEventCode.START_DOCUMENT;
                        _reader = subReader; // Bound whole file
                        continue; // Don't skip content
                    case ResourceType.RES_STRING_POOL_TYPE:
                        ResStringPool_header stringPoolHeader = subReader.ReadResStringPool_header(header);
                        _strings = subReader.ReadResStringPool(stringPoolHeader);
                        break;
                    case ResourceType.RES_XML_RESOURCE_MAP_TYPE:
                        ResResourceMap resourceMap = subReader.ReadResResourceMap(header);
                        _resourceMap = resourceMap;
                        break;
                    case ResourceType.RES_XML_START_NAMESPACE_TYPE:
                        _currentNode = subReader.ReadResXMLTree_node(header);
                        _currentExtension = subReader.ReadResXMLTree_namespaceExt();
                        yield return XmlParserEventCode.START_NAMESPACE;
                        break;
                    case ResourceType.RES_XML_END_NAMESPACE_TYPE:
                        _currentNode = subReader.ReadResXMLTree_node(header);
                        _currentExtension = subReader.ReadResXMLTree_namespaceExt();
                        yield return XmlParserEventCode.END_NAMESPACE;
                        break;
                    case ResourceType.RES_XML_START_ELEMENT_TYPE:
                        _currentNode = subReader.ReadResXMLTree_node(header);
                        ResXMLTree_attrExt attrExt = subReader.ReadResXMLTree_attrExt();
                        _currentExtension = attrExt;

                        _attributes = new List<ResXMLTree_attribute>();
                        for (int i = 0; i < attrExt.AttributeCount; i++)
                        {
                            _attributes.Add(subReader.ReadResXMLTree_attribute());
                        }
                        yield return XmlParserEventCode.START_TAG;
                        break;
                    case ResourceType.RES_XML_END_ELEMENT_TYPE:
                        _currentNode = subReader.ReadResXMLTree_node(header);
                        _currentExtension = subReader.ReadResXMLTree_endElementExt();
                        yield return XmlParserEventCode.END_TAG;
                        break;
                    case ResourceType.RES_XML_CDATA_TYPE:
                        _currentNode = subReader.ReadResXMLTree_node(header);
                        _currentExtension = subReader.ReadResXMLTree_cdataExt();
                        yield return XmlParserEventCode.TEXT;
                        break;
                    default:
                        Console.WriteLine("Warning: Skipping chunk of type {0} (0x{1:x4})",
                                          header.Type, (int) header.Type);
                        break;
                }
                byte[] junk = subStream.ReadFully();
                if (junk.Length > 0)
                {
                    Console.WriteLine("Warning: Skipping {0} bytes at the end of a {1} (0x{2:x4}) chunk.",
                                      junk.Length, header.Type, (int) header.Type);
                }
            }
        }
コード例 #25
0
ファイル: StringPoolRef.cs プロジェクト: Xtremrules/dot42
 /// <summary>
 /// Reading ctor
 /// </summary>
 internal static string Read(ResReader reader, StringPool pool)
 {
     var index = reader.ReadInt32();
     return (index < 0) ? null : pool[index];
 }
コード例 #26
0
        /**
         *  This is a reference to a unique entry (a ResTable_entry structure)
         *  in a resource table.  The value is structured as: 0xpptteeee,
         *  where pp is the package index, tt is the type index in that
         *  package, and eeee is the entry index in that type.  The package
         *  and type values start at 1 for the first item, to help catch cases
         *  where they have not been supplied.
         */

        /// <summary>
        /// Reading ctor
        /// </summary>
        internal static int Read(ResReader reader)
        {
            return(reader.ReadInt32());
        }