file.h revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// found in the LICENSE file.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// See net/disk_cache/disk_cache.h for the public interface of the cache.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NET_DISK_CACHE_BLOCKFILE_FILE_H_
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define NET_DISK_CACHE_BLOCKFILE_FILE_H_
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/memory/ref_counted.h"
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/platform_file.h"
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "net/base/net_export.h"
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace base {
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class FilePath;
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace disk_cache {
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This interface is used to support asynchronous ReadData and WriteData calls.
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class FileIOCallback {
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public:
2351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)  // Notified of the actual number of bytes read or written. This value is
247757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch  // negative if an error occurred.
257757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch  virtual void OnFileIOComplete(int bytes_copied) = 0;
267757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) protected:
28c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)  virtual ~FileIOCallback() {}
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Simple wrapper around a file that allows asynchronous operations.
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NET_EXPORT_PRIVATE File : public base::RefCounted<File> {
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  friend class base::RefCounted<File>;
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public:
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  File();
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // mixed_mode set to true enables regular synchronous operations for the file.
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  explicit File(bool mixed_mode);
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Initializes the object to use the passed in file instead of opening it with
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // the Init() call. No asynchronous operations can be performed with this
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // object.
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  explicit File(base::PlatformFile file);
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Initializes the object to point to a given file. The file must aready exist
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // on disk, and allow shared read and write.
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bool Init(const base::FilePath& name);
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Returns the handle or file descriptor.
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  base::PlatformFile platform_file() const;
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)  // Returns true if the file was opened properly.
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bool IsValid() const;
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Performs synchronous IO.
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bool Read(void* buffer, size_t buffer_len, size_t offset);
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bool Write(const void* buffer, size_t buffer_len, size_t offset);
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch  // Performs asynchronous IO. callback will be called when the IO completes,
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // as an APC on the thread that queued the operation.
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bool Read(void* buffer, size_t buffer_len, size_t offset,
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            FileIOCallback* callback, bool* completed);
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bool Write(const void* buffer, size_t buffer_len, size_t offset,
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             FileIOCallback* callback, bool* completed);
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Sets the file's length. The file is truncated or extended with zeros to
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // the new length.
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bool SetLength(size_t length);
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  size_t GetLength();
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Blocks until |num_pending_io| IO operations complete.
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  static void WaitForPendingIO(int* num_pending_io);
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Drops current pending operations without waiting for them to complete.
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  static void DropPendingIO();
7553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
7651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) protected:
7751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)  virtual ~File();
7853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private:
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Performs the actual asynchronous write. If notify is set and there is no
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // callback, the call will be re-synchronized.
82  bool AsyncWrite(const void* buffer, size_t buffer_len, size_t offset,
83                  FileIOCallback* callback, bool* completed);
84
85  // Infrastructure for async IO.
86  int DoRead(void* buffer, size_t buffer_len, size_t offset);
87  int DoWrite(const void* buffer, size_t buffer_len, size_t offset);
88  void OnOperationComplete(FileIOCallback* callback, int result);
89
90  bool init_;
91  bool mixed_;
92  base::PlatformFile platform_file_;  // Regular, asynchronous IO handle.
93  base::PlatformFile sync_platform_file_;  // Synchronous IO handle.
94
95  DISALLOW_COPY_AND_ASSIGN(File);
96};
97
98}  // namespace disk_cache
99
100#endif  // NET_DISK_CACHE_BLOCKFILE_FILE_H_
101