15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_FILEAPI_FILE_STREAM_WRITER_H_ 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_FILEAPI_FILE_STREAM_WRITER_H_ 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/basictypes.h" 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/files/file.h" 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/files/file_path.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/ref_counted.h" 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/weak_ptr.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_stream_writer.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace chromeos { 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace file_system_provider { 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ProvidedFileSystemInterface; 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Implements a streamed file writer. It is lazily initialized by the first call 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// to Write(). 2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class FileStreamWriter : public storage::FileStreamWriter { 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) FileStreamWriter(const storage::FileSystemURL& url, int64 initial_offset); 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~FileStreamWriter(); 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // storage::FileStreamWriter overrides. 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual int Write(net::IOBuffer* buf, 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int buf_len, 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const net::CompletionCallback& callback) OVERRIDE; 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual int Cancel(const net::CompletionCallback& callback) OVERRIDE; 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual int Flush(const net::CompletionCallback& callback) OVERRIDE; 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Helper class for executing operations on the provided file system. All 3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // of its methods must be called on UI thread. Callbacks are called on IO 3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // thread. 4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) class OperationRunner; 4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // State of the file stream writer. 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enum State { NOT_INITIALIZED, INITIALIZING, INITIALIZED, FAILED }; 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Called when OperationRunner::WriteOnUIThread is completed. 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void OnWriteFileCompleted(int buffer_length, 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const net::CompletionCallback& callback, 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::File::Error result); 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Called when Write() operation is completed with either a success or an 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // error. 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void OnWriteCompleted(net::CompletionCallback callback, int result); 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Called when Abort() operation is completed with either a success or an 5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // error. 5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void OnAbortCompleted(const net::CompletionCallback& callback, 5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::File::Error result); 5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Initializes the writer by opening the file. When completed with success, 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // runs the |pending_closure|. Otherwise, calls the |error_callback|. 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void Initialize(const base::Closure& pending_closure, 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const net::CompletionCallback& error_callback); 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Called when opening a file is completed with either a success or an error. 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void OnOpenFileCompleted( 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::Closure& pending_closure, 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const net::CompletionCallback& error_callback, 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::File::Error result); 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Same as Write(), but called after initializing is completed. 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void WriteAfterInitialized(scoped_refptr<net::IOBuffer> buffer, 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int buffer_length, 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const net::CompletionCallback& callback); 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemURL url_; 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int64 current_offset_; 7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<OperationRunner> runner_; 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) State state_; 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::WeakPtrFactory<FileStreamWriter> weak_ptr_factory_; 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FileStreamWriter); 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace file_system_provider 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace chromeos 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif // CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_FILEAPI_FILE_STREAM_WRITER_H_ 88