VFS - Ported from old LW code
This commit is contained in:
parent
68716e9193
commit
bb94169a31
4 changed files with 694 additions and 0 deletions
150
include/ebcl/VFS.hh
Normal file
150
include/ebcl/VFS.hh
Normal file
|
@ -0,0 +1,150 @@
|
|||
/******************************************************************************/
|
||||
/* VIRTUAL FILE SYSTEM ********************************************************/
|
||||
/******************************************************************************/
|
||||
|
||||
#ifndef _H_EBCL_VFS
|
||||
#define _H_EBCL_VFS
|
||||
|
||||
#include <ebcl/Sets.hh>
|
||||
#include <ebcl/Strings.hh>
|
||||
#include <ebcl/Streams.hh>
|
||||
#include <ebcl/Files.hh>
|
||||
#include <ebcl/Registration.hh>
|
||||
namespace ebcl {
|
||||
|
||||
|
||||
/*= DRIVERS ==================================================================*/
|
||||
|
||||
class A_VFSDriver
|
||||
{
|
||||
public:
|
||||
virtual ~A_VFSDriver( ) = 0;
|
||||
|
||||
/*
|
||||
* Initialisation and shutdown methods, called by the main VFS code.
|
||||
* These do nothing by default.
|
||||
*/
|
||||
virtual bool init( );
|
||||
virtual void shutdown( );
|
||||
|
||||
/*
|
||||
* Note: the main VFS code will NEVER pass anything but an absolute
|
||||
* path to the methods below.
|
||||
*/
|
||||
|
||||
/* Get the type of an entry in the VFS */
|
||||
virtual E_FSEntryType typeOf( T_FSPath const& path ) = 0;
|
||||
|
||||
/* Checks that a path exists */
|
||||
bool exists( T_FSPath const& path );
|
||||
|
||||
/* List entries matching a VFS path. The method should return true if
|
||||
* the path was found by the driver and was a directory, or false if
|
||||
* it wasn't.
|
||||
*/
|
||||
virtual bool list( T_FSPath const& path ,
|
||||
T_Set< T_FSPath >& values ) = 0;
|
||||
|
||||
/* Try reading from a VFS file. Returns an owning pointer that's either
|
||||
* null if the path in question couldn't be found (or wasn't a file)
|
||||
* or that refers to some unspecified input stream.
|
||||
*/
|
||||
virtual OP_InputStream read( T_FSPath const& path ) = 0;
|
||||
|
||||
/* Try opening a path as an actual file. If the driver doesn't support
|
||||
* this, or if it cannot open the file for whatever reason, this should
|
||||
* return null (which is what the default implementation does).
|
||||
*/
|
||||
virtual OP_File file( T_FSPath const& path );
|
||||
};
|
||||
M_ABSTRACT_POINTERS( VFSDriver );
|
||||
|
||||
|
||||
/*= VFS FILESYSTEM DRIVER ====================================================*/
|
||||
|
||||
/* A driver that allows the VFS to access a part of the actual filesystem. */
|
||||
class T_VFSFilesystemDriver : public A_VFSDriver
|
||||
{
|
||||
private:
|
||||
T_FSPath root_;
|
||||
|
||||
public:
|
||||
T_VFSFilesystemDriver( ) = delete;
|
||||
T_VFSFilesystemDriver( T_VFSFilesystemDriver const& ) = delete;
|
||||
T_VFSFilesystemDriver( T_VFSFilesystemDriver&& ) noexcept = delete;
|
||||
|
||||
explicit T_VFSFilesystemDriver( T_FSPath const& root );
|
||||
|
||||
T_FSPath const& root( ) const;
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
bool init( ) override;
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
E_FSEntryType typeOf( T_FSPath const& path ) override;
|
||||
bool list( T_FSPath const& path , T_Set< T_FSPath >& values ) override;
|
||||
|
||||
OP_InputStream read( T_FSPath const& path ) override;
|
||||
OP_File file( T_FSPath const& path ) override;
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
protected:
|
||||
T_String getFullPath( T_FSPath const& path ) const;
|
||||
T_Buffer< char > getOSPath( T_FSPath const& path ) const;
|
||||
};
|
||||
M_CLASS_POINTERS( VFSFilesystemDriver );
|
||||
|
||||
|
||||
/*= VFS CORE =================================================================*/
|
||||
|
||||
class X_VFSInitialisationFailure : public std::runtime_error
|
||||
{
|
||||
public:
|
||||
X_VFSInitialisationFailure( );
|
||||
};
|
||||
|
||||
class T_VFS : public A_PrivateImplementation
|
||||
{
|
||||
public:
|
||||
// Initialise the VFS, using the specified RW directory
|
||||
T_VFS( T_FSPath const& userDir );
|
||||
|
||||
T_VFS( ) = delete;
|
||||
T_VFS( T_VFS const& ) = delete;
|
||||
T_VFS( T_VFS&& ) = delete;
|
||||
|
||||
// Add a new VFS driver
|
||||
T_RegisteredItem addDriver( OP_VFSDriver&& driver );
|
||||
template<
|
||||
typename DriverType ,
|
||||
typename... ArgTypes
|
||||
>
|
||||
T_RegisteredItem addDriver( ArgTypes&& ... arguments );
|
||||
|
||||
// Read-only access methods.
|
||||
E_FSEntryType typeOf( T_FSPath const& path ) const;
|
||||
bool list( T_FSPath const& path , T_Array< T_FSPath >& output ) const;
|
||||
OP_InputStream read( T_FSPath const& path ) const;
|
||||
OP_File file( T_FSPath const& path ) const;
|
||||
|
||||
// Read/write access for the user directory.
|
||||
OP_File file( T_FSPath const& path , E_FileMode mode ) const;
|
||||
OP_OutputStream write( T_FSPath const& path ) const;
|
||||
bool mkdir( T_FSPath const& path ) const;
|
||||
bool rmdir( T_FSPath const& path ) const;
|
||||
bool rm( T_FSPath const& path ) const;
|
||||
bool move( T_FSPath const& from ,
|
||||
T_FSPath const& to ) const;
|
||||
|
||||
// Path style for the VFS
|
||||
static constexpr T_FSPathStyle Style( ) noexcept;
|
||||
};
|
||||
M_CLASS_POINTERS( VFS );
|
||||
|
||||
|
||||
} // namespace
|
||||
#endif // _H_EBCL_VFS
|
||||
#include <ebcl/inline/VFS.hh>
|
60
include/ebcl/inline/VFS.hh
Normal file
60
include/ebcl/inline/VFS.hh
Normal file
|
@ -0,0 +1,60 @@
|
|||
/******************************************************************************/
|
||||
/* VIRTUAL FILE SYSTEM - INLINE CODE ******************************************/
|
||||
/******************************************************************************/
|
||||
|
||||
#ifndef _H_EBCL_INLINE_VFS
|
||||
#define _H_EBCL_INLINE_VFS
|
||||
#include <ebcl/VFS.hh>
|
||||
namespace ebcl {
|
||||
|
||||
|
||||
/*= A_VFSDriver ==============================================================*/
|
||||
|
||||
inline A_VFSDriver::~A_VFSDriver( )
|
||||
{ }
|
||||
|
||||
inline bool A_VFSDriver::exists( T_FSPath const& path )
|
||||
{
|
||||
const auto et( typeOf( path ) );
|
||||
return et != E_FSEntryType::NONE;
|
||||
}
|
||||
|
||||
|
||||
/*= T_VFSFilesystemDriver ====================================================*/
|
||||
|
||||
inline T_FSPath const& T_VFSFilesystemDriver::root( ) const
|
||||
{
|
||||
return root_;
|
||||
}
|
||||
|
||||
|
||||
/*= X_VFSInitialisationFailure ===============================================*/
|
||||
|
||||
inline X_VFSInitialisationFailure::X_VFSInitialisationFailure( )
|
||||
: std::runtime_error( "unable to initialise VFS" )
|
||||
{ }
|
||||
|
||||
|
||||
/*= T_VFS ====================================================================*/
|
||||
|
||||
template<
|
||||
typename DriverType ,
|
||||
typename... ArgTypes
|
||||
>
|
||||
inline T_RegisteredItem T_VFS::addDriver( ArgTypes&& ... arguments )
|
||||
{
|
||||
return addDriver( NewOwned< DriverType >(
|
||||
std::forward< ArgTypes >( arguments ) ... ) );
|
||||
}
|
||||
|
||||
inline constexpr T_FSPathStyle T_VFS::Style( ) noexcept
|
||||
{
|
||||
return T_FSPathStyle{ true , false ,
|
||||
T_Flags< E_FSPathSeparator >{
|
||||
E_FSPathSeparator::SLASH ,
|
||||
E_FSPathSeparator::BACKSLASH } };
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
#endif // _H_EBCL_INLINE_VFS
|
Loading…
Add table
Add a link
Reference in a new issue