This commit is contained in:
Pavel 2022-10-03 17:59:03 +03:00
parent c4fdba1e2e
commit 6eee88e356
3 changed files with 76 additions and 7 deletions

View File

@ -168,7 +168,7 @@ var
Procedure DumpExceptionCallStack(E: Exception);
Function FetchMount(path,point:PChar):Integer;
Function FetchMount(path,point:PChar;mode:Integer):Integer;
Function UnMountPath(path:PChar):Integer;
function _parse_filename(filename:PChar):RawByteString;
@ -293,11 +293,23 @@ var
const
SCE_SAVE_DATA_ERROR_PARAMETER =-2137063424; // 0x809F0000
SCE_SAVE_DATA_ERROR_EXISTS =-2137063417; // 0x809F0007
SCE_SAVE_DATA_ERROR_NOT_FOUND =-2137063416; // 0x809f0008
SCE_SAVE_DATA_ERROR_MOUNT_FULL =-2137063412; // 0x809F000C
SCE_SAVE_DATA_ERROR_NOT_MOUNTED=-2137063420; // 0x809F0004
SCE_SAVE_DATA_ERROR_INTERNAL =-2137063413; // 0x809f000b
SCE_SAVE_DATA_ERROR_BUSY =-2137063421; // 0x809f0003
Function FetchMount(path,point:PChar):Integer;
SCE_SAVE_DATA_MOUNT_MODE_RDONLY =1; //Read-only
SCE_SAVE_DATA_MOUNT_MODE_RDWR =2; //Read/write-enabled
SCE_SAVE_DATA_MOUNT_MODE_CREATE =4; //Create new (error if save data directory already exists)
SCE_SAVE_DATA_MOUNT_MODE_DESTRUCT_OFF=8; //Turn off corrupt flag (not recommended)
SCE_SAVE_DATA_MOUNT_MODE_COPY_ICON =16; //Copy save_data.png in package as icon when newly creating save data
SCE_SAVE_DATA_MOUNT_MODE_CREATE2 =32; //Create new (mount save data directory if it already exists)
Function FetchMount(path,point:PChar;mode:Integer):Integer;
var
sp:RawByteString;
s:TMountDir;
i,m:Integer;
Label
@ -312,6 +324,22 @@ begin
i:=IndexChar(s,MOUNT_MAXSIZE,#0);
if (i=0) then Exit(SCE_SAVE_DATA_ERROR_PARAMETER);
sp:=IncludeTrailingPathDelimiter(ps4_app.save_path)+s;
if (mode and SCE_SAVE_DATA_MOUNT_MODE_CREATE2)<>0 then
begin
if not ForceDirectories(ps4_app.save_path) then Exit(SCE_SAVE_DATA_ERROR_INTERNAL);
CreateDir(sp);
end else
if (mode and SCE_SAVE_DATA_MOUNT_MODE_CREATE)<>0 then
begin
if not ForceDirectories(ps4_app.save_path) then Exit(SCE_SAVE_DATA_ERROR_INTERNAL);
if not CreateDir(sp) then Exit(SCE_SAVE_DATA_ERROR_EXISTS);
end else
begin
if not DirectoryExists(sp) then Exit(SCE_SAVE_DATA_ERROR_NOT_FOUND);
end;
rwlock_wrlock(FMounts_lock);
m:=-1;
@ -324,7 +352,7 @@ begin
begin
if (FMounts[i]=s) then
begin
Result:=SCE_SAVE_DATA_ERROR_EXISTS;
Result:=SCE_SAVE_DATA_ERROR_BUSY;
goto _exit;
end;
end;
@ -428,7 +456,7 @@ begin
s:=IncludeTrailingPathDelimiter(ps4_app.save_path)+s;
if not ForceDirectories(s) then Exit('');
if not FileExists(s) then Exit('');
Result:=PathConcat(s,filename);
end;

View File

@ -27,12 +27,25 @@ type
function ps4_sceAppContentInitialize(initParam:PSceAppContentInitParam;bootParam:PSceAppContentBootParam):Integer; SysV_ABI_CDecl;
begin
Writeln('sceAppContentInitialize');
if (initParam<>nil) then
begin
initParam^:=Default(SceAppContentInitParam);
end;
if (bootParam<>nil) then
begin
bootParam^:=Default(SceAppContentBootParam);
end;
Result:=0;
end;
Const
SCE_APP_CONTENT_APPPARAM_ID_SKU_FLAG=0;
SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_1=1;
SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_2=2;
SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_3=3;
SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_4=4;
SCE_APP_CONTENT_ERROR_PARAMETER=-2133262334;//0x80D90002
@ -47,7 +60,8 @@ begin
Writeln('sceAppContentAppParamGetInt:',paramId);
Case SCE_APP_CONTENT_APPPARAM_ID_SKU_FLAG of
SCE_APP_CONTENT_APPPARAM_ID_SKU_FLAG:Result:=SCE_APP_CONTENT_APPPARAM_SKU_FLAG_FULL;
1..4:Result:=SCE_APP_CONTENT_ADDCONT_DOWNLOAD_STATUS_INSTALLED;
SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_1..
SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_4:Result:=0;
else
Result:=SCE_APP_CONTENT_ERROR_PARAMETER;
end;

View File

@ -282,20 +282,45 @@ const
SCE_SAVE_DATA_ERROR_MOUNT_FULL =-2137063412; // 0x809F000C
SCE_SAVE_DATA_ERROR_NOT_MOUNTED=-2137063420; // 0x809F0004
SCE_SAVE_DATA_MOUNT_MODE_RDONLY =1; //Read-only
SCE_SAVE_DATA_MOUNT_MODE_RDWR =2; //Read/write-enabled
SCE_SAVE_DATA_MOUNT_MODE_CREATE =4; //Create new (error if save data directory already exists)
SCE_SAVE_DATA_MOUNT_MODE_DESTRUCT_OFF=8; //Turn off corrupt flag (not recommended)
SCE_SAVE_DATA_MOUNT_MODE_COPY_ICON =16; //Copy save_data.png in package as icon when newly creating save data
SCE_SAVE_DATA_MOUNT_MODE_CREATE2 =32; //Create new (mount save data directory if it already exists)
function ps4_sceSaveDataMount(mount:pSceSaveDataMount;mountResult:pSceSaveDataMountResult):Integer; SysV_ABI_CDecl;
begin
if (mount=nil) or (mountResult=nil) then Exit(SCE_SAVE_DATA_ERROR_PARAMETER);
mountResult^:=Default(SceSaveDataMountResult);
_sig_lock;
Result:=FetchMount(PChar(mount^.dirName),@mountResult^.mountPoint);
Result:=FetchMount(PChar(mount^.dirName),@mountResult^.mountPoint,mount^.mountMode);
_sig_unlock;
if (Result=0) and
((mount^.mountMode and (SCE_SAVE_DATA_MOUNT_MODE_CREATE or SCE_SAVE_DATA_MOUNT_MODE_CREATE2))<>0) then
begin
mountResult^.mountStatus:=SCE_SAVE_DATA_MOUNT_STATUS_CREATED;
end;
end;
function ps4_sceSaveDataMount2(mount:PSceSaveDataMount2;mountResult:PSceSaveDataMountResult):Integer; SysV_ABI_CDecl;
begin
if (mount=nil) or (mountResult=nil) then Exit(SCE_SAVE_DATA_ERROR_PARAMETER);
mountResult^:=Default(SceSaveDataMountResult);
_sig_lock;
Result:=FetchMount(PChar(mount^.dirName),@mountResult^.mountPoint);
Result:=FetchMount(PChar(mount^.dirName),@mountResult^.mountPoint,mount^.mountMode);
_sig_unlock;
if (Result=0) and
((mount^.mountMode and (SCE_SAVE_DATA_MOUNT_MODE_CREATE or SCE_SAVE_DATA_MOUNT_MODE_CREATE2))<>0) then
begin
mountResult^.mountStatus:=SCE_SAVE_DATA_MOUNT_STATUS_CREATED;
end;
end;
function ps4_sceSaveDataUmount(mountPoint:PSceSaveDataMountPoint):Integer; SysV_ABI_CDecl;
@ -312,6 +337,8 @@ begin
if (info<>nil) then
begin
info^:=Default(SceSaveDataMountInfo);
info^.blocks :=100000;
info^.freeBlocks:=100000;
end;
end;