annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 // fsItem API
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 // Alternate, object-based way of accessing the local filesystem.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 // It is recommended to use fsItem methods to operate on user-specified media folders.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 // In some cases, notably Android and WinPhone/UWP, accessing user's documents/media over paths requires expensive resolving of objects representing them.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 // fsItem can cache platform specific resources necessary to manipulate the files, allowing efficient opening of files returned by directory enumeration.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 // Note that as of 2023, fsItem is just a convenience API.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 // WinPhone/UWP has been dropped; slow and buggy Android DocumentFile (*) wrapper is being abandoned. On neither of these platforms foobar2000 supports loading components.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 // Nothing in current-generation foobar2000 gains performance from using fsItem methods over plain filesystem with paths.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 // (*) Android DocumentFile is slow and buggy, not the wrapper. Google sucks.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 #include "file.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 #include "commonObjects.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 namespace foobar2000_io {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 namespace createMode {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 failIfExists = 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 allowExisting,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 generateUniqueName
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 namespace listMode {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 //! Return files
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 files = 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 //! Return folders
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 folders = 2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 //! Return both files and flders
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 filesAndFolders = files | folders,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 //! Return hidden files
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 hidden = 4,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 //! Do not hand over filestats unless they come for free with folder enumeration
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 suppressStats = 8,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 class fsItemBase; class fsItemFile; class fsItemFolder;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 typedef service_ptr_t<fsItemBase> fsItemPtr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 typedef service_ptr_t<fsItemFile> fsItemFilePtr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 typedef service_ptr_t<fsItemFolder> fsItemFolderPtr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 class filesystem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 //! Base class for filesystem items, files or folders. All fsItemBase objects actually belong to one of the main subclasses fsItemFile or fsItemFolder.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 class fsItemBase : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 FB2K_MAKE_SERVICE_INTERFACE(fsItemBase, service_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 //! Returns possibly incomplete or outdated stats that are readily available without blocking. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 //! The stats may have been fetched at the the object is created (as a part of directory enumeration).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 virtual t_filestats2 getStatsOpportunist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 //! Returns this item's canonical path.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 virtual fb2k::stringRef canonicalPath() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 //! Returns filename+extension / last path component
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 virtual fb2k::stringRef nameWithExt() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 //! Shortened display name. By default same as nameWithExt().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 virtual fb2k::stringRef shortName();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 //! Copies this item to the specified folder. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 //! If this is a folder, it will be copied recursively. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 //! This may be overridden for a specific filesystem to provide an optimized version; the default implementation walks and copies files using regular file APIs.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 virtual fsItemPtr copyTo(fsItemFolderPtr folder, const char* desiredName, unsigned createMode, abort_callback& aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 //! See copyTo(4) above. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 //! Uses source item's name (last path component, filename+ext or foldername).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 fsItemPtr copyTo(fsItemFolderPtr folder, unsigned createMode, abort_callback& aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 //! Moves this item to the specified folder. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 //! If this is a folder, it will be moved recursively. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 //! This may be overridden for a specific filesystem to provide an optimized version; the default implementation walks and moves files using regular file APIs.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 virtual fsItemPtr moveTo(fsItemFolderPtr folder, const char* desiredName, unsigned createMode, abort_callback& aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 //! See moveTo(4) above. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 //! Uses source item's name (last path component, filename+ext or foldername).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 fsItemPtr moveTo(fsItemFolderPtr folder, unsigned createMode, abort_callback& aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 //! Removes this item.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 virtual void remove(abort_callback& aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 //! Does represent remote object or local?
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 virtual bool isRemote() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 virtual t_filestats2 getStats2(uint32_t s2flags, abort_callback& aborter) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 virtual service_ptr_t<filesystem> getFS() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 static fsItemBase::ptr fromPath(const char* path, abort_callback& aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 t_filestats getStats(abort_callback& a);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 class fsItemFile : public fsItemBase {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 FB2K_MAKE_SERVICE_INTERFACE(fsItemFile, fsItemBase);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 virtual file::ptr open(uint32_t openMode, abort_callback& aborter) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 file::ptr openRead(abort_callback& aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 file::ptr openWriteExisting(abort_callback& aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 file::ptr openWriteNew(abort_callback& aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 //! Transfer this file's content and properties to another file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 virtual void copyToOther(fsItemFilePtr other, abort_callback& aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 //! Returns the file's content type, if provided by the filesystem. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 //! Null if not provided by the filesystem.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 virtual fb2k::stringRef getContentType(abort_callback&) { return nullptr; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 static fsItemFile::ptr fromPath(const char* path, abort_callback& aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 virtual fb2k::memBlockRef readWhole(size_t sizeSanity, abort_callback& aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 class fsItemFolder : public fsItemBase {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 FB2K_MAKE_SERVICE_INTERFACE(fsItemFolder, fsItemBase);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 virtual fb2k::arrayRef listContents(unsigned listMode, abort_callback& aborter) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 virtual fsItemBase::ptr findChild(const char* fileName, abort_callback& aborter) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 virtual fsItemFile::ptr findChildFile(const char* fileName, abort_callback& aborter) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 virtual fsItemFolder::ptr findChildFolder(const char* fileName, abort_callback& aborter) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 virtual fsItemFile::ptr createFile(const char* fileName, unsigned createMode, abort_callback& aborter) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 virtual fsItemFolder::ptr createFolder(const char* fileName, unsigned createMode, abort_callback& aborter) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 //! Removes this folder recursively.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 virtual void removeRecur(abort_callback& aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 static fsItemFolder::ptr fromPath(const char* path, abort_callback& aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 }