Mercurial > foo_out_sdl
diff foosdk/sdk/foobar2000/SDK/fsitem.h @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/foobar2000/SDK/fsitem.h Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,134 @@ +#pragma once + +// fsItem API +// Alternate, object-based way of accessing the local filesystem. +// It is recommended to use fsItem methods to operate on user-specified media folders. +// In some cases, notably Android and WinPhone/UWP, accessing user's documents/media over paths requires expensive resolving of objects representing them. +// fsItem can cache platform specific resources necessary to manipulate the files, allowing efficient opening of files returned by directory enumeration. +// +// Note that as of 2023, fsItem is just a convenience API. +// WinPhone/UWP has been dropped; slow and buggy Android DocumentFile (*) wrapper is being abandoned. On neither of these platforms foobar2000 supports loading components. +// Nothing in current-generation foobar2000 gains performance from using fsItem methods over plain filesystem with paths. +// +// (*) Android DocumentFile is slow and buggy, not the wrapper. Google sucks. + +#include "file.h" +#include "commonObjects.h" + +namespace foobar2000_io { + + namespace createMode { + enum { + failIfExists = 0, + allowExisting, + generateUniqueName + }; + } + namespace listMode { + enum { + //! Return files + files = 1, + //! Return folders + folders = 2, + //! Return both files and flders + filesAndFolders = files | folders, + //! Return hidden files + hidden = 4, + //! Do not hand over filestats unless they come for free with folder enumeration + suppressStats = 8, + }; + } + + class fsItemBase; class fsItemFile; class fsItemFolder; + typedef service_ptr_t<fsItemBase> fsItemPtr; + typedef service_ptr_t<fsItemFile> fsItemFilePtr; + typedef service_ptr_t<fsItemFolder> fsItemFolderPtr; + class filesystem; + + //! Base class for filesystem items, files or folders. All fsItemBase objects actually belong to one of the main subclasses fsItemFile or fsItemFolder. + class fsItemBase : public service_base { + FB2K_MAKE_SERVICE_INTERFACE(fsItemBase, service_base); + public: + //! Returns possibly incomplete or outdated stats that are readily available without blocking. \n + //! The stats may have been fetched at the the object is created (as a part of directory enumeration). + virtual t_filestats2 getStatsOpportunist(); + + //! Returns this item's canonical path. + virtual fb2k::stringRef canonicalPath() = 0; + + //! Returns filename+extension / last path component + virtual fb2k::stringRef nameWithExt() = 0; + + + //! Shortened display name. By default same as nameWithExt(). + virtual fb2k::stringRef shortName(); + + //! Copies this item to the specified folder. \n + //! If this is a folder, it will be copied recursively. \n + //! This may be overridden for a specific filesystem to provide an optimized version; the default implementation walks and copies files using regular file APIs. + virtual fsItemPtr copyTo(fsItemFolderPtr folder, const char* desiredName, unsigned createMode, abort_callback& aborter); + //! See copyTo(4) above. \n + //! Uses source item's name (last path component, filename+ext or foldername). + fsItemPtr copyTo(fsItemFolderPtr folder, unsigned createMode, abort_callback& aborter); + + //! Moves this item to the specified folder. \n + //! If this is a folder, it will be moved recursively. \n + //! This may be overridden for a specific filesystem to provide an optimized version; the default implementation walks and moves files using regular file APIs. + virtual fsItemPtr moveTo(fsItemFolderPtr folder, const char* desiredName, unsigned createMode, abort_callback& aborter); + //! See moveTo(4) above. \n + //! Uses source item's name (last path component, filename+ext or foldername). + fsItemPtr moveTo(fsItemFolderPtr folder, unsigned createMode, abort_callback& aborter); + + //! Removes this item. + virtual void remove(abort_callback& aborter); + + //! Does represent remote object or local? + virtual bool isRemote() = 0; + + virtual t_filestats2 getStats2(uint32_t s2flags, abort_callback& aborter) = 0; + + virtual service_ptr_t<filesystem> getFS() = 0; + + static fsItemBase::ptr fromPath(const char* path, abort_callback& aborter); + + t_filestats getStats(abort_callback& a); + }; + + class fsItemFile : public fsItemBase { + FB2K_MAKE_SERVICE_INTERFACE(fsItemFile, fsItemBase); + public: + virtual file::ptr open(uint32_t openMode, abort_callback& aborter) = 0; + + file::ptr openRead(abort_callback& aborter); + file::ptr openWriteExisting(abort_callback& aborter); + file::ptr openWriteNew(abort_callback& aborter); + + //! Transfer this file's content and properties to another file. + virtual void copyToOther(fsItemFilePtr other, abort_callback& aborter); + + //! Returns the file's content type, if provided by the filesystem. \n + //! Null if not provided by the filesystem. + virtual fb2k::stringRef getContentType(abort_callback&) { return nullptr; } + + static fsItemFile::ptr fromPath(const char* path, abort_callback& aborter); + + virtual fb2k::memBlockRef readWhole(size_t sizeSanity, abort_callback& aborter); + }; + + class fsItemFolder : public fsItemBase { + FB2K_MAKE_SERVICE_INTERFACE(fsItemFolder, fsItemBase); + public: + virtual fb2k::arrayRef listContents(unsigned listMode, abort_callback& aborter) = 0; + virtual fsItemBase::ptr findChild(const char* fileName, abort_callback& aborter) = 0; + virtual fsItemFile::ptr findChildFile(const char* fileName, abort_callback& aborter) = 0; + virtual fsItemFolder::ptr findChildFolder(const char* fileName, abort_callback& aborter) = 0; + virtual fsItemFile::ptr createFile(const char* fileName, unsigned createMode, abort_callback& aborter) = 0; + virtual fsItemFolder::ptr createFolder(const char* fileName, unsigned createMode, abort_callback& aborter) = 0; + + //! Removes this folder recursively. + virtual void removeRecur(abort_callback& aborter); + + static fsItemFolder::ptr fromPath(const char* path, abort_callback& aborter); + }; + +}
