annotate foosdk/sdk/foobar2000/SDK/filesystem.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 #include "file.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "fsitem.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include <functional>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #ifndef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 struct stat;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 //! Contains various I/O related structures and interfaces.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 namespace foobar2000_io
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 {
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 //! Disk space info struct
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 struct drivespace_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 //! Free space, in bytes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 t_filesize m_free = filesize_invalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 //! Total size, in bytes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 t_filesize m_total = filesize_invalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 //! Free space available to caller, in bytes \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 //! If not specifically supported by filesystem, same as m_free.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 t_filesize m_avail = filesize_invalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 };
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 class filesystem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 class NOVTABLE directory_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 //! @returns true to continue enumeration, false to abort.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 virtual bool on_entry(filesystem * p_owner,abort_callback & p_abort,const char * p_url,bool p_is_subdirectory,const t_filestats & p_stats)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 class NOVTABLE directory_callback_v3 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 virtual bool on_entry(filesystem* owner, const char* URL, t_filestats2 const& stats, abort_callback& abort) = 0;
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 //! Entrypoint service for all filesystem operations.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 //! Implementation: standard implementations for local filesystem etc are provided by core.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 //! Instantiation: use static helper functions rather than calling filesystem interface methods directly, e.g. filesystem::g_open() to open a file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 class NOVTABLE filesystem : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(filesystem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 //! Enumeration specifying how to open a file. See: filesystem::open(), filesystem::g_open().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 typedef uint32_t t_open_mode;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 //! Opens an existing file for reading; if the file does not exist, the operation will fail.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 open_mode_read,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 //! Opens an existing file for writing; if the file does not exist, the operation will fail.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 open_mode_write_existing,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 //! Opens a new file for writing; if the file exists, its contents will be wiped.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 open_mode_write_new,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 open_mode_mask = 0xFF,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 open_shareable = 0x100,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 virtual bool get_canonical_path(const char * p_path,pfc::string_base & p_out)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 virtual bool is_our_path(const char * p_path)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 virtual bool get_display_path(const char * p_path,pfc::string_base & p_out)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 virtual void open(service_ptr_t<file> & p_out,const char * p_path, t_open_mode p_mode,abort_callback & p_abort)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 virtual void remove(const char * p_path,abort_callback & p_abort)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 //! Moves/renames a file. Will fail if the destination file already exists. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 //! Note that this function may throw exception_io_denied instead of exception_io_sharing_violation when the file is momentarily in use, due to bugs in Windows MoveFile() API. There is no legitimate way for us to distinguish between the two scenarios.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 virtual void move(const char * p_src,const char * p_dst,abort_callback & p_abort)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 //! Queries whether a file at specified path belonging to this filesystem is a remote object or not.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 virtual bool is_remote(const char * p_src) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 //! Retrieves stats of a file at specified path.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 virtual void get_stats(const char * p_path,t_filestats & p_stats,bool & p_is_writeable,abort_callback & p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 //! Helper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 t_filestats get_stats( const char * path, abort_callback & abort );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 virtual bool relative_path_create(const char* file_path, const char* playlist_path, pfc::string_base& out) { (void)file_path; (void)playlist_path; (void)out; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 virtual bool relative_path_parse(const char* relative_path, const char* playlist_path, pfc::string_base& out) { (void)relative_path; (void)playlist_path; (void)out; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 //! Creates a directory.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 virtual void create_directory(const char * p_path,abort_callback & p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 virtual void list_directory(const char * p_path,directory_callback & p_out,abort_callback & p_abort)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 //! Hint; returns whether this filesystem supports mime types. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 //! When this returns false, all file::get_content_type() calls on files opened thru this filesystem implementation will return false; otherwise, file::get_content_type() calls may return true depending on the file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 virtual bool supports_content_types() = 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 static void g_get_canonical_path(const char * path,pfc::string_base & out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 static void g_get_display_path(const char * path,pfc::string_base & out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 static void g_get_display_path(const char* path, pfc::string_base& out, filesystem::ptr & reuseMe);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 //! Retrieves a shortened display name for this file. By default this is implemented by returning filename.ext portion of the path.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 static bool g_get_display_name_short( const char * path, pfc::string_base & out );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 //! Extracts the native filesystem path, sets out to the input path if native path cannot be extracted so the output is always set.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 //! @returns True if native path was extracted successfully, false otherwise (but output is set anyway).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 static bool g_get_native_path( const char * path, pfc::string_base & out, abort_callback & a = fb2k::noAbort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 static pfc::string8 g_get_native_path( const char * path, abort_callback & a = fb2k::noAbort );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 static bool g_get_interface(service_ptr_t<filesystem> & p_out,const char * path);//path is AFTER get_canonical_path
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 static filesystem::ptr g_get_interface(const char * path);// throws exception_io_no_handler_for_path on failure
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 static filesystem::ptr get( const char * path ) { return g_get_interface(path); } // shortened; never returns null, throws on failure
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 static filesystem::ptr getLocalFS(); // returns local filesystem object
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 static filesystem::ptr tryGet(const char* path); // returns null if not found instead of throwing
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 static bool g_is_remote(const char * p_path);//path is AFTER get_canonical_path
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 static bool g_is_recognized_and_remote(const char * p_path);//path is AFTER get_canonical_path
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 static bool g_is_remote_safe(const char * p_path) {return g_is_recognized_and_remote(p_path);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 static bool g_is_remote_or_unrecognized(const char * p_path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 static bool g_is_recognized_path(const char * p_path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 //! Opens file at specified path, with specified access privileges.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 static void g_open(service_ptr_t<file> & p_out,const char * p_path,t_open_mode p_mode,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 //! Attempts to open file at specified path; if the operation fails with sharing violation error, keeps retrying (with short sleep period between retries) for specified amount of time.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 static void g_open_timeout(service_ptr_t<file> & p_out,const char * p_path,t_open_mode p_mode,double p_timeout,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 static void g_open_write_new(service_ptr_t<file> & p_out,const char * p_path,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 static void g_open_read(service_ptr_t<file> & p_out,const char * path,abort_callback & p_abort) {return g_open(p_out,path,open_mode_read,p_abort);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 static void g_open_precache(service_ptr_t<file> & p_out,const char * path,abort_callback & p_abort);//open only for precaching data (eg. will fail on http etc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 static bool g_exists(const char * p_path,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 static bool g_exists_writeable(const char * p_path,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 //! Removes file at specified path.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 static void g_remove(const char * p_path,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 //! Attempts to remove file at specified path; if the operation fails with a sharing violation error, keeps retrying (with short sleep period between retries) for specified amount of time.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 static void g_remove_timeout(const char * p_path,double p_timeout,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 //! Moves file from one path to another.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 //! Note that this function may throw exception_io_denied instead of exception_io_sharing_violation when the file is momentarily in use, due to bugs in Windows MoveFile() API. There is no legitimate way for us to distinguish between the two scenarios.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 static void g_move(const char * p_src,const char * p_dst,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 //! Attempts to move file from one path to another; if the operation fails with a sharing violation error, keeps retrying (with short sleep period between retries) for specified amount of time.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 static void g_move_timeout(const char * p_src,const char * p_dst,double p_timeout,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 static void g_link(const char * p_src,const char * p_dst,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 static void g_link_timeout(const char * p_src,const char * p_dst,double p_timeout,abort_callback & p_abort);
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 static void g_copy(const char * p_src,const char * p_dst,abort_callback & p_abort);//needs canonical path
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 static void g_copy_timeout(const char * p_src,const char * p_dst,double p_timeout,abort_callback & p_abort);//needs canonical path
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 static void g_copy_directory(const char * p_src,const char * p_dst,abort_callback & p_abort);//needs canonical path
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 static void g_get_stats(const char * p_path,t_filestats & p_stats,bool & p_is_writeable,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 static bool g_relative_path_create(const char * p_file_path,const char * p_playlist_path,pfc::string_base & out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 static bool g_relative_path_parse(const char * p_relative_path,const char * p_playlist_path,pfc::string_base & out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 static void g_create_directory(const char * p_path,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 static void g_open_temp(service_ptr_t<file> & p_out,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 static void g_open_tempmem(service_ptr_t<file> & p_out,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 static file::ptr g_open_tempmem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 static void g_list_directory(const char * p_path,directory_callback & p_out,abort_callback & p_abort);// path must be canonical
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 static bool g_is_valid_directory(const char * path,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 static bool g_is_empty_directory(const char * path,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 void remove_object_recur(const char * path, abort_callback & abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 void remove_directory_content(const char * path, abort_callback & abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 static void g_remove_object_recur(const char * path, abort_callback & abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 static void g_remove_object_recur_timeout(const char * path, double timeout, abort_callback & abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 // Presumes both source and destination belong to this filesystem.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 void copy_directory(const char * p_src, const char * p_dst, abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 void copy_directory_contents(const char* p_src, const char* p_dst, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 //! Moves/renames a file, overwriting the destination atomically if exists. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 //! Note that this function may throw exception_io_denied instead of exception_io_sharing_violation when the file is momentarily in use, due to bugs in Windows MoveFile() API. There is no legitimate way for us to distinguish between the two scenarios.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 void move_overwrite( const char * src, const char * dst, abort_callback & abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 //! Moves/renames a file, overwriting the destination atomically if exists. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 //! Meant to retain destination attributes if feasible. Otherwise identical to move_overwrite(). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 //! Note that this function may throw exception_io_denied instead of exception_io_sharing_violation when the file is momentarily in use, due to bugs in Windows MoveFile() API. There is no legitimate way for us to distinguish between the two scenarios.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 void replace_file(const char * src, const char * dst, abort_callback & abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 //! Create a directory, without throwing an exception if it already exists.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 //! @param didCreate bool flag indicating whether a new directory was created or not. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 //! This should be a retval, but because it's messy to obtain this information with certain APIs, the caller can opt out of receiving this information,.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 void make_directory( const char * path, abort_callback & abort, bool * didCreate = nullptr );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 //! Bool retval version of make_directory().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 bool make_directory_check( const char * path, abort_callback & abort );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 //! Returns whether a directory exists at path, false if doesn't exist or not a directory.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 bool directory_exists(const char * path, abort_callback & abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 //! Returns whether a file exists at path, false if doesn't exist or not a file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 bool file_exists( const char * path, abort_callback & abort );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 //! Returns whether either a file or a directory exists at path. Effectively directory_exists() || file_exists(), but somewhat more efficient.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 bool exists(const char* path, abort_callback& a);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 char pathSeparator();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 //! Extracts the filename.ext portion of the path. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 //! The filename is ready to be presented to the user - URL decoding and such (similar to get_display_path()) is applied.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 void extract_filename_ext(const char * path, pfc::string_base & outFN);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 pfc::string8 extract_filename_ext(const char* path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 pfc::string8 get_extension(const char* path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 static pfc::string8 g_get_extension(const char* path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 //! Retrieves the parent path.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 bool get_parent_path(const char * path, pfc::string_base & out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 //! Retrieves the parent path, alternate version.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 fb2k::stringRef parentPath(const char* path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 file::ptr openWriteNew( const char * path, abort_callback & abort, double timeout );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 file::ptr openWriteExisting(const char * path, abort_callback & abort, double timeout);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 file::ptr openRead( const char * path, abort_callback & abort, double timeout);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 file::ptr openEx( const char * path, t_open_mode mode, abort_callback & abort, double timeout);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 void remove_(const char* path, abort_callback& a, double timeout);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 //! Read whole file into a mem_block_container
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 void read_whole_file(const char * path, mem_block_container & out, pfc::string_base & outContentType, size_t maxBytes, abort_callback & abort );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 //! Alternate read whole file, fb2k mobile style
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 fb2k::memBlockRef readWholeFile(const char* path, size_t maxBytes, abort_callback& abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 static fb2k::memBlockRef g_readWholeFile(const char * path, size_t sizeSanity, abort_callback & aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 bool is_transacted();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 bool commit_if_transacted(abort_callback &abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 //! Full file rewrite helper that automatically does the right thing to ensure atomic update. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 //! If this is a transacted filesystem, a simple in-place rewrite is performed. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 //! If this is not a transacted filesystem, your content first goes to a temporary file, which then replaces the original. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 //! See also: filesystem_transacted. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 //! In order to perform transacted operations, you must obtain a transacted filesystem explicitly, or get one passed down from a higher level context (example: in config_io_callback_v3).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 void rewrite_file( const char * path, abort_callback & abort, double opTimeout, std::function<void (file::ptr) > worker );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 void rewrite_file(const char* path, abort_callback& abort, double opTimeout, const void* payload, size_t bytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 //! Full directory rewrite helper that automatically does the right thing to ensure atomic update. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 //! If this is a transacted filesystem, a simple in-place rewrite is performed. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 //! If this is not a transacted filesystem, your content first goes to a temporary folder, which then replaces the original. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 //! It is encouraged to perform flushFileBuffers on all files accessed from within. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 //! See also: filesystem_transacted. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 //! In order to perform transacted operations, you must obtain a transacted filesystem explicitly, or get one passed down from a higher level context (example: in config_io_callback_v3).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 void rewrite_directory(const char * path, abort_callback & abort, double opTimeout, std::function<void(const char *) > worker);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 t_filestats2 get_stats2_(const char* p_path, uint32_t s2flags, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 static t_filestats2 g_get_stats2(const char* p_path, uint32_t s2flags, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 bool get_display_name_short_(const char* path, pfc::string_base& out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 fsItemFolder::ptr makeItemFolderStd(const char* pathCanonical, t_filestats2 const& stats = filestats2_invalid );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 fsItemFile::ptr makeItemFileStd(const char* pathCanonical, t_filestats2 const& stats = filestats2_invalid );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 fsItemBase::ptr findItem_(const char* path, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 fsItemFile::ptr findItemFile_(const char* path, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 fsItemFolder::ptr findItemFolder_(const char* path, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 typedef std::function<void(const char*, t_filestats2 const&) > list_callback_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 void list_directory_(const char* path, list_callback_t cb, unsigned listMode,abort_callback& a);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 //! Compares two paths determining if one is a subpath of another,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 //! Returns false if the paths are unrelated.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 //! Returns true if the paths are related, and then: result is set 0 if they are equal, 1 if p2 is a subpath of p1, -1 if p1 is a subpath of p2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 static bool g_compare_paths(const char* p1, const char* p2, int& result);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 //! Batch file stats read. Some filesystems provide an optimized implementation of this.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 static void g_readStatsMulti(fb2k::arrayRef items, uint32_t s2flags, t_filestats2* outStats, abort_callback& abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 //! See filesystem_v3::fileNameSanity(). Throws pfc::exception_not_implemented() if not available.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 fb2k::stringRef fileNameSanity_(const char* fn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 //! See filesystem_v3::getDriveSpace(). Throws pfc::exception_not_implemented() if not available.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 drivespace_t getDriveSpace_(const char* pathAt, abort_callback& abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 static bool get_parent_helper(const char * path, char separator, pfc::string_base & out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 void read_whole_file_fallback( const char * path, mem_block_container & out, pfc::string_base & outContentType, size_t maxBytes, abort_callback & abort );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 class filesystem_v2 : public filesystem {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 FB2K_MAKE_SERVICE_INTERFACE( filesystem_v2, filesystem )
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 //! Moves/renames a file, overwriting the destination atomically if exists. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 //! Note that this function may throw exception_io_denied instead of exception_io_sharing_violation when the file is momentarily in use, due to bugs in Windows MoveFile() API. There is no legitimate way for us to distinguish between the two scenarios.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 virtual void move_overwrite(const char * src, const char * dst, abort_callback & abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 //! Moves/renames a file, overwriting the destination atomically if exists. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 //! Meant to retain destination attributes if feasible. Otherwise identical to move_overwrite(). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 //! Note that this function may throw exception_io_denied instead of exception_io_sharing_violation when the file is momentarily in use, due to bugs in Windows MoveFile() API. There is no legitimate way for us to distinguish between the two scenarios.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 virtual void replace_file(const char * src, const char * dst, abort_callback & abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 //! Create a directory, without throwing an exception if it already exists.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 //! @param didCreate bool flag indicating whether a new directory was created or not. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 //! This should be a retval, but because it's messy to obtain this information with certain APIs, the caller can opt out of receiving this information,.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 virtual void make_directory(const char * path, abort_callback & abort, bool * didCreate = nullptr) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 virtual bool directory_exists(const char * path, abort_callback & abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 virtual bool file_exists(const char * path, abort_callback & abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 virtual char pathSeparator() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 virtual void extract_filename_ext(const char * path, pfc::string_base & outFN);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 virtual bool get_parent_path( const char * path, pfc::string_base & out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 virtual void list_directory_ex(const char * p_path, directory_callback & p_out, unsigned listMode, abort_callback & p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 virtual void read_whole_file(const char * path, mem_block_container & out, pfc::string_base & outContentType, size_t maxBytes, abort_callback & abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 //! Wrapper to list_directory_ex
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 void list_directory( const char * p_path, directory_callback & p_out, abort_callback & p_abort );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 bool make_directory_check(const char * path, abort_callback & abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 class filesystem_v3 : public filesystem_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 FB2K_MAKE_SERVICE_INTERFACE(filesystem_v3, filesystem_v2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 //! Retrieves free space on the volume at the specified path.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 //! Optional functionality, throws pfc::exception_not_implemented if n/a.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 virtual drivespace_t getDriveSpace(const char* pathAt, abort_callback& abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 //! Retrieves stats of a file at specified path.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 virtual t_filestats2 get_stats2(const char* p_path, uint32_t s2flags, abort_callback& p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 virtual bool get_display_name_short(const char* in, pfc::string_base& out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 virtual void list_directory_v3(const char* path, directory_callback_v3& callback, unsigned listMode, abort_callback& p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 virtual fsItemBase::ptr findItem(const char* path, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 virtual fsItemFile::ptr findItemFile(const char* path, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 virtual fsItemFolder::ptr findItemFolder(const char* path, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 virtual fsItemFolder::ptr findParentFolder(const char* path, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 virtual fb2k::stringRef fileNameSanity(const char* fn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 virtual void readStatsMulti(fb2k::arrayRef items, uint32_t s2flags, t_filestats2* outStats, abort_callback& abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 //! Optional method to return a native filesystem path to this item, null if N/A.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 //! Aborter provided for corner cases, normally not needed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 virtual fb2k::stringRef getNativePath(const char* in, abort_callback& a) { (void)in; (void)a; return nullptr; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 // Old method wrapped to get_stats2()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 void get_stats(const char* p_path, t_filestats& p_stats, bool& p_is_writeable, abort_callback& p_abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 // Old method wrapped to list_directory_v3()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 void list_directory_ex(const char* p_path, directory_callback& p_out, unsigned listMode, abort_callback& p_abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 // Old method wrapped to get_stats2()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 bool directory_exists(const char* path, abort_callback& abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 // Old method wrapped to get_stats2()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 bool file_exists(const char* path, abort_callback& abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 class directory_callback_impl : public directory_callback
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 struct t_entry
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 pfc::string_simple m_path;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 t_filestats m_stats;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 t_entry(const char * p_path, const t_filestats & p_stats) : m_path(p_path), m_stats(p_stats) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 pfc::list_t<pfc::rcptr_t<t_entry> > m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 bool m_recur;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 static int sortfunc(const pfc::rcptr_t<const t_entry> & p1, const pfc::rcptr_t<const t_entry> & p2) {return pfc::io::path::compare(p1->m_path,p2->m_path);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 bool on_entry(filesystem * owner,abort_callback & p_abort,const char * url,bool is_subdirectory,const t_filestats & p_stats);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 directory_callback_impl(bool p_recur) : m_recur(p_recur) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 t_size get_count() {return m_data.get_count();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 const char * operator[](t_size n) const {return m_data[n]->m_path;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 const char * get_item(t_size n) const {return m_data[n]->m_path;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 const t_filestats & get_item_stats(t_size n) const {return m_data[n]->m_stats;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 void sort() {m_data.sort_t(sortfunc);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 t_filetimestamp filetimestamp_from_system_timer();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 inline t_filetimestamp import_filetimestamp(FILETIME ft) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 return *reinterpret_cast<t_filetimestamp*>(&ft);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 void generate_temp_location_for_file(pfc::string_base & p_out, const char * p_origpath,const char * p_extension,const char * p_magic);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 inline file_ptr fileOpen(const char * p_path,filesystem::t_open_mode p_mode,abort_callback & p_abort,double p_timeout) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 file_ptr temp; filesystem::g_open_timeout(temp,p_path,p_mode,p_timeout,p_abort); PFC_ASSERT(temp.is_valid()); return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 inline file_ptr fileOpenReadExisting(const char * p_path,abort_callback & p_abort,double p_timeout = 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 return fileOpen(p_path,filesystem::open_mode_read,p_abort,p_timeout);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 inline file_ptr fileOpenWriteExisting(const char * p_path,abort_callback & p_abort,double p_timeout = 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 return fileOpen(p_path,filesystem::open_mode_write_existing,p_abort,p_timeout);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 inline file_ptr fileOpenWriteNew(const char * p_path,abort_callback & p_abort,double p_timeout = 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 return fileOpen(p_path,filesystem::open_mode_write_new,p_abort,p_timeout);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 template<typename t_list>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 class directory_callback_retrieveList : public directory_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 directory_callback_retrieveList(t_list & p_list,bool p_getFiles,bool p_getSubDirectories) : m_list(p_list), m_getFiles(p_getFiles), m_getSubDirectories(p_getSubDirectories) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 bool on_entry(filesystem * p_owner,abort_callback & p_abort,const char * p_url,bool p_is_subdirectory,const t_filestats & p_stats) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 p_abort.check();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 if (p_is_subdirectory ? m_getSubDirectories : m_getFiles) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 m_list.add_item(p_url);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 const bool m_getSubDirectories;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 const bool m_getFiles;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 t_list & m_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 template<typename t_list>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 class directory_callback_retrieveListEx : public directory_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 directory_callback_retrieveListEx(t_list & p_files, t_list & p_directories) : m_files(p_files), m_directories(p_directories) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 bool on_entry(filesystem * p_owner,abort_callback & p_abort,const char * p_url,bool p_is_subdirectory,const t_filestats & p_stats) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 p_abort.check();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 if (p_is_subdirectory) m_directories += p_url;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 else m_files += p_url;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 t_list & m_files;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 t_list & m_directories;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 template<typename t_list> class directory_callback_retrieveListRecur : public directory_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 directory_callback_retrieveListRecur(t_list & p_list) : m_list(p_list) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 bool on_entry(filesystem * owner,abort_callback & p_abort,const char * path, bool isSubdir, const t_filestats&) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 if (isSubdir) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 try { owner->list_directory(path,*this,p_abort); } catch(exception_io const &) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 m_list.add_item(path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 t_list & m_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 template<typename t_list>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 static void listFiles(const char * p_path,t_list & p_out,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 directory_callback_retrieveList<t_list> callback(p_out,true,false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 filesystem::g_list_directory(p_path,callback,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 template<typename t_list>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 static void listDirectories(const char * p_path,t_list & p_out,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 directory_callback_retrieveList<t_list> callback(p_out,false,true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 filesystem::g_list_directory(p_path,callback,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 template<typename t_list>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 static void listFilesAndDirectories(const char * p_path,t_list & p_files,t_list & p_directories,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 directory_callback_retrieveListEx<t_list> callback(p_files,p_directories);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 filesystem::g_list_directory(p_path,callback,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 template<typename t_list>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 static void listFilesRecur(const char * p_path,t_list & p_out,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 directory_callback_retrieveListRecur<t_list> callback(p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 filesystem::g_list_directory(p_path,callback,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 bool extract_native_path(const char * p_fspath,pfc::string_base & p_native);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 bool _extract_native_path_ptr(const char * & p_fspath);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 bool is_native_filesystem( const char * p_fspath );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 bool extract_native_path_ex(const char * p_fspath, pfc::string_base & p_native);//prepends \\?\ where needed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 bool extract_native_path_archive_aware( const char * fspatch, pfc::string_base & out );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 bool extract_native_path_archive_aware_ex( const char * fspatch, pfc::string_base & out, abort_callback & a );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 template<typename T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 pfc::string getPathDisplay(const T& source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 const char * c = pfc::stringToPtr(source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 if ( *c == 0 ) return c;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 pfc::string_formatter temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 filesystem::g_get_display_path(c,temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 return temp.toString();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 template<typename T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 pfc::string getPathCanonical(const T& source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 const char * c = pfc::stringToPtr(source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 if ( *c == 0 ) return c;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 pfc::string_formatter temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 filesystem::g_get_canonical_path(c,temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 return temp.toString();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 bool matchContentType(const char * fullString, const char * ourType);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 bool matchProtocol(const char * fullString, const char * protocolName);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 bool testIfHasProtocol( const char * fullString );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 const char * afterProtocol( const char * fullString );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 pfc::string8 getProtocol(const char* fullString);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 void substituteProtocol(pfc::string_base & out, const char * fullString, const char * protocolName);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 bool matchContentType_MP3( const char * fullString);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 bool matchContentType_MP4audio( const char * fullString);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 bool matchContentType_MP4( const char * fullString);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 bool matchContentType_Ogg( const char * fullString);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 bool matchContentType_Opus( const char * fullString);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 bool matchContentType_FLAC( const char * fullString);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 bool matchContentType_WavPack( const char * fullString);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 bool matchContentType_WAV( const char * fullString);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 bool matchContentType_Musepack( const char * fullString);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 const char * extensionFromContentType( const char * contentType );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 const char * contentTypeFromExtension( const char * ext );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 void purgeOldFiles(const char * directory, t_filetimestamp period, abort_callback & abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 #ifndef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 // Struct stat to fb2k filestats converter
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 t_filestats nixMakeFileStats(const struct stat & st);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 t_filestats2 nixMakeFileStats2(const struct stat & st);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 bool nixQueryReadonly( const struct stat & st );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 bool nixQueryDirectory( const struct stat & st );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 bool compactHomeDir(pfc::string_base & str);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 bool expandHomeDir(pfc::string_base & str);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 //! \since 1.6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 class read_ahead_tools : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 FB2K_MAKE_SERVICE_COREAPI(read_ahead_tools);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 //! Turn any file object into asynchronous read-ahead-buffered file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 //! @param f File object to wrap. Do not call this object's method after a successful call to add_read_ahead; new file object takes over the ownership of it.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 //! @param size Requested read-ahead bytes. Pass 0 to use user settings for local/remote playback.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 virtual file::ptr add_read_ahead(file::ptr f, size_t size, abort_callback & aborter) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 //! A helper method to use prior to opening decoders. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 //! May open the file if needed or leave it blank for the decoder to open.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 //! @param f File object to open if needed (buffering mandated by user settings). May be valid or null prior to call. May be valid or null (no buffering) after call.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 //! @param path Path to open. May be null if f is not null. At least one of f and path must be valid prior to call.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 virtual void open_file_helper(file::ptr & f, const char * path, abort_callback & aborter) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 using namespace foobar2000_io;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 #include "filesystem_helper.h"