using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using Steamworks.Data; namespace Steamworks { /// /// Class for utilizing the Steam Remote Storage API. /// public class SteamRemoteStorage : SteamClientClass { internal static ISteamRemoteStorage? Internal => Interface as ISteamRemoteStorage; internal override bool InitializeInterface( bool server ) { SetInterface( server, new ISteamRemoteStorage( server ) ); if ( Interface is null || Interface.Self == IntPtr.Zero ) return false; return true; } /// /// Creates a new file, writes the bytes to the file, and then closes the file. /// If the target file already exists, it is overwritten /// /// The path of the file. /// The bytes of data. /// A boolean, detailing whether or not the operation was successful. public unsafe static bool FileWrite( string filename, byte[] data ) { fixed ( byte* ptr = data ) { return Internal != null && Internal.FileWrite( filename, (IntPtr) ptr, data.Length ); } } /// /// Opens a binary file, reads the contents of the file into a byte array, and then closes the file. /// /// The path of the file. public unsafe static byte[]? FileRead( string filename ) { if (Internal is null) { return null; } var size = FileSize( filename ); if ( size <= 0 ) return null; var buffer = new byte[size]; fixed ( byte* ptr = buffer ) { var readsize = Internal.FileRead( filename, (IntPtr)ptr, size ); if ( readsize != size ) { return null; } return buffer; } } /// /// Checks whether the specified file exists. /// /// The path of the file. /// Whether or not the file exists. public static bool FileExists( string filename ) => Internal != null && Internal.FileExists( filename ); /// /// Checks if a specific file is persisted in the steam cloud. /// /// The path of the file. /// Boolean. public static bool FilePersisted( string filename ) => Internal != null && Internal.FilePersisted( filename ); /// /// Gets the specified file's last modified date/time. /// /// The path of the file. /// A describing when the file was modified last. public static DateTime FileTime( string filename ) => Internal != null ? Epoch.ToDateTime( Internal.GetFileTimestamp( filename ) ) : default; /// /// Returns the specified files size in bytes, or 0 if the file does not exist. /// /// The path of the file. /// The size of the file in bytes, or 0 if the file doesn't exist. public static int FileSize( string filename ) => Internal?.GetFileSize( filename ) ?? 0; /// /// Deletes the file from remote storage, but leaves it on the local disk and remains accessible from the API. /// /// A boolean, detailing whether or not the operation was successful. public static bool FileForget( string filename ) => Internal != null && Internal.FileForget( filename ); /// /// Deletes a file from the local disk, and propagates that delete to the cloud. /// public static bool FileDelete( string filename ) => Internal != null && Internal.FileDelete( filename ); /// /// Gets the total number of quota bytes. /// public static ulong QuotaBytes { get { ulong t = 0, a = 0; Internal?.GetQuota( ref t, ref a ); return t; } } /// /// Gets the total number of quota bytes that have been used. /// public static ulong QuotaUsedBytes { get { ulong t = 0, a = 0; Internal?.GetQuota( ref t, ref a ); return t - a; } } /// /// Number of bytes remaining until the quota is used. /// public static ulong QuotaRemainingBytes { get { ulong t = 0, a = 0; Internal?.GetQuota( ref t, ref a ); return a; } } /// /// returns if AND are . /// public static bool IsCloudEnabled => IsCloudEnabledForAccount && IsCloudEnabledForApp; /// /// Checks if the account wide Steam Cloud setting is enabled for this user /// or if they disabled it in the Settings->Cloud dialog. /// public static bool IsCloudEnabledForAccount => Internal != null && Internal.IsCloudEnabledForAccount(); /// /// Checks if the per game Steam Cloud setting is enabled for this user /// or if they disabled it in the Game Properties->Update dialog. /// /// This must only ever be set as the direct result of the user explicitly /// requesting that it's enabled or not. This is typically accomplished with /// a checkbox within your in-game options /// public static bool IsCloudEnabledForApp { get => Internal != null && Internal.IsCloudEnabledForApp(); set => Internal?.SetCloudEnabledForApp( value ); } /// /// Gets the total number of local files synchronized by Steam Cloud. /// public static int FileCount => Internal?.GetFileCount() ?? 0; public struct RemoteFile { public string Filename; public int Size; public bool Delete() { return Internal != null && Internal.FileDelete(Filename); } } /// /// Gets a list of filenames synchronized by Steam Cloud. /// public static List Files { get { var ret = new List(); if (Internal is null) { return ret; } int count = FileCount; for( int i=0; i