Add WritevData() in StreamDelegateInterface and let QuicSession::WritevData implement it.

gfe-relnote: no behavior change. not protected.
PiperOrigin-RevId: 295818988
Change-Id: Ic5f9e7bf8ec7c4fc63feaaee96b213911a386433
diff --git a/quic/core/quic_crypto_stream.cc b/quic/core/quic_crypto_stream.cc
index 8e32448..8a3153d 100644
--- a/quic/core/quic_crypto_stream.cc
+++ b/quic/core/quic_crypto_stream.cc
@@ -290,7 +290,7 @@
     // Set appropriate encryption level.
     session()->connection()->SetDefaultEncryptionLevel(
         retransmission_encryption_level);
-    QuicConsumedData consumed = session()->WritevData(
+    QuicConsumedData consumed = stream_delegate()->WritevData(
         this, id(), pending.length, pending.offset, NO_FIN);
     QUIC_DVLOG(1) << ENDPOINT << "stream " << id()
                   << " tries to retransmit stream data [" << pending.offset
@@ -332,7 +332,7 @@
     QuicByteCount retransmission_length = interval.max() - interval.min();
     // Set appropriate encryption level.
     session()->connection()->SetDefaultEncryptionLevel(send_encryption_level);
-    QuicConsumedData consumed = session()->WritevData(
+    QuicConsumedData consumed = stream_delegate()->WritevData(
         this, id(), retransmission_length, retransmission_offset, NO_FIN);
     QUIC_DVLOG(1) << ENDPOINT << "stream " << id()
                   << " is forced to retransmit stream data ["
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h
index 466d17b..1d6534f 100644
--- a/quic/core/quic_session.h
+++ b/quic/core/quic_session.h
@@ -165,17 +165,6 @@
                                 const QuicSocketAddress& peer_address,
                                 const QuicReceivedPacket& packet);
 
-  // Called by streams when they want to write data to the peer.
-  // Returns a pair with the number of bytes consumed from data, and a boolean
-  // indicating if the fin bit was consumed.  This does not indicate the data
-  // has been sent on the wire: it may have been turned into a packet and queued
-  // if the socket was unexpectedly blocked.
-  virtual QuicConsumedData WritevData(QuicStream* stream,
-                                      QuicStreamId id,
-                                      size_t write_length,
-                                      QuicStreamOffset offset,
-                                      StreamSendingState state);
-
   // Called by application to send |message|. Data copy can be avoided if
   // |message| is provided in reference counted memory.
   // Please note, |message| provided in reference counted memory would be moved
@@ -263,6 +252,17 @@
   void OnStreamError(QuicErrorCode error_code,
                      std::string error_details) override;
 
+  // Called by streams when they want to write data to the peer.
+  // Returns a pair with the number of bytes consumed from data, and a boolean
+  // indicating if the fin bit was consumed.  This does not indicate the data
+  // has been sent on the wire: it may have been turned into a packet and queued
+  // if the socket was unexpectedly blocked.
+  QuicConsumedData WritevData(QuicStream* stream,
+                              QuicStreamId id,
+                              size_t write_length,
+                              QuicStreamOffset offset,
+                              StreamSendingState state) override;
+
   // Called by the QuicCryptoStream when a handshake message is sent.
   virtual void OnCryptoHandshakeMessageSent(
       const CryptoHandshakeMessage& message);
diff --git a/quic/core/quic_stream.cc b/quic/core/quic_stream.cc
index fee630b..6dcbd36 100644
--- a/quic/core/quic_stream.cc
+++ b/quic/core/quic_stream.cc
@@ -929,9 +929,9 @@
     const bool can_bundle_fin =
         retransmit_fin && (retransmission_offset + retransmission_length ==
                            stream_bytes_written());
-    consumed = session()->WritevData(this, id_, retransmission_length,
-                                     retransmission_offset,
-                                     can_bundle_fin ? FIN : NO_FIN);
+    consumed = stream_delegate_->WritevData(this, id_, retransmission_length,
+                                            retransmission_offset,
+                                            can_bundle_fin ? FIN : NO_FIN);
     QUIC_DVLOG(1) << ENDPOINT << "stream " << id_
                   << " is forced to retransmit stream data ["
                   << retransmission_offset << ", "
@@ -952,7 +952,8 @@
   if (retransmit_fin) {
     QUIC_DVLOG(1) << ENDPOINT << "stream " << id_
                   << " retransmits fin only frame.";
-    consumed = session()->WritevData(this, id_, 0, stream_bytes_written(), FIN);
+    consumed =
+        stream_delegate_->WritevData(this, id_, 0, stream_bytes_written(), FIN);
     if (!consumed.fin_consumed) {
       return false;
     }
@@ -1022,7 +1023,7 @@
   if (fin && add_random_padding_after_fin_) {
     state = FIN_AND_PADDING;
   }
-  QuicConsumedData consumed_data = session_->WritevData(
+  QuicConsumedData consumed_data = stream_delegate_->WritevData(
       this, id(), write_length, stream_bytes_written(), state);
 
   OnStreamDataConsumed(consumed_data.bytes_consumed);
@@ -1097,8 +1098,8 @@
     if (!send_buffer_.HasPendingRetransmission()) {
       QUIC_DVLOG(1) << ENDPOINT << "stream " << id_
                     << " retransmits fin only frame.";
-      consumed =
-          session()->WritevData(this, id_, 0, stream_bytes_written(), FIN);
+      consumed = stream_delegate_->WritevData(this, id_, 0,
+                                              stream_bytes_written(), FIN);
       fin_lost_ = !consumed.fin_consumed;
       if (fin_lost_) {
         // Connection is write blocked.
@@ -1111,9 +1112,9 @@
       const bool can_bundle_fin =
           fin_lost_ &&
           (pending.offset + pending.length == stream_bytes_written());
-      consumed =
-          session()->WritevData(this, id_, pending.length, pending.offset,
-                                can_bundle_fin ? FIN : NO_FIN);
+      consumed = stream_delegate_->WritevData(this, id_, pending.length,
+                                              pending.offset,
+                                              can_bundle_fin ? FIN : NO_FIN);
       QUIC_DVLOG(1) << ENDPOINT << "stream " << id_
                     << " tries to retransmit stream data [" << pending.offset
                     << ", " << pending.offset + pending.length
diff --git a/quic/core/stream_delegate_interface.h b/quic/core/stream_delegate_interface.h
index f6d052a..2616f13 100644
--- a/quic/core/stream_delegate_interface.h
+++ b/quic/core/stream_delegate_interface.h
@@ -5,10 +5,13 @@
 #ifndef QUICHE_QUIC_CORE_STREAM_DELEGATE_INTERFACE_H_
 #define QUICHE_QUIC_CORE_STREAM_DELEGATE_INTERFACE_H_
 
+#include <cstddef>
 #include "net/third_party/quiche/src/quic/core/quic_types.h"
 
 namespace quic {
 
+class QuicStream;
+
 class QUIC_EXPORT_PRIVATE StreamDelegateInterface {
  public:
   virtual ~StreamDelegateInterface() {}
@@ -16,6 +19,13 @@
   // Called when the stream has encountered errors that it can't handle.
   virtual void OnStreamError(QuicErrorCode error_code,
                              std::string error_details) = 0;
+
+  // Called when the stream needs to write data.
+  virtual QuicConsumedData WritevData(QuicStream* stream,
+                                      QuicStreamId id,
+                                      size_t write_length,
+                                      QuicStreamOffset offset,
+                                      StreamSendingState state) = 0;
 };
 
 }  // namespace quic