231 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			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(); | |||
|  |         } | |||
|  |     } | |||
|  | } |