Go to the documentation of this file.
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();
std::streampos get_start() const
Returns the offset within the file at which this file data begins.
void add_uint32(uint32_t value)
Adds an unsigned 32-bit integer to the stream.
bool open_read(std::ifstream &stream) const
Opens the indicated ifstream for reading the file, if possible.
PointerTo< VirtualFile > create_file(const Filename &filename)
Attempts to create a file by the indicated name in the filesystem, if possible, and returns it.
virtual const FileReference * get_file()
Returns the FileReference that provides the target for these datagrams, if any, or NULL if the datagr...
PointerTo< VirtualFile > get_file(const Filename &filename, bool status_only=false) const
Looks up the file by the indicated name in the file system.
void close()
Closes the file.
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...
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
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 void flush()
Ensures that all datagrams previously written will be visible in the output file.
static void close_write_file(std::ostream *stream)
Closes a file opened by a previous call to open_write_file().
A hierarchy of directories and files that appears to be one continuous file system,...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
bool write_header(const std::string &header)
Writes a sequence of bytes to the beginning of the datagram file.
void add_uint64(uint64_t value)
Adds an unsigned 64-bit integer to the stream.
const Filename & get_filename() const
A shortcut to the filename.
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.
static VirtualFileSystem * get_global_ptr()
Returns the default global VirtualFileSystem.
Keeps a reference-counted pointer to a file on disk.
The abstract base class for a file or directory within the VirtualFileSystem.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
A StreamWriter object is used to write sequential binary data directly to an ostream.
This class records a particular byte sub-range within an existing file on disk.
bool open(const FileReference *file)
Opens the indicated filename for writing.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
The name of a file, such as a texture file or an Egg file.
void set_binary()
Indicates that the filename represents a binary file.
virtual bool put_datagram(const Datagram &data)
Writes the given datagram to the file.
std::streamsize get_size() const
Returns the number of consecutive bytes, beginning at get_start(), that correspond to this file data.