64 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System.IO;
 | |
| using UnityEngine;
 | |
| 
 | |
| namespace ES3Internal
 | |
| {
 | |
| 	internal class ES3PlayerPrefsStream : MemoryStream
 | |
| 	{
 | |
| 		private string path;
 | |
| 		private bool append;
 | |
| 		private bool isWriteStream = false;
 | |
| 		private bool isDisposed = false;
 | |
| 
 | |
| 		// This constructor should be used for read streams only.
 | |
| 		public ES3PlayerPrefsStream(string path) : base(GetData(path,false))
 | |
| 		{
 | |
| 			this.path = path;
 | |
| 			this.append = false;
 | |
| 		}
 | |
| 
 | |
| 		// This constructor should be used for write streams only.
 | |
| 		public ES3PlayerPrefsStream(string path, int bufferSize, bool append=false) : base(bufferSize)
 | |
| 		{
 | |
| 			this.path = path;
 | |
| 			this.append = append;
 | |
| 			this.isWriteStream = true;
 | |
| 		}
 | |
| 
 | |
| 		private static byte[] GetData(string path, bool isWriteStream)
 | |
| 		{
 | |
| 			if(!PlayerPrefs.HasKey(path))
 | |
| 				throw new FileNotFoundException("File \""+path+"\" could not be found in PlayerPrefs");
 | |
| 			return System.Convert.FromBase64String(PlayerPrefs.GetString(path));
 | |
| 		}
 | |
| 
 | |
| 		protected override void Dispose (bool disposing)
 | |
| 		{
 | |
| 			if(isDisposed)
 | |
| 				return;
 | |
| 			isDisposed = true;
 | |
| 			if(isWriteStream && this.Length > 0)
 | |
| 			{
 | |
| 	            if (append)
 | |
| 	            {
 | |
| 	                // Convert data back to bytes before appending, as appending Base-64 strings directly can corrupt the data.
 | |
| 	                var sourceBytes = System.Convert.FromBase64String(PlayerPrefs.GetString(path));
 | |
| 	                var appendBytes = this.ToArray();
 | |
| 	                var finalBytes = new byte[sourceBytes.Length + appendBytes.Length];
 | |
| 	                System.Buffer.BlockCopy(sourceBytes, 0, finalBytes, 0, sourceBytes.Length);
 | |
| 	                System.Buffer.BlockCopy(appendBytes, 0, finalBytes, sourceBytes.Length, appendBytes.Length);
 | |
| 
 | |
| 					PlayerPrefs.SetString(path, System.Convert.ToBase64String(finalBytes));
 | |
| 
 | |
| 					PlayerPrefs.Save();
 | |
| 	            }
 | |
| 	            else
 | |
| 					PlayerPrefs.SetString(path + ES3IO.temporaryFileSuffix, System.Convert.ToBase64String(this.ToArray()));
 | |
| 				// Save the timestamp to a separate key.
 | |
| 				PlayerPrefs.SetString("timestamp_" + path, System.DateTime.UtcNow.Ticks.ToString());
 | |
| 			}
 | |
| 			base.Dispose(disposing);
 | |
| 		}
 | |
| 	}
 | |
| }
 |