amazfitbiptools/Resources/Writer.cs

52 lines
1.6 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using NLog;
2019-05-04 10:44:19 +02:00
using Resources.Models;
namespace Resources
{
public class Writer
{
private const int OffsetTableItemLength = 4;
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
private readonly Stream _stream;
public Writer(Stream stream)
{
_stream = stream;
}
2019-05-04 10:44:19 +02:00
public void Write(List<IResource> resources)
{
2019-05-04 10:44:19 +02:00
var offsetsTable = new byte[resources.Count * OffsetTableItemLength];
var encodedResources = new MemoryStream[resources.Count];
var offset = (uint) 0;
2019-05-04 10:44:19 +02:00
for (var i = 0; i < resources.Count; i++)
{
2019-05-04 10:44:19 +02:00
Logger.Trace("Resource {0} offset is {1}...", i, offset);
var offsetBytes = BitConverter.GetBytes(offset);
offsetBytes.CopyTo(offsetsTable, i * OffsetTableItemLength);
var encodedImage = new MemoryStream();
2019-05-04 10:44:19 +02:00
Logger.Debug("Encoding resource {0}...", i);
resources[i].WriteTo(encodedImage);
offset += (uint) encodedImage.Length;
2019-05-04 10:44:19 +02:00
encodedResources[i] = encodedImage;
}
2019-05-04 10:44:19 +02:00
Logger.Trace("Writing resources offsets table");
_stream.Write(offsetsTable, 0, offsetsTable.Length);
2019-05-04 10:44:19 +02:00
Logger.Debug("Writing resources");
foreach (var encodedImage in encodedResources)
{
encodedImage.Seek(0, SeekOrigin.Begin);
encodedImage.CopyTo(_stream);
}
}
}
}