public ResXMLParser(Stream source) { _source = source; _reader = new ResReader(_source); _eventCode = XmlParserEventCode.NOT_STARTED; _parserIterator = ParserIterator().GetEnumerator(); }
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)); }
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]; } }
/// <summary> /// Read ctor /// </summary> internal Map(EntryInstance parent, ResReader reader) { this.parent = parent; // header nameRef = TableRef.Read(reader); value = new Value(reader); }
public bool Process(AssemblyDefinition containingAssembly, Res resource, ResReader resourceReader, ResourceWriter resourceWriter) { if (!resource.IsBamlStream) return false; _bamlStreams.Add(resource, containingAssembly); return true; }
public bool Process( AssemblyDefinition containingAssembly, Res resource, ResReader resourceReader, ResourceWriter resourceWriter) { if (!resource.IsBamlStream) return false; resource.data = GetProcessedResource(resource, containingAssembly); return false; }
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; }
public bool Process(AssemblyDefinition containingAssembly, Res resource, ResReader resourceReader, ResourceWriter resourceWriter) { if (!resource.IsBamlStream) { return(false); } _bamlStreams.Add(resource, containingAssembly); return(true); }
public bool Process( AssemblyDefinition containingAssembly, Res resource, ResReader resourceReader, ResourceWriter resourceWriter) { if (!resource.IsBamlStream) { return(false); } resource.data = GetProcessedResource(resource, containingAssembly); return(false); }
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); }
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; }
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); }
/// <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); }
/** * 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(); }
/// <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); }
/// <summary> /// Reading ctor /// </summary> internal static string Read(ResReader reader, StringPool pool) { var index = reader.ReadInt32(); return((index < 0) ? null : pool[index]); }
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 } } }
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); }
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); }
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); } } }
/// <summary> /// Reading ctor /// </summary> internal static string Read(ResReader reader, StringPool pool) { var index = reader.ReadInt32(); return (index < 0) ? null : pool[index]; }
/** * 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()); }