OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "content/renderer/p2p/p2p_transport_impl.h" | 5 #include "content/renderer/p2p/p2p_transport_impl.h" |
6 | 6 |
7 #include "base/values.h" | |
8 #include "content/common/json_value_serializer.h" | |
9 #include "content/renderer/p2p/ipc_network_manager.h" | 7 #include "content/renderer/p2p/ipc_network_manager.h" |
10 #include "content/renderer/p2p/ipc_socket_factory.h" | 8 #include "content/renderer/p2p/ipc_socket_factory.h" |
11 #include "content/renderer/render_view.h" | 9 #include "content/renderer/render_view.h" |
12 #include "jingle/glue/channel_socket_adapter.h" | 10 #include "jingle/glue/channel_socket_adapter.h" |
13 #include "jingle/glue/pseudotcp_adapter.h" | 11 #include "jingle/glue/pseudotcp_adapter.h" |
14 #include "jingle/glue/thread_wrapper.h" | 12 #include "jingle/glue/thread_wrapper.h" |
| 13 #include "jingle/glue/utils.h" |
15 #include "net/base/net_errors.h" | 14 #include "net/base/net_errors.h" |
16 #include "third_party/libjingle/source/talk/p2p/base/p2ptransportchannel.h" | 15 #include "third_party/libjingle/source/talk/p2p/base/p2ptransportchannel.h" |
17 #include "third_party/libjingle/source/talk/p2p/client/basicportallocator.h" | 16 #include "third_party/libjingle/source/talk/p2p/client/basicportallocator.h" |
18 | 17 |
19 P2PTransportImpl::P2PTransportImpl( | 18 P2PTransportImpl::P2PTransportImpl( |
20 talk_base::NetworkManager* network_manager, | 19 talk_base::NetworkManager* network_manager, |
21 talk_base::PacketSocketFactory* socket_factory) | 20 talk_base::PacketSocketFactory* socket_factory) |
22 : event_handler_(NULL), | 21 : event_handler_(NULL), |
23 state_(STATE_NONE), | 22 state_(STATE_NONE), |
24 network_manager_(network_manager), | 23 network_manager_(network_manager), |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 int result = pseudo_tcp_adapter_->Connect(&connect_callback_); | 82 int result = pseudo_tcp_adapter_->Connect(&connect_callback_); |
84 if (result != net::ERR_IO_PENDING) | 83 if (result != net::ERR_IO_PENDING) |
85 OnTcpConnected(result); | 84 OnTcpConnected(result); |
86 } | 85 } |
87 | 86 |
88 return true; | 87 return true; |
89 } | 88 } |
90 | 89 |
91 bool P2PTransportImpl::AddRemoteCandidate(const std::string& address) { | 90 bool P2PTransportImpl::AddRemoteCandidate(const std::string& address) { |
92 cricket::Candidate candidate; | 91 cricket::Candidate candidate; |
93 if (!DeserializeCandidate(address, &candidate)) { | 92 if (!jingle_glue::DeserializeP2PCandidate(address, &candidate)) { |
| 93 LOG(ERROR) << "Failed to parse candidate " << address; |
94 return false; | 94 return false; |
95 } | 95 } |
96 | 96 |
97 channel_->OnCandidate(candidate); | 97 channel_->OnCandidate(candidate); |
98 return true; | 98 return true; |
99 } | 99 } |
100 | 100 |
101 void P2PTransportImpl::OnRequestSignaling() { | 101 void P2PTransportImpl::OnRequestSignaling() { |
102 channel_->OnSignalingReady(); | 102 channel_->OnSignalingReady(); |
103 } | 103 } |
104 | 104 |
105 void P2PTransportImpl::OnCandidateReady( | 105 void P2PTransportImpl::OnCandidateReady( |
106 cricket::TransportChannelImpl* channel, | 106 cricket::TransportChannelImpl* channel, |
107 const cricket::Candidate& candidate) { | 107 const cricket::Candidate& candidate) { |
108 event_handler_->OnCandidateReady(SerializeCandidate(candidate)); | 108 event_handler_->OnCandidateReady( |
| 109 jingle_glue::SerializeP2PCandidate(candidate)); |
109 } | 110 } |
110 | 111 |
111 void P2PTransportImpl::OnReadableState(cricket::TransportChannel* channel) { | 112 void P2PTransportImpl::OnReadableState(cricket::TransportChannel* channel) { |
112 state_ = static_cast<State>(state_ | STATE_READABLE); | 113 state_ = static_cast<State>(state_ | STATE_READABLE); |
113 event_handler_->OnStateChange(state_); | 114 event_handler_->OnStateChange(state_); |
114 } | 115 } |
115 | 116 |
116 void P2PTransportImpl::OnWriteableState(cricket::TransportChannel* channel) { | 117 void P2PTransportImpl::OnWriteableState(cricket::TransportChannel* channel) { |
117 state_ = static_cast<State>(state_ | STATE_WRITABLE); | 118 state_ = static_cast<State>(state_ | STATE_WRITABLE); |
118 event_handler_->OnStateChange(state_); | 119 event_handler_->OnStateChange(state_); |
119 } | 120 } |
120 | 121 |
121 std::string P2PTransportImpl::SerializeCandidate( | |
122 const cricket::Candidate& candidate) { | |
123 | |
124 // TODO(sergeyu): Use SDP to format candidates? | |
125 DictionaryValue value; | |
126 value.SetString("name", candidate.name()); | |
127 value.SetString("ip", candidate.address().IPAsString()); | |
128 value.SetInteger("port", candidate.address().port()); | |
129 value.SetString("type", candidate.type()); | |
130 value.SetString("protocol", candidate.protocol()); | |
131 value.SetString("username", candidate.username()); | |
132 value.SetString("password", candidate.password()); | |
133 value.SetDouble("preference", candidate.preference()); | |
134 value.SetInteger("generation", candidate.generation()); | |
135 | |
136 std::string result; | |
137 JSONStringValueSerializer serializer(&result); | |
138 serializer.Serialize(value); | |
139 return result; | |
140 } | |
141 | |
142 bool P2PTransportImpl::DeserializeCandidate(const std::string& address, | |
143 cricket::Candidate* candidate) { | |
144 JSONStringValueSerializer deserializer(address); | |
145 scoped_ptr<Value> value(deserializer.Deserialize(NULL, NULL)); | |
146 if (!value.get() || !value->IsType(Value::TYPE_DICTIONARY)) { | |
147 return false; | |
148 } | |
149 | |
150 DictionaryValue* dic_value = static_cast<DictionaryValue*>(value.get()); | |
151 | |
152 std::string name; | |
153 std::string ip; | |
154 int port; | |
155 std::string type; | |
156 std::string protocol; | |
157 std::string username; | |
158 std::string password; | |
159 double preference; | |
160 int generation; | |
161 | |
162 if (!dic_value->GetString("name", &name) || | |
163 !dic_value->GetString("ip", &ip) || | |
164 !dic_value->GetInteger("port", &port) || | |
165 !dic_value->GetString("type", &type) || | |
166 !dic_value->GetString("protocol", &protocol) || | |
167 !dic_value->GetString("username", &username) || | |
168 !dic_value->GetString("password", &password) || | |
169 !dic_value->GetDouble("preference", &preference) || | |
170 !dic_value->GetInteger("generation", &generation)) { | |
171 return false; | |
172 } | |
173 | |
174 candidate->set_name(name); | |
175 candidate->set_address(talk_base::SocketAddress(ip, port)); | |
176 candidate->set_type(type); | |
177 candidate->set_protocol(protocol); | |
178 candidate->set_username(username); | |
179 candidate->set_password(password); | |
180 candidate->set_preference(static_cast<float>(preference)); | |
181 candidate->set_generation(generation); | |
182 | |
183 return true; | |
184 } | |
185 | |
186 net::Socket* P2PTransportImpl::GetChannel() { | 122 net::Socket* P2PTransportImpl::GetChannel() { |
187 if (pseudo_tcp_adapter_.get()) { | 123 if (pseudo_tcp_adapter_.get()) { |
188 DCHECK(!channel_adapter_.get()); | 124 DCHECK(!channel_adapter_.get()); |
189 return pseudo_tcp_adapter_.get(); | 125 return pseudo_tcp_adapter_.get(); |
190 } else { | 126 } else { |
191 DCHECK(channel_adapter_.get()); | 127 DCHECK(channel_adapter_.get()); |
192 return channel_adapter_.get(); | 128 return channel_adapter_.get(); |
193 } | 129 } |
194 } | 130 } |
195 | 131 |
196 void P2PTransportImpl::OnTcpConnected(int result) { | 132 void P2PTransportImpl::OnTcpConnected(int result) { |
197 if (result < 0) { | 133 if (result < 0) { |
198 event_handler_->OnError(result); | 134 event_handler_->OnError(result); |
199 return; | 135 return; |
200 } | 136 } |
201 state_ = static_cast<State>(STATE_READABLE | STATE_WRITABLE); | 137 state_ = static_cast<State>(STATE_READABLE | STATE_WRITABLE); |
202 event_handler_->OnStateChange(state_); | 138 event_handler_->OnStateChange(state_); |
203 } | 139 } |
OLD | NEW |