popcorn/Scripts/Managers/UsayaStorageManager.cs

231 lines
7.7 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using UnityEngine;
public enum UsayaStorageFilename {
Main_Data,
Settings_Data,
Wallet_Data,
Purchaser_Data,
}
public class UsayaStorageManager {
[Serializable]
protected class DataSet {
public string tag;
public string data;
public static DataSet CreateInstance<T>(string tag, T value){
DataSet dataSet = new DataSet();
dataSet.Save(tag, value);
return dataSet;
}
public void Save<T>(string tag, T value){
this.tag = tag;
this.data = JsonUtility.ToJson(new Serialization<T>(new List<T>{ value }));
}
public T Load<T>(){
return JsonUtility.FromJson<Serialization<T>>(data).ToList()[0];
}
}
private const string FileExtension = ".usaya";
private static Dictionary<string, List<DataSet>> dataSetDictionary = new Dictionary<string, List<DataSet>>();
private static string ToPath(UsayaStorageFilename filename){
return Application.persistentDataPath + "/" + filename.ToString() + FileExtension;
}
public static void Reset(){
dataSetDictionary.Clear();
}
private static List<DataSet> GetDataSetList(UsayaStorageFilename filename){
var key = filename.ToString();
if(dataSetDictionary.ContainsKey(key)){
return dataSetDictionary[key];
}else{
try{
List<DataSet> list;
if(Exists(filename)){
list = LoadList(filename);
}else{
list = new List<DataSet>();
}
dataSetDictionary[key] = list;
return list;
}catch(Exception e){
dataSetDictionary[key] = new List<DataSet>();
if(filename == UsayaStorageFilename.Settings_Data){
return dataSetDictionary[key];
}else{
throw e;
}
}
}
}
private static List<DataSet> SaveDataSet<T>(UsayaStorageFilename filename, string tag, T value){
var dataSetList = GetDataSetList(filename);
bool isExists = false;
foreach(var dataSet in dataSetList){
if(dataSet.tag == tag){
dataSet.Save(tag, value);
isExists = true;
break;
}
}
if(!isExists){
dataSetList.Add(DataSet.CreateInstance(tag, value));
}
return dataSetList;
}
private static DataSet LoadDataSet(UsayaStorageFilename filename, string tag){
var dataSetList = GetDataSetList(filename);
foreach(var dataSet in dataSetList){
if(dataSet.tag == tag) return dataSet;
}
return null;
}
private static bool ExistsDataSet(UsayaStorageFilename filename, string tag){
var dataSetList = GetDataSetList(filename);
foreach(var dataSet in dataSetList){
if(dataSet.tag == tag) return true;
}
return false;
}
public static void Save<T>(UsayaStorageFilename filename, string tag, T value){
var list = SaveDataSet(filename, tag, value);
SaveList(filename, list);
}
private static void SaveList(UsayaStorageFilename filename, List<DataSet> list){
var path = ToPath(filename);
var json = JsonUtility.ToJson(new Serialization<DataSet>(list));
using(StreamWriter writer = new StreamWriter(path, false)){
writer.Write(json);
writer.Flush();
writer.Close();
}
}
public static T LoadOrDefault<T>(UsayaStorageFilename filename, string tag, T defaultValue){
if(Exists(filename, tag)){
return Load<T>(filename, tag);
}else{
return defaultValue;
}
}
public static T Load<T>(UsayaStorageFilename filename, string tag){
var dataSet = LoadDataSet(filename, tag);
return dataSet.Load<T>();
}
private static List<DataSet> LoadList(UsayaStorageFilename filename){
var path = ToPath(filename);
var fileInfo = new FileInfo(path);
string json = LoadJson(fileInfo);
var result = Deserialize<Serialization<DataSet>>(json);
return SerializationToList(result);
}
private static string LoadJson(FileInfo fileInfo){
string json;
using(var fileStream = fileInfo.OpenRead()){
using(var streamReader = new StreamReader(fileStream, Encoding.UTF8)){
json = streamReader.ReadToEnd();
streamReader.Close();
}
}
return json;
}
private static T Deserialize<T>(string json){
return JsonUtility.FromJson<T>(json);
}
private static List<T> SerializationToList<T>(Serialization<T> serialization){
return serialization.ToList();
}
public static bool Exists(UsayaStorageFilename filename, string tag){
return ExistsDataSet(filename, tag);
}
public static bool Exists(UsayaStorageFilename filename){
var path = ToPath(filename);
return File.Exists(path);
}
public static void Remove(UsayaStorageFilename filename, string tag){
var list = GetDataSetList(filename);
DataSet result = null;
foreach(var dataSet in list){
if(dataSet.tag == tag){
result = dataSet;
break;
}
}
if(result != null){
list.Remove(result);
SaveList(filename, list);
}
}
public static void SaveAndBackup(UsayaStorageFilename filename, string tag, string value){
// bool isMainSaved = false;
try{
Save<string>(filename, tag, value);
// isMainSaved = true;
}catch(Exception){
// TODO ログサーバが出来たらExceptionを送りたい
}finally{
SaveBackup(filename, tag, value);
}
}
public static void SaveBackup(UsayaStorageFilename filename, string tag, string value){
string key = string.Format("{0}?tag={1}", filename.ToString(), tag);
PlayerPrefs.SetString(key, value);
PlayerPrefs.Save();
}
public static bool ExistsBackup(UsayaStorageFilename filename, string tag){
string key = string.Format("{0}?tag={1}", filename.ToString(), tag);
return PlayerPrefs.HasKey(key);
}
public static string LoadBackup(UsayaStorageFilename filename, string tag){
string key = string.Format("{0}?tag={1}", filename.ToString(), tag);
return PlayerPrefs.GetString(key);
}
public static void IsDiskFull(Exception ex, Func<string> getDiskFullMessage){
const int ERROR_HANDLE_DISK_FULL = 0x27;
const int ERROR_DISK_FULL = 0x70;
int errorCode = Marshal.GetHRForException(ex) & 0xFFFF;
if(errorCode == ERROR_HANDLE_DISK_FULL || errorCode == ERROR_DISK_FULL){
NativeUtils.ShowAlert(ex.Message, getDiskFullMessage());
}else{
throw ex;
}
}
public static string LoadRawString(UsayaStorageFilename filename){
var path = ToPath(filename);
var fileInfo = new FileInfo(path);
string json;
using(var streamReader = new StreamReader(fileInfo.OpenRead(), Encoding.UTF8)){
json = streamReader.ReadToEnd();
streamReader.Close();
}
return json;
}
public static void SaveRawString(UsayaStorageFilename filename, string str){
var path = ToPath(filename);
using(StreamWriter writer = new StreamWriter(path, false)){
writer.Write(str);
writer.Flush();
writer.Close();
}
}
}