Przeglądaj źródła

Pass AAssetManager explicitly

Daniele Bartolini 11 lat temu
rodzic
commit
eff6fb9a89

+ 11 - 20
engine/core/filesystem/apk_file.cpp

@@ -31,26 +31,18 @@ OTHER DEALINGS IN THE SOFTWARE.
 #include "apk_file.h"
 #include "assert.h"
 #include "macros.h"
-#include "log.h"
 #include <android/asset_manager.h>
 
 namespace crown
 {
 
-extern AAssetManager* g_android_asset_manager;
-
-//-----------------------------------------------------------------------------
-AAssetManager* get_android_asset_manager()
-{
-	return g_android_asset_manager;
-}
-
 //-----------------------------------------------------------------------------
-ApkFile::ApkFile(const char* path)
-	: File(FOM_READ), m_asset(NULL)
+ApkFile::ApkFile(AAssetManager* asset_manager, const char* path)
+	: File(FOM_READ)
+	, m_asset(NULL)
 {
-	m_asset = AAssetManager_open(get_android_asset_manager(), path, AASSET_MODE_RANDOM);
-	CE_ASSERT(m_asset != NULL, "Unable to open file: %s", path);
+	m_asset = AAssetManager_open(asset_manager, path, AASSET_MODE_RANDOM);
+	CE_ASSERT(m_asset != NULL, "AAssetManager_open: failed to open %s", path);
 }
 
 //-----------------------------------------------------------------------------
@@ -67,7 +59,7 @@ ApkFile::~ApkFile()
 void ApkFile::seek(size_t position)
 {
 	off_t seek_result = AAsset_seek(m_asset, (off_t)position, SEEK_SET);
-	CE_ASSERT(seek_result != (off_t) -1, "Failed to seek");
+	CE_ASSERT(seek_result != (off_t) -1, "AAsset_seek: error");
 	CE_UNUSED(seek_result);
 }
 
@@ -75,7 +67,7 @@ void ApkFile::seek(size_t position)
 void ApkFile::seek_to_end()
 {
 	off_t seek_result = AAsset_seek(m_asset, 0, SEEK_END);
-	CE_ASSERT(seek_result != (off_t) -1, "Failed to seek to end");
+	CE_ASSERT(seek_result != (off_t) -1, "AAsset_seek: error");
 	CE_UNUSED(seek_result);
 }
 
@@ -83,7 +75,7 @@ void ApkFile::seek_to_end()
 void ApkFile::skip(size_t bytes)
 {
 	off_t seek_result = AAsset_seek(m_asset, (off_t) bytes, SEEK_CUR);
-	CE_ASSERT(seek_result != (off_t) -1, "Failed to skip");
+	CE_ASSERT(seek_result != (off_t) -1, "AAsset_seek: error");
 	CE_UNUSED(seek_result);
 }
 
@@ -91,22 +83,21 @@ void ApkFile::skip(size_t bytes)
 void ApkFile::read(void* buffer, size_t size)
 {
 	CE_ASSERT_NOT_NULL(buffer);
-
 	size_t bytes_read = (size_t) AAsset_read(m_asset, buffer, size);
-	CE_ASSERT(bytes_read == size, "Failed to read from file: requested: %lu, read: %lu", size, bytes_read);
+	CE_ASSERT(bytes_read == size, "AAsset_read: requested: %lu, read: %lu", size, bytes_read);
 	CE_UNUSED(bytes_read);
 }
 
 //-----------------------------------------------------------------------------
 void ApkFile::write(const void* /*buffer*/, size_t /*size*/)
 {
-	CE_ASSERT(false, "Attempt to write to android assets folder!");
+	CE_ASSERT(false, "Apk files are read only!");
 }
 
 //-----------------------------------------------------------------------------
 bool ApkFile::copy_to(File& /*file*/, size_t /*size = 0*/)
 {
-	CE_ASSERT(false, "Not implemented yet :(");
+	CE_ASSERT(false, "Not implemented");
 	return false;
 }
 

+ 1 - 1
engine/core/filesystem/apk_file.h

@@ -38,7 +38,7 @@ class ApkFile : public File
 public:
 
 	/// Opens the given @a filename.
-	ApkFile(const char* filename);
+	ApkFile(AAssetManager* asset_manager, const char* filename);
 	~ApkFile();
 
 	/// @copydoc File::seek()

+ 6 - 8
engine/core/filesystem/apk_filesystem.cpp

@@ -28,20 +28,19 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 #if CROWN_PLATFORM_ANDROID
 
-#include <sys/types.h>
-#include <android/asset_manager.h>
 #include "apk_filesystem.h"
 #include "temp_allocator.h"
 #include "apk_file.h"
 #include "os.h"
+#include <sys/types.h>
+#include <android/asset_manager.h>
 
 namespace crown
 {
 
-extern AAssetManager* get_android_asset_manager();
-
 //-----------------------------------------------------------------------------
-ApkFilesystem::ApkFilesystem()
+ApkFilesystem::ApkFilesystem(AAssetManager* asset_manager)
+	: _asset_manager(asset_manager)
 {
 }
 
@@ -50,8 +49,7 @@ File* ApkFilesystem::open(const char* path, FileOpenMode mode)
 {
 	CE_ASSERT_NOT_NULL(path);
 	CE_ASSERT(mode == FOM_READ, "Cannot open for writing in Android assets folder");
-
-	return CE_NEW(default_allocator(), ApkFile)(path);
+	return CE_NEW(default_allocator(), ApkFile)(_asset_manager, path);
 }
 
 //-----------------------------------------------------------------------------
@@ -108,7 +106,7 @@ void ApkFilesystem::list_files(const char* path, Vector<DynamicString>& files)
 {
 	CE_ASSERT_NOT_NULL(path);
 
-	AAssetDir* root_dir = AAssetManager_openDir(get_android_asset_manager(), path);
+	AAssetDir* root_dir = AAssetManager_openDir(_asset_manager, path);
 	CE_ASSERT(root_dir != NULL, "Failed to open Android assets folder");
 
 	const char* filename = NULL;

+ 12 - 1
engine/core/filesystem/apk_filesystem.h

@@ -26,7 +26,12 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 #pragma once
 
+#include "config.h"
+
+#if CROWN_PLATFORM_ANDROID
+
 #include "filesystem.h"
+#include <android/asset_manager.h>
 
 namespace crown
 {
@@ -37,7 +42,7 @@ class ApkFilesystem : public Filesystem
 {
 public:
 
-	ApkFilesystem();
+	ApkFilesystem(AAssetManager* asset_manager);
 
 	/// @copydoc Filesystem::open()
 	/// @note
@@ -76,6 +81,12 @@ public:
 	/// Assets folder has no concept of "absolute path", all paths are
 	/// relative to the assets folder itself, so, all paths are returned unchanged.
 	void get_absolute_path(const char* path, DynamicString& os_path);
+
+private:
+
+	AAssetManager* _asset_manager;
 };
 
 } // namespace crown
+
+#endif // CROWN_PLATFORM_ANDROID

+ 1 - 0
engine/core/filesystem/os_file.h

@@ -30,6 +30,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 #include "types.h"
 #include "assert.h"
 #include "config.h"
+#include "macros.h"
 #include "file.h" // FileOpenMode
 
 #if CROWN_PLATFORM_WINDOWS