aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/Filesystem
diff options
context:
space:
mode:
Diffstat (limited to 'src/libjin/Filesystem')
-rw-r--r--src/libjin/Filesystem/Buffer.h53
-rw-r--r--src/libjin/Filesystem/Filesystem.cpp68
-rw-r--r--src/libjin/Filesystem/Filesystem.h56
-rw-r--r--src/libjin/Filesystem/je_asset_database.cpp85
-rw-r--r--src/libjin/Filesystem/je_asset_database.h114
-rw-r--r--src/libjin/Filesystem/je_buffer.h169
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