Files
2026-03-04 10:03:45 +08:00

136 lines
2.8 KiB
C#

using System;
using System.Text;
using Steamworks;
using UnityEngine;
namespace HeathenEngineering.SteamApi.PlayerServices
{
[Serializable]
public class SteamDataFile
{
public SteamworksRemoteStorageManager.FileAddress address;
[HideInInspector]
public byte[] binaryData;
[HideInInspector]
public SteamAPICall_t? apiCall;
[HideInInspector]
public EResult result = EResult.k_EResultPending;
[HideInInspector]
public SteamDataLibrary linkedLibrary;
public Action<SteamDataFile> Complete;
public void ReadFromLibrary(SteamDataLibrary dataLibrary)
{
linkedLibrary = dataLibrary;
dataLibrary.SyncToBuffer(out binaryData);
}
public void WriteToLibrary(SteamDataLibrary dataLibrary)
{
linkedLibrary = dataLibrary;
dataLibrary.SyncFromBuffer(binaryData);
}
public void SetDataFromObject(object jsonObject, Encoding encoding)
{
binaryData = encoding.GetBytes(JsonUtility.ToJson(jsonObject));
}
public string FromUTF8()
{
if (binaryData.Length != 0)
{
return Encoding.UTF8.GetString(binaryData);
}
return string.Empty;
}
public string FromUTF32()
{
if (binaryData.Length != 0)
{
return Encoding.UTF32.GetString(binaryData);
}
return string.Empty;
}
public string FromUnicode()
{
if (binaryData.Length != 0)
{
return Encoding.Unicode.GetString(binaryData);
}
return string.Empty;
}
public string FromDefaultEncoding()
{
if (binaryData.Length != 0)
{
return Encoding.Default.GetString(binaryData);
}
return string.Empty;
}
public string FromASCII()
{
if (binaryData.Length != 0)
{
return Encoding.ASCII.GetString(binaryData);
}
return string.Empty;
}
public string FromEncoding(Encoding encoding)
{
return encoding.GetString(binaryData);
}
public T FromJson<T>(Encoding encoding)
{
return JsonUtility.FromJson<T>(encoding.GetString(binaryData));
}
public void HandleFileReadAsyncComplete(RemoteStorageFileReadAsyncComplete_t param, bool bIOFailure)
{
result = param.m_eResult;
if (result == EResult.k_EResultOK)
{
binaryData = new byte[address.fileSize];
if (!SteamRemoteStorage.FileReadAsyncComplete(param.m_hFileReadAsync, binaryData, (uint)binaryData.Length))
{
result = EResult.k_EResultFail;
}
else if (linkedLibrary != null)
{
linkedLibrary.activeFile = this;
WriteToLibrary(linkedLibrary);
}
}
if (Complete != null)
{
Complete(this);
}
}
public void HandleFileWriteAsyncComplete(RemoteStorageFileWriteAsyncComplete_t param, bool bIOFailure)
{
result = param.m_eResult;
if (result == EResult.k_EResultOK && linkedLibrary != null)
{
linkedLibrary.activeFile = this;
WriteToLibrary(linkedLibrary);
}
if (Complete != null)
{
Complete(this);
}
}
}
}