UpgradePackageReader.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. class UpgradePackageReader
  10. {
  11. private readonly List<UpgradePackage> _packages = new List<UpgradePackage>();
  12. public IReadOnlyList<UpgradePackage> Packages => _packages;
  13. public UpgradePackageReader(string filePath)
  14. {
  15. LoadPackages(filePath);
  16. }
  17. private void LoadPackages(string filePath)
  18. {
  19. try
  20. {
  21. using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
  22. {
  23. var reader = new UpgradePackageStreamReader(stream);
  24. var header = reader.ReadString();
  25. if (header != "VUP") return;
  26. var packageCount = reader.ReadInt();
  27. for (int i = 0; i < packageCount; i++)
  28. {
  29. var platform = (PackagePlatform)reader.ReadInt();
  30. var type = (PackageType)reader.ReadInt();
  31. var version = Version.Parse(reader.ReadString());
  32. var description = reader.ReadString();
  33. var fileData = reader.ReadBytes();
  34. var fileMd5 = reader.ReadBytes();
  35. _packages.Add(new UpgradePackage(platform, type, version, description, fileData, fileMd5));
  36. }
  37. }
  38. }
  39. catch (Exception)
  40. {
  41. _packages.Clear();
  42. }
  43. }
  44. class UpgradePackageStreamReader
  45. {
  46. private readonly Stream _stream;
  47. public UpgradePackageStreamReader(Stream stream)
  48. {
  49. _stream = stream;
  50. }
  51. /// <summary>
  52. /// Read string from stream.
  53. /// </summary>
  54. /// <returns></returns>
  55. public string ReadString()
  56. {
  57. var dataLength = ReadInt();
  58. var data = new byte[dataLength];
  59. _stream.Read(data, 0, dataLength);
  60. return Encoding.Unicode.GetString(data, 0, data.Length);
  61. }
  62. /// <summary>
  63. /// Read a int32 value from the stream.
  64. /// </summary>
  65. /// <returns></returns>
  66. public int ReadInt()
  67. {
  68. var data = new byte[sizeof(int)];
  69. _stream.Read(data, 0, sizeof(int));
  70. return BitConverter.ToInt32(data, 0);
  71. }
  72. /// <summary>
  73. /// Read a byte value from the stream.
  74. /// </summary>
  75. /// <returns></returns>
  76. public byte ReadByte()
  77. {
  78. return (byte)(_stream.ReadByte());
  79. }
  80. /// <summary>
  81. /// Read a byte array from the stream.
  82. /// </summary>
  83. /// <returns></returns>
  84. public byte[] ReadBytes()
  85. {
  86. var size = ReadInt();
  87. var data = new byte[size];
  88. _stream.Read(data, 0, size);
  89. return data;
  90. }
  91. }
  92. }
  93. }