Index: net/base/file_stream_win.cc |
=================================================================== |
--- net/base/file_stream_win.cc (revision 4000) |
+++ net/base/file_stream_win.cc (working copy) |
@@ -2,7 +2,7 @@ |
// source code is governed by a BSD-style license that can be found in the |
// LICENSE file. |
-#include "net/base/file_input_stream.h" |
+#include "net/base/file_stream.h" |
#include <windows.h> |
@@ -45,11 +45,11 @@ |
} |
} |
-// FileInputStream::AsyncContext ---------------------------------------------- |
+// FileStream::AsyncContext ---------------------------------------------- |
-class FileInputStream::AsyncContext : public MessageLoopForIO::IOHandler { |
+class FileStream::AsyncContext : public MessageLoopForIO::IOHandler { |
public: |
- AsyncContext(FileInputStream* owner) |
+ AsyncContext(FileStream* owner) |
: owner_(owner), overlapped_(), callback_(NULL) { |
overlapped_.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); |
} |
@@ -67,15 +67,15 @@ |
private: |
// MessageLoopForIO::IOHandler implementation: |
- virtual void OnIOCompleted(OVERLAPPED* context, DWORD bytes_read, |
+ virtual void OnIOCompleted(OVERLAPPED* context, DWORD num_bytes, |
DWORD error); |
- FileInputStream* owner_; |
+ FileStream* owner_; |
OVERLAPPED overlapped_; |
CompletionCallback* callback_; |
}; |
-void FileInputStream::AsyncContext::IOCompletionIsPending( |
+void FileStream::AsyncContext::IOCompletionIsPending( |
CompletionCallback* callback) { |
DCHECK(!callback_); |
callback_ = callback; |
@@ -83,82 +83,73 @@ |
MessageLoopForIO::current()->RegisterIOContext(&overlapped_, this); |
} |
-void FileInputStream::AsyncContext::OnIOCompleted(OVERLAPPED* context, |
- DWORD bytes_read, |
+void FileStream::AsyncContext::OnIOCompleted(OVERLAPPED* context, |
+ DWORD num_bytes, |
DWORD error) { |
DCHECK(&overlapped_ == context); |
DCHECK(callback_); |
MessageLoopForIO::current()->RegisterIOContext(&overlapped_, NULL); |
- HANDLE handle = owner_->handle_; |
+ HANDLE handle = owner_->file_; |
- int result = static_cast<int>(bytes_read); |
+ int result = static_cast<int>(num_bytes); |
if (error && error != ERROR_HANDLE_EOF) |
result = MapErrorCode(error); |
- if (bytes_read) |
- IncrementOffset(&overlapped_, bytes_read); |
+ if (num_bytes) |
+ IncrementOffset(&overlapped_, num_bytes); |
CompletionCallback* temp = NULL; |
std::swap(temp, callback_); |
temp->Run(result); |
} |
-// FileInputStream ------------------------------------------------------------ |
+// FileStream ------------------------------------------------------------ |
-FileInputStream::FileInputStream() : handle_(INVALID_HANDLE_VALUE) { |
+FileStream::FileStream() : file_(INVALID_HANDLE_VALUE) { |
} |
-FileInputStream::~FileInputStream() { |
+FileStream::~FileStream() { |
Close(); |
} |
-void FileInputStream::Close() { |
- if (handle_ != INVALID_HANDLE_VALUE) { |
- CloseHandle(handle_); |
- handle_ = INVALID_HANDLE_VALUE; |
+void FileStream::Close() { |
+ if (file_ != INVALID_HANDLE_VALUE) { |
+ CloseHandle(file_); |
+ file_ = INVALID_HANDLE_VALUE; |
} |
async_context_.reset(); |
} |
-int FileInputStream::Open(const std::wstring& path, bool asynchronous_mode) { |
+int FileStream::Open(const std::wstring& path, int open_flags) { |
if (IsOpen()) { |
DLOG(FATAL) << "File is already open!"; |
return ERR_UNEXPECTED; |
} |
- // Optimize for streaming, not seeking. If someone does a lot of random |
- // access operations, then we should consider revising this. |
- DWORD create_file_flags = FILE_FLAG_SEQUENTIAL_SCAN; |
- |
- if (asynchronous_mode) |
- create_file_flags |= FILE_FLAG_OVERLAPPED; |
- |
- handle_ = |
- CreateFile(path.c_str(), GENERIC_READ | SYNCHRONIZE, |
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, |
- NULL, OPEN_EXISTING, create_file_flags, NULL); |
- if (handle_ == INVALID_HANDLE_VALUE) { |
+ open_flags_ = open_flags; |
+ file_ = base::CreatePlatformFile(path, open_flags_, NULL); |
+ if (file_ == INVALID_HANDLE_VALUE) { |
DWORD error = GetLastError(); |
LOG(WARNING) << "Failed to open file: " << error; |
return MapErrorCode(error); |
} |
- if (asynchronous_mode) { |
+ if (open_flags_ & base::PLATFORM_FILE_ASYNC) { |
async_context_.reset(new AsyncContext(this)); |
- MessageLoopForIO::current()->RegisterIOHandler(handle_, |
+ MessageLoopForIO::current()->RegisterIOHandler(file_, |
async_context_.get()); |
} |
return OK; |
} |
-bool FileInputStream::IsOpen() const { |
- return handle_ != INVALID_HANDLE_VALUE; |
+bool FileStream::IsOpen() const { |
+ return file_ != INVALID_HANDLE_VALUE; |
} |
-int64 FileInputStream::Seek(Whence whence, int64 offset) { |
+int64 FileStream::Seek(Whence whence, int64 offset) { |
if (!IsOpen()) |
return ERR_UNEXPECTED; |
DCHECK(!async_context_.get() || !async_context_->callback()); |
@@ -166,7 +157,7 @@ |
LARGE_INTEGER distance, result; |
distance.QuadPart = offset; |
DWORD move_method = static_cast<DWORD>(whence); |
- if (!SetFilePointerEx(handle_, distance, &result, move_method)) { |
+ if (!SetFilePointerEx(file_, distance, &result, move_method)) { |
DWORD error = GetLastError(); |
LOG(WARNING) << "SetFilePointerEx failed: " << error; |
return MapErrorCode(error); |
@@ -176,7 +167,7 @@ |
return result.QuadPart; |
} |
-int64 FileInputStream::Available() { |
+int64 FileStream::Available() { |
if (!IsOpen()) |
return ERR_UNEXPECTED; |
@@ -185,7 +176,7 @@ |
return cur_pos; |
LARGE_INTEGER file_size; |
- if (!GetFileSizeEx(handle_, &file_size)) { |
+ if (!GetFileSizeEx(file_, &file_size)) { |
DWORD error = GetLastError(); |
LOG(WARNING) << "GetFileSizeEx failed: " << error; |
return MapErrorCode(error); |
@@ -194,10 +185,11 @@ |
return file_size.QuadPart - cur_pos; |
} |
-int FileInputStream::Read( |
+int FileStream::Read( |
char* buf, int buf_len, CompletionCallback* callback) { |
if (!IsOpen()) |
return ERR_UNEXPECTED; |
+ DCHECK(open_flags_ & base::PLATFORM_FILE_READ); |
OVERLAPPED* overlapped = NULL; |
if (async_context_.get()) { |
@@ -208,7 +200,7 @@ |
int rv; |
DWORD bytes_read; |
- if (!ReadFile(handle_, buf, buf_len, &bytes_read, overlapped)) { |
+ if (!ReadFile(file_, buf, buf_len, &bytes_read, overlapped)) { |
DWORD error = GetLastError(); |
if (async_context_.get() && error == ERROR_IO_PENDING) { |
async_context_->IOCompletionIsPending(callback); |
@@ -227,4 +219,36 @@ |
return rv; |
} |
+int FileStream::Write( |
+ const char* buf, int buf_len, CompletionCallback* callback) { |
+ if (!IsOpen()) |
+ return ERR_UNEXPECTED; |
+ DCHECK(open_flags_ & base::PLATFORM_FILE_READ); |
+ |
+ OVERLAPPED* overlapped = NULL; |
+ if (async_context_.get()) { |
+ DCHECK(!async_context_->callback()); |
+ overlapped = async_context_->overlapped(); |
+ } |
+ |
+ int rv; |
+ DWORD bytes_written; |
+ if (!WriteFile(file_, buf, buf_len, &bytes_written, overlapped)) { |
+ DWORD error = GetLastError(); |
+ if (async_context_.get() && error == ERROR_IO_PENDING) { |
+ async_context_->IOCompletionIsPending(callback); |
+ rv = ERR_IO_PENDING; |
+ } else { |
+ LOG(WARNING) << "WriteFile failed: " << error; |
+ rv = MapErrorCode(error); |
+ } |
+ } else { |
+ if (overlapped) |
+ IncrementOffset(overlapped, bytes_written); |
+ rv = static_cast<int>(bytes_written); |
+ } |
+ return rv; |
+} |
+ |
} // namespace net |
+ |
Property changes on: net\base\file_stream_win.cc |
___________________________________________________________________ |
Added: svn:mergeinfo |
Merged /branches/chrome_webkit_merge_branch/net/base/file_input_stream_win.cc:r69-2775 |