using System;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using Newtonsoft.Json;
using TapSDK.Core;
using UnityEngine;
using TapSDK.Core.Internal.Log;
namespace TapSDK.Compliance.Internal
{
///
/// 通用 JSON 序列化工具
///
internal class Persistence
{
private readonly string _filePath;
internal Persistence(string path)
{
string new_cacheDir = Path.Combine(Application.persistentDataPath, Config.ANTI_ADDICTION_DIR);
if (!string.IsNullOrEmpty(TapTapComplianceManager.ClientId)){
new_cacheDir = Path.Combine(Application.persistentDataPath, Config.ANTI_ADDICTION_DIR + "_" + TapTapComplianceManager.ClientId);
}
// 文件夹不存在时,尝试兼容旧版本数据
if(!Directory.Exists(new_cacheDir)) {
string old_cacheDir = Path.Combine(Application.persistentDataPath, Config.ANTI_ADDICTION_DIR);
if(Directory.Exists(old_cacheDir)) {
Directory.Move(old_cacheDir, new_cacheDir);
}
}
_filePath = Path.Combine(new_cacheDir, path);
}
internal async Task Load() where T : class
{
TapLog.Log(_filePath);
if (!File.Exists(_filePath))
{
return null;
}
string text;
using (FileStream fs = File.OpenRead(_filePath))
{
byte[] buffer = new byte[fs.Length];
await fs.ReadAsync(buffer, 0, (int)fs.Length);
text = Encoding.UTF8.GetString(buffer);
}
try
{
return JsonConvert.DeserializeObject(text);
}
catch (Exception e)
{
TapLog.Error(e);
Delete();
return null;
}
}
internal async Task Save(T obj)
{
if (obj == null)
{
TapLog.Error("Saved object is null.");
return;
}
string text;
try
{
text = JsonConvert.SerializeObject(obj);
}
catch (Exception e)
{
TapLog.Error(e);
return;
}
string dirPath = Path.GetDirectoryName(_filePath);
if (!string.IsNullOrEmpty(dirPath) && !Directory.Exists(dirPath))
{
Directory.CreateDirectory(dirPath);
}
using (FileStream fs = File.Create(_filePath))
{
byte[] buffer = Encoding.UTF8.GetBytes(text);
await fs.WriteAsync(buffer, 0, buffer.Length);
}
}
internal void Delete()
{
if (!File.Exists(_filePath))
{
return;
}
File.Delete(_filePath);
}
}
}