summaryrefslogtreecommitdiffhomepage
path: root/src/utils.c
diff options
context:
space:
mode:
authorRay <[email protected]>2020-03-05 18:12:41 +0100
committerRay <[email protected]>2020-03-05 18:12:41 +0100
commitfb2ed693e4ad6cd183d8a4135608c813d8f29358 (patch)
tree344b28d84049ff02408f3df7eb972d6f7b7c2a75 /src/utils.c
parent966e8adcf9639c8f524fa99d2edfd348306f45f1 (diff)
downloadraylib-fb2ed693e4ad6cd183d8a4135608c813d8f29358.tar.gz
raylib-fb2ed693e4ad6cd183d8a4135608c813d8f29358.zip
Android: Support file saving to internal data storage
Diffstat (limited to 'src/utils.c')
-rw-r--r--src/utils.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/utils.c b/src/utils.c
index 34369744..f26be95d 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -65,6 +65,7 @@ static TraceLogCallback logCallback = NULL; // Log callback function
#if defined(PLATFORM_ANDROID)
static AAssetManager *assetManager = NULL; // Android assets manager pointer
+static const char *internalDataPath = NULL; // Android internal data path
#endif
#if defined(PLATFORM_UWP)
@@ -292,21 +293,34 @@ void SaveFileText(const char *fileName, char *text)
#if defined(PLATFORM_ANDROID)
// Initialize asset manager from android app
-void InitAssetManager(AAssetManager *manager)
+void InitAssetManager(AAssetManager *manager, const char *dataPath)
{
assetManager = manager;
+ internalDataPath = dataPath;
}
// Replacement for fopen
+// Ref: https://developer.android.com/ndk/reference/group/asset
FILE *android_fopen(const char *fileName, const char *mode)
{
- if (mode[0] == 'w') return NULL;
-
- AAsset *asset = AAssetManager_open(assetManager, fileName, 0);
-
- if (!asset) return NULL;
+ if (mode[0] == 'w') // TODO: Test!
+ {
+ // TODO: fopen() is mapped to android_fopen() that only grants read access
+ // to assets directory through AAssetManager but we want to also be able to
+ // write data when required using the standard stdio FILE access functions
+ // Ref: https://stackoverflow.com/questions/11294487/android-writing-saving-files-from-native-code-only
+ #undef fopen
+ return fopen(TextFormat("%s/%s", internalDataPath, fileName), mode);
+ #define fopen(name, mode) android_fopen(name, mode)
+ }
+ else
+ {
+ // NOTE: AAsset provides access to read-only asset
+ AAsset *asset = AAssetManager_open(assetManager, fileName, AASSET_MODE_UNKNOWN);
- return funopen(asset, android_read, android_write, android_seek, android_close);
+ if (asset != NULL) return funopen(asset, android_read, android_write, android_seek, android_close);
+ else return NULL;
+ }
}
#endif // PLATFORM_ANDROID