21 using std::streamsize;
32 _filename = _file->get_filename();
39 if (_vfile ==
nullptr) {
43 _out = _vfile->open_write_file(
true,
true);
44 _owns_out = (_out !=
nullptr);
45 return _owns_out && !_out->fail();
61 if (!filename.empty()) {
85 _wrote_first_datagram =
false;
97 nassertr(_out !=
nullptr,
false);
98 nassertr(!_wrote_first_datagram,
false);
100 _out->write(header.data(), header.size());
101 thread_consider_yield();
102 return !_out->fail();
111 nassertr(_out !=
nullptr,
false);
112 _wrote_first_datagram =
true;
116 size_t num_bytes = data.get_length();
117 if (num_bytes == (uint32_t)-1 || num_bytes != (uint32_t)num_bytes) {
127 _out->write((
const char *)data.get_data(), data.get_length());
128 thread_consider_yield();
130 return !_out->fail();
144 nassertr(_out !=
nullptr,
false);
145 _wrote_first_datagram =
true;
149 if (vfile ==
nullptr) {
152 std::istream *in = vfile->open_read_file(
true);
157 streamsize size = vfile->get_file_size(in);
158 streamsize num_remaining = size;
161 if (num_remaining == (uint32_t)-1 || num_remaining != (uint32_t)num_remaining) {
170 static const size_t buffer_size = 4096;
171 char buffer[buffer_size];
173 streampos start = _out->tellp();
174 in->read(buffer, min((streamsize)buffer_size, num_remaining));
175 streamsize count = in->gcount();
177 _out->write(buffer, count);
179 vfile->close_read_file(in);
182 num_remaining -= count;
183 if (num_remaining == 0) {
186 in->read(buffer, min((streamsize)buffer_size, num_remaining));
187 count = in->gcount();
190 vfile->close_read_file(in);
192 if (num_remaining != 0) {
194 <<
"Truncated input stream.\n";
213 nassertr(_out !=
nullptr,
false);
214 _wrote_first_datagram =
true;
221 streamsize num_remaining = source.
get_size();
224 if (num_remaining == (uint32_t)-1 || num_remaining != (uint32_t)num_remaining) {
233 static const size_t buffer_size = 4096;
234 char buffer[buffer_size];
236 streampos start = _out->tellp();
238 in.read(buffer, min((streamsize)buffer_size, num_remaining));
239 streamsize count = in.gcount();
241 _out->write(buffer, count);
245 num_remaining -= count;
246 if (num_remaining == 0) {
249 in.read(buffer, min((streamsize)buffer_size, num_remaining));
253 if (num_remaining != 0) {
255 <<
"Truncated input stream.\n";
268 if (_out ==
nullptr) {
284 if (_out !=
nullptr) {
318 if (_out ==
nullptr) {
321 return _out->tellp();
virtual bool copy_datagram(SubfileInfo &result, const Filename &filename)
Copies the file data from the entire indicated file (via the vfs) as the next datagram.
virtual void flush()
Ensures that all datagrams previously written will be visible in the output file.
bool open(const FileReference *file)
Opens the indicated filename for writing.
void close()
Closes the file.
virtual std::streampos get_file_pos()
Returns the current file position within the data stream, if any, or 0 if the file position is not me...
virtual const FileReference * get_file()
Returns the FileReference that provides the target for these datagrams, if any, or NULL if the datagr...
virtual bool is_error()
Returns true if the file has reached an error condition.
virtual const Filename & get_filename()
Returns the filename that provides the target for these datagrams, if any, or empty string if the dat...
virtual bool put_datagram(const Datagram &data)
Writes the given datagram to the file.
bool write_header(const std::string &header)
Writes a sequence of bytes to the beginning of the datagram file.
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
Keeps a reference-counted pointer to a file on disk.
The name of a file, such as a texture file or an Egg file.
bool open_read(std::ifstream &stream) const
Opens the indicated ifstream for reading the file, if possible.
void set_binary()
Indicates that the filename represents a binary file.
A StreamWriter object is used to write sequential binary data directly to an ostream.
void add_uint32(uint32_t value)
Adds an unsigned 32-bit integer to the stream.
void add_uint64(uint64_t value)
Adds an unsigned 64-bit integer to the stream.
This class records a particular byte sub-range within an existing file on disk.
const Filename & get_filename() const
A shortcut to the filename.
std::streampos get_start() const
Returns the offset within the file at which this file data begins.
std::streamsize get_size() const
Returns the number of consecutive bytes, beginning at get_start(), that correspond to this file data.
A hierarchy of directories and files that appears to be one continuous file system,...
static void close_write_file(std::ostream *stream)
Closes a file opened by a previous call to open_write_file().
PointerTo< VirtualFile > create_file(const Filename &filename)
Attempts to create a file by the indicated name in the filesystem, if possible, and returns it.
PointerTo< VirtualFile > get_file(const Filename &filename, bool status_only=false) const
Looks up the file by the indicated name in the file system.
static VirtualFileSystem * get_global_ptr()
Returns the default global VirtualFileSystem.
The abstract base class for a file or directory within the VirtualFileSystem.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.