Index: storage/browser/blob/blob_data_handle.cc |
diff --git a/storage/browser/blob/blob_data_handle.cc b/storage/browser/blob/blob_data_handle.cc |
index e3a4be944fe36eeedaed8cfb16cdf5a159f595c0..3e864fa1cdf9bcdb0caba7096522b16a0c32193d 100644 |
--- a/storage/browser/blob/blob_data_handle.cc |
+++ b/storage/browser/blob/blob_data_handle.cc |
@@ -8,38 +8,98 @@ |
#include "base/location.h" |
#include "base/logging.h" |
#include "base/sequenced_task_runner.h" |
+#include "base/task_runner.h" |
+#include "base/time/time.h" |
#include "storage/browser/blob/blob_data_snapshot.h" |
+#include "storage/browser/blob/blob_reader.h" |
#include "storage/browser/blob/blob_storage_context.h" |
+#include "storage/browser/fileapi/file_stream_reader.h" |
+#include "storage/browser/fileapi/file_system_context.h" |
+#include "storage/browser/fileapi/file_system_url.h" |
+#include "url/gurl.h" |
namespace storage { |
+namespace { |
+ |
+class FileStreamReaderProviderImpl |
+ : public BlobReader::FileStreamReaderProvider { |
+ public: |
+ FileStreamReaderProviderImpl(FileSystemContext* file_system_context) |
+ : file_system_context_(file_system_context) {} |
+ ~FileStreamReaderProviderImpl() override {} |
+ |
+ scoped_ptr<FileStreamReader> CreateForLocalFile( |
+ base::TaskRunner* task_runner, |
+ const base::FilePath& file_path, |
+ int64_t initial_offset, |
+ const base::Time& expected_modification_time) override { |
+ return make_scoped_ptr(FileStreamReader::CreateForLocalFile( |
+ task_runner, file_path, initial_offset, expected_modification_time)); |
+ } |
+ |
+ scoped_ptr<FileStreamReader> CreateFileStreamReader( |
+ const GURL& filesystem_url, |
+ int64_t offset, |
+ int64_t max_bytes_to_read, |
+ const base::Time& expected_modification_time) override { |
+ return file_system_context_->CreateFileStreamReader( |
+ storage::FileSystemURL( |
+ file_system_context_->CrackURL( |
+ filesystem_url)), |
+ offset, max_bytes_to_read, |
+ expected_modification_time) |
+ .Pass(); |
+ } |
+ |
+ private: |
+ scoped_refptr<FileSystemContext> file_system_context_; |
+ DISALLOW_COPY_AND_ASSIGN(FileStreamReaderProviderImpl); |
+}; |
+ |
+} // namespace |
+ |
BlobDataHandle::BlobDataHandleShared::BlobDataHandleShared( |
const std::string& uuid, |
- BlobStorageContext* context, |
- base::SequencedTaskRunner* task_runner) |
- : uuid_(uuid), context_(context->AsWeakPtr()) { |
+ const std::string& content_type, |
+ const std::string& content_disposition, |
+ BlobStorageContext* context) |
+ : uuid_(uuid), |
+ content_type_(content_type), |
+ content_disposition_(content_disposition), |
+ context_(context->AsWeakPtr()) { |
context_->IncrementBlobRefCount(uuid); |
} |
+scoped_ptr<BlobReader> BlobDataHandle::CreateReader( |
+ FileSystemContext* file_system_context, |
+ base::SequencedTaskRunner* file_task_runner) const { |
+ return scoped_ptr<BlobReader>(new BlobReader( |
+ this, scoped_ptr<BlobReader::FileStreamReaderProvider>( |
+ new FileStreamReaderProviderImpl(file_system_context)), |
+ file_task_runner)); |
+} |
+ |
scoped_ptr<BlobDataSnapshot> |
BlobDataHandle::BlobDataHandleShared::CreateSnapshot() const { |
return context_->CreateSnapshot(uuid_).Pass(); |
} |
-const std::string& BlobDataHandle::BlobDataHandleShared::uuid() const { |
- return uuid_; |
-} |
- |
BlobDataHandle::BlobDataHandleShared::~BlobDataHandleShared() { |
if (context_.get()) |
context_->DecrementBlobRefCount(uuid_); |
} |
BlobDataHandle::BlobDataHandle(const std::string& uuid, |
+ const std::string& content_type, |
+ const std::string& content_disposition, |
BlobStorageContext* context, |
- base::SequencedTaskRunner* task_runner) |
- : io_task_runner_(task_runner), |
- shared_(new BlobDataHandleShared(uuid, context, task_runner)) { |
+ base::SequencedTaskRunner* io_task_runner) |
+ : io_task_runner_(io_task_runner), |
+ shared_(new BlobDataHandleShared(uuid, |
+ content_type, |
+ content_disposition, |
+ context)) { |
DCHECK(io_task_runner_.get()); |
DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
} |
@@ -62,7 +122,15 @@ scoped_ptr<BlobDataSnapshot> BlobDataHandle::CreateSnapshot() const { |
} |
const std::string& BlobDataHandle::uuid() const { |
- return shared_->uuid(); |
+ return shared_->uuid_; |
+} |
+ |
+const std::string& BlobDataHandle::content_type() const { |
+ return shared_->content_type_; |
+} |
+ |
+const std::string& BlobDataHandle::content_disposition() const { |
+ return shared_->content_disposition_; |
} |
} // namespace storage |