示例#1
0
        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);
            }
        }
示例#2
0
        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;
            }
        }