4jcraft/Minecraft.World/IO/Files/ConsoleSaveFileOutputStream.cpp
2026-03-13 17:06:56 -05:00

117 lines
4.1 KiB
C++

#include "../../Platform/stdafx.h"
#include "File.h"
#include "ConsoleSaveFileOutputStream.h"
#include "ConsoleSaveFile.h"
// Creates a file output stream to write to the file represented by the
// specified File object. A new FileDescriptor object is created to represent
// this file connection. First, if there is a security manager, its checkWrite
// method is called with the path represented by the file argument as its
// argument.
//
// If the file exists but is a directory rather than a regular file, does not
// exist but cannot be created, or cannot be opened for any other reason then a
// FileNotFoundException is thrown.
//
// Parameters:
// file - the file to be opened for writing.
ConsoleSaveFileOutputStream::ConsoleSaveFileOutputStream(
ConsoleSaveFile* saveFile, const ConsoleSavePath& file) {
m_saveFile = saveFile;
m_file = m_saveFile->createFile(file);
m_saveFile->setFilePointer(m_file, 0, SaveFileSeekOrigin::Begin);
}
ConsoleSaveFileOutputStream::ConsoleSaveFileOutputStream(
ConsoleSaveFile* saveFile, FileEntry* file) {
m_saveFile = saveFile;
m_file = file;
m_saveFile->setFilePointer(m_file, 0, SaveFileSeekOrigin::Begin);
}
// Writes the specified byte to this file output stream. Implements the write
// method of OutputStream. Parameters: b - the byte to be written.
void ConsoleSaveFileOutputStream::write(unsigned int b) {
unsigned int numberOfBytesWritten;
std::uint8_t value = (std::uint8_t)b;
bool result =
m_saveFile->writeFile(m_file,
&value, // data buffer
1, // number of bytes to write
&numberOfBytesWritten // number of bytes written
);
if (!result) {
// TODO 4J Stu - Some kind of error handling
} else if (numberOfBytesWritten == 0) {
// File pointer is past the end of the file
}
}
// Writes b.length bytes from the specified byte array to this file output
// stream. Parameters: b - the data.
void ConsoleSaveFileOutputStream::write(byteArray b) {
unsigned int numberOfBytesWritten;
bool result =
m_saveFile->writeFile(m_file,
&b.data, // data buffer
b.length, // number of bytes to write
&numberOfBytesWritten // number of bytes written
);
if (!result) {
// TODO 4J Stu - Some kind of error handling
} else if (numberOfBytesWritten == 0 || numberOfBytesWritten != b.length) {
// File pointer is past the end of the file
}
}
// Writes len bytes from the specified byte array starting at offset off to this
// file output stream. Parameters: b - the data. off - the start offset in the
// data. len - the number of bytes to write.
void ConsoleSaveFileOutputStream::write(byteArray b, unsigned int offset,
unsigned int length) {
// 4J Stu - We don't want to write any more than the array buffer holds
assert(length <= (b.length - offset));
unsigned int numberOfBytesWritten;
bool result =
m_saveFile->writeFile(m_file,
&b[offset], // data buffer
length, // number of bytes to write
&numberOfBytesWritten // number of bytes written
);
if (!result) {
// TODO 4J Stu - Some kind of error handling
} else if (numberOfBytesWritten == 0 || numberOfBytesWritten != length) {
// File pointer is past the end of the file
}
}
//
// Closes this file output stream and releases any system resources associated
// with this stream. This file output stream may no longer be used for writing
// bytes. If this stream has an associated channel then the channel is closed as
// well.
void ConsoleSaveFileOutputStream::close() {
if (m_saveFile != NULL) {
bool result = m_saveFile->closeHandle(m_file);
if (!result) {
// TODO 4J Stu - Some kind of error handling
}
// Stop the dtor from trying to close it again
m_saveFile = NULL;
}
}