15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/glue/utils.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_writer.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/ip_endpoint.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/libjingle/source/talk/p2p/base/candidate.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/webrtc/base/byteorder.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/webrtc/base/socketaddress.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace jingle_glue { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool IPEndPointToSocketAddress(const net::IPEndPoint& ip_endpoint, 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::SocketAddress* address) { 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) sockaddr_storage addr; 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) socklen_t len = sizeof(addr); 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return ip_endpoint.ToSockAddr(reinterpret_cast<sockaddr*>(&addr), &len) && 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::SocketAddressFromSockAddrStorage(addr, address); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool SocketAddressToIPEndPoint(const rtc::SocketAddress& address, 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) net::IPEndPoint* ip_endpoint) { 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) sockaddr_storage addr; 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int size = address.ToSockAddrStorage(&addr); 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return (size > 0) && 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ip_endpoint->FromSockAddr(reinterpret_cast<sockaddr*>(&addr), size); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string SerializeP2PCandidate(const cricket::Candidate& candidate) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sergeyu): Use SDP to format candidates? 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue value; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.SetString("ip", candidate.address().ipaddr().ToString()); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.SetInteger("port", candidate.address().port()); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.SetString("type", candidate.type()); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.SetString("protocol", candidate.protocol()); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.SetString("username", candidate.username()); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.SetString("password", candidate.password()); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.SetDouble("preference", candidate.preference()); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.SetInteger("generation", candidate.generation()); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::JSONWriter::Write(&value, &result); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DeserializeP2PCandidate(const std::string& candidate_str, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cricket::Candidate* candidate) { 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::Value> value( 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::JSONReader::Read(candidate_str, base::JSON_ALLOW_TRAILING_COMMAS)); 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!value.get() || !value->IsType(base::Value::TYPE_DICTIONARY)) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue* dic_value = 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static_cast<base::DictionaryValue*>(value.get()); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string ip; 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int port = 0; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string type; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string protocol; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string username; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string password; 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch double preference = 0; 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int generation = 0; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dic_value->GetString("ip", &ip) || 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !dic_value->GetInteger("port", &port) || 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !dic_value->GetString("type", &type) || 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !dic_value->GetString("protocol", &protocol) || 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !dic_value->GetString("username", &username) || 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !dic_value->GetString("password", &password) || 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !dic_value->GetDouble("preference", &preference) || 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !dic_value->GetInteger("generation", &generation)) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) candidate->set_address(rtc::SocketAddress(ip, port)); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) candidate->set_type(type); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) candidate->set_protocol(protocol); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) candidate->set_username(username); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) candidate->set_password(password); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) candidate->set_preference(static_cast<float>(preference)); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) candidate->set_generation(generation); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace jingle_glue 96