Browse Source

Fix File opened with READ_WRITE on Windows

To allows use read and write anytime and in any order

(cherry picked from commit 8d12dfa24d70b6a86660baaafb83781d6dea4680)
Chaosus 6 years ago
parent
commit
d0bebee560
2 changed files with 34 additions and 0 deletions
  1. 33 0
      drivers/windows/file_access_windows.cpp
  2. 1 0
      drivers/windows/file_access_windows.h

+ 33 - 0
drivers/windows/file_access_windows.cpp

@@ -197,12 +197,14 @@ void FileAccessWindows::seek(size_t p_position) {
 	last_error = OK;
 	last_error = OK;
 	if (fseek(f, p_position, SEEK_SET))
 	if (fseek(f, p_position, SEEK_SET))
 		check_errors();
 		check_errors();
+	prev_op = 0;
 }
 }
 void FileAccessWindows::seek_end(int64_t p_position) {
 void FileAccessWindows::seek_end(int64_t p_position) {
 
 
 	ERR_FAIL_COND(!f);
 	ERR_FAIL_COND(!f);
 	if (fseek(f, p_position, SEEK_END))
 	if (fseek(f, p_position, SEEK_END))
 		check_errors();
 		check_errors();
+	prev_op = 0;
 }
 }
 size_t FileAccessWindows::get_position() const {
 size_t FileAccessWindows::get_position() const {
 
 
@@ -234,6 +236,12 @@ bool FileAccessWindows::eof_reached() const {
 uint8_t FileAccessWindows::get_8() const {
 uint8_t FileAccessWindows::get_8() const {
 
 
 	ERR_FAIL_COND_V(!f, 0);
 	ERR_FAIL_COND_V(!f, 0);
+	if (flags == READ_WRITE || flags == WRITE_READ) {
+		if (prev_op == WRITE) {
+			fflush(f);
+		}
+		prev_op = READ;
+	}
 	uint8_t b;
 	uint8_t b;
 	if (fread(&b, 1, 1, f) == 0) {
 	if (fread(&b, 1, 1, f) == 0) {
 		check_errors();
 		check_errors();
@@ -246,6 +254,12 @@ uint8_t FileAccessWindows::get_8() const {
 int FileAccessWindows::get_buffer(uint8_t *p_dst, int p_length) const {
 int FileAccessWindows::get_buffer(uint8_t *p_dst, int p_length) const {
 
 
 	ERR_FAIL_COND_V(!f, -1);
 	ERR_FAIL_COND_V(!f, -1);
+	if (flags == READ_WRITE || flags == WRITE_READ) {
+		if (prev_op == WRITE) {
+			fflush(f);
+		}
+		prev_op = READ;
+	}
 	int read = fread(p_dst, 1, p_length, f);
 	int read = fread(p_dst, 1, p_length, f);
 	check_errors();
 	check_errors();
 	return read;
 	return read;
@@ -260,16 +274,34 @@ void FileAccessWindows::flush() {
 
 
 	ERR_FAIL_COND(!f);
 	ERR_FAIL_COND(!f);
 	fflush(f);
 	fflush(f);
+	if (prev_op == WRITE)
+		prev_op = 0;
 }
 }
 
 
 void FileAccessWindows::store_8(uint8_t p_dest) {
 void FileAccessWindows::store_8(uint8_t p_dest) {
 
 
 	ERR_FAIL_COND(!f);
 	ERR_FAIL_COND(!f);
+	if (flags == READ_WRITE || flags == WRITE_READ) {
+		if (prev_op == READ) {
+			if (last_error != ERR_FILE_EOF) {
+				fseek(f, 0, SEEK_CUR);
+			}
+		}
+		prev_op = WRITE;
+	}
 	fwrite(&p_dest, 1, 1, f);
 	fwrite(&p_dest, 1, 1, f);
 }
 }
 
 
 void FileAccessWindows::store_buffer(const uint8_t *p_src, int p_length) {
 void FileAccessWindows::store_buffer(const uint8_t *p_src, int p_length) {
 	ERR_FAIL_COND(!f);
 	ERR_FAIL_COND(!f);
+	if (flags == READ_WRITE || flags == WRITE_READ) {
+		if (prev_op == READ) {
+			if (last_error != ERR_FILE_EOF) {
+				fseek(f, 0, SEEK_CUR);
+			}
+		}
+		prev_op = WRITE;
+	}
 	ERR_FAIL_COND(fwrite(p_src, 1, p_length, f) != p_length);
 	ERR_FAIL_COND(fwrite(p_src, 1, p_length, f) != p_length);
 }
 }
 
 
@@ -310,6 +342,7 @@ uint64_t FileAccessWindows::_get_modified_time(const String &p_file) {
 FileAccessWindows::FileAccessWindows() :
 FileAccessWindows::FileAccessWindows() :
 		f(NULL),
 		f(NULL),
 		flags(0),
 		flags(0),
+		prev_op(0),
 		last_error(OK) {
 		last_error(OK) {
 }
 }
 FileAccessWindows::~FileAccessWindows() {
 FileAccessWindows::~FileAccessWindows() {

+ 1 - 0
drivers/windows/file_access_windows.h

@@ -47,6 +47,7 @@ class FileAccessWindows : public FileAccess {
 	FILE *f;
 	FILE *f;
 	int flags;
 	int flags;
 	void check_errors() const;
 	void check_errors() const;
+	mutable int prev_op;
 	mutable Error last_error;
 	mutable Error last_error;
 	String path;
 	String path;
 	String path_src;
 	String path_src;