Upstream version 11.40.271.0
[platform/framework/web/crosswalk.git] / src / content / browser / loader / stream_writer.cc
1 // Copyright 2014 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 #include "content/browser/loader/stream_writer.h"
6
7 #include "base/guid.h"
8 #include "content/browser/streams/stream.h"
9 #include "content/browser/streams/stream_registry.h"
10 #include "content/public/browser/resource_controller.h"
11 #include "net/base/io_buffer.h"
12 #include "url/gurl.h"
13 #include "url/url_constants.h"
14
15 namespace content {
16
17 StreamWriter::StreamWriter() : controller_(nullptr) {
18 }
19
20 StreamWriter::~StreamWriter() {
21   if (stream_.get())
22     Finalize();
23 }
24
25 void StreamWriter::InitializeStream(StreamRegistry* registry,
26                                     const GURL& origin) {
27   DCHECK(!stream_.get());
28
29   // TODO(tyoshino): Find a way to share this with the blob URL creation in
30   // WebKit.
31   GURL url(std::string(url::kBlobScheme) + ":" + origin.spec() +
32            base::GenerateGUID());
33   stream_ = new Stream(registry, this, url);
34 }
35
36 void StreamWriter::OnWillRead(scoped_refptr<net::IOBuffer>* buf,
37                               int* buf_size,
38                               int min_size) {
39   static const int kReadBufSize = 32768;
40
41   DCHECK(buf);
42   DCHECK(buf_size);
43   DCHECK_LE(min_size, kReadBufSize);
44   if (!read_buffer_.get())
45     read_buffer_ = new net::IOBuffer(kReadBufSize);
46   *buf = read_buffer_.get();
47   *buf_size = kReadBufSize;
48 }
49
50 void StreamWriter::OnReadCompleted(int bytes_read, bool* defer) {
51   if (!bytes_read)
52     return;
53
54   // We have more data to read.
55   DCHECK(read_buffer_.get());
56
57   // Release the ownership of the buffer, and store a reference
58   // to it. A new one will be allocated in OnWillRead().
59   scoped_refptr<net::IOBuffer> buffer;
60   read_buffer_.swap(buffer);
61   stream_->AddData(buffer, bytes_read);
62
63   if (!stream_->can_add_data())
64     *defer = true;
65 }
66
67 void StreamWriter::Finalize() {
68   DCHECK(stream_.get());
69   stream_->Finalize();
70   stream_->RemoveWriteObserver(this);
71   stream_ = nullptr;
72 }
73
74 void StreamWriter::OnSpaceAvailable(Stream* stream) {
75   controller_->Resume();
76 }
77
78 void StreamWriter::OnClose(Stream* stream) {
79   controller_->Cancel();
80 }
81
82 }  // namespace content