blob: 4eb74d6a31d8382e50b1f3678e318786a8684ac7 [file] [log] [blame]
[email protected]dd3fd0e2012-11-04 05:14:401// 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#include "net/quic/quic_reliable_client_stream.h"
6
[email protected]6adeb922013-09-01 22:43:257#include "base/callback_helpers.h"
[email protected]dd3fd0e2012-11-04 05:14:408#include "net/base/net_errors.h"
[email protected]f702d572012-12-04 15:56:209#include "net/quic/quic_session.h"
[email protected]9f0dcd4e2014-01-16 15:58:1410#include "net/quic/quic_write_blocked_list.h"
[email protected]dd3fd0e2012-11-04 05:14:4011
12namespace net {
13
14QuicReliableClientStream::QuicReliableClientStream(QuicStreamId id,
[email protected]0d10b592013-02-14 16:09:2615 QuicSession* session,
16 const BoundNetLog& net_log)
[email protected]457d6952013-12-13 09:24:5817 : QuicDataStream(id, session),
[email protected]0d10b592013-02-14 16:09:2618 net_log_(net_log),
[email protected]f702d572012-12-04 15:56:2019 delegate_(NULL) {
[email protected]dd3fd0e2012-11-04 05:14:4020}
21
22QuicReliableClientStream::~QuicReliableClientStream() {
[email protected]56dfb902013-01-03 23:17:5523 if (delegate_)
[email protected]74bda142013-03-31 02:49:1124 delegate_->OnClose(connection_error());
[email protected]dd3fd0e2012-11-04 05:14:4025}
26
27uint32 QuicReliableClientStream::ProcessData(const char* data,
28 uint32 data_len) {
[email protected]f702d572012-12-04 15:56:2029 // TODO(rch): buffer data if we don't have a delegate.
[email protected]56dfb902013-01-03 23:17:5530 if (!delegate_)
[email protected]63534512012-12-23 18:49:0031 return ERR_ABORTED;
[email protected]56dfb902013-01-03 23:17:5532
[email protected]dd3fd0e2012-11-04 05:14:4033 int rv = delegate_->OnDataReceived(data, data_len);
34 if (rv != OK) {
35 DLOG(ERROR) << "Delegate refused data, rv: " << rv;
[email protected]2adef90e2013-12-02 20:26:5736 Reset(QUIC_BAD_APPLICATION_PAYLOAD);
[email protected]dd3fd0e2012-11-04 05:14:4037 return 0;
38 }
39 return data_len;
40}
41
[email protected]2adef90e2013-12-02 20:26:5742void QuicReliableClientStream::OnFinRead() {
[email protected]f702d572012-12-04 15:56:2043 if (delegate_) {
[email protected]74bda142013-03-31 02:49:1144 delegate_->OnClose(connection_error());
[email protected]f702d572012-12-04 15:56:2045 delegate_ = NULL;
46 }
[email protected]2adef90e2013-12-02 20:26:5747 ReliableQuicStream::OnFinRead();
[email protected]dd3fd0e2012-11-04 05:14:4048}
49
[email protected]6adeb922013-09-01 22:43:2550void QuicReliableClientStream::OnCanWrite() {
51 ReliableQuicStream::OnCanWrite();
52
53 if (!HasBufferedData() && !callback_.is_null()) {
54 base::ResetAndReturn(&callback_).Run(OK);
55 }
56}
57
[email protected]24e5bc52013-09-18 15:36:5858QuicPriority QuicReliableClientStream::EffectivePriority() const {
[email protected]7c87ce72013-09-19 17:47:3859 if (delegate_ && delegate_->HasSendHeadersComplete()) {
[email protected]457d6952013-12-13 09:24:5860 return QuicDataStream::EffectivePriority();
[email protected]24e5bc52013-09-18 15:36:5861 }
[email protected]9f0dcd4e2014-01-16 15:58:1462 return QuicWriteBlockedList::kHighestPriority;
[email protected]24e5bc52013-09-18 15:36:5863}
64
[email protected]6adeb922013-09-01 22:43:2565int QuicReliableClientStream::WriteStreamData(
66 base::StringPiece data,
67 bool fin,
68 const CompletionCallback& callback) {
69 // We should not have data buffered.
70 DCHECK(!HasBufferedData());
71 // Writes the data, or buffers it.
[email protected]b9475b582014-03-20 20:04:3372 WriteOrBufferData(data, fin, NULL);
[email protected]6adeb922013-09-01 22:43:2573 if (!HasBufferedData()) {
74 return OK;
75 }
76
77 callback_ = callback;
78 return ERR_IO_PENDING;
79}
80
[email protected]dd3fd0e2012-11-04 05:14:4081void QuicReliableClientStream::SetDelegate(
82 QuicReliableClientStream::Delegate* delegate) {
[email protected]f702d572012-12-04 15:56:2083 DCHECK((!delegate_ && delegate) || (delegate_ && !delegate));
[email protected]dd3fd0e2012-11-04 05:14:4084 delegate_ = delegate;
85}
86
[email protected]56dfb902013-01-03 23:17:5587void QuicReliableClientStream::OnError(int error) {
88 if (delegate_) {
89 QuicReliableClientStream::Delegate* delegate = delegate_;
90 delegate_ = NULL;
91 delegate->OnError(error);
92 }
93}
94
[email protected]13428d42013-11-26 18:50:3695bool QuicReliableClientStream::CanWrite(const CompletionCallback& callback) {
[email protected]9cda5fd2014-06-03 10:20:2896 bool can_write = session()->connection()->CanWrite(HAS_RETRANSMITTABLE_DATA);
[email protected]13428d42013-11-26 18:50:3697 if (!can_write) {
98 session()->MarkWriteBlocked(id(), EffectivePriority());
99 DCHECK(callback_.is_null());
100 callback_ = callback;
101 }
102 return can_write;
103}
104
[email protected]dd3fd0e2012-11-04 05:14:40105} // namespace net