Skip to content

Commit

Permalink
Add kinc_file_reader_set_callback() function for user-provided filesy…
Browse files Browse the repository at this point in the history
…stems
  • Loading branch information
samhocevar committed Mar 8, 2024
1 parent c7dd80f commit 1865456
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 24 deletions.
35 changes: 18 additions & 17 deletions Backends/System/Android/Sources/kinc/backend/system.c.h
Original file line number Diff line number Diff line change
Expand Up @@ -1266,24 +1266,25 @@ static void kinc_aasset_reader_seek(kinc_file_reader_t *reader, size_t pos) {
AAsset_seek((struct AAsset *)reader->data, pos, SEEK_SET);
}

bool kinc_file_reader_open(kinc_file_reader_t *reader, const char *filename, int type) {
if (kinc_internal_file_reader_open(reader, filename, type)) {
return true;
}

if (type == KINC_FILE_TYPE_ASSET) {
reader->data = AAssetManager_open(kinc_android_get_asset_manager(), filename, AASSET_MODE_RANDOM);
if (reader->data == NULL)
return false;
reader->size = AAsset_getLength((struct AAsset *)reader->data);
reader->close = kinc_aasset_reader_close;
reader->read = kinc_aasset_reader_read;
reader->pos = kinc_aasset_reader_pos;
reader->seek = kinc_aasset_reader_seek;
return true;
}
static bool kinc_aasset_reader_open(kinc_file_reader_t *reader, const char *filename, int type) {
if (type != KINC_FILE_TYPE_ASSET)
return false;
reader->data = AAssetManager_open(kinc_android_get_asset_manager(), filename, AASSET_MODE_RANDOM);
if (reader->data == NULL)
return false;
reader->size = AAsset_getLength((struct AAsset *)reader->data);
reader->close = kinc_aasset_reader_close;
reader->read = kinc_aasset_reader_read;
reader->pos = kinc_aasset_reader_pos;
reader->seek = kinc_aasset_reader_seek;
return true;
}

return false;
bool kinc_file_reader_open(kinc_file_reader_t *reader, const char *filename, int type) {
memset(reader, 0, sizeof(*reader));
return kinc_internal_file_reader_callback(reader, filename, type) ||
kinc_internal_file_reader_open(reader, filename, type) ||
kinc_aasset_reader_open(reader, filename, type);
}

int kinc_cpu_cores(void) {
Expand Down
26 changes: 19 additions & 7 deletions Sources/kinc/io/filereader.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@ typedef struct kinc_file_reader {
void *data; // A file handle or a more complex structure
size_t size;
size_t offset; // Needed by some implementations
int type;
bool mounted;

void (*close)(struct kinc_file_reader *reader);
size_t (*read)(struct kinc_file_reader *reader, void *data, size_t size);
Expand All @@ -58,6 +56,12 @@ KINC_FUNC bool kinc_file_reader_open(kinc_file_reader_t *reader, const char *fil
/// <returns>This function always returns true</returns>
KINC_FUNC bool kinc_file_reader_from_memory(kinc_file_reader_t *reader, void *data, size_t size);

/// <summary>
/// Registers a file reader callback.
/// </summary>
/// <param name="callback">The function to call when opening a file</param>
KINC_FUNC void kinc_file_reader_set_callback(bool (*callback)(kinc_file_reader_t *reader, const char *filename, int type));

/// <summary>
/// Closes a file.
/// </summary>
Expand Down Expand Up @@ -176,6 +180,7 @@ KINC_FUNC int8_t kinc_read_s8(uint8_t *data);

void kinc_internal_set_files_location(char *dir);
char *kinc_internal_get_files_location(void);
bool kinc_internal_file_reader_callback(kinc_file_reader_t *reader, const char *filename, int type);
bool kinc_internal_file_reader_open(kinc_file_reader_t *reader, const char *filename, int type);

#ifdef KINC_IMPLEMENTATION_IO
Expand Down Expand Up @@ -222,7 +227,6 @@ static void memory_seek_callback(kinc_file_reader_t *reader, size_t pos) {
bool kinc_file_reader_from_memory(kinc_file_reader_t *reader, void *data, size_t size)
{
memset(reader, 0, sizeof(kinc_file_reader_t));
reader->type = KINC_FILE_TYPE_ASSET;
reader->data = data;
reader->size = size;
reader->read = memory_read_callback;
Expand Down Expand Up @@ -253,6 +257,7 @@ const char *macgetresourcepath(void);
#endif

static char *fileslocation = NULL;
static bool *file_reader_callback(kinc_file_reader_t *reader, const char *filename, int type) = NULL;
#ifdef KORE_WINDOWS
static wchar_t wfilepath[1001];
#endif
Expand All @@ -265,6 +270,10 @@ char *kinc_internal_get_files_location(void) {
return fileslocation;
}

bool kinc_internal_file_reader_callback(kinc_file_reader_t *reader, const char *filename, int type) {
return file_reader_callback ? file_reader_callback(reader, filename, type) : false;
}

#ifdef KORE_WINDOWSAPP
void kinc_internal_uwp_installed_location_path(char *path);
#endif
Expand Down Expand Up @@ -315,9 +324,6 @@ static size_t kinc_libc_file_reader_pos(kinc_file_reader_t *reader) {
#endif

bool kinc_internal_file_reader_open(kinc_file_reader_t *reader, const char *filename, int type) {
memset(reader, 0, sizeof(kinc_file_reader_t));
reader->type = type;

char filepath[1001];
#ifdef KORE_IOS
strcpy(filepath, type == KINC_FILE_TYPE_SAVE ? kinc_internal_save_path() : iphonegetresourcepath());
Expand Down Expand Up @@ -432,10 +438,16 @@ bool kinc_internal_file_reader_open(kinc_file_reader_t *reader, const char *file

#if !defined(KORE_ANDROID) && !defined(KORE_CONSOLE)
bool kinc_file_reader_open(kinc_file_reader_t *reader, const char *filename, int type) {
return kinc_internal_file_reader_open(reader, filename, type);
memset(reader, 0, sizeof(*reader));
return kinc_internal_file_reader_callback(reader, filename, type) ||
kinc_internal_file_reader_open(reader, filename, type);
}
#endif

void kinc_file_reader_set_callback(bool (*callback)(kinc_file_reader_t *reader, const char *filename, int type)) {
file_reader_callback = callback;
}

size_t kinc_file_reader_read(kinc_file_reader_t *reader, void *data, size_t size) {
return reader->read(reader, data, size);
}
Expand Down

0 comments on commit 1865456

Please sign in to comment.