| 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 |