async UniTask <bool> ReadFileAsync(IAltoStorageData data) { string path = $"{ DataPath() }/{ SlotPrefix() }{ data.SaveFileName() }"; Log($"Read file : {path}"); if (!File.Exists(path)) { Log($"File not exists, so set initial data : { data.GetType() }"); data.OnCreateNewData(); return(false); } try { byte[] dataBytes; byte[] ivSeedBytes = new byte[IvSeedLength]; using (var fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read)) { dataBytes = new byte[fileStream.Length - IvSeedLength]; await fileStream.ReadAsync(ivSeedBytes, 0, IvSeedLength); await fileStream.ReadAsync(dataBytes, 0, dataBytes.Length); } string ivSeed = Encoding.UTF8.GetString(ivSeedBytes); dataBytes = AltoCrypto.Decrypt(dataBytes, CryptoKey(), ivSeed); string json = Encoding.UTF8.GetString(dataBytes); data.OnDeserialize(json); data.ClearDirty(); MigrateIfNeeded(data); return(true); } catch (Exception e) { Debug.LogException(e); return(false); } }
void MigrateIfNeeded(IAltoStorageData data) { if (data.savedSchemaVersion >= data.schemaVersion) { return; } Log($"Migration { data.GetType() } : {data.savedSchemaVersion} -> {data.schemaVersion}"); if (data.savedSchemaVersion + 1000 < data.schemaVersion) { LogError("Data shcema version is too big! / Migration is canceled."); return; } int versionHead = data.savedSchemaVersion; while (versionHead < data.schemaVersion) { data.OnMigrateData(versionHead + 1); ++versionHead; } }