- add sources.
[platform/framework/web/crosswalk.git] / src / webkit / browser / fileapi / local_file_stream_writer.h
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.
4
5 #ifndef WEBKIT_BROWSER_FILEAPI_LOCAL_FILE_STREAM_WRITER_H_
6 #define WEBKIT_BROWSER_FILEAPI_LOCAL_FILE_STREAM_WRITER_H_
7
8 #include <utility>
9
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"
20
21 namespace net {
22 class FileStream;
23 }
24
25 namespace fileapi {
26
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) {
30  public:
31   virtual ~LocalFileStreamWriter();
32
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;
38
39  private:
40   friend class FileStreamWriter;
41   friend class LocalFileStreamWriterTest;
42   LocalFileStreamWriter(base::TaskRunner* task_runner,
43                         const base::FilePath& file_path,
44                         int64 initial_offset);
45
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,
52                int result);
53
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,
60                int64 result);
61
62   // Passed as the |main_operation| of InitiateOpen() function.
63   void ReadyToWrite(net::IOBuffer* buf, int buf_len,
64                     const net::CompletionCallback& callback);
65
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);
70
71   // Flushes asynchronously to the file.
72   int InitiateFlush(const net::CompletionCallback& callback);
73   void DidFlush(const net::CompletionCallback& callback, int result);
74
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();
78
79   // Initialization parameters.
80   const base::FilePath file_path_;
81   const int64 initial_offset_;
82   scoped_refptr<base::TaskRunner> task_runner_;
83
84   // Current states of the operation.
85   bool has_pending_operation_;
86   scoped_ptr<net::FileStream> stream_impl_;
87   net::CompletionCallback cancel_callback_;
88
89   base::WeakPtrFactory<LocalFileStreamWriter> weak_factory_;
90   DISALLOW_COPY_AND_ASSIGN(LocalFileStreamWriter);
91 };
92
93 }  // namespace fileapi
94
95 #endif  // WEBKIT_BROWSER_FILEAPI_LOCAL_FILE_STREAM_WRITER_H_