Support for RemoteStorageLocalFileChange_t

This commit is contained in:
James King 2022-08-30 14:40:00 +01:00
parent 12902b416e
commit 435a9fd92d
3 changed files with 81 additions and 2 deletions

View File

@ -818,7 +818,7 @@ internal enum UGCReadAction : int
//
// ERemoteStorageLocalFileChange
//
internal enum RemoteStorageLocalFileChange : int
public enum RemoteStorageLocalFileChange : int
{
Invalid = 0,
FileUpdated = 1,
@ -828,10 +828,22 @@ internal enum RemoteStorageLocalFileChange : int
//
// ERemoteStorageFilePathType
//
internal enum RemoteStorageFilePathType : int
public enum RemoteStorageFilePathType : int
{
/// <summary>
/// Unused.
/// </summary>
Invalid = 0,
/// <summary>
/// An absolute disk path is provided. This type of path is used for files managed via AutoCloud.
/// </summary>
Absolute = 1,
/// <summary>
/// An ISteamRemoteStorage API relative path is provided. This type of path is used for files
/// managed via the ISteamRemoteStorage API methods (FileWrite, FileRead, etc).
/// </summary>
APIFilename = 2,
}

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
@ -17,8 +18,34 @@ public class SteamRemoteStorage : SteamClientClass<SteamRemoteStorage>
internal override void InitializeInterface( bool server )
{
SetInterface( server, new ISteamRemoteStorage( server ) );
InstallEvents( server );
}
internal static void InstallEvents( bool server )
{
Dispatch.Install<RemoteStorageLocalFileChange_t>( x =>
{
var count = Internal.GetLocalFileChangeCount();
var files = new LocalFileChange[count];
for ( var i = 0; i < count; i++ )
{
RemoteStorageLocalFileChange changeType = default;
RemoteStorageFilePathType filePathType = default;
var filename = Internal.GetLocalFileChange( i, ref changeType, ref filePathType );
files[i] = new LocalFileChange( filename, changeType, filePathType );
}
OnLocalFileChange?.Invoke( files );
}, server );
}
/// <summary>
/// If a Steam app is flagged for supporting dynamic Steam Cloud sync, and a sync occurs, this callback will be posted to the app if any local files changed.
/// </summary>
public static event Action<LocalFileChange[]> OnLocalFileChange;
/// <summary>
/// Creates a new file, writes the bytes to the file, and then closes the file.
@ -177,6 +204,27 @@ public static IEnumerable<string> Files
}
}
public static IDisposable FileWriteBatch()
{
Internal.BeginFileWriteBatch();
return new FileWriteBatchDisposable();
}
private sealed class FileWriteBatchDisposable : IDisposable
{
private bool _disposed;
public void Dispose()
{
if ( _disposed ) return;
_disposed = true;
Internal.EndFileWriteBatch();
}
}
public static async Task<LegacyDownloadResult?> LegacyDownloadSharedFile( PublishedFileId fileId, uint priority = 1000 )
{
var result = await Internal.UGCDownload( fileId.Value, priority );

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Steamworks
{
/// <summary>
/// References a Remote Storage file that was externally changed
/// during the lifetime of the application.
/// See <see cref="SteamRemoteStorage.OnLocalFileChange"/>.
/// </summary>
/// <param name="Filename">Name of the changed file, of type <paramref name="PathType"/></param>
/// <param name="ChangeType">What happened to this file</param>
/// <param name="PathType">Type of path to the file</param>
public record struct LocalFileChange(
string Filename,
RemoteStorageLocalFileChange ChangeType,
RemoteStorageFilePathType PathType );
}