1
0
mirror of https://github.com/VCMP-SqMod/SqMod.git synced 2024-11-08 16:57:16 +01:00
SqMod/module/Library/System/Dir.cpp

127 lines
4.3 KiB
C++
Raw Normal View History

// ------------------------------------------------------------------------------------------------
#include "Library/System/Dir.hpp"
// ------------------------------------------------------------------------------------------------
namespace SqMod {
// ------------------------------------------------------------------------------------------------
SQMODE_DECL_TYPENAME(TypenameD, _SC("SqSysDir"))
SQMODE_DECL_TYPENAME(TypenameF, _SC("SqSysFile"))
// ------------------------------------------------------------------------------------------------
LightObj SysDir::ReadFile() const
{
Validate("read current file");
// Create a file instance
std::unique_ptr< SysFile > mem = std::make_unique< SysFile >();
// Turn it into a script object
LightObj obj(mem.get());
// Will hold the raw object pointer
SysFile * ptr = nullptr;
// Release it if it was taken over by the script engine
if (obj.IsNull())
{
STHROWF("Failed to create a SqSysFile object.");
}
else
{
ptr = mem.release();
}
// The file handle where it will be opened
tinydir_file * handle = ptr->GetOrMake();
// Attempt to read the current file
if (tinydir_readfile(mHandle.get(), handle) == -1)
{
STHROWF("Failed to read current file.");
}
// Return the resulted object
return obj;
}
// ------------------------------------------------------------------------------------------------
LightObj SysDir::ReadFileAt(SQInteger i) const
{
Validate("read scanned file");
// Make sure the specified directory index is valid
if (i < 0)
{
STHROWF("File index (" PRINT_INT_FMT " < 0) our of bounds.", i);
}
if (static_cast< size_t >(i) >= mHandle->n_files)
{
STHROWF("File index (" PRINT_INT_FMT " >= " PRINT_SZ_FMT ") our of bounds.", i, mHandle->n_files);
}
// Create a file instance
std::unique_ptr< SysFile > mem = std::make_unique< SysFile >();
// Turn it into a script object
LightObj obj(mem.get());
// Will hold the raw object pointer
SysFile * ptr = nullptr;
// Release it if it was taken over by the script engine
if (obj.IsNull())
{
STHROWF("Failed to create a SqSysFile object.");
}
else
{
ptr = mem.release();
}
// The file handle where it will be opened
tinydir_file * handle = ptr->GetOrMake();
// Attempt to read the current file
if (tinydir_readfile_n(mHandle.get(), handle, i) == -1)
{
STHROWF("Failed to read file at index (" PRINT_INT_FMT ")", i);
}
// Return the resulted object
return obj;
}
// ================================================================================================
void Register_SysDir(HSQUIRRELVM vm)
{
RootTable(vm).Bind(TypenameD::Str,
Class< SysDir, NoCopy< SysDir > >(vm, TypenameD::Str)
// Constructors
.Ctor()
.Ctor< StackStrF & >()
.Ctor< bool, StackStrF & >()
// Meta-methods
.SquirrelFunc(_SC("_typename"), &TypenameD::Fn)
.Func(_SC("_tostring"), &SysDir::ToString)
// Member Properties
.Prop(_SC("IsValid"), &SysDir::IsValid)
.Prop(_SC("Path"), &SysDir::GetPath)
.Prop(_SC("HasNext"), &SysDir::HasNext)
.Prop(_SC("FileCount"), &SysDir::FileCount)
// Member Methods
.FmtFunc(_SC("Open"), &SysDir::Open)
.FmtFunc(_SC("OpenSorted"), &SysDir::OpenSorted)
.Func(_SC("OpenSubDir"), &SysDir::OpenSubDir)
.Func(_SC("Next"), &SysDir::Next)
.Func(_SC("Close"), &SysDir::Close)
.Func(_SC("ReadFile"), &SysDir::ReadFile)
.Func(_SC("ReadFileAt"), &SysDir::ReadFileAt)
);
RootTable(vm).Bind(TypenameF::Str,
Class< SysFile, NoCopy< SysFile > >(vm, TypenameF::Str)
// Constructors
.Ctor()
.Ctor< StackStrF & >()
// Meta-methods
.SquirrelFunc(_SC("_typename"), &TypenameF::Fn)
.Func(_SC("_tostring"), &SysFile::ToString)
// Member Properties
.Prop(_SC("IsValid"), &SysFile::IsValid)
.Prop(_SC("IsDir"), &SysFile::IsDir)
.Prop(_SC("IsReg"), &SysFile::IsReg)
.Prop(_SC("Path"), &SysFile::GetPath)
.Prop(_SC("Name"), &SysFile::GetName)
.Prop(_SC("Extension"), &SysFile::GetExtension)
// Member Methods
.FmtFunc(_SC("Open"), &SysFile::Open)
);
}
} // Namespace:: SqMod