annotate foosdk/sdk/foobar2000/SDK/file.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 "exception_io.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 class file_info;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 class mem_block_container;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 //! Contains various I/O related structures and interfaces.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 namespace foobar2000_io
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 //! Type used for file size related variables.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 typedef t_uint64 t_filesize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 //! Type used for file size related variables when a signed value is needed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 typedef t_int64 t_sfilesize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 //! Type used for file timestamp related variables. 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601; 0 for invalid/unknown time.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 typedef t_uint64 t_filetimestamp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 //! Invalid/unknown file timestamp constant. Also see: t_filetimestamp.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 const t_filetimestamp filetimestamp_invalid = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 //! Invalid/unknown file size constant. Also see: t_filesize.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 static constexpr t_filesize filesize_invalid = (t_filesize)(UINT64_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 static constexpr t_filetimestamp filetimestamp_1second_increment = 10000000;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 //! Stores file stats (size and timestamp).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 struct t_filestats {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 //! Size of the file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 t_filesize m_size = filesize_invalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 //! Time of last file modification.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 t_filetimestamp m_timestamp = filetimestamp_invalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 inline bool operator==(const t_filestats& param) const { return m_size == param.m_size && m_timestamp == param.m_timestamp; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 inline bool operator!=(const t_filestats& param) const { return m_size != param.m_size || m_timestamp != param.m_timestamp; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 pfc::string8 describe() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 pfc::string8 debug() const { return describe(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 struct t_filestats2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 //! Size of the file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 t_filesize m_size = filesize_invalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 //! Time of last file modification.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 t_filetimestamp m_timestamp = filetimestamp_invalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 t_filetimestamp m_timestampCreate = filetimestamp_invalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 uint32_t m_attribs = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 uint32_t m_attribsValid = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 t_filestats const& as_legacy() const { return *reinterpret_cast<const t_filestats*>(this); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 t_filestats to_legacy() const { return { m_size, m_timestamp }; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 static t_filestats2 from_legacy(t_filestats const& in) { return { in.m_size, in.m_timestamp }; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 attr_readonly = 1 << 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 attr_folder = 1 << 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 attr_hidden = 1 << 2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 attr_system = 1 << 3,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 attr_remote = 1 << 4,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 bool is_set(uint32_t attr) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 PFC_ASSERT(m_attribsValid & attr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 return (m_attribs & attr) != 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 bool is_readonly() const { return is_set(attr_readonly); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 bool is_folder() const { return is_set(attr_folder); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 bool is_file() const { return !is_folder(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 bool is_hidden() const { return is_set(attr_hidden); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 bool can_write() const { return !is_readonly(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 bool is_system() const { return is_set(attr_system); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 bool is_remote() const { return is_set(attr_remote); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 void set_attrib(uint32_t f, bool v) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 if (v) m_attribs |= f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 else m_attribs &= ~f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 m_attribsValid |= f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 void set_file(bool v = true) { set_folder(!v); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 void set_folder(bool v = true) { set_attrib(attr_folder, v); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 void set_readonly(bool v) { set_attrib(attr_readonly, v); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 void set_hidden(bool v) { set_attrib(attr_hidden, v); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 void set_system(bool v) { set_attrib(attr_system, v); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 void set_remote(bool v = true) { set_attrib(attr_remote, v); }
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 static pfc::string8 format_attribs(uint32_t flags, const char* delim = ", ");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 pfc::string8 format_attribs(const char* delim = ", ") const { return format_attribs(m_attribs, delim); }
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 static bool equals(t_filestats2 const& v1, t_filestats2 const& v2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 return v1.m_size == v2.m_size && v1.m_timestamp == v2.m_timestamp && v1.m_timestampCreate == v2.m_timestampCreate && v1.m_attribsValid == v2.m_attribsValid && v1.m_attribs == v2.m_attribs;
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 bool operator==(const t_filestats2& other) const { return equals(*this, other); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 bool operator!=(const t_filestats2& other) const { return !equals(*this, other); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 pfc::string8 describe() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 pfc::string8 debug() const { return describe(); }
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 bool haveSize() const { return m_size != filesize_invalid; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 bool haveTimestamp() const { return m_timestamp != filetimestamp_invalid; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 bool haveTimestampCreate() const { return m_timestampCreate != filetimestamp_invalid; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 static constexpr uint32_t
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 stats2_size = 1 << 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 stats2_timestamp = 1 << 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 stats2_timestampCreate = 1 << 2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 stats2_fileOrFolder = 1 << 3,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 stats2_readOnly = 1 << 4,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 stats2_canWrite = stats2_readOnly,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 stats2_hidden = 1 << 5,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 stats2_remote = 1 << 6,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 stats2_flags = (stats2_fileOrFolder | stats2_readOnly | stats2_hidden | stats2_remote),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 stats2_legacy = (stats2_size | stats2_timestamp),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 stats2_all = 0xFFFFFFFF;
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 //! Invalid/unknown file stats constant. See: t_filestats.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 static constexpr t_filestats filestats_invalid = t_filestats();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 static constexpr t_filestats2 filestats2_invalid = t_filestats2();
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 //! Struct to be used with guid_getFileTimes / guid_setFileTimes.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 struct filetimes_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 t_filetimestamp creation = filetimestamp_invalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 t_filetimestamp lastAccess = filetimestamp_invalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 t_filetimestamp lastWrite = filetimestamp_invalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 //! Generic interface to read data from a nonseekable stream. Also see: stream_writer, file. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 //! Error handling: all methods may throw exception_io or one of derivatives on failure; exception_aborted when abort_callback is signaled.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 class NOVTABLE stream_reader {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 //! Attempts to reads specified number of bytes from the stream.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 //! @param p_buffer Receives data being read. Must have at least p_bytes bytes of space allocated.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 //! @param p_bytes Number of bytes to read.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 //! @returns Number of bytes actually read. May be less than requested when EOF was reached.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 virtual t_size read(void* p_buffer, t_size p_bytes, abort_callback& p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 //! Reads specified number of bytes from the stream. If requested amount of bytes can't be read (e.g. EOF), throws exception_io_data_truncation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 //! @param p_buffer Receives data being read. Must have at least p_bytes bytes of space allocated.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 //! @param p_bytes Number of bytes to read.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 virtual void read_object(void* p_buffer, t_size p_bytes, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 //! Attempts to skip specified number of bytes in the stream.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 //! @param p_bytes Number of bytes to skip.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 //! @returns Number of bytes actually skipped, May be less than requested when EOF was reached.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 virtual t_filesize skip(t_filesize p_bytes, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 //! Skips specified number of bytes in the stream. If requested amount of bytes can't be skipped (e.g. EOF), throws exception_io_data_truncation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 //! @param p_bytes Number of bytes to skip.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 virtual void skip_object(t_filesize p_bytes, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 //! Helper template built around read_object. Reads single raw object from the stream.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 //! @param p_object Receives object read from the stream on success.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 template<typename T> inline void read_object_t(T& p_object, abort_callback& p_abort) { pfc::assert_raw_type<T>(); read_object(&p_object, sizeof(p_object), p_abort); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 template<typename T> inline T read_object_t(abort_callback& a) { T val; this->read_object_t(val, a); return val; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 //! Helper template built around read_object. Reads single raw object from the stream; corrects byte order assuming stream uses little endian order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 //! @param p_object Receives object read from the stream on success.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 template<typename T> inline void read_lendian_t(T& p_object, abort_callback& p_abort) { read_object_t(p_object, p_abort); byte_order::order_le_to_native_t(p_object); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 template<typename T> inline T read_lendian_t(abort_callback& a) { T val; this->read_lendian_t(val, a); return val; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 //! Helper template built around read_object. Reads single raw object from the stream; corrects byte order assuming stream uses big endian order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 //! @param p_object Receives object read from the stream on success.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 template<typename T> inline void read_bendian_t(T& p_object, abort_callback& p_abort) { read_object_t(p_object, p_abort); byte_order::order_be_to_native_t(p_object); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 template<typename T> inline T read_bendian_t(abort_callback& a) { T val; this->read_bendian_t(val, a); return val; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 //! Helper function; reads a string (with a 32-bit header indicating length in bytes followed by UTF-8 encoded data without a null terminator).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 void read_string(pfc::string_base& p_out, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 //! Helper function; alternate way of storing strings; assumes string takes space up to end of stream.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 void read_string_raw(pfc::string_base& p_out, abort_callback& p_abort, size_t sanity = SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 //! Helper function; reads a string (with a 32-bit header indicating length in bytes followed by UTF-8 encoded data without a null terminator).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 pfc::string read_string(abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 //! Helper function; reads a string of specified length from the stream.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 void read_string_ex(pfc::string_base& p_out, t_size p_bytes, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 //! Helper function; reads a string of specified length from the stream.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 pfc::string read_string_ex(t_size p_len, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 void read_string_nullterm(pfc::string_base& out, abort_callback& abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 t_filesize skip_till_eof(abort_callback& abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 template<typename t_outArray>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 void read_till_eof(t_outArray& out, abort_callback& abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 pfc::assert_raw_type<typename t_outArray::t_item>();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 const t_size itemWidth = sizeof(typename t_outArray::t_item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 out.set_size(pfc::max_t<t_size>(1, 256 / itemWidth)); t_size done = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 for (;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 t_size delta = out.get_size() - done;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 t_size delta2 = read(out.get_ptr() + done, delta * itemWidth, abort) / itemWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 done += delta2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 if (delta2 != delta) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 out.set_size(out.get_size() << 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 out.set_size(done);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 uint8_t read_byte(abort_callback& abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 stream_reader() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 ~stream_reader() {}
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 //! Generic interface to write data to a nonseekable stream. Also see: stream_reader, file. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 //! Error handling: all methods may throw exception_io or one of derivatives on failure; exception_aborted when abort_callback is signaled.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 class NOVTABLE stream_writer {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 //! Writes specified number of bytes from specified buffer to the stream.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 //! @param p_buffer Buffer with data to write. Must contain at least p_bytes bytes.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 //! @param p_bytes Number of bytes to write.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 virtual void write(const void* p_buffer, t_size p_bytes, abort_callback& p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 //! Helper. Same as write(), provided for consistency.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 inline void write_object(const void* p_buffer, t_size p_bytes, abort_callback& p_abort) { write(p_buffer, p_bytes, p_abort); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 //! Helper template. Writes single raw object to the stream.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 //! @param p_object Object to write.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 template<typename T> inline void write_object_t(const T& p_object, abort_callback& p_abort) { pfc::assert_raw_type<T>(); write_object(&p_object, sizeof(p_object), p_abort); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 //! Helper template. Writes single raw object to the stream; corrects byte order assuming stream uses little endian order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 //! @param p_object Object to write.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 template<typename T> inline void write_lendian_t(const T& p_object, abort_callback& p_abort) { T temp = p_object; byte_order::order_native_to_le_t(temp); write_object_t(temp, p_abort); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 //! Helper template. Writes single raw object to the stream; corrects byte order assuming stream uses big endian order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 //! @param p_object Object to write.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 template<typename T> inline void write_bendian_t(const T& p_object, abort_callback& p_abort) { T temp = p_object; byte_order::order_native_to_be_t(temp); write_object_t(temp, p_abort); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 //! Helper function; writes string (with 32-bit header indicating length in bytes followed by UTF-8 encoded data without null terminator).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 void write_string(const char* p_string, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 void write_string(const char* p_string, t_size p_len, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 template<typename T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 void write_string(const T& val, abort_callback& p_abort) { write_string(pfc::stringToPtr(val), 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 //! Helper function; writes raw string to the stream, with no length info or null terminators.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 void write_string_raw(const char* p_string, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 void write_string_nullterm(const char* p_string, abort_callback& p_abort) { this->write(p_string, strlen(p_string) + 1, p_abort); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 stream_writer() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 ~stream_writer() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 };
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 //! A class providing abstraction for an open file object, with reading/writing/seeking methods. See also: stream_reader, stream_writer (which it inherits read/write methods from). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 //! Error handling: all methods may throw exception_io or one of derivatives on failure; exception_aborted when abort_callback is signaled.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 class NOVTABLE file : public service_base, public stream_reader, public stream_writer {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 //! Seeking mode constants. Note: these are purposedly defined to same values as standard C SEEK_* constants
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 enum t_seek_mode {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 //! Seek relative to beginning of file (same as seeking to absolute offset).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 seek_from_beginning = 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 //! Seek relative to current position.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 seek_from_current = 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 //! Seek relative to end of file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 seek_from_eof = 2,
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 //! Retrieves size of the file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 //! @returns File size on success; filesize_invalid if unknown (nonseekable stream etc).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 virtual t_filesize get_size(abort_callback& p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 //! Retrieves read/write cursor position in the file. In case of non-seekable stream, this should return number of bytes read so far since open/reopen call.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 //! @returns Read/write cursor position
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 virtual t_filesize get_position(abort_callback& p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 //! Resizes file to the specified size in bytes.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 virtual void resize(t_filesize p_size, abort_callback& p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 //! Sets read/write cursor position to the specified offset. Throws exception_io_seek_out_of_range if the specified offset is outside the valid range.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 //! @param p_position position to seek to.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 virtual void seek(t_filesize p_position, abort_callback& p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 //! Same as seek() but throws exception_io_data instead of exception_io_seek_out_of_range.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 void seek_probe(t_filesize p_position, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 //! Sets read/write cursor position to the specified offset; extended form allowing seeking relative to current position or to end of file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 //! @param p_position Position to seek to; interpretation of this value depends on p_mode parameter.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 //! @param p_mode Seeking mode; see t_seek_mode enum values for further description.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 virtual void seek_ex(t_sfilesize p_position, t_seek_mode p_mode, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 //! Returns whether the file is seekable or not. If can_seek() returns false, all seek() or seek_ex() calls will fail; reopen() is still usable on nonseekable streams.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 virtual bool can_seek() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 //! Retrieves mime type of the file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 //! @param p_out Receives content type string on success.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 virtual bool get_content_type(pfc::string_base& p_out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 pfc::string8 get_content_type();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 //! Hint, returns whether the file is already fully buffered into memory.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 virtual bool is_in_memory() { return false; }
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 //! Optional, called by owner thread before sleeping.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 virtual void on_idle(abort_callback& p_abort) { (void)p_abort; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 //! Retrieves last modification time of the file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 //! @returns Last modification time o fthe file; filetimestamp_invalid if N/A.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 virtual t_filetimestamp get_timestamp(abort_callback& p_abort) { (void)p_abort; return filetimestamp_invalid; }
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 //! Resets non-seekable stream, or seeks to zero on seekable file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 virtual void reopen(abort_callback& p_abort) = 0;
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 //! Indicates whether the file is a remote resource and non-sequential access may be slowed down by lag. This is typically returns to true on non-seekable sources but may also return true on seekable sources indicating that seeking is supported but will be relatively slow.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 virtual bool is_remote() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 //! Retrieves file stats structure. Uses get_size() and get_timestamp().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 t_filestats get_stats(abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 //! Returns whether read/write cursor position is at the end of file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 bool is_eof(abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 //! Truncates file to specified size (while preserving read/write cursor position if possible); uses set_eof().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 void truncate(t_filesize p_position, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 //! Truncates the file at current read/write cursor position.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 void set_eof(abort_callback& p_abort) { resize(get_position(p_abort), p_abort); }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 //! Helper; retrieves size of the file. If size is not available (get_size() returns filesize_invalid), throws exception_io_no_length.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 t_filesize get_size_ex(abort_callback& p_abort);
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 //! Helper; retrieves amount of bytes between read/write cursor position and end of file. Fails when length can't be determined.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 t_filesize get_remaining(abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 //! Security helper; fails early with exception_io_data_truncation if it is not possible to read this amount of bytes from this file at this position.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 void probe_remaining(t_filesize bytes, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 bool probe_remaining_ex(t_filesize bytes, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 //! Helper; throws exception_io_object_not_seekable if file is not seekable.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 void ensure_seekable();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 //! Helper; throws exception_io_object_is_remote if the file is remote.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 void ensure_local();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 //! Helper; transfers specified number of bytes between streams.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 //! @returns number of bytes actually transferred. May be less than requested if e.g. EOF is reached.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 static t_filesize g_transfer(stream_reader* src, stream_writer* dst, t_filesize bytes, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 //! Helper; transfers specified number of bytes between streams. Throws exception if requested number of bytes could not be read (EOF).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 static void g_transfer_object(stream_reader* src, stream_writer* dst, t_filesize bytes, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 //! Helper; transfers entire file content from one file to another, erasing previous content.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 static void g_transfer_file(const service_ptr_t<file>& p_from, const service_ptr_t<file>& p_to, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 //! Helper; transfers file modification times from one file to another, if supported by underlying objects. Returns true on success, false if the operation doesn't appear to be supported.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 static bool g_copy_timestamps(service_ptr_t<file> from, service_ptr_t<file> to, abort_callback& abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 static bool g_copy_creation_time(service_ptr_t<file> from, service_ptr_t<file> to, abort_callback& abort);
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 //! Helper; improved performance over g_transfer on streams (avoids disk fragmentation when transferring large blocks).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 static t_filesize g_transfer(service_ptr_t<file> p_src, service_ptr_t<file> p_dst, t_filesize p_bytes, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 //! Helper; improved performance over g_transfer_file on streams (avoids disk fragmentation when transferring large blocks).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 static void g_transfer_object(service_ptr_t<file> p_src, service_ptr_t<file> p_dst, t_filesize p_bytes, abort_callback& p_abort);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 //! file_v2 wrapper;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 size_t lowLevelIO_(const GUID& guid, size_t arg1, void* arg2, size_t arg2size, abort_callback& abort);
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 //! Helper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 bool flushFileBuffers(abort_callback&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 bool flushFileBuffers_(abort_callback& a) { return flushFileBuffers(a); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 //! Helper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 bool getFileTimes(filetimes_t& out, abort_callback&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 //! Helper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 bool setFileTimes(filetimes_t const& in, abort_callback&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 t_filesize skip(t_filesize p_bytes, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 t_filesize skip_seek(t_filesize p_bytes, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 //! file_v2 wrapper.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 service_ptr get_metadata_(abort_callback& a);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 //! file_v2 wrapper.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 t_filestats2 get_stats2_(uint32_t f, abort_callback& a);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 //! file_v2 wrapper.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 void set_stats(t_filestats2 const&, abort_callback&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 //! file_v2 wrapper.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 t_filetimestamp get_time_created(abort_callback& a);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 //! Alternate version of read() intended for network resources.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 //! See: stream_receive::receive(); \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 //! If not implemented by this object, uses plain read().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 size_t receive(void*, size_t, abort_callback&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 void commit(abort_callback& a) {flushFileBuffers(a);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 FB2K_MAKE_SERVICE_INTERFACE(file, service_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 typedef service_ptr_t<file> file_ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 //! Extension for shoutcast dynamic metadata handling.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 class file_dynamicinfo : public file {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 FB2K_MAKE_SERVICE_INTERFACE(file_dynamicinfo, file);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 //! Retrieves "static" info that doesn't change in the middle of stream, such as station names etc. Returns true on success; false when static info is not available.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 virtual bool get_static_info(class file_info& p_out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 //! Returns whether dynamic info is available on this stream or not.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 virtual bool is_dynamic_info_enabled() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 //! Retrieves dynamic stream info (e.g. online stream track titles). Returns true on success, false when info has not changed since last call.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 virtual bool get_dynamic_info(class file_info& p_out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 //! \since 1.4.1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 //! Extended version of file_dynamicinfo
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 class file_dynamicinfo_v2 : public file_dynamicinfo {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 FB2K_MAKE_SERVICE_INTERFACE(file_dynamicinfo_v2, file_dynamicinfo);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 virtual bool get_dynamic_info_v2(class file_info& out, t_filesize& outOffset) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 // Obsolete
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 bool get_dynamic_info(class file_info& p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 //! Extension for cached file access - allows callers to know that they're dealing with a cache layer, to prevent cache duplication.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 class file_cached : public file {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 FB2K_MAKE_SERVICE_INTERFACE(file_cached, file);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 virtual size_t get_cache_block_size() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 virtual void suggest_grow_cache(size_t suggestSize) = 0;
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 static file::ptr g_create(service_ptr_t<file> p_base, abort_callback& p_abort, t_size blockSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 static void g_create(service_ptr_t<file>& p_out, service_ptr_t<file> p_base, abort_callback& p_abort, t_size blockSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 static void g_decodeInitCache(file::ptr& theFile, abort_callback& abort, size_t blockSize);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 //! \since 1.5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 //! Additional service implemented by standard file object providing access to low level OS specific APIs. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 //! Obsolete, lowLevelIO() is now a part of file_v2 API.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 class file_lowLevelIO : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 FB2K_MAKE_SERVICE_INTERFACE(file_lowLevelIO, service_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 //! @returns 0 if the command was not recognized, a command-defined non zero value otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 virtual size_t lowLevelIO(const GUID& guid, size_t arg1, void* arg2, size_t arg2size, abort_callback& abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 //! Win32 FlushFileBuffers() wrapper. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 //! Throws exception_io_denied on a file opened for reading. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 //! No arguments are defined. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 //! Returns 1 if handled, 0 if unsupported.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 static const GUID guid_flushFileBuffers;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 //! Retrieves file creation / last access / last write times. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 //! Parameters: arg2 points to a filetimes_t struct to receive the data; arg2size must be set to sizeof(filetimes_t). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 //! If the filesystem does not support a specific portion of the information, relevant struct member will be set to filetimestamp_invalid. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 //! Returns 1 if handled, 0 if unsupported.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 static const GUID guid_getFileTimes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 //! Sets file creation / last access / last write times. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 //! Parameters: arg2 points to a filetimes_t struct holding the new data; arg2size must be set to sizeof(filetimes_t). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 //! Individual members of the filetimes_t struct can be set to filetimestamp_invalid, if not all of the values are to be altered on the file. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 //! Returns 1 if handled, 0 if unsupported.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 static const GUID guid_setFileTimes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 typedef ::foobar2000_io::filetimes_t filetimes_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 //! Implementation helper - contains dummy implementations of methods that modify the file
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 template<typename t_base> class file_readonly_t : public t_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 void resize(t_filesize p_size, abort_callback& p_abort) override { throw exception_io_denied(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 void write(const void* p_buffer, t_size p_bytes, abort_callback& p_abort) override { throw exception_io_denied(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 typedef file_readonly_t<file> file_readonly;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 class file_v2 : public file {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 FB2K_MAKE_SERVICE_INTERFACE(file_v2, file);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 //! Returns an object with protocol specific metadata of the file. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 //! It is essential that this object is made available to the caller by any wrappers working on top if a file object. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 //! The returned object can be of any implementation-defined class; for http it's file_metdata_http. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 //! Null return is allowed if no metadata is available.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 virtual service_ptr get_metadata(abort_callback&) { return nullptr; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 virtual t_filestats2 get_stats2(uint32_t s2flags, abort_callback&) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 virtual size_t lowLevelIO(const GUID& guid, size_t arg1, void* arg2, size_t arg2size, abort_callback& abort) { (void)guid; (void)arg1; (void)arg2; (void)arg2size; (void)abort; return 0; }
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 // Old methods wrapped to get_stats2()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 t_filetimestamp get_timestamp(abort_callback& p_abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 bool is_remote() override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 t_filesize get_size(abort_callback& p_abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 //! \since 1.6.7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 class file_metadata_http : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 FB2K_MAKE_SERVICE_INTERFACE(file_metadata_http, service_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 virtual bool get_http_header(const char* name, pfc::string_base& out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 virtual void get_connected_path(pfc::string_base& out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 };
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 //! \since 2.1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 //! Extension to file object, implemented by network readers. Adds receive() method.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 class stream_receive : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 FB2K_MAKE_SERVICE_INTERFACE(stream_receive, service_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 //! Alternate version of read() intended for network resources.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 //! Returns as soon as any data is available (usually less than requested), or EOF has been reached (0 returned).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 virtual size_t receive(void*, size_t, abort_callback&) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 size_t read_using_receive(void*, size_t, abort_callback&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 }