utils.cc revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
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/base/byteorder.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/libjingle/source/talk/base/socketaddress.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/libjingle/source/talk/p2p/base/candidate.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace jingle_glue { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool IPEndPointToSocketAddress(const net::IPEndPoint& ip_endpoint, 217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) talk_base::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) && 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) talk_base::SocketAddressFromSockAddrStorage(addr, address); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool SocketAddressToIPEndPoint(const talk_base::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? 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 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) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Value> value( 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::JSONReader::Read(candidate_str, base::JSON_ALLOW_TRAILING_COMMAS)); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value.get() || !value->IsType(Value::TYPE_DICTIONARY)) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* dic_value = static_cast<DictionaryValue*>(value.get()); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string ip; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int port; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string type; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string protocol; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string username; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string password; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double preference; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int generation; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dic_value->GetString("ip", &ip) || 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !dic_value->GetInteger("port", &port) || 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !dic_value->GetString("type", &type) || 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !dic_value->GetString("protocol", &protocol) || 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !dic_value->GetString("username", &username) || 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !dic_value->GetString("password", &password) || 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !dic_value->GetDouble("preference", &preference) || 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !dic_value->GetInteger("generation", &generation)) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) candidate->set_address(talk_base::SocketAddress(ip, port)); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) candidate->set_type(type); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) candidate->set_protocol(protocol); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) candidate->set_username(username); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) candidate->set_password(password); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) candidate->set_preference(static_cast<float>(preference)); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) candidate->set_generation(generation); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace jingle_glue 95