// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 // Unity using UnityEngine; // Standard Library using System; using System.IO; using System.Runtime.InteropServices; // GameKit using AWS.GameKit.Runtime.Utils; namespace AWS.GameKit.Runtime.Features.GameKitGameSaving { /// /// Describes default file actions to be called by the GameKit SDK /// public class DefaultFileActions { /// /// Create a FileActions struct. /// /// The created FileActions struct. public static FileActions Make() { FileActions actions; actions.FileWriteCallback = WriteCallback; actions.FileReadCallback = ReadCallback; actions.FileSizeCallback = GetFileSizeCallback; actions.FileWriteDispatchReceiver = IntPtr.Zero; actions.FileReadDispatchReceiver = IntPtr.Zero; actions.FileSizeDispatchReceiver = IntPtr.Zero; return actions; } private static bool WriteDesktopFile(string filePath, byte[] data) { try { // Ensure the parent directory exists - if not, create it now FileInfo fileInfo = new FileInfo(filePath); if (!fileInfo.Directory.Exists) { fileInfo.Directory.Create(); } File.WriteAllBytes(filePath, data); } catch (Exception exception) { Logging.LogException($"Failed to write data to {filePath}", exception); return false; } return true; } private static bool ReadDesktopFile(string filePath, IntPtr data, uint size) { try { byte[] byteData = File.ReadAllBytes(filePath); Marshal.Copy(byteData, 0, data, (int) size); } catch (Exception exception) { Logging.LogException($"Failed to read data from {filePath}", exception); return false; } return true; } private static uint GetDesktopFileSize(string filePath) { try { FileInfo fileInfo = new FileInfo(filePath); return (uint)fileInfo.Length; } catch (Exception exception) { Logging.LogException($"Failed to determine file size of {filePath}", exception); return 0; } } [AOT.MonoPInvokeCallback(typeof(FuncFileWriteCallback))] private static bool WriteCallback(IntPtr dispatchReceiver, string filePath, byte[] data, uint size) { return WriteDesktopFile(filePath, data); } [AOT.MonoPInvokeCallback(typeof(FuncFileReadCallback))] private static bool ReadCallback(IntPtr dispatchReceiver, string filePath, IntPtr data, uint size) { return ReadDesktopFile(filePath, data, size); } [AOT.MonoPInvokeCallback(typeof(FuncFileGetSizeCallback))] private static uint GetFileSizeCallback(IntPtr dispatchReceiver, string filePath) { return GetDesktopFileSize(filePath); } } }