using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PackingPress.Common { internal class UpgradePackageWriter { private readonly string _filePath; private readonly List _packages = new List(); public IReadOnlyList Packages => _packages; public UpgradePackageWriter(string filePath) { _filePath = filePath; } public void AddPackage(UpgradePackage package) { var existing = _packages.FirstOrDefault(x => x.Platform == package.Platform && x.Type == package.Type); if (existing == null) { _packages.Add(package); } } public void RemovePackage(PackagePlatform platform, PackageType type) { var existing = _packages.FirstOrDefault(x => x.Platform == platform && x.Type == type); if (existing != null) { _packages.Remove(existing); } } public void Save() { using (var stream = new FileStream(_filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite)) { var writer = new UpgradePackageStreamWriter(stream); writer.WriteString("VUP"); writer.WriteInt(_packages.Count); foreach (var package in _packages) { writer.WriteInt((int)package.Platform); writer.WriteInt((int)package.Type); writer.WriteString(package.Version.ToString()); writer.WriteString(package.Description); writer.WriteBytes(package.FileData); writer.WriteBytes(package.FileMD5); } } } private class UpgradePackageStreamWriter { private readonly Stream _stream; public UpgradePackageStreamWriter(Stream stream) { _stream = stream; } /// /// Write a string to stream. /// /// public void WriteString(string value) { var data = Encoding.Unicode.GetBytes(value); WriteInt(data.Length); _stream.Write(data, 0, data.Length); } /// /// Write a int32 value to stream. /// /// public void WriteInt(int value) { _stream.Write(BitConverter.GetBytes(value), 0, sizeof(int)); } /// /// Write a array in to stream. /// public void WriteBytes(byte[] value) { WriteInt(value.Length); _stream.Write(value, 0, value.Length); } } } }