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

Side by Side Diff: remoting/base/buffered_socket_writer.cc

Issue 1197853003: Add P2PDatagramSocket and P2PStreamSocket interfaces. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 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 "remoting/base/buffered_socket_writer.h" 5 #include "remoting/base/buffered_socket_writer.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/single_thread_task_runner.h" 9 #include "base/single_thread_task_runner.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
11 #include "base/thread_task_runner_handle.h" 11 #include "base/thread_task_runner_handle.h"
12 #include "net/base/net_errors.h" 12 #include "net/base/net_errors.h"
13 13
14 namespace remoting { 14 namespace remoting {
15 15
16 struct BufferedSocketWriterBase::PendingPacket { 16 struct BufferedSocketWriterBase::PendingPacket {
17 PendingPacket(scoped_refptr<net::IOBufferWithSize> data, 17 PendingPacket(scoped_refptr<net::IOBufferWithSize> data,
18 const base::Closure& done_task) 18 const base::Closure& done_task)
19 : data(data), 19 : data(data),
20 done_task(done_task) { 20 done_task(done_task) {
21 } 21 }
22 22
23 scoped_refptr<net::IOBufferWithSize> data; 23 scoped_refptr<net::IOBufferWithSize> data;
24 base::Closure done_task; 24 base::Closure done_task;
25 }; 25 };
26 26
27 BufferedSocketWriterBase::BufferedSocketWriterBase() 27 BufferedSocketWriterBase::BufferedSocketWriterBase()
28 : socket_(nullptr), 28 : write_pending_(false),
29 write_pending_(false),
30 closed_(false), 29 closed_(false),
31 destroyed_flag_(nullptr) { 30 destroyed_flag_(nullptr) {
32 } 31 }
33 32
34 void BufferedSocketWriterBase::Init(net::Socket* socket, 33 void BufferedSocketWriterBase::Init(
35 const WriteFailedCallback& callback) { 34 const WriteCallback& write_callback,
35 const WriteFailedCallback& write_failed_callback) {
36 DCHECK(CalledOnValidThread()); 36 DCHECK(CalledOnValidThread());
37 DCHECK(socket); 37 DCHECK(write_callback_.is_null());
38 socket_ = socket; 38 write_callback_ = write_callback;
39 write_failed_callback_ = callback; 39 write_failed_callback_ = write_failed_callback;
40 } 40 }
41 41
42 bool BufferedSocketWriterBase::Write( 42 bool BufferedSocketWriterBase::Write(
43 scoped_refptr<net::IOBufferWithSize> data, const base::Closure& done_task) { 43 scoped_refptr<net::IOBufferWithSize> data, const base::Closure& done_task) {
44 DCHECK(CalledOnValidThread()); 44 DCHECK(CalledOnValidThread());
45 DCHECK(socket_);
46 DCHECK(data.get()); 45 DCHECK(data.get());
47 46
48 // Don't write after Close(). 47 // Don't write after Close().
49 if (closed_) 48 if (closed_)
50 return false; 49 return false;
51 50
52 queue_.push_back(new PendingPacket(data, done_task)); 51 queue_.push_back(new PendingPacket(data, done_task));
53 52
54 DoWrite(); 53 DoWrite();
55 54
56 // DoWrite() may trigger OnWriteError() to be called. 55 // DoWrite() may trigger OnWriteError() to be called.
57 return !closed_; 56 return !closed_;
58 } 57 }
59 58
60 void BufferedSocketWriterBase::DoWrite() { 59 void BufferedSocketWriterBase::DoWrite() {
61 DCHECK(CalledOnValidThread()); 60 DCHECK(CalledOnValidThread());
62 DCHECK(socket_); 61 DCHECK(!write_callback_.is_null());
63 62
64 // Don't try to write if there is another write pending. 63 // Don't try to write if there is another write pending.
65 if (write_pending_) 64 if (write_pending_)
66 return; 65 return;
67 66
68 // Don't write after Close(). 67 // Don't write after Close().
69 if (closed_) 68 if (closed_)
70 return; 69 return;
71 70
72 while (true) { 71 while (true) {
73 net::IOBuffer* current_packet; 72 net::IOBuffer* current_packet;
74 int current_packet_size; 73 int current_packet_size;
75 GetNextPacket(&current_packet, &current_packet_size); 74 GetNextPacket(&current_packet, &current_packet_size);
76 75
77 // Return if the queue is empty. 76 // Return if the queue is empty.
78 if (!current_packet) 77 if (!current_packet)
79 return; 78 return;
80 79
81 int result = socket_->Write( 80 int result =
82 current_packet, current_packet_size, 81 write_callback_.Run(current_packet, current_packet_size,
83 base::Bind(&BufferedSocketWriterBase::OnWritten, 82 base::Bind(&BufferedSocketWriterBase::OnWritten,
84 base::Unretained(this))); 83 base::Unretained(this)));
85 bool write_again = false; 84 bool write_again = false;
86 HandleWriteResult(result, &write_again); 85 HandleWriteResult(result, &write_again);
87 if (!write_again) 86 if (!write_again)
88 return; 87 return;
89 } 88 }
90 } 89 }
91 90
92 void BufferedSocketWriterBase::HandleWriteResult(int result, 91 void BufferedSocketWriterBase::HandleWriteResult(int result,
93 bool* write_again) { 92 bool* write_again) {
94 *write_again = false; 93 *write_again = false;
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 } 212 }
214 213
215 void BufferedDatagramWriter::OnError(int result) { 214 void BufferedDatagramWriter::OnError(int result) {
216 // Nothing to do here. 215 // Nothing to do here.
217 } 216 }
218 217
219 BufferedDatagramWriter::~BufferedDatagramWriter() { 218 BufferedDatagramWriter::~BufferedDatagramWriter() {
220 } 219 }
221 220
222 } // namespace remoting 221 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698