| Index: net/disk_cache/file_win.cc
|
| diff --git a/net/disk_cache/file_win.cc b/net/disk_cache/file_win.cc
|
| deleted file mode 100644
|
| index 1492c42c6e45817b22a7b4e00e3586677bdcfdd9..0000000000000000000000000000000000000000
|
| --- a/net/disk_cache/file_win.cc
|
| +++ /dev/null
|
| @@ -1,274 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "net/disk_cache/file.h"
|
| -
|
| -#include "base/files/file_path.h"
|
| -#include "base/lazy_instance.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "net/disk_cache/disk_cache.h"
|
| -
|
| -namespace {
|
| -
|
| -// Structure used for asynchronous operations.
|
| -struct MyOverlapped {
|
| - MyOverlapped(disk_cache::File* file, size_t offset,
|
| - disk_cache::FileIOCallback* callback);
|
| - ~MyOverlapped() {}
|
| - OVERLAPPED* overlapped() {
|
| - return &context_.overlapped;
|
| - }
|
| -
|
| - base::MessageLoopForIO::IOContext context_;
|
| - scoped_refptr<disk_cache::File> file_;
|
| - disk_cache::FileIOCallback* callback_;
|
| -};
|
| -
|
| -COMPILE_ASSERT(!offsetof(MyOverlapped, context_), starts_with_overlapped);
|
| -
|
| -// Helper class to handle the IO completion notifications from the message loop.
|
| -class CompletionHandler : public base::MessageLoopForIO::IOHandler {
|
| - virtual void OnIOCompleted(base::MessageLoopForIO::IOContext* context,
|
| - DWORD actual_bytes,
|
| - DWORD error);
|
| -};
|
| -
|
| -static base::LazyInstance<CompletionHandler> g_completion_handler =
|
| - LAZY_INSTANCE_INITIALIZER;
|
| -
|
| -void CompletionHandler::OnIOCompleted(
|
| - base::MessageLoopForIO::IOContext* context,
|
| - DWORD actual_bytes,
|
| - DWORD error) {
|
| - MyOverlapped* data = reinterpret_cast<MyOverlapped*>(context);
|
| -
|
| - if (error) {
|
| - DCHECK(!actual_bytes);
|
| - actual_bytes = static_cast<DWORD>(net::ERR_CACHE_READ_FAILURE);
|
| - NOTREACHED();
|
| - }
|
| -
|
| - if (data->callback_)
|
| - data->callback_->OnFileIOComplete(static_cast<int>(actual_bytes));
|
| -
|
| - delete data;
|
| -}
|
| -
|
| -MyOverlapped::MyOverlapped(disk_cache::File* file, size_t offset,
|
| - disk_cache::FileIOCallback* callback) {
|
| - memset(this, 0, sizeof(*this));
|
| - context_.handler = g_completion_handler.Pointer();
|
| - context_.overlapped.Offset = static_cast<DWORD>(offset);
|
| - file_ = file;
|
| - callback_ = callback;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -namespace disk_cache {
|
| -
|
| -File::File(base::PlatformFile file)
|
| - : init_(true), mixed_(true), platform_file_(INVALID_HANDLE_VALUE),
|
| - sync_platform_file_(file) {
|
| -}
|
| -
|
| -bool File::Init(const base::FilePath& name) {
|
| - DCHECK(!init_);
|
| - if (init_)
|
| - return false;
|
| -
|
| - DWORD sharing = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
|
| - DWORD access = GENERIC_READ | GENERIC_WRITE | DELETE;
|
| - platform_file_ = CreateFile(name.value().c_str(), access, sharing, NULL,
|
| - OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
|
| -
|
| - if (INVALID_HANDLE_VALUE == platform_file_)
|
| - return false;
|
| -
|
| - base::MessageLoopForIO::current()->RegisterIOHandler(
|
| - platform_file_, g_completion_handler.Pointer());
|
| -
|
| - init_ = true;
|
| - sync_platform_file_ = CreateFile(name.value().c_str(), access, sharing, NULL,
|
| - OPEN_EXISTING, 0, NULL);
|
| -
|
| - if (INVALID_HANDLE_VALUE == sync_platform_file_)
|
| - return false;
|
| -
|
| - return true;
|
| -}
|
| -
|
| -File::~File() {
|
| - if (!init_)
|
| - return;
|
| -
|
| - if (INVALID_HANDLE_VALUE != platform_file_)
|
| - CloseHandle(platform_file_);
|
| - if (INVALID_HANDLE_VALUE != sync_platform_file_)
|
| - CloseHandle(sync_platform_file_);
|
| -}
|
| -
|
| -base::PlatformFile File::platform_file() const {
|
| - DCHECK(init_);
|
| - return (INVALID_HANDLE_VALUE == platform_file_) ? sync_platform_file_ :
|
| - platform_file_;
|
| -}
|
| -
|
| -bool File::IsValid() const {
|
| - if (!init_)
|
| - return false;
|
| - return (INVALID_HANDLE_VALUE != platform_file_ ||
|
| - INVALID_HANDLE_VALUE != sync_platform_file_);
|
| -}
|
| -
|
| -bool File::Read(void* buffer, size_t buffer_len, size_t offset) {
|
| - DCHECK(init_);
|
| - if (buffer_len > ULONG_MAX || offset > LONG_MAX)
|
| - return false;
|
| -
|
| - DWORD ret = SetFilePointer(sync_platform_file_, static_cast<LONG>(offset),
|
| - NULL, FILE_BEGIN);
|
| - if (INVALID_SET_FILE_POINTER == ret)
|
| - return false;
|
| -
|
| - DWORD actual;
|
| - DWORD size = static_cast<DWORD>(buffer_len);
|
| - if (!ReadFile(sync_platform_file_, buffer, size, &actual, NULL))
|
| - return false;
|
| - return actual == size;
|
| -}
|
| -
|
| -bool File::Write(const void* buffer, size_t buffer_len, size_t offset) {
|
| - DCHECK(init_);
|
| - if (buffer_len > ULONG_MAX || offset > ULONG_MAX)
|
| - return false;
|
| -
|
| - DWORD ret = SetFilePointer(sync_platform_file_, static_cast<LONG>(offset),
|
| - NULL, FILE_BEGIN);
|
| - if (INVALID_SET_FILE_POINTER == ret)
|
| - return false;
|
| -
|
| - DWORD actual;
|
| - DWORD size = static_cast<DWORD>(buffer_len);
|
| - if (!WriteFile(sync_platform_file_, buffer, size, &actual, NULL))
|
| - return false;
|
| - return actual == size;
|
| -}
|
| -
|
| -// We have to increase the ref counter of the file before performing the IO to
|
| -// prevent the completion to happen with an invalid handle (if the file is
|
| -// closed while the IO is in flight).
|
| -bool File::Read(void* buffer, size_t buffer_len, size_t offset,
|
| - FileIOCallback* callback, bool* completed) {
|
| - DCHECK(init_);
|
| - if (!callback) {
|
| - if (completed)
|
| - *completed = true;
|
| - return Read(buffer, buffer_len, offset);
|
| - }
|
| -
|
| - if (buffer_len > ULONG_MAX || offset > ULONG_MAX)
|
| - return false;
|
| -
|
| - MyOverlapped* data = new MyOverlapped(this, offset, callback);
|
| - DWORD size = static_cast<DWORD>(buffer_len);
|
| -
|
| - DWORD actual;
|
| - if (!ReadFile(platform_file_, buffer, size, &actual, data->overlapped())) {
|
| - *completed = false;
|
| - if (GetLastError() == ERROR_IO_PENDING)
|
| - return true;
|
| - delete data;
|
| - return false;
|
| - }
|
| -
|
| - // The operation completed already. We'll be called back anyway.
|
| - *completed = (actual == size);
|
| - DCHECK_EQ(size, actual);
|
| - data->callback_ = NULL;
|
| - data->file_ = NULL; // There is no reason to hold on to this anymore.
|
| - return *completed;
|
| -}
|
| -
|
| -bool File::Write(const void* buffer, size_t buffer_len, size_t offset,
|
| - FileIOCallback* callback, bool* completed) {
|
| - DCHECK(init_);
|
| - if (!callback) {
|
| - if (completed)
|
| - *completed = true;
|
| - return Write(buffer, buffer_len, offset);
|
| - }
|
| -
|
| - return AsyncWrite(buffer, buffer_len, offset, callback, completed);
|
| -}
|
| -
|
| -bool File::AsyncWrite(const void* buffer, size_t buffer_len, size_t offset,
|
| - FileIOCallback* callback, bool* completed) {
|
| - DCHECK(init_);
|
| - DCHECK(callback);
|
| - DCHECK(completed);
|
| - if (buffer_len > ULONG_MAX || offset > ULONG_MAX)
|
| - return false;
|
| -
|
| - MyOverlapped* data = new MyOverlapped(this, offset, callback);
|
| - DWORD size = static_cast<DWORD>(buffer_len);
|
| -
|
| - DWORD actual;
|
| - if (!WriteFile(platform_file_, buffer, size, &actual, data->overlapped())) {
|
| - *completed = false;
|
| - if (GetLastError() == ERROR_IO_PENDING)
|
| - return true;
|
| - delete data;
|
| - return false;
|
| - }
|
| -
|
| - // The operation completed already. We'll be called back anyway.
|
| - *completed = (actual == size);
|
| - DCHECK_EQ(size, actual);
|
| - data->callback_ = NULL;
|
| - data->file_ = NULL; // There is no reason to hold on to this anymore.
|
| - return *completed;
|
| -}
|
| -
|
| -bool File::SetLength(size_t length) {
|
| - DCHECK(init_);
|
| - if (length > ULONG_MAX)
|
| - return false;
|
| -
|
| - DWORD size = static_cast<DWORD>(length);
|
| - HANDLE file = platform_file();
|
| - if (INVALID_SET_FILE_POINTER == SetFilePointer(file, size, NULL, FILE_BEGIN))
|
| - return false;
|
| -
|
| - return TRUE == SetEndOfFile(file);
|
| -}
|
| -
|
| -size_t File::GetLength() {
|
| - DCHECK(init_);
|
| - LARGE_INTEGER size;
|
| - HANDLE file = platform_file();
|
| - if (!GetFileSizeEx(file, &size))
|
| - return 0;
|
| - if (size.HighPart)
|
| - return ULONG_MAX;
|
| -
|
| - return static_cast<size_t>(size.LowPart);
|
| -}
|
| -
|
| -// Static.
|
| -void File::WaitForPendingIO(int* num_pending_io) {
|
| - while (*num_pending_io) {
|
| - // Asynchronous IO operations may be in flight and the completion may end
|
| - // up calling us back so let's wait for them.
|
| - base::MessageLoopForIO::IOHandler* handler = g_completion_handler.Pointer();
|
| - base::MessageLoopForIO::current()->WaitForIOCompletion(100, handler);
|
| - }
|
| -}
|
| -
|
| -// Static.
|
| -void File::DropPendingIO() {
|
| -}
|
| -
|
| -} // namespace disk_cache
|
|
|