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
3 // found in the LICENSE file.
5 #ifndef WEBKIT_BROWSER_FILEAPI_LOCAL_FILE_STREAM_WRITER_H_
6 #define WEBKIT_BROWSER_FILEAPI_LOCAL_FILE_STREAM_WRITER_H_
10 #include "base/callback.h"
11 #include "base/compiler_specific.h"
12 #include "base/files/file_path.h"
13 #include "base/gtest_prod_util.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/memory/weak_ptr.h"
16 #include "base/platform_file.h"
17 #include "base/task_runner.h"
18 #include "webkit/browser/fileapi/file_stream_writer.h"
19 #include "webkit/browser/webkit_storage_browser_export.h"
27 // This class is a thin wrapper around net::FileStream for writing local files.
28 class WEBKIT_STORAGE_BROWSER_EXPORT LocalFileStreamWriter
29 : public NON_EXPORTED_BASE(FileStreamWriter) {
31 virtual ~LocalFileStreamWriter();
33 // FileStreamWriter overrides.
34 virtual int Write(net::IOBuffer* buf, int buf_len,
35 const net::CompletionCallback& callback) OVERRIDE;
36 virtual int Cancel(const net::CompletionCallback& callback) OVERRIDE;
37 virtual int Flush(const net::CompletionCallback& callback) OVERRIDE;
40 friend class FileStreamWriter;
41 friend class LocalFileStreamWriterTest;
42 LocalFileStreamWriter(base::TaskRunner* task_runner,
43 const base::FilePath& file_path,
44 int64 initial_offset);
46 // Opens |file_path_| and if it succeeds, proceeds to InitiateSeek().
47 // If failed, the error code is returned by calling |error_callback|.
48 int InitiateOpen(const net::CompletionCallback& error_callback,
49 const base::Closure& main_operation);
50 void DidOpen(const net::CompletionCallback& error_callback,
51 const base::Closure& main_operation,
54 // Seeks to |initial_offset_| and proceeds to |main_operation| if it succeeds.
55 // If failed, the error code is returned by calling |error_callback|.
56 void InitiateSeek(const net::CompletionCallback& error_callback,
57 const base::Closure& main_operation);
58 void DidSeek(const net::CompletionCallback& error_callback,
59 const base::Closure& main_operation,
62 // Passed as the |main_operation| of InitiateOpen() function.
63 void ReadyToWrite(net::IOBuffer* buf, int buf_len,
64 const net::CompletionCallback& callback);
66 // Writes asynchronously to the file.
67 int InitiateWrite(net::IOBuffer* buf, int buf_len,
68 const net::CompletionCallback& callback);
69 void DidWrite(const net::CompletionCallback& callback, int result);
71 // Flushes asynchronously to the file.
72 int InitiateFlush(const net::CompletionCallback& callback);
73 void DidFlush(const net::CompletionCallback& callback, int result);
75 // Stops the in-flight operation and calls |cancel_callback_| if it has been
76 // set by Cancel() for the current operation.
77 bool CancelIfRequested();
79 // Initialization parameters.
80 const base::FilePath file_path_;
81 const int64 initial_offset_;
82 scoped_refptr<base::TaskRunner> task_runner_;
84 // Current states of the operation.
85 bool has_pending_operation_;
86 scoped_ptr<net::FileStream> stream_impl_;
87 net::CompletionCallback cancel_callback_;
89 base::WeakPtrFactory<LocalFileStreamWriter> weak_factory_;
90 DISALLOW_COPY_AND_ASSIGN(LocalFileStreamWriter);
93 } // namespace fileapi
95 #endif // WEBKIT_BROWSER_FILEAPI_LOCAL_FILE_STREAM_WRITER_H_