| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // For 64-bit file access (off_t = off64_t, lseek64, etc). | 5 // For 64-bit file access (off_t = off64_t, lseek64, etc). |
| 6 #define _FILE_OFFSET_BITS 64 | 6 #define _FILE_OFFSET_BITS 64 |
| 7 | 7 |
| 8 #include "net/base/file_stream_context.h" | 8 #include "net/base/file_stream_context.h" |
| 9 | 9 |
| 10 #include <errno.h> | 10 #include <errno.h> |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 // We cast back and forth, so make sure it's the size we're expecting. | 39 // We cast back and forth, so make sure it's the size we're expecting. |
| 40 COMPILE_ASSERT(sizeof(int64) == sizeof(off_t), off_t_64_bit); | 40 COMPILE_ASSERT(sizeof(int64) == sizeof(off_t), off_t_64_bit); |
| 41 | 41 |
| 42 // Make sure our Whence mappings match the system headers. | 42 // Make sure our Whence mappings match the system headers. |
| 43 COMPILE_ASSERT(FROM_BEGIN == SEEK_SET && | 43 COMPILE_ASSERT(FROM_BEGIN == SEEK_SET && |
| 44 FROM_CURRENT == SEEK_CUR && | 44 FROM_CURRENT == SEEK_CUR && |
| 45 FROM_END == SEEK_END, whence_matches_system); | 45 FROM_END == SEEK_END, whence_matches_system); |
| 46 | 46 |
| 47 FileStream::Context::Context(const BoundNetLog& bound_net_log, | 47 FileStream::Context::Context(const BoundNetLog& bound_net_log, |
| 48 const scoped_refptr<base::TaskRunner>& task_runner) | 48 const scoped_refptr<base::TaskRunner>& task_runner) |
| 49 : file_(base::kInvalidPlatformFileValue), | 49 : record_uma_(false), |
| 50 record_uma_(false), | |
| 51 async_in_progress_(false), | 50 async_in_progress_(false), |
| 52 orphaned_(false), | 51 orphaned_(false), |
| 52 async_(false), |
| 53 bound_net_log_(bound_net_log), | 53 bound_net_log_(bound_net_log), |
| 54 task_runner_(task_runner) { | 54 task_runner_(task_runner) { |
| 55 } | 55 } |
| 56 | 56 |
| 57 FileStream::Context::Context(base::PlatformFile file, | 57 FileStream::Context::Context(base::File file, |
| 58 const BoundNetLog& bound_net_log, | 58 const BoundNetLog& bound_net_log, |
| 59 int /* open_flags */, | |
| 60 const scoped_refptr<base::TaskRunner>& task_runner) | 59 const scoped_refptr<base::TaskRunner>& task_runner) |
| 61 : file_(file), | 60 : file_(file.Pass()), |
| 62 record_uma_(false), | 61 record_uma_(false), |
| 63 async_in_progress_(false), | 62 async_in_progress_(false), |
| 64 orphaned_(false), | 63 orphaned_(false), |
| 64 async_(false), |
| 65 bound_net_log_(bound_net_log), | 65 bound_net_log_(bound_net_log), |
| 66 task_runner_(task_runner) { | 66 task_runner_(task_runner) { |
| 67 } | 67 } |
| 68 |
| 69 FileStream::Context::Context(base::File file, |
| 70 int flags, |
| 71 const BoundNetLog& bound_net_log, |
| 72 const scoped_refptr<base::TaskRunner>& task_runner) |
| 73 : file_(file.Pass()), |
| 74 record_uma_(false), |
| 75 async_in_progress_(false), |
| 76 orphaned_(false), |
| 77 async_((flags & base::File::FLAG_ASYNC) == base::File::FLAG_ASYNC), |
| 78 bound_net_log_(bound_net_log), |
| 79 task_runner_(task_runner) { |
| 80 } |
| 68 | 81 |
| 69 FileStream::Context::~Context() { | 82 FileStream::Context::~Context() { |
| 70 } | 83 } |
| 71 | 84 |
| 72 int64 FileStream::Context::GetFileSize() const { | 85 int64 FileStream::Context::GetFileSize() const { |
| 73 struct stat info; | 86 struct stat info; |
| 74 if (fstat(file_, &info) != 0) { | 87 if (fstat(file_.GetPlatformFile(), &info) != 0) { |
| 75 IOResult result = IOResult::FromOSError(errno); | 88 IOResult result = IOResult::FromOSError(errno); |
| 76 RecordError(result, FILE_ERROR_SOURCE_GET_SIZE); | 89 RecordError(result, FILE_ERROR_SOURCE_GET_SIZE); |
| 77 return result.result; | 90 return result.result; |
| 78 } | 91 } |
| 79 | 92 |
| 80 return static_cast<int64>(info.st_size); | 93 return static_cast<int64>(info.st_size); |
| 81 } | 94 } |
| 82 | 95 |
| 83 int FileStream::Context::ReadAsync(IOBuffer* in_buf, | 96 int FileStream::Context::ReadAsync(IOBuffer* in_buf, |
| 84 int buf_len, | 97 int buf_len, |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 } | 141 } |
| 129 | 142 |
| 130 int FileStream::Context::WriteSync(const char* in_buf, int buf_len) { | 143 int FileStream::Context::WriteSync(const char* in_buf, int buf_len) { |
| 131 scoped_refptr<IOBuffer> buf = new WrappedIOBuffer(in_buf); | 144 scoped_refptr<IOBuffer> buf = new WrappedIOBuffer(in_buf); |
| 132 IOResult result = WriteFileImpl(buf, buf_len); | 145 IOResult result = WriteFileImpl(buf, buf_len); |
| 133 RecordError(result, FILE_ERROR_SOURCE_WRITE); | 146 RecordError(result, FILE_ERROR_SOURCE_WRITE); |
| 134 return result.result; | 147 return result.result; |
| 135 } | 148 } |
| 136 | 149 |
| 137 int FileStream::Context::Truncate(int64 bytes) { | 150 int FileStream::Context::Truncate(int64 bytes) { |
| 138 if (ftruncate(file_, bytes) != 0) { | 151 if (ftruncate(file_.GetPlatformFile(), bytes) != 0) { |
| 139 IOResult result = IOResult::FromOSError(errno); | 152 IOResult result = IOResult::FromOSError(errno); |
| 140 RecordError(result, FILE_ERROR_SOURCE_SET_EOF); | 153 RecordError(result, FILE_ERROR_SOURCE_SET_EOF); |
| 141 return result.result; | 154 return result.result; |
| 142 } | 155 } |
| 143 | 156 |
| 144 return bytes; | 157 return bytes; |
| 145 } | 158 } |
| 146 | 159 |
| 147 FileStream::Context::IOResult FileStream::Context::SeekFileImpl(Whence whence, | 160 FileStream::Context::IOResult FileStream::Context::SeekFileImpl(Whence whence, |
| 148 int64 offset) { | 161 int64 offset) { |
| 149 off_t res = lseek(file_, static_cast<off_t>(offset), | 162 off_t res = lseek(file_.GetPlatformFile(), static_cast<off_t>(offset), |
| 150 static_cast<int>(whence)); | 163 static_cast<int>(whence)); |
| 151 if (res == static_cast<off_t>(-1)) | 164 if (res == static_cast<off_t>(-1)) |
| 152 return IOResult::FromOSError(errno); | 165 return IOResult::FromOSError(errno); |
| 153 | 166 |
| 154 return IOResult(res, 0); | 167 return IOResult(res, 0); |
| 155 } | 168 } |
| 156 | 169 |
| 157 FileStream::Context::IOResult FileStream::Context::FlushFileImpl() { | 170 FileStream::Context::IOResult FileStream::Context::FlushFileImpl() { |
| 158 ssize_t res = HANDLE_EINTR(fsync(file_)); | 171 ssize_t res = HANDLE_EINTR(fsync(file_.GetPlatformFile())); |
| 159 if (res == -1) | 172 if (res == -1) |
| 160 return IOResult::FromOSError(errno); | 173 return IOResult::FromOSError(errno); |
| 161 | 174 |
| 162 return IOResult(res, 0); | 175 return IOResult(res, 0); |
| 163 } | 176 } |
| 164 | 177 |
| 165 FileStream::Context::IOResult FileStream::Context::ReadFileImpl( | 178 FileStream::Context::IOResult FileStream::Context::ReadFileImpl( |
| 166 scoped_refptr<IOBuffer> buf, | 179 scoped_refptr<IOBuffer> buf, |
| 167 int buf_len) { | 180 int buf_len) { |
| 168 // Loop in the case of getting interrupted by a signal. | 181 // Loop in the case of getting interrupted by a signal. |
| 169 ssize_t res = HANDLE_EINTR(read(file_, buf->data(), | 182 ssize_t res = HANDLE_EINTR(read(file_.GetPlatformFile(), buf->data(), |
| 170 static_cast<size_t>(buf_len))); | 183 static_cast<size_t>(buf_len))); |
| 171 if (res == -1) | 184 if (res == -1) |
| 172 return IOResult::FromOSError(errno); | 185 return IOResult::FromOSError(errno); |
| 173 | 186 |
| 174 return IOResult(res, 0); | 187 return IOResult(res, 0); |
| 175 } | 188 } |
| 176 | 189 |
| 177 FileStream::Context::IOResult FileStream::Context::WriteFileImpl( | 190 FileStream::Context::IOResult FileStream::Context::WriteFileImpl( |
| 178 scoped_refptr<IOBuffer> buf, | 191 scoped_refptr<IOBuffer> buf, |
| 179 int buf_len) { | 192 int buf_len) { |
| 180 ssize_t res = HANDLE_EINTR(write(file_, buf->data(), buf_len)); | 193 ssize_t res = HANDLE_EINTR(write(file_.GetPlatformFile(), buf->data(), |
| 194 buf_len)); |
| 181 if (res == -1) | 195 if (res == -1) |
| 182 return IOResult::FromOSError(errno); | 196 return IOResult::FromOSError(errno); |
| 183 | 197 |
| 184 return IOResult(res, 0); | 198 return IOResult(res, 0); |
| 185 } | 199 } |
| 186 | 200 |
| 187 FileStream::Context::IOResult FileStream::Context::CloseFileImpl() { | |
| 188 bool success = base::ClosePlatformFile(file_); | |
| 189 file_ = base::kInvalidPlatformFileValue; | |
| 190 if (!success) | |
| 191 return IOResult::FromOSError(errno); | |
| 192 | |
| 193 return IOResult(OK, 0); | |
| 194 } | |
| 195 | |
| 196 } // namespace net | 201 } // namespace net |
| OLD | NEW |