UpgradePackageWriter.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace PackingPress.Common
  8. {
  9. internal class UpgradePackageWriter
  10. {
  11. private readonly string _filePath;
  12. private readonly List<UpgradePackage> _packages = new List<UpgradePackage>();
  13. public IReadOnlyList<UpgradePackage> Packages => _packages;
  14. public UpgradePackageWriter(string filePath)
  15. {
  16. _filePath = filePath;
  17. }
  18. public void AddPackage(UpgradePackage package)
  19. {
  20. var existing = _packages.FirstOrDefault(x => x.Platform == package.Platform && x.Type == package.Type);
  21. if (existing == null)
  22. {
  23. _packages.Add(package);
  24. }
  25. }
  26. public void RemovePackage(PackagePlatform platform, PackageType type)
  27. {
  28. var existing = _packages.FirstOrDefault(x => x.Platform == platform && x.Type == type);
  29. if (existing != null)
  30. {
  31. _packages.Remove(existing);
  32. }
  33. }
  34. public void Save()
  35. {
  36. using (var stream = new FileStream(_filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
  37. {
  38. var writer = new UpgradePackageStreamWriter(stream);
  39. writer.WriteString("VUP");
  40. writer.WriteInt(_packages.Count);
  41. foreach (var package in _packages)
  42. {
  43. writer.WriteInt((int)package.Platform);
  44. writer.WriteInt((int)package.Type);
  45. writer.WriteString(package.Version.ToString());
  46. writer.WriteString(package.Description);
  47. writer.WriteBytes(package.FileData);
  48. writer.WriteBytes(package.FileMD5);
  49. }
  50. }
  51. }
  52. private class UpgradePackageStreamWriter
  53. {
  54. private readonly Stream _stream;
  55. public UpgradePackageStreamWriter(Stream stream)
  56. {
  57. _stream = stream;
  58. }
  59. /// <summary>
  60. /// Write a string to stream.
  61. /// </summary>
  62. /// <param name="value"></param>
  63. public void WriteString(string value)
  64. {
  65. var data = Encoding.Unicode.GetBytes(value);
  66. WriteInt(data.Length);
  67. _stream.Write(data, 0, data.Length);
  68. }
  69. /// <summary>
  70. /// Write a int32 value to stream.
  71. /// </summary>
  72. /// <param name="value"></param>
  73. public void WriteInt(int value)
  74. {
  75. _stream.Write(BitConverter.GetBytes(value), 0, sizeof(int));
  76. }
  77. /// <summary>
  78. /// Write a array in to stream.
  79. /// </summary>
  80. public void WriteBytes(byte[] value)
  81. {
  82. WriteInt(value.Length);
  83. _stream.Write(value, 0, value.Length);
  84. }
  85. }
  86. }
  87. }