|
@@ -495,56 +495,56 @@ String FileAccess::get_as_utf8_string(bool p_skip_cr) const {
|
|
|
return s;
|
|
|
}
|
|
|
|
|
|
-void FileAccess::store_8(uint8_t p_dest) {
|
|
|
- store_buffer(&p_dest, sizeof(uint8_t));
|
|
|
+bool FileAccess::store_8(uint8_t p_dest) {
|
|
|
+ return store_buffer(&p_dest, sizeof(uint8_t));
|
|
|
}
|
|
|
|
|
|
-void FileAccess::store_16(uint16_t p_dest) {
|
|
|
+bool FileAccess::store_16(uint16_t p_dest) {
|
|
|
if (big_endian) {
|
|
|
p_dest = BSWAP16(p_dest);
|
|
|
}
|
|
|
|
|
|
- store_buffer(reinterpret_cast<uint8_t *>(&p_dest), sizeof(uint16_t));
|
|
|
+ return store_buffer(reinterpret_cast<uint8_t *>(&p_dest), sizeof(uint16_t));
|
|
|
}
|
|
|
|
|
|
-void FileAccess::store_32(uint32_t p_dest) {
|
|
|
+bool FileAccess::store_32(uint32_t p_dest) {
|
|
|
if (big_endian) {
|
|
|
p_dest = BSWAP32(p_dest);
|
|
|
}
|
|
|
|
|
|
- store_buffer(reinterpret_cast<uint8_t *>(&p_dest), sizeof(uint32_t));
|
|
|
+ return store_buffer(reinterpret_cast<uint8_t *>(&p_dest), sizeof(uint32_t));
|
|
|
}
|
|
|
|
|
|
-void FileAccess::store_64(uint64_t p_dest) {
|
|
|
+bool FileAccess::store_64(uint64_t p_dest) {
|
|
|
if (big_endian) {
|
|
|
p_dest = BSWAP64(p_dest);
|
|
|
}
|
|
|
|
|
|
- store_buffer(reinterpret_cast<uint8_t *>(&p_dest), sizeof(uint64_t));
|
|
|
+ return store_buffer(reinterpret_cast<uint8_t *>(&p_dest), sizeof(uint64_t));
|
|
|
}
|
|
|
|
|
|
-void FileAccess::store_real(real_t p_real) {
|
|
|
+bool FileAccess::store_real(real_t p_real) {
|
|
|
if constexpr (sizeof(real_t) == 4) {
|
|
|
- store_float(p_real);
|
|
|
+ return store_float(p_real);
|
|
|
} else {
|
|
|
- store_double(p_real);
|
|
|
+ return store_double(p_real);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void FileAccess::store_half(float p_dest) {
|
|
|
- store_16(Math::make_half_float(p_dest));
|
|
|
+bool FileAccess::store_half(float p_dest) {
|
|
|
+ return store_16(Math::make_half_float(p_dest));
|
|
|
}
|
|
|
|
|
|
-void FileAccess::store_float(float p_dest) {
|
|
|
+bool FileAccess::store_float(float p_dest) {
|
|
|
MarshallFloat m;
|
|
|
m.f = p_dest;
|
|
|
- store_32(m.i);
|
|
|
+ return store_32(m.i);
|
|
|
}
|
|
|
|
|
|
-void FileAccess::store_double(double p_dest) {
|
|
|
+bool FileAccess::store_double(double p_dest) {
|
|
|
MarshallDouble m;
|
|
|
m.d = p_dest;
|
|
|
- store_64(m.l);
|
|
|
+ return store_64(m.l);
|
|
|
}
|
|
|
|
|
|
uint64_t FileAccess::get_modified_time(const String &p_file) {
|
|
@@ -628,19 +628,18 @@ Error FileAccess::set_read_only_attribute(const String &p_file, bool p_ro) {
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-void FileAccess::store_string(const String &p_string) {
|
|
|
+bool FileAccess::store_string(const String &p_string) {
|
|
|
if (p_string.length() == 0) {
|
|
|
- return;
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
CharString cs = p_string.utf8();
|
|
|
- store_buffer((uint8_t *)&cs[0], cs.length());
|
|
|
+ return store_buffer((uint8_t *)&cs[0], cs.length());
|
|
|
}
|
|
|
|
|
|
-void FileAccess::store_pascal_string(const String &p_string) {
|
|
|
+bool FileAccess::store_pascal_string(const String &p_string) {
|
|
|
CharString cs = p_string.utf8();
|
|
|
- store_32(cs.length());
|
|
|
- store_buffer((uint8_t *)&cs[0], cs.length());
|
|
|
+ return store_32(cs.length()) && store_buffer((uint8_t *)&cs[0], cs.length());
|
|
|
}
|
|
|
|
|
|
String FileAccess::get_pascal_string() {
|
|
@@ -655,13 +654,12 @@ String FileAccess::get_pascal_string() {
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-void FileAccess::store_line(const String &p_line) {
|
|
|
- store_string(p_line);
|
|
|
- store_8('\n');
|
|
|
+bool FileAccess::store_line(const String &p_line) {
|
|
|
+ return store_string(p_line) && store_8('\n');
|
|
|
}
|
|
|
|
|
|
-void FileAccess::store_csv_line(const Vector<String> &p_values, const String &p_delim) {
|
|
|
- ERR_FAIL_COND(p_delim.length() != 1);
|
|
|
+bool FileAccess::store_csv_line(const Vector<String> &p_values, const String &p_delim) {
|
|
|
+ ERR_FAIL_COND_V(p_delim.length() != 1, false);
|
|
|
|
|
|
String line = "";
|
|
|
int size = p_values.size();
|
|
@@ -678,30 +676,43 @@ void FileAccess::store_csv_line(const Vector<String> &p_values, const String &p_
|
|
|
line += value;
|
|
|
}
|
|
|
|
|
|
- store_line(line);
|
|
|
+ return store_line(line);
|
|
|
}
|
|
|
|
|
|
-void FileAccess::store_buffer(const Vector<uint8_t> &p_buffer) {
|
|
|
+bool FileAccess::store_buffer(const Vector<uint8_t> &p_buffer) {
|
|
|
uint64_t len = p_buffer.size();
|
|
|
+ if (len == 0) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
const uint8_t *r = p_buffer.ptr();
|
|
|
|
|
|
- store_buffer(r, len);
|
|
|
+ return store_buffer(r, len);
|
|
|
+}
|
|
|
+
|
|
|
+bool FileAccess::store_buffer(const uint8_t *p_src, uint64_t p_length) {
|
|
|
+ ERR_FAIL_COND_V(!p_src && p_length > 0, false);
|
|
|
+ for (uint64_t i = 0; i < p_length; i++) {
|
|
|
+ if (unlikely(!store_8(p_src[i]))) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
-void FileAccess::store_var(const Variant &p_var, bool p_full_objects) {
|
|
|
+bool FileAccess::store_var(const Variant &p_var, bool p_full_objects) {
|
|
|
int len;
|
|
|
Error err = encode_variant(p_var, nullptr, len, p_full_objects);
|
|
|
- ERR_FAIL_COND_MSG(err != OK, "Error when trying to encode Variant.");
|
|
|
+ ERR_FAIL_COND_V_MSG(err != OK, false, "Error when trying to encode Variant.");
|
|
|
|
|
|
Vector<uint8_t> buff;
|
|
|
buff.resize(len);
|
|
|
|
|
|
uint8_t *w = buff.ptrw();
|
|
|
err = encode_variant(p_var, &w[0], len, p_full_objects);
|
|
|
- ERR_FAIL_COND_MSG(err != OK, "Error when trying to encode Variant.");
|
|
|
+ ERR_FAIL_COND_V_MSG(err != OK, false, "Error when trying to encode Variant.");
|
|
|
|
|
|
- store_32(len);
|
|
|
- store_buffer(buff);
|
|
|
+ return store_32(len) && store_buffer(buff);
|
|
|
}
|
|
|
|
|
|
Vector<uint8_t> FileAccess::get_file_as_bytes(const String &p_path, Error *r_error) {
|
|
@@ -864,7 +875,7 @@ void FileAccess::_bind_methods() {
|
|
|
ClassDB::bind_method(D_METHOD("store_float", "value"), &FileAccess::store_float);
|
|
|
ClassDB::bind_method(D_METHOD("store_double", "value"), &FileAccess::store_double);
|
|
|
ClassDB::bind_method(D_METHOD("store_real", "value"), &FileAccess::store_real);
|
|
|
- ClassDB::bind_method(D_METHOD("store_buffer", "buffer"), (void(FileAccess::*)(const Vector<uint8_t> &)) & FileAccess::store_buffer);
|
|
|
+ ClassDB::bind_method(D_METHOD("store_buffer", "buffer"), (bool(FileAccess::*)(const Vector<uint8_t> &)) & FileAccess::store_buffer);
|
|
|
ClassDB::bind_method(D_METHOD("store_line", "line"), &FileAccess::store_line);
|
|
|
ClassDB::bind_method(D_METHOD("store_csv_line", "values", "delim"), &FileAccess::store_csv_line, DEFVAL(","));
|
|
|
ClassDB::bind_method(D_METHOD("store_string", "string"), &FileAccess::store_string);
|