fixed getting file size of BD caveset file inside Android APK file
authorHolger Schemel <info@artsoft.org>
Sun, 19 Jan 2025 23:21:44 +0000 (00:21 +0100)
committerHolger Schemel <info@artsoft.org>
Sun, 19 Jan 2025 23:24:24 +0000 (00:24 +0100)
src/game_bd/bd_caveset.c
src/libgame/misc.c
src/libgame/misc.h

index 37bdd547b5790de417a640c27e785c0645a1f7c5..8ebbe269499167af78e99bcd6ba7337901eee6ce 100644 (file)
@@ -599,22 +599,22 @@ static void caveset_name_set_from_filename(char *filename)
 */
 boolean gd_caveset_load_from_file(char *filename)
 {
+  size_t filesize = getSizeOfFile(filename);
   size_t length;
   char *buf;
   List *new_caveset;
-  struct stat st;
   File *file;
 
-  if (stat(filename, &st) != 0)
+  if (filesize < 0)
   {
-    Warn("cannot stat() file");
+    Warn("cannot get size of file '%s'", filename);
 
     return FALSE;
   }
 
-  if (st.st_size > 1048576)
+  if (filesize > 1048576)
   {
-    Warn("file bigger than 1MiB, refusing to load");
+    Warn("cannot load file '%s' (bigger than 1 MB)", filename);
 
     return FALSE;
   }
@@ -626,13 +626,13 @@ boolean gd_caveset_load_from_file(char *filename)
     return FALSE;
   }
 
-  buf = checked_malloc(st.st_size + 1);
-  length = readFile(file, buf, 1, st.st_size);
+  buf = checked_malloc(filesize + 1);
+  length = readFile(file, buf, 1, filesize);
   buf[length] = '\0';
 
   closeFile(file);
 
-  if (length < st.st_size)
+  if (length < filesize)
   {
     Warn("cannot read file '%s'", filename);
 
index 26c7a0e1aa82fb4379380e5108d9afa966933e28..3ab4f57cf33e0a50e42b3cf3a7b0beafd730e03d 100644 (file)
@@ -3364,6 +3364,29 @@ boolean touchFile(const char *filename)
   return TRUE;
 }
 
+size_t getSizeOfFile(const char *filename)
+{
+  struct stat file_status;
+
+  if (stat(filename, &file_status) == 0)
+    return file_status.st_size;
+
+#if defined(PLATFORM_ANDROID)
+  SDL_RWops *rw = SDL_RWFromFile(filename, MODE_READ);
+
+  if (rw != NULL)
+  {
+    int size = SDL_RWsize(rw);
+
+    SDL_RWclose(rw);
+
+    return size;
+  }
+#endif
+
+  return -1;
+}
+
 
 // ----------------------------------------------------------------------------
 // functions for directory handling
index 81d27d22c8f38490da6c7c14245ccc6ea77f3824..aa5827388b8ecb305a6f277c93cb8d650908d88c 100644 (file)
@@ -291,6 +291,7 @@ int getByteFromFile(File *);
 char *getStringFromFile(File *, char *, int);
 int copyFile(const char *, const char *);
 boolean touchFile(const char *);
+size_t getSizeOfFile(const char *);
 
 Directory *openDirectory(char *);
 int closeDirectory(Directory *);