FasterARK/src/io.c

103 lines
2.1 KiB
C

#include <vitasdk.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include "io.h"
#include "ui.h"
void CopyFileAndUpdateUi(char* src, char* dst) {
char msg[MAX_PATH+0x100];
snprintf(msg, sizeof(msg), "Copying %s ...", src);
updateUi(msg);
CopyFile(src, dst);
}
void CreateDirAndUpdateUi(char* dir) {
char msg[MAX_PATH+0x100];
snprintf(msg, sizeof(msg), "Creating directory %s ...", dir);
updateUi(msg);
sceIoMkdir(dir, 0006);
}
int WriteFile(const char *file, void *buf, int size) {
SceUID fd = sceIoOpen(file, SCE_O_WRONLY | SCE_O_CREAT , 0777);
if (fd < 0)
return fd;
int written = sceIoWrite(fd, buf, size);
sceIoClose(fd);
return written;
}
int ReadFile(const char *file, void *buf, int size) {
SceUID fd = sceIoOpen(file,SCE_O_RDONLY, 0777);
if (fd < 0)
return fd;
int read = sceIoRead(fd, buf, size);
sceIoClose(fd);
return read;
}
size_t GetFileSize(const char *file) {
SceIoStat stat;
int ret = sceIoGetstat(file, &stat);
if(ret < 0)
return ret;
return stat.st_size;
}
void CopyFile(const char *file, const char* dstfile) {
size_t sz = GetFileSize(file);
char* buf = malloc(sz);
if(buf != NULL) {
ReadFile(file, buf, sz);
WriteFile(dstfile, buf, sz);
free(buf);
}
}
void CopyTree(const char* src, const char* dst) {
SceUID dfd = sceIoDopen(src);
char* srcEnt = malloc(MAX_PATH);
memset(srcEnt, 0x00, MAX_PATH);
char* dstEnt = malloc(MAX_PATH);
memset(dstEnt, 0x00, MAX_PATH);
int dir_read_ret = 0;
SceIoDirent* dir = malloc(sizeof(SceIoDirent));
do{
memset(dir, 0x00, sizeof(SceIoDirent));
dir_read_ret = sceIoDread(dfd, dir);
snprintf(srcEnt, MAX_PATH, "%s/%s", src, dir->d_name);
snprintf(dstEnt, MAX_PATH, "%s/%s", dst, dir->d_name);
if(SCE_S_ISDIR(dir->d_stat.st_mode)) {
CreateDirAndUpdateUi(dstEnt);
CopyTree(srcEnt, dstEnt);
}
else{
CopyFileAndUpdateUi(srcEnt, dstEnt);
}
} while(dir_read_ret > 0);
free(dir);
sceIoDclose(dfd);
free(srcEnt);
free(dstEnt);
}