コード例 #1
0
ファイル: SaveDataIndexer.cs プロジェクト: M1CR0H4CK3R/LibHac
        public Result Get(out SaveDataIndexerValue value, ref SaveDataAttribute key)
        {
            value = default;

            lock (Locker)
            {
                Result rc = Initialize();
                if (rc.IsFailure())
                {
                    return(rc);
                }

                rc = EnsureKvDatabaseLoaded(false);
                if (rc.IsFailure())
                {
                    return(rc);
                }

                rc = KvDatabase.Get(ref key, SpanHelpers.AsByteSpan(ref value));

                if (rc.IsFailure())
                {
                    return(ResultFs.TargetNotFound.LogConverted(rc));
                }

                return(Result.Success);
            }
        }
コード例 #2
0
ファイル: SaveDataIndexer.cs プロジェクト: M1CR0H4CK3R/LibHac
        public Result Add(out ulong saveDataId, ref SaveDataAttribute key)
        {
            saveDataId = default;

            lock (Locker)
            {
                Result rc = Initialize();
                if (rc.IsFailure())
                {
                    return(rc);
                }

                rc = EnsureKvDatabaseLoaded(false);
                if (rc.IsFailure())
                {
                    return(rc);
                }

                SaveDataIndexerValue value = default;

                rc = KvDatabase.Get(ref key, SpanHelpers.AsByteSpan(ref value));

                if (rc.IsSuccess())
                {
                    return(ResultFs.SaveDataPathAlreadyExists.Log());
                }

                LastPublishedId++;
                ulong newSaveDataId = LastPublishedId;

                value = new SaveDataIndexerValue {
                    SaveDataId = newSaveDataId
                };

                rc = KvDatabase.Set(ref key, SpanHelpers.AsByteSpan(ref value));

                if (rc.IsFailure())
                {
                    LastPublishedId--;
                    return(rc);
                }

                rc = AdjustOpenedInfoReaders(ref key);
                if (rc.IsFailure())
                {
                    return(rc);
                }

                saveDataId = newSaveDataId;
                return(Result.Success);
            }
        }
コード例 #3
0
ファイル: SaveDataIndexer.cs プロジェクト: M1CR0H4CK3R/LibHac
        public Result AddSystemSaveData(ref SaveDataAttribute key)
        {
            lock (Locker)
            {
                Result rc = Initialize();
                if (rc.IsFailure())
                {
                    return(rc);
                }

                rc = EnsureKvDatabaseLoaded(false);
                if (rc.IsFailure())
                {
                    return(rc);
                }

                foreach (KeyValuePair <SaveDataAttribute, byte[]> kvp in KvDatabase)
                {
                    ref SaveDataIndexerValue value = ref Unsafe.As <byte, SaveDataIndexerValue>(ref kvp.Value[0]);

                    if (key.SaveDataId == value.SaveDataId)
                    {
                        return(ResultFs.SaveDataPathAlreadyExists.Log());
                    }
                }

                var newValue = new SaveDataIndexerValue
                {
                    SaveDataId = key.SaveDataId
                };

                rc = KvDatabase.Set(ref key, SpanHelpers.AsByteSpan(ref newValue));
                if (rc.IsFailure())
                {
                    return(rc);
                }

                rc = AdjustOpenedInfoReaders(ref key);
                if (rc.IsFailure())
                {
                    return(rc);
                }

                return(rc);
            }
コード例 #4
0
ファイル: SaveDataIndexer.cs プロジェクト: M1CR0H4CK3R/LibHac
        public Result Commit()
        {
            lock (Locker)
            {
                Result rc = Initialize();
                if (rc.IsFailure())
                {
                    return(rc);
                }

                rc = EnsureKvDatabaseLoaded(false);
                if (rc.IsFailure())
                {
                    return(rc);
                }

                var mount = new Mounter();

                try
                {
                    rc = mount.Initialize(FsClient, MountName, SpaceId, SaveDataId);
                    if (rc.IsFailure())
                    {
                        return(rc);
                    }

                    rc = KvDatabase.WriteDatabaseToFile();
                    if (rc.IsFailure())
                    {
                        return(rc);
                    }

                    string idFilePath = $"{MountName}:/{LastIdFileName}";

                    rc = FsClient.OpenFile(out FileHandle handle, idFilePath, OpenMode.Write);
                    if (rc.IsFailure())
                    {
                        return(rc);
                    }

                    bool fileAlreadyClosed = false;

                    try
                    {
                        ulong lastId = LastPublishedId;

                        rc = FsClient.WriteFile(handle, 0, SpanHelpers.AsByteSpan(ref lastId), WriteOption.None);
                        if (rc.IsFailure())
                        {
                            return(rc);
                        }

                        rc = FsClient.FlushFile(handle);
                        if (rc.IsFailure())
                        {
                            return(rc);
                        }

                        FsClient.CloseFile(handle);
                        fileAlreadyClosed = true;

                        return(FsClient.Commit(MountName));
                    }
                    finally
                    {
                        if (!fileAlreadyClosed)
                        {
                            FsClient.CloseFile(handle);
                        }
                    }
                }
                finally
                {
                    mount.Dispose();
                }
            }
        }