diff options
Diffstat (limited to 'src/libjin/Filesystem')
-rw-r--r-- | src/libjin/Filesystem/Buffer.h | 53 | ||||
-rw-r--r-- | src/libjin/Filesystem/Filesystem.cpp | 68 | ||||
-rw-r--r-- | src/libjin/Filesystem/Filesystem.h | 56 | ||||
-rw-r--r-- | src/libjin/Filesystem/je_asset_database.cpp | 85 | ||||
-rw-r--r-- | src/libjin/Filesystem/je_asset_database.h | 114 | ||||
-rw-r--r-- | src/libjin/Filesystem/je_buffer.h | 169 |
6 files changed, 368 insertions, 177 deletions
diff --git a/src/libjin/Filesystem/Buffer.h b/src/libjin/Filesystem/Buffer.h deleted file mode 100644 index 1d72083..0000000 --- a/src/libjin/Filesystem/Buffer.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef __JIN_BUFFER_H -#define __JIN_BUFFER_H - -#include <string.h> - -namespace jin -{ -namespace filesystem -{ - - class Buffer - { - public: - - inline Buffer(): data(0), size(0) - { - } - - inline Buffer(const Buffer& src) - { - delete data; - size = src.size; - data = new char[size]; - memcpy(data, src.data, size); - } - - inline Buffer(void* d, int s) - { - data = new char(size); - memcpy(data, d, size); - size = s; - } - - inline ~Buffer() - { - size = 0; - delete[] data; - } - - public: - - // data position in memory - void* data; - - // data buffer size - unsigned int size; - - }; - -} -} - -#endif
\ No newline at end of file diff --git a/src/libjin/Filesystem/Filesystem.cpp b/src/libjin/Filesystem/Filesystem.cpp deleted file mode 100644 index e9b05e3..0000000 --- a/src/libjin/Filesystem/Filesystem.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include "filesystem.h" -#include <string.h> -#include <stdlib.h> -#include <stdio.h> /* defines FILENAME_MAX */ - -namespace jin -{ -namespace filesystem -{ - - Filesystem* Filesystem::fs = 0; - - Filesystem::Filesystem() - { - S = smtnewshared(); - } - - Filesystem* Filesystem::get() - { - return fs ? fs : (fs = new Filesystem()); - } - - /** - * r is relative path - */ - void Filesystem::mount(const char * path) - { - int err = smtmount(S, path); - if (err) - { - printf("%s mounted path %s", smterrstr(err), path); - exit(1); - } - } - - /** - * - */ - int Filesystem::read(const char* path, Buffer* buffer) - { - buffer->data = smtread(S, path, &buffer->size); - if (buffer->data == 0) - return 0; - return 1; - } - - const char* Filesystem::getFull(const char* path) - { - return smtfullpath(S, path); - } - - bool Filesystem::isDir(const char* path) - { - return smtisdir(S, path); - } - - bool Filesystem::isFile(const char* path) - { - return smtisreg(S, path); - } - - bool Filesystem::exists(const char* path) - { - return smtexists(S, path) == 0; - } - -} -}
\ No newline at end of file diff --git a/src/libjin/Filesystem/Filesystem.h b/src/libjin/Filesystem/Filesystem.h deleted file mode 100644 index ba0fdc5..0000000 --- a/src/libjin/Filesystem/Filesystem.h +++ /dev/null @@ -1,56 +0,0 @@ -#include "buffer.h" -#include "../3rdparty/smount/smount.h" - -namespace jin -{ -namespace filesystem -{ - - class Filesystem - { - public: - - Filesystem(); - - static Filesystem* get(); - - /** - * is a path a directroy or a single file - */ - bool isDir(const char* path); - - /** - * is a path a directroy or a single file - */ - bool isFile(const char* path); - - /** - * is path a valid path - */ - bool exists(const char* path); - - /** - * read a file and return data buffer - */ - int read(const char* path, Buffer* buffer); - - /** - * set root directory, can only mount once. - */ - void mount(const char* root); - - /** - * convret relative path to absolute path - */ - const char* getFull(const char* path); - - private: - - static Filesystem* fs; - - smtShared* S; - - }; - -} -}
\ No newline at end of file diff --git a/src/libjin/Filesystem/je_asset_database.cpp b/src/libjin/Filesystem/je_asset_database.cpp new file mode 100644 index 0000000..ac547f0 --- /dev/null +++ b/src/libjin/Filesystem/je_asset_database.cpp @@ -0,0 +1,85 @@ +#include "../core/je_configuration.h" +#if defined(jin_filesystem) + +#include <string.h> +#include <stdlib.h> +#include <stdio.h> /* defines FILENAME_MAX */ + +#include "je_asset_database.h" + +namespace JinEngine +{ + namespace Filesystem + { + + AssetDatabase* AssetDatabase::mAssetDatabase = 0; + + AssetDatabase::AssetDatabase() + { + mSmt = smtnewshared(); + } + + AssetDatabase* AssetDatabase::get() + { + return mAssetDatabase ? mAssetDatabase : (mAssetDatabase = new AssetDatabase()); + } + + void AssetDatabase::mount(const char * path) + { + int err = smtmount(mSmt, path); + if (err) + { + printf("%s mounted path %s", smterrstr(err), path); + exit(1); + } + } + + bool AssetDatabase::read(const char* path, Buffer& buffer) + { + size_t size; + byte* data = (byte*)smtread(mSmt, path, &size); + if (data == nullptr) + return false; + buffer.bind(data, size); + return true; + } + + Buffer* read(const char* path) + { + return nullptr; + } + + void* AssetDatabase::read(const char* path, unsigned int* len) + { + return smtread(mSmt, path, len); + } + + const char* AssetDatabase::getFull(const char* path) + { + return smtfullpath(mSmt, path); + } + + bool AssetDatabase::isDir(const char* path) + { + return smtisdir(mSmt, path); + } + + bool AssetDatabase::isFile(const char* path) + { + return smtisreg(mSmt, path); + } + + bool AssetDatabase::exists(const char* path) + { + return smtexists(mSmt, path) == 0; + } + + std::vector<std::string> AssetDatabase::getFiles(const char* path, bool recursive) + { + + } + + } // namespace Filesystem +} // namespace JinEngine + +#endif // jin_filesystem
\ No newline at end of file diff --git a/src/libjin/Filesystem/je_asset_database.h b/src/libjin/Filesystem/je_asset_database.h new file mode 100644 index 0000000..8c30fc1 --- /dev/null +++ b/src/libjin/Filesystem/je_asset_database.h @@ -0,0 +1,114 @@ +#ifndef __JE_ASSET_DATABASE_H +#define __JE_ASSET_DATABASE_H + +#include "../core/je_configuration.h" +#if defined(jin_filesystem) + +#include <vector> + +#include "../3rdparty/smount/smount.h" + +#include "je_buffer.h" + +namespace JinEngine +{ + namespace Filesystem + { + + /// + /// Assets managment. + /// + class AssetDatabase + { + public: + /// + /// Get asset database singleton. + /// + /// @param Singleton of asset database. + /// + static AssetDatabase* get(); + + /// + /// Asset database constructor. + /// + AssetDatabase(); + + /// + /// Set asset root folder. + /// + /// @param root Root folder of assets. + /// + void mount(const char* root); + + /// + /// Check if the path is directory. + /// + /// @param path Path under asset folder. + /// @return True if the given path is directory, otherwise return false. + /// + bool isDir(const char* path); + + /// + /// Check if the path is file. + /// + /// @param path Path under asset folder. + /// @return True if the given path is file, otherwise return false. + /// + bool isFile(const char* path); + + /// + /// Check if the path exists. + /// @param path Given path. + /// @return True if path exists, otherwise return false. + /// + bool exists(const char* path); + + /// + /// Read file into a buffer. + /// + /// @param path Path of file. + /// @param buffer Buffer to fill. + /// @return True if read sucessful, otherwise return false. + /// + bool read(const char* path, Buffer& buffer); + + /// + /// Read file and return data content. + /// + /// @param path Path of file. + /// @param length Length of data. + /// @return Data if read sucessful, otherwise return null. + /// + void* read(const char* path, unsigned int* length); + + /// + /// Get files under given directory. + /// + /// @param path Path of directory. + /// @param recursive Recursivily search folder. + /// @return File list under given directory. + /// + std::vector<std::string> getFiles(const char* path, bool recursive); + + /// + /// Get full path of asset. + /// + /// @param path Path of asset. + /// @return Full path of asset. + /// + const char* getFull(const char* path); + + private: + static AssetDatabase* mAssetDatabase; +#if jin_filesystem == jin_filesystem_smount + smtShared* mSmt; +#endif + + }; + + } // namespace Filesystem +} // namespace JinEngine + +#endif // jin_filesystem + +#endif
\ No newline at end of file diff --git a/src/libjin/Filesystem/je_buffer.h b/src/libjin/Filesystem/je_buffer.h new file mode 100644 index 0000000..0726e1d --- /dev/null +++ b/src/libjin/Filesystem/je_buffer.h @@ -0,0 +1,169 @@ +#ifndef __JE_BUFFER_H +#define __JE_BUFFER_H + +#include "../core/je_configuration.h" +#if defined(jin_filesystem) + +#include <string.h> +#include <stdlib.h> + +#include "../common/je_temporary.h" +#include "../common/je_types.h" + +namespace JinEngine +{ + namespace Filesystem + { + + /// + /// Data buffer allocated on heap. + /// + class Buffer : public Temporary + { + public: + /// + /// Buffer constructor. + /// + Buffer() + : mData(0) + , mSize(0) + { + } + + /// + /// Copy constructor. + /// + /// @param src Buffer source. + /// + Buffer(const Buffer& src) + { + delete[] mData; + mSize = src.mSize; + mData = new byte[mSize]; + memcpy(mData, src.mData, mSize); + } + + /// + /// Buffer constructor. + /// + /// @param data Buffer data. + /// @param size Size of buffer. + /// + Buffer(void* data, int size) + { + mSize = size; + mData = new byte[mSize]; + memcpy(mData, data, mSize); + } + + /// + /// Buffer constructor. + /// + /// @param size Size of data. + /// + Buffer(size_t size) + { + mData = new byte[size]; + memset(mData, 0, size); + mSize = size; + } + + /// + /// Buffer destructor. + /// + ~Buffer() + { + delete[] mData; + mSize = 0; + } + + /// + /// Set buffer data. + /// + /// @param data Buffer data. + /// @param size Size of data. + /// + void set(byte* data, size_t size) + { + if (data == nullptr) + return; + if (mSize != size) + { + delete mData; + mData = new byte[size]; + } + mSize = size; + memcpy(mData, data, size); + } + + /// + /// Bind buffer data. + /// + /// @param data Buffer data. + /// @param size Size of buffer. + /// + void bind(byte* data, size_t size) + { + if (mData != nullptr) + delete mData; + mSize = size; + mData = data; + } + + /// + /// Buffer assignment. + /// + /// @param buffer Buffer to copy. + /// + void operator = (const Buffer& buffer) + { + delete[] mData; + mSize = buffer.mSize; + mData = new byte[mSize]; + memcpy(mData, buffer.mData, mSize); + } + + /// + /// Get data addresss. + /// + /// @return Data address. + /// + const byte* operator &() + { + return mData; + } + + /// + /// Get data size. + /// + /// @return Size of data. + /// + const inline size_t size() + { + return mSize; + } + + /// + /// Clear data. + /// + void clear() + { + if (mData == nullptr) + return; + delete mData; + mData = nullptr; + mSize = 0; + } + + private: + byte* mData; + size_t mSize; + + }; + + } // namespace Filesystem +} // namespace JinEngine + +#endif // jin_filesystem + +#endif
\ No newline at end of file |