mikymod 12 лет назад
Родитель
Сommit
4113259f65
2 измененных файлов с 237 добавлено и 0 удалено
  1. 148 0
      engine/os/android/APKFile.cpp
  2. 89 0
      engine/os/android/APKFile.h

+ 148 - 0
engine/os/android/APKFile.cpp

@@ -0,0 +1,148 @@
+/*
+Copyright (c) 2013 Daniele Bartolini, Michele Rossi
+Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include <android/asset_manager_jni.h>
+
+#include "Assert.h"
+#include "OS.h"
+#include "APKFile.h"
+#include "AndroidOS.h"
+
+namespace crown
+{
+
+static AAssetManager*	g_android_asset_manager = NULL;
+
+//-----------------------------------------------------------------------------
+APKFile::APKFile(const char* path, FileOpenMode mode)
+{
+	// Android assets are always read-only
+	(void) mode;
+	m_mode = FOM_READ;
+	m_asset = AAssetManager_open(get_android_asset_manager(), path, AASSET_MODE_RANDOM);
+
+	CE_ASSERT(m_asset != NULL, "Unable to open file: %s", path);
+}
+
+//-----------------------------------------------------------------------------
+APKFile::~APKFile()
+{
+	close();
+}
+
+//-----------------------------------------------------------------------------
+void APKFile::close()
+{
+	if (m_asset != NULL)
+	{
+		AAsset_close(m_asset);
+		m_asset = NULL;
+	}
+}
+
+//-----------------------------------------------------------------------------
+bool APKFile::is_open() const
+{
+	return m_asset != NULL;
+}
+
+//-----------------------------------------------------------------------------
+FileOpenMode APKFile::mode() const
+{
+	return m_mode;
+}
+
+//-----------------------------------------------------------------------------
+size_t APKFile::size() const
+{
+	return AAsset_getLength(m_asset);
+}
+
+//-----------------------------------------------------------------------------
+size_t APKFile::read(void* data, size_t size)
+{
+	CE_ASSERT(data != NULL, "Data must be != NULL");
+
+	return (size_t)AAsset_read(m_asset, data, size);
+}
+
+//-----------------------------------------------------------------------------
+size_t APKFile::write(const void* data, size_t size)
+{
+	CE_ASSERT(data != NULL, "Data must be != NULL");
+
+	os::printf("Android asset directory is read-only!");
+
+	return 0;
+}
+
+//-----------------------------------------------------------------------------
+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");
+}
+
+//-----------------------------------------------------------------------------
+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");
+}
+
+//-----------------------------------------------------------------------------
+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 seek");
+}
+
+//-----------------------------------------------------------------------------
+size_t APKFile::position() const
+{
+	return (size_t) (AAsset_getLength(m_asset) - AAsset_getRemainingLength(m_asset));
+}
+
+//-----------------------------------------------------------------------------
+bool APKFile::eof() const
+{
+	return AAsset_getRemainingLength(m_asset) == 0;
+}
+
+//-----------------------------------------------------------------------------
+AAssetManager* get_android_asset_manager()
+{
+	return g_android_asset_manager;
+}
+
+//-----------------------------------------------------------------------------
+extern "C" JNIEXPORT void JNICALL Java_crown_android_CrownLib_initAssetManager(JNIEnv* env, jobject obj, jobject assetManager)
+{
+	g_android_asset_manager = AAssetManager_fromJava(env, assetManager);
+}
+
+} // namespace crown
+

+ 89 - 0
engine/os/android/APKFile.h

@@ -0,0 +1,89 @@
+/*
+Copyright (c) 2013 Daniele Bartolini, Michele Rossi
+Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#pragma once
+
+#include <sys/types.h>
+#include <android/asset_manager.h>
+
+#include "Types.h"
+#include "File.h"
+
+namespace crown
+{
+
+/// Android assets wrapper
+class APKFile
+{
+public:
+
+	/// Opens the file located at @a path with the given @a mode.
+							APKFile(const char* path, FileOpenMode mode);
+							~APKFile();
+
+	/// Closes the file.
+	void					close();
+
+	bool					is_open() const;
+
+	/// Return the size of the file in bytes.
+	size_t					size() const;
+
+	/// Returs the mode used to open the file.
+	FileOpenMode			mode() const;
+
+	/// Reads @a size bytes from the file and stores it into @a data.
+	/// Returns the number of bytes read.
+	size_t					read(void* data, size_t size);
+
+	/// Writes @a size bytes of data stored in @a data and returns the
+	/// number of bytes written.
+	size_t					write(const void* data, size_t size);
+
+	/// Moves the file pointer to the given @a position.
+	void					seek(size_t position);
+
+	/// Moves the file pointer to the end of the file.
+	void					seek_to_end();
+
+	/// Moves the file pointer @a bytes bytes ahead the current
+	/// file pointer position.
+	void					skip(size_t bytes);
+
+	/// Returns the position of the file pointer from the
+	/// start of the file in bytes.
+	size_t					position() const;
+
+	/// Returns whether the file pointer is at the end of the file.
+	bool					eof() const;
+
+private:
+
+	AAsset*					m_asset;
+	FileOpenMode			m_mode;
+};
+
+} // namespace crown