| Index: components/cronet/ios/cronet_c_for_grpc.cc
|
| diff --git a/components/cronet/ios/cronet_c_for_grpc.cc b/components/cronet/ios/cronet_c_for_grpc.cc
|
| index 5c7810a9fcd554ec57daf615111a17c0041b87e0..d079d20bb32b082c30129ece88f75c613442e26a 100644
|
| --- a/components/cronet/ios/cronet_c_for_grpc.cc
|
| +++ b/components/cronet/ios/cronet_c_for_grpc.cc
|
| @@ -14,6 +14,7 @@
|
| #include "base/location.h"
|
| #include "base/logging.h"
|
| #include "base/macros.h"
|
| +#include "base/memory/ptr_util.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/string_split.h"
|
| @@ -73,7 +74,7 @@ class CronetBidirectionalStreamAdapter
|
| public:
|
| CronetBidirectionalStreamAdapter(
|
| cronet_engine* engine,
|
| - cronet_bidirectional_stream* stream,
|
| + void* annotation,
|
| cronet_bidirectional_stream_callback* callback);
|
|
|
| virtual ~CronetBidirectionalStreamAdapter();
|
| @@ -95,6 +96,8 @@ class CronetBidirectionalStreamAdapter
|
|
|
| void OnCanceled() override;
|
|
|
| + cronet_bidirectional_stream* c_stream() const { return c_stream_.get(); }
|
| +
|
| static cronet::CronetBidirectionalStream* GetCronetStream(
|
| cronet_bidirectional_stream* stream);
|
|
|
| @@ -107,69 +110,71 @@ class CronetBidirectionalStreamAdapter
|
| cronet::CronetEnvironment* cronet_environment_;
|
| cronet::CronetBidirectionalStream* cronet_bidirectional_stream_;
|
| // C side
|
| - cronet_bidirectional_stream* stream_;
|
| - cronet_bidirectional_stream_callback* callback_;
|
| + std::unique_ptr<cronet_bidirectional_stream> c_stream_;
|
| + cronet_bidirectional_stream_callback* c_callback_;
|
| };
|
|
|
| CronetBidirectionalStreamAdapter::CronetBidirectionalStreamAdapter(
|
| cronet_engine* engine,
|
| - cronet_bidirectional_stream* stream,
|
| + void* annotation,
|
| cronet_bidirectional_stream_callback* callback)
|
| : cronet_environment_(
|
| reinterpret_cast<cronet::CronetEnvironment*>(engine->obj)),
|
| - stream_(stream),
|
| - callback_(callback) {
|
| + c_stream_(base::MakeUnique<cronet_bidirectional_stream>()),
|
| + c_callback_(callback) {
|
| DCHECK(cronet_environment_);
|
| cronet_bidirectional_stream_ =
|
| new cronet::CronetBidirectionalStream(cronet_environment_, this);
|
| + c_stream_->obj = this;
|
| + c_stream_->annotation = annotation;
|
| }
|
|
|
| CronetBidirectionalStreamAdapter::~CronetBidirectionalStreamAdapter() {}
|
|
|
| void CronetBidirectionalStreamAdapter::OnStreamReady() {
|
| - DCHECK(callback_->on_response_headers_received);
|
| - callback_->on_stream_ready(stream_);
|
| + DCHECK(c_callback_->on_stream_ready);
|
| + c_callback_->on_stream_ready(c_stream());
|
| }
|
|
|
| void CronetBidirectionalStreamAdapter::OnHeadersReceived(
|
| const net::SpdyHeaderBlock& headers_block,
|
| const char* negotiated_protocol) {
|
| - DCHECK(callback_->on_response_headers_received);
|
| + DCHECK(c_callback_->on_response_headers_received);
|
| HeadersArray response_headers(headers_block);
|
| - callback_->on_response_headers_received(stream_, &response_headers,
|
| - negotiated_protocol);
|
| + c_callback_->on_response_headers_received(c_stream(), &response_headers,
|
| + negotiated_protocol);
|
| }
|
|
|
| void CronetBidirectionalStreamAdapter::OnDataRead(char* data, int size) {
|
| - DCHECK(callback_->on_read_completed);
|
| - callback_->on_read_completed(stream_, data, size);
|
| + DCHECK(c_callback_->on_read_completed);
|
| + c_callback_->on_read_completed(c_stream(), data, size);
|
| }
|
|
|
| void CronetBidirectionalStreamAdapter::OnDataSent(const char* data) {
|
| - DCHECK(callback_->on_write_completed);
|
| - callback_->on_write_completed(stream_, data);
|
| + DCHECK(c_callback_->on_write_completed);
|
| + c_callback_->on_write_completed(c_stream(), data);
|
| }
|
|
|
| void CronetBidirectionalStreamAdapter::OnTrailersReceived(
|
| const net::SpdyHeaderBlock& trailers_block) {
|
| - DCHECK(callback_->on_response_trailers_received);
|
| + DCHECK(c_callback_->on_response_trailers_received);
|
| HeadersArray response_trailers(trailers_block);
|
| - callback_->on_response_trailers_received(stream_, &response_trailers);
|
| + c_callback_->on_response_trailers_received(c_stream(), &response_trailers);
|
| }
|
|
|
| void CronetBidirectionalStreamAdapter::OnSucceeded() {
|
| - DCHECK(callback_->on_succeded);
|
| - callback_->on_succeded(stream_);
|
| + DCHECK(c_callback_->on_succeded);
|
| + c_callback_->on_succeded(c_stream());
|
| }
|
|
|
| void CronetBidirectionalStreamAdapter::OnFailed(int error) {
|
| - DCHECK(callback_->on_failed);
|
| - callback_->on_failed(stream_, error);
|
| + DCHECK(c_callback_->on_failed);
|
| + c_callback_->on_failed(c_stream(), error);
|
| }
|
|
|
| void CronetBidirectionalStreamAdapter::OnCanceled() {
|
| - DCHECK(callback_->on_canceled);
|
| - callback_->on_canceled(stream_);
|
| + DCHECK(c_callback_->on_canceled);
|
| + c_callback_->on_canceled(c_stream());
|
| }
|
|
|
| cronet::CronetBidirectionalStream*
|
| @@ -178,7 +183,7 @@ CronetBidirectionalStreamAdapter::GetCronetStream(
|
| DCHECK(stream);
|
| CronetBidirectionalStreamAdapter* adapter =
|
| static_cast<CronetBidirectionalStreamAdapter*>(stream->obj);
|
| - DCHECK(adapter->stream_ == stream);
|
| + DCHECK(adapter->c_stream() == stream);
|
| DCHECK(adapter->cronet_bidirectional_stream_);
|
| return adapter->cronet_bidirectional_stream_;
|
| }
|
| @@ -188,7 +193,7 @@ void CronetBidirectionalStreamAdapter::DestroyAdapterForStream(
|
| DCHECK(stream);
|
| CronetBidirectionalStreamAdapter* adapter =
|
| static_cast<CronetBidirectionalStreamAdapter*>(stream->obj);
|
| - DCHECK(adapter->stream_ == stream);
|
| + DCHECK(adapter->c_stream() == stream);
|
| // Destroy could be called from any thread, including network thread (if
|
| // posting task to executor throws an exception), but is posted, so |this|
|
| // is valid until calling task is complete.
|
| @@ -210,17 +215,14 @@ cronet_bidirectional_stream* cronet_bidirectional_stream_create(
|
| cronet_engine* engine,
|
| void* annotation,
|
| cronet_bidirectional_stream_callback* callback) {
|
| - // Allocate C |stream| object.
|
| - cronet_bidirectional_stream* stream = new cronet_bidirectional_stream();
|
| // Allocate new C++ adapter that will invoke |callback|.
|
| - stream->obj = new CronetBidirectionalStreamAdapter(engine, stream, callback);
|
| - stream->annotation = annotation;
|
| - return stream;
|
| + CronetBidirectionalStreamAdapter* stream_adapter =
|
| + new CronetBidirectionalStreamAdapter(engine, annotation, callback);
|
| + return stream_adapter->c_stream();
|
| }
|
|
|
| int cronet_bidirectional_stream_destroy(cronet_bidirectional_stream* stream) {
|
| CronetBidirectionalStreamAdapter::DestroyAdapterForStream(stream);
|
| - delete stream;
|
| return 1;
|
| }
|
|
|
|
|