summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--base/files/file_unittest.cc33
-rw-r--r--base/files/file_win.cc27
2 files changed, 45 insertions, 15 deletions
diff --git a/base/files/file_unittest.cc b/base/files/file_unittest.cc
index 18ba340..c0579ad 100644
--- a/base/files/file_unittest.cc
+++ b/base/files/file_unittest.cc
@@ -349,18 +349,17 @@ TEST(File, DISABLED_TouchGetInfo) {
creation_time.ToInternalValue());
}
-TEST(File, ReadFileAtCurrentPosition) {
+TEST(File, ReadAtCurrentPosition) {
base::ScopedTempDir temp_dir;
ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
- FilePath file_path =
- temp_dir.path().AppendASCII("read_file_at_current_position");
+ FilePath file_path = temp_dir.path().AppendASCII("read_at_current_position");
File file(file_path,
base::File::FLAG_CREATE | base::File::FLAG_READ |
base::File::FLAG_WRITE);
EXPECT_TRUE(file.IsValid());
const char kData[] = "test";
- const int kDataSize = arraysize(kData) - 1;
+ const int kDataSize = sizeof(kData) - 1;
EXPECT_EQ(kDataSize, file.Write(0, kData, kDataSize));
EXPECT_EQ(0, file.Seek(base::File::FROM_BEGIN, 0));
@@ -371,8 +370,30 @@ TEST(File, ReadFileAtCurrentPosition) {
EXPECT_EQ(kDataSize - first_chunk_size,
file.ReadAtCurrentPos(buffer + first_chunk_size,
kDataSize - first_chunk_size));
- EXPECT_EQ(std::string(buffer, buffer + kDataSize),
- std::string(kData));
+ EXPECT_EQ(std::string(buffer, buffer + kDataSize), std::string(kData));
+}
+
+TEST(File, WriteAtCurrentPosition) {
+ base::ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+ FilePath file_path = temp_dir.path().AppendASCII("write_at_current_position");
+ File file(file_path,
+ base::File::FLAG_CREATE | base::File::FLAG_READ |
+ base::File::FLAG_WRITE);
+ EXPECT_TRUE(file.IsValid());
+
+ const char kData[] = "test";
+ const int kDataSize = sizeof(kData) - 1;
+
+ int first_chunk_size = kDataSize / 2;
+ EXPECT_EQ(first_chunk_size, file.WriteAtCurrentPos(kData, first_chunk_size));
+ EXPECT_EQ(kDataSize - first_chunk_size,
+ file.WriteAtCurrentPos(kData + first_chunk_size,
+ kDataSize - first_chunk_size));
+
+ char buffer[kDataSize];
+ EXPECT_EQ(kDataSize, file.Read(0, buffer, kDataSize));
+ EXPECT_EQ(std::string(buffer, buffer + kDataSize), std::string(kData));
}
#if defined(OS_WIN)
diff --git a/base/files/file_win.cc b/base/files/file_win.cc
index 3581fca..2bd69c7 100644
--- a/base/files/file_win.cc
+++ b/base/files/file_win.cc
@@ -139,7 +139,7 @@ int File::Read(int64 offset, char* data, int size) {
overlapped.OffsetHigh = offset_li.HighPart;
DWORD bytes_read;
- if (::ReadFile(file_, data, size, &bytes_read, &overlapped) != 0)
+ if (::ReadFile(file_, data, size, &bytes_read, &overlapped))
return bytes_read;
if (ERROR_HANDLE_EOF == GetLastError())
return 0;
@@ -155,7 +155,7 @@ int File::ReadAtCurrentPos(char* data, int size) {
return -1;
DWORD bytes_read;
- if (::ReadFile(file_, data, size, &bytes_read, NULL) != 0)
+ if (::ReadFile(file_, data, size, &bytes_read, NULL))
return bytes_read;
if (ERROR_HANDLE_EOF == GetLastError())
return 0;
@@ -184,14 +184,23 @@ int File::Write(int64 offset, const char* data, int size) {
overlapped.OffsetHigh = offset_li.HighPart;
DWORD bytes_written;
- if (::WriteFile(file_, data, size, &bytes_written, &overlapped) != 0)
+ if (::WriteFile(file_, data, size, &bytes_written, &overlapped))
return bytes_written;
return -1;
}
int File::WriteAtCurrentPos(const char* data, int size) {
- NOTREACHED();
+ base::ThreadRestrictions::AssertIOAllowed();
+ DCHECK(IsValid());
+ DCHECK(!async_);
+ if (size < 0)
+ return -1;
+
+ DWORD bytes_written;
+ if (::WriteFile(file_, data, size, &bytes_written, NULL))
+ return bytes_written;
+
return -1;
}
@@ -217,7 +226,7 @@ bool File::SetLength(int64 length) {
LARGE_INTEGER file_pointer;
LARGE_INTEGER zero;
zero.QuadPart = 0;
- if (::SetFilePointerEx(file_, zero, &file_pointer, FILE_CURRENT) == 0)
+ if (!::SetFilePointerEx(file_, zero, &file_pointer, FILE_CURRENT))
return false;
LARGE_INTEGER length_li;
@@ -233,8 +242,8 @@ bool File::SetLength(int64 length) {
// TODO(rvargas): Emulating ftruncate details seem suspicious and it is not
// promised by the interface (nor was promised by PlatformFile). See if this
// implementation detail can be removed.
- return ((::SetEndOfFile(file_) != 0) &&
- (::SetFilePointerEx(file_, file_pointer, NULL, FILE_BEGIN) != 0));
+ return ((::SetEndOfFile(file_) != FALSE) &&
+ (::SetFilePointerEx(file_, file_pointer, NULL, FILE_BEGIN) != FALSE));
}
bool File::Flush() {
@@ -250,7 +259,7 @@ bool File::SetTimes(Time last_access_time, Time last_modified_time) {
FILETIME last_access_filetime = last_access_time.ToFileTime();
FILETIME last_modified_filetime = last_modified_time.ToFileTime();
return (::SetFileTime(file_, NULL, &last_access_filetime,
- &last_modified_filetime) != 0);
+ &last_modified_filetime) != FALSE);
}
bool File::GetInfo(Info* info) {
@@ -258,7 +267,7 @@ bool File::GetInfo(Info* info) {
DCHECK(IsValid());
BY_HANDLE_FILE_INFORMATION file_info;
- if (GetFileInformationByHandle(file_, &file_info) == 0)
+ if (!GetFileInformationByHandle(file_, &file_info))
return false;
LARGE_INTEGER size;