public static bool ContainsBamlResources(Resource resource)
        {
            var data = resource.GetData();

            if (!ResourceUtils.IsResource(data))
            {
                return(false);
            }

            using (var reader = new ResourceReaderEx(data))
            {
                while (reader.Read())
                {
                    if (reader.TypeCode != ResourceTypeCode.Stream && reader.TypeCode != ResourceTypeCode.ByteArray)
                    {
                        continue;
                    }

                    if (0 == string.Compare(Path.GetExtension(reader.Name), BamlImage.FileExtension, true))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
        public void Map()
        {
            if (!_assembly.HasWpfResource)
            {
                return;
            }

            var resource = _assembly.GetWpfResource();

            if (!resource.HasWpfBaml)
            {
                return;
            }

            var data = resource.GetData();

            bool changed = false;

            using (var outputStream = new MemoryStream())
            {
                using (var reader = new ResourceReaderEx(data))
                {
                    using (var writer = new ResourceWriter(outputStream))
                    {
                        while (reader.Read())
                        {
                            byte[] resourceData = reader.Data;
                            Map(reader, ref resourceData, ref changed);
                            writer.AddResourceData(reader.Name, reader.TypeName, resourceData);
                        }
                    }
                }

                if (changed)
                {
                    resource.SetData(outputStream.ToArray());
                }
            }
        }
        private void Map(ResourceReaderEx reader, ref byte[] resourceData, ref bool changed)
        {
            if (reader.TypeCode != ResourceTypeCode.Stream && reader.TypeCode != ResourceTypeCode.ByteArray)
            {
                return;
            }

            string name = reader.Name;

            if (0 != string.Compare(Path.GetExtension(name), BamlImage.FileExtension, true))
            {
                return;
            }

            var resourceDataStream = new MemoryStream(resourceData);

            resourceDataStream.Position += 4;

            var bamlImage = BamlImage.Load(resourceDataStream);

            if (bamlImage == null)
            {
                return;
            }

            if (Map(bamlImage))
            {
                resourceData = bamlImage.Save();

                int pos             = 0;
                var newResourceData = new byte[resourceData.Length + 4];
                BufferUtils.Write(newResourceData, ref pos, (int)resourceData.Length);
                BufferUtils.Write(newResourceData, ref pos, (byte[])resourceData);
                resourceData = newResourceData;

                changed = true;
            }
        }
Example #4
0
        private void Analyze()
        {
            bool hasWpfResource = false;

            string resourceName = BamlUtils.GetWpfResourceName(_assembly.Name);

            foreach (BuildResource resource in _assembly.Resources)
            {
                if (resource.Name != resourceName)
                {
                    continue;
                }

                resource.IsWpf = true;
                hasWpfResource = true;

                bool hasBaml = false;

                var data = resource.GetData();

                if (!ResourceUtils.IsResource(data))
                {
                    continue;
                }

                using (var reader = new ResourceReaderEx(data))
                {
                    while (reader.Read())
                    {
                        if (reader.TypeCode != ResourceTypeCode.Stream && reader.TypeCode != ResourceTypeCode.ByteArray)
                        {
                            continue;
                        }

                        if (0 != string.Compare(Path.GetExtension(reader.Name), BamlImage.FileExtension, true))
                        {
                            continue;
                        }

                        byte[] resourceData       = reader.Data;
                        var    resourceDataStream = new MemoryStream(resourceData);
                        resourceDataStream.Position += 4;

                        var bamlImage = BamlImage.Load(resourceDataStream);
                        if (bamlImage == null)
                        {
                            continue;
                        }

                        Process(bamlImage);

                        hasBaml = true;
                    }
                }

                if (hasBaml)
                {
                    resource.HasWpfBaml = true;
                }
            }

            if (hasWpfResource)
            {
                _assembly.HasWpfResource = true;
            }
        }