VFS - Ported from old LW code

This commit is contained in:
Emmanuel BENOîT 2018-12-23 22:31:34 +01:00
parent 68716e9193
commit bb94169a31
4 changed files with 694 additions and 0 deletions
include/ebcl

150
include/ebcl/VFS.hh Normal file
View 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>

View 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