Adds ReadSaveDataFileSystemExtraData and WriteSaveDataFileSystemExtraData
Auto-format SaveDataFileSystemServiceImpl
Use SdkRecursiveMutexType instead of SdkRecursiveMutex in SaveDataExtraDataAccessorCacheManager
- Add case-sensitive mode.
- Avoid TargetLocked results by waiting and retrying a few times.
- Allow getting either windows or unix timestamps.
- Try a finite number of times if an entry has been deleted before returning TargetLocked.
Mostly imitates nnsdk's assert system. The assert handler object is global because passing around a HorizonClient object just to do asserts would be annoying
Use this function in all places out values that set in the original code because of errors. Unmanaged values will stay uninitialized while managed values will be zeroed.
- Implement some of LibHac.Os
- Add the Mmc and SD card portions of FsSrv.Storage
- Add the Time, AccessFailureManagement and StatusReport services to `FileSystemProxyImpl`
- Use a new method for handling globals.
Each translation unit with global fields now has a struct containing that TU's globals, or at least the best guess at its globals. `FileSystemServer` now only contains a single `FileSystemServerGlobals` struct that contains all those TU global structs.
Each translation unit with global functions has extension methods for each function. The type the methods extend depends on its original namespace. e,g, `nn::fssrv` functions go on `FileSystemServer` and `nn::fssrv::detail` functions go on `FileSystemServerImpl`.
`FileSystemServer.cs` is simple enough that the code itself explains it well.
With this in place, the FS "process" initialization code has been properly separated from the FS library code. That initialization code is currently in `FileSystemServerInitializer`. This separation allows consumers of the library to implement the initialization code themselves and customize it as they wish.