/// <summary> /// 序列化本地版本资源列表(版本 1)回调函数。 /// </summary> /// <param name="stream">目标流。</param> /// <param name="versionList">要序列化的本地版本资源列表(版本 1)。</param> /// <returns>是否序列化本地版本资源列表(版本 1)成功。</returns> public static bool LocalVersionListSerializeCallback_V1(Stream stream, LocalVersionList versionList) { if (!versionList.IsValid) { return(false); } Utility.Random.GetRandomBytes(s_CachedHashBytes); using (BinaryWriter binaryWriter = new BinaryWriter(stream, Encoding.UTF8)) { binaryWriter.Write(s_CachedHashBytes); LocalVersionList.Resource[] resources = versionList.GetResources(); binaryWriter.Write7BitEncodedInt32(resources.Length); foreach (LocalVersionList.Resource resource in resources) { binaryWriter.WriteEncryptedString(resource.Name, s_CachedHashBytes); binaryWriter.WriteEncryptedString(resource.Variant, s_CachedHashBytes); binaryWriter.WriteEncryptedString(resource.Extension != DefaultExtension ? resource.Extension : null, s_CachedHashBytes); binaryWriter.Write(resource.LoadType); binaryWriter.Write7BitEncodedInt32(resource.Length); binaryWriter.Write(resource.HashCode); } } Array.Clear(s_CachedHashBytes, 0, CachedHashBytesLength); return(true); }
// 加载本地所有版本 public static void LoadAllVersionInfo() { LocalVersionList.Clear(); // 首包 OriginalVersionInfo = new VersionInfo(OriginalVersionId, true); LocalVersionList.Add(OriginalVersionId.Id3rd, OriginalVersionInfo); // 获取本地的所有版本 DirectoryInfo dirInfo = new DirectoryInfo(LocalStorgePath); foreach (DirectoryInfo info in dirInfo.GetDirectories()) { int id3rd = 0; if (!int.TryParse(info.Name, out id3rd)) { continue; } if (id3rd <= OriginalVersionId.Id3rd) { continue; } VersionNum versionId = new VersionNum(OriginalVersionId.Id1st, OriginalVersionId.Id2nd, id3rd); if (!LoadVersionInfo(versionId)) { continue; } if (null == CurVersionId || versionId.Id3rd > CurVersionId.Id3rd) { CurVersionId = LocalVersionList[versionId.Id3rd].VersionId; } } }
// 加载指定版本信息 public static bool LoadVersionInfo(VersionNum version) { VersionInfo versionInfo = null; LocalVersionList.TryGetValue(version.Id3rd, out versionInfo); if (null == versionInfo) { versionInfo = new VersionInfo(version); if (versionInfo.IsValid) { LocalVersionList.Add(version.Id3rd, versionInfo); return(true); } } else if (versionInfo.IsValid) { return(true); } else { LocalVersionList.Remove(version.Id3rd); return(false); } return(false); }
/// <summary> /// 序列化本地版本资源列表(版本 0)回调函数。 /// </summary> /// <param name="binaryWriter">目标流。</param> /// <param name="versionList">要序列化的本地版本资源列表(版本 0)。</param> /// <returns>是否序列化本地版本资源列表(版本 0)成功。</returns> public static bool LocalVersionListSerializeCallback_V0(BinaryWriter binaryWriter, LocalVersionList versionList) { if (!versionList.IsValid) { return(false); } Utility.Random.GetRandomBytes(s_CachedHashBytes); binaryWriter.Write(s_CachedHashBytes); LocalVersionList.Resource[] resources = versionList.GetResources(); binaryWriter.Write(resources.Length); foreach (LocalVersionList.Resource resource in resources) { binaryWriter.WriteEncryptedString(resource.Name, s_CachedHashBytes); binaryWriter.WriteEncryptedString(resource.Variant, s_CachedHashBytes); binaryWriter.Write(resource.LoadType); binaryWriter.Write(resource.Length); binaryWriter.Write(resource.HashCode); } Array.Clear(s_CachedHashBytes, 0, CachedHashBytesLength); return(true); }
/// <summary> /// 序列化本地版本资源列表(版本 2)回调函数。 /// </summary> /// <param name="binaryWriter">目标流。</param> /// <param name="versionList">要序列化的本地版本资源列表(版本 2)。</param> /// <returns>是否序列化本地版本资源列表(版本 2)成功。</returns> public static bool LocalVersionListSerializeCallback_V2(BinaryWriter binaryWriter, LocalVersionList versionList) { if (!versionList.IsValid) { return(false); } Utility.Random.GetRandomBytes(s_CachedHashBytes); binaryWriter.Write(s_CachedHashBytes); LocalVersionList.Resource[] resources = versionList.GetResources(); binaryWriter.Write7BitEncodedInt32(resources.Length); foreach (LocalVersionList.Resource resource in resources) { binaryWriter.WriteEncryptedString(resource.Name, s_CachedHashBytes); binaryWriter.WriteEncryptedString(resource.Variant, s_CachedHashBytes); binaryWriter.WriteEncryptedString(resource.Extension != DefaultExtension ? resource.Extension : null, s_CachedHashBytes); binaryWriter.Write(resource.LoadType); binaryWriter.Write7BitEncodedInt32(resource.Length); binaryWriter.Write(resource.HashCode); } LocalVersionList.FileSystem[] fileSystems = versionList.GetFileSystems(); binaryWriter.Write7BitEncodedInt32(fileSystems.Length); foreach (LocalVersionList.FileSystem fileSystem in fileSystems) { binaryWriter.WriteEncryptedString(fileSystem.Name, s_CachedHashBytes); int[] resourceIndexes = fileSystem.GetResourceIndexes(); binaryWriter.Write7BitEncodedInt32(resourceIndexes.Length); foreach (int resourceIndex in resourceIndexes) { binaryWriter.Write7BitEncodedInt32(resourceIndex); } } Array.Clear(s_CachedHashBytes, 0, CachedHashBytesLength); return(true); }