Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1130)

Side by Side Diff: blimp/net/blimp_connection.cc

Issue 1909143002: Use ConnectionErrorObserver, not callbacks, for error handling. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed haibinlu feedback. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "blimp/net/blimp_connection.h" 5 #include "blimp/net/blimp_connection.h"
6 6
7 #include "base/callback_helpers.h" 7 #include "base/callback_helpers.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/memory/weak_ptr.h" 10 #include "base/memory/weak_ptr.h"
11 #include "base/message_loop/message_loop.h" 11 #include "base/message_loop/message_loop.h"
12 #include "blimp/common/logging.h" 12 #include "blimp/common/logging.h"
13 #include "blimp/common/proto/blimp_message.pb.h" 13 #include "blimp/common/proto/blimp_message.pb.h"
14 #include "blimp/net/blimp_message_processor.h" 14 #include "blimp/net/blimp_message_processor.h"
15 #include "blimp/net/blimp_message_pump.h" 15 #include "blimp/net/blimp_message_pump.h"
16 #include "blimp/net/common.h" 16 #include "blimp/net/common.h"
17 #include "blimp/net/connection_error_observer.h" 17 #include "blimp/net/connection_error_observer.h"
18 #include "blimp/net/packet_reader.h" 18 #include "blimp/net/packet_reader.h"
19 #include "blimp/net/packet_writer.h" 19 #include "blimp/net/packet_writer.h"
20 #include "net/base/completion_callback.h" 20 #include "net/base/completion_callback.h"
21 21
22 namespace blimp { 22 namespace blimp {
23 namespace {
24 23
25 // Forwards incoming blimp messages to PacketWriter. 24 // Forwards incoming blimp messages to PacketWriter.
26 class BlimpMessageSender : public BlimpMessageProcessor { 25 class BlimpMessageSender : public BlimpMessageProcessor {
27 public: 26 public:
28 explicit BlimpMessageSender(PacketWriter* writer); 27 explicit BlimpMessageSender(PacketWriter* writer);
29 ~BlimpMessageSender() override; 28 ~BlimpMessageSender() override;
30 29
31 void set_error_observer(ConnectionErrorObserver* observer) { 30 void set_error_observer(ConnectionErrorObserver* observer) {
32 error_observer_ = observer; 31 error_observer_ = observer;
33 } 32 }
34 33
35 // BlimpMessageProcessor implementation. 34 // BlimpMessageProcessor implementation.
35 // |callback| receives net::OK on write success, or receives an error code
36 // otherwise.
36 void ProcessMessage(std::unique_ptr<BlimpMessage> message, 37 void ProcessMessage(std::unique_ptr<BlimpMessage> message,
37 const net::CompletionCallback& callback) override; 38 const net::CompletionCallback& callback) override;
38 39
39 private: 40 private:
40 void OnWritePacketComplete(int result); 41 void OnWritePacketComplete(int result);
41 42
42 PacketWriter* writer_; 43 PacketWriter* writer_;
43 ConnectionErrorObserver* error_observer_ = nullptr; 44 ConnectionErrorObserver* error_observer_ = nullptr;
44 scoped_refptr<net::IOBuffer> buffer_; 45 scoped_refptr<net::IOBuffer> buffer_;
45 net::CompletionCallback pending_process_msg_callback_; 46 net::CompletionCallback pending_process_msg_callback_;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 writer_->WritePacket( 85 writer_->WritePacket(
85 scoped_refptr<net::DrainableIOBuffer>( 86 scoped_refptr<net::DrainableIOBuffer>(
86 new net::DrainableIOBuffer(buffer_.get(), message->ByteSize())), 87 new net::DrainableIOBuffer(buffer_.get(), message->ByteSize())),
87 base::Bind(&BlimpMessageSender::OnWritePacketComplete, 88 base::Bind(&BlimpMessageSender::OnWritePacketComplete,
88 weak_factory_.GetWeakPtr())); 89 weak_factory_.GetWeakPtr()));
89 } 90 }
90 91
91 void BlimpMessageSender::OnWritePacketComplete(int result) { 92 void BlimpMessageSender::OnWritePacketComplete(int result) {
92 DVLOG(2) << "OnWritePacketComplete, result=" << result; 93 DVLOG(2) << "OnWritePacketComplete, result=" << result;
93 DCHECK_NE(net::ERR_IO_PENDING, result); 94 DCHECK_NE(net::ERR_IO_PENDING, result);
94 base::ResetAndReturn(&pending_process_msg_callback_).Run(result); 95
96 // Create a stack-local copy of |pending_process_msg_callback_|, in case an
97 // observer deletes |this|.
98 net::CompletionCallback process_callback =
99 base::ResetAndReturn(&pending_process_msg_callback_);
100
95 if (result != net::OK) { 101 if (result != net::OK) {
96 error_observer_->OnConnectionError(result); 102 error_observer_->OnConnectionError(result);
97 } 103 }
104
105 process_callback.Run(net::OK);
98 } 106 }
99 107
100 } // namespace
101
102 BlimpConnection::BlimpConnection(std::unique_ptr<PacketReader> reader, 108 BlimpConnection::BlimpConnection(std::unique_ptr<PacketReader> reader,
103 std::unique_ptr<PacketWriter> writer) 109 std::unique_ptr<PacketWriter> writer)
104 : reader_(std::move(reader)), 110 : reader_(std::move(reader)),
105 message_pump_(new BlimpMessagePump(reader_.get())), 111 message_pump_(new BlimpMessagePump(reader_.get())),
106 writer_(std::move(writer)), 112 writer_(std::move(writer)) {
107 outgoing_msg_processor_(new BlimpMessageSender(writer_.get())) {
108 DCHECK(writer_); 113 DCHECK(writer_);
114 DCHECK(reader_);
109 115
110 // Observe the connection errors received by any of this connection's network
111 // objects.
112 message_pump_->set_error_observer(this); 116 message_pump_->set_error_observer(this);
113 BlimpMessageSender* sender = 117
114 static_cast<BlimpMessageSender*>(outgoing_msg_processor_.get()); 118 std::unique_ptr<BlimpMessageSender> sender(
119 new BlimpMessageSender(writer_.get()));
115 sender->set_error_observer(this); 120 sender->set_error_observer(this);
121 outgoing_msg_processor_ = std::move(sender);
116 } 122 }
117 123
118 BlimpConnection::BlimpConnection() {} 124 BlimpConnection::BlimpConnection() {}
119 125
120 BlimpConnection::~BlimpConnection() { 126 BlimpConnection::~BlimpConnection() {
121 VLOG(1) << "BlimpConnection destroyed."; 127 VLOG(1) << "BlimpConnection destroyed.";
122 } 128 }
123 129
124 void BlimpConnection::AddConnectionErrorObserver( 130 void BlimpConnection::AddConnectionErrorObserver(
125 ConnectionErrorObserver* observer) { 131 ConnectionErrorObserver* observer) {
(...skipping 16 matching lines...) Expand all
142 148
143 void BlimpConnection::OnConnectionError(int error) { 149 void BlimpConnection::OnConnectionError(int error) {
144 VLOG(1) << "OnConnectionError, error=" << error; 150 VLOG(1) << "OnConnectionError, error=" << error;
145 151
146 // Propagate the error to all observers. 152 // Propagate the error to all observers.
147 FOR_EACH_OBSERVER(ConnectionErrorObserver, error_observers_, 153 FOR_EACH_OBSERVER(ConnectionErrorObserver, error_observers_,
148 OnConnectionError(error)); 154 OnConnectionError(error));
149 } 155 }
150 156
151 } // namespace blimp 157 } // namespace blimp
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698