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

Side by Side Diff: webrtc/p2p/client/basicportallocator.cc

Issue 2685783014: Replace NULL with nullptr in all C++ files. (Closed)
Patch Set: Fixing android. Created 3 years, 10 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 /* 1 /*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 BasicPortAllocator::BasicPortAllocator(rtc::NetworkManager* network_manager) 107 BasicPortAllocator::BasicPortAllocator(rtc::NetworkManager* network_manager)
108 : network_manager_(network_manager), socket_factory_(nullptr) { 108 : network_manager_(network_manager), socket_factory_(nullptr) {
109 RTC_DCHECK(network_manager_ != nullptr); 109 RTC_DCHECK(network_manager_ != nullptr);
110 Construct(); 110 Construct();
111 } 111 }
112 112
113 BasicPortAllocator::BasicPortAllocator(rtc::NetworkManager* network_manager, 113 BasicPortAllocator::BasicPortAllocator(rtc::NetworkManager* network_manager,
114 rtc::PacketSocketFactory* socket_factory, 114 rtc::PacketSocketFactory* socket_factory,
115 const ServerAddresses& stun_servers) 115 const ServerAddresses& stun_servers)
116 : network_manager_(network_manager), socket_factory_(socket_factory) { 116 : network_manager_(network_manager), socket_factory_(socket_factory) {
117 RTC_DCHECK(socket_factory_ != NULL); 117 RTC_DCHECK(socket_factory_ != nullptr);
118 SetConfiguration(stun_servers, std::vector<RelayServerConfig>(), 0, false); 118 SetConfiguration(stun_servers, std::vector<RelayServerConfig>(), 0, false);
119 Construct(); 119 Construct();
120 } 120 }
121 121
122 BasicPortAllocator::BasicPortAllocator( 122 BasicPortAllocator::BasicPortAllocator(
123 rtc::NetworkManager* network_manager, 123 rtc::NetworkManager* network_manager,
124 const ServerAddresses& stun_servers, 124 const ServerAddresses& stun_servers,
125 const rtc::SocketAddress& relay_address_udp, 125 const rtc::SocketAddress& relay_address_udp,
126 const rtc::SocketAddress& relay_address_tcp, 126 const rtc::SocketAddress& relay_address_tcp,
127 const rtc::SocketAddress& relay_address_ssl) 127 const rtc::SocketAddress& relay_address_ssl)
128 : network_manager_(network_manager), socket_factory_(NULL) { 128 : network_manager_(network_manager), socket_factory_(nullptr) {
129 std::vector<RelayServerConfig> turn_servers; 129 std::vector<RelayServerConfig> turn_servers;
130 RelayServerConfig config(RELAY_GTURN); 130 RelayServerConfig config(RELAY_GTURN);
131 if (!relay_address_udp.IsNil()) { 131 if (!relay_address_udp.IsNil()) {
132 config.ports.push_back(ProtocolAddress(relay_address_udp, PROTO_UDP)); 132 config.ports.push_back(ProtocolAddress(relay_address_udp, PROTO_UDP));
133 } 133 }
134 if (!relay_address_tcp.IsNil()) { 134 if (!relay_address_tcp.IsNil()) {
135 config.ports.push_back(ProtocolAddress(relay_address_tcp, PROTO_TCP)); 135 config.ports.push_back(ProtocolAddress(relay_address_tcp, PROTO_TCP));
136 } 136 }
137 if (!relay_address_ssl.IsNil()) { 137 if (!relay_address_ssl.IsNil()) {
138 config.ports.push_back(ProtocolAddress(relay_address_ssl, PROTO_SSLTCP)); 138 config.ports.push_back(ProtocolAddress(relay_address_ssl, PROTO_SSLTCP));
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 const std::string& content_name, 194 const std::string& content_name,
195 int component, 195 int component,
196 const std::string& ice_ufrag, 196 const std::string& ice_ufrag,
197 const std::string& ice_pwd) 197 const std::string& ice_pwd)
198 : PortAllocatorSession(content_name, 198 : PortAllocatorSession(content_name,
199 component, 199 component,
200 ice_ufrag, 200 ice_ufrag,
201 ice_pwd, 201 ice_pwd,
202 allocator->flags()), 202 allocator->flags()),
203 allocator_(allocator), 203 allocator_(allocator),
204 network_thread_(NULL), 204 network_thread_(nullptr),
205 socket_factory_(allocator->socket_factory()), 205 socket_factory_(allocator->socket_factory()),
206 allocation_started_(false), 206 allocation_started_(false),
207 network_manager_started_(false), 207 network_manager_started_(false),
208 allocation_sequences_created_(false), 208 allocation_sequences_created_(false),
209 prune_turn_ports_(allocator->prune_turn_ports()) { 209 prune_turn_ports_(allocator->prune_turn_ports()) {
210 allocator_->network_manager()->SignalNetworksChanged.connect( 210 allocator_->network_manager()->SignalNetworksChanged.connect(
211 this, &BasicPortAllocatorSession::OnNetworksChanged); 211 this, &BasicPortAllocatorSession::OnNetworksChanged);
212 allocator_->network_manager()->StartUpdating(); 212 allocator_->network_manager()->StartUpdating();
213 } 213 }
214 214
215 BasicPortAllocatorSession::~BasicPortAllocatorSession() { 215 BasicPortAllocatorSession::~BasicPortAllocatorSession() {
216 allocator_->network_manager()->StopUpdating(); 216 allocator_->network_manager()->StopUpdating();
217 if (network_thread_ != NULL) 217 if (network_thread_ != nullptr)
218 network_thread_->Clear(this); 218 network_thread_->Clear(this);
219 219
220 for (uint32_t i = 0; i < sequences_.size(); ++i) { 220 for (uint32_t i = 0; i < sequences_.size(); ++i) {
221 // AllocationSequence should clear it's map entry for turn ports before 221 // AllocationSequence should clear it's map entry for turn ports before
222 // ports are destroyed. 222 // ports are destroyed.
223 sequences_[i]->Clear(); 223 sequences_[i]->Clear();
224 } 224 }
225 225
226 std::vector<PortData>::iterator it; 226 std::vector<PortData>::iterator it;
227 for (it = ports_.begin(); it != ports_.end(); it++) 227 for (it = ports_.begin(); it != ports_.end(); it++)
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 void BasicPortAllocatorSession::OnAllocationSequenceObjectsCreated() { 714 void BasicPortAllocatorSession::OnAllocationSequenceObjectsCreated() {
715 allocation_sequences_created_ = true; 715 allocation_sequences_created_ = true;
716 // Send candidate allocation complete signal if we have no sequences. 716 // Send candidate allocation complete signal if we have no sequences.
717 MaybeSignalCandidatesAllocationDone(); 717 MaybeSignalCandidatesAllocationDone();
718 } 718 }
719 719
720 void BasicPortAllocatorSession::OnCandidateReady( 720 void BasicPortAllocatorSession::OnCandidateReady(
721 Port* port, const Candidate& c) { 721 Port* port, const Candidate& c) {
722 RTC_DCHECK(rtc::Thread::Current() == network_thread_); 722 RTC_DCHECK(rtc::Thread::Current() == network_thread_);
723 PortData* data = FindPort(port); 723 PortData* data = FindPort(port);
724 RTC_DCHECK(data != NULL); 724 RTC_DCHECK(data != nullptr);
725 LOG_J(LS_INFO, port) << "Gathered candidate: " << c.ToSensitiveString(); 725 LOG_J(LS_INFO, port) << "Gathered candidate: " << c.ToSensitiveString();
726 // Discarding any candidate signal if port allocation status is 726 // Discarding any candidate signal if port allocation status is
727 // already done with gathering. 727 // already done with gathering.
728 if (!data->inprogress()) { 728 if (!data->inprogress()) {
729 LOG(LS_WARNING) 729 LOG(LS_WARNING)
730 << "Discarding candidate because port is already done gathering."; 730 << "Discarding candidate because port is already done gathering.";
731 return; 731 return;
732 } 732 }
733 733
734 // Mark that the port has a pairable candidate, either because we have a 734 // Mark that the port has a pairable candidate, either because we have a
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
826 void BasicPortAllocatorSession::PruneAllPorts() { 826 void BasicPortAllocatorSession::PruneAllPorts() {
827 for (PortData& data : ports_) { 827 for (PortData& data : ports_) {
828 data.Prune(); 828 data.Prune();
829 } 829 }
830 } 830 }
831 831
832 void BasicPortAllocatorSession::OnPortComplete(Port* port) { 832 void BasicPortAllocatorSession::OnPortComplete(Port* port) {
833 RTC_DCHECK(rtc::Thread::Current() == network_thread_); 833 RTC_DCHECK(rtc::Thread::Current() == network_thread_);
834 LOG_J(LS_INFO, port) << "Port completed gathering candidates."; 834 LOG_J(LS_INFO, port) << "Port completed gathering candidates.";
835 PortData* data = FindPort(port); 835 PortData* data = FindPort(port);
836 RTC_DCHECK(data != NULL); 836 RTC_DCHECK(data != nullptr);
837 837
838 // Ignore any late signals. 838 // Ignore any late signals.
839 if (!data->inprogress()) { 839 if (!data->inprogress()) {
840 return; 840 return;
841 } 841 }
842 842
843 // Moving to COMPLETE state. 843 // Moving to COMPLETE state.
844 data->set_complete(); 844 data->set_complete();
845 // Send candidate allocation complete signal if this was the last port. 845 // Send candidate allocation complete signal if this was the last port.
846 MaybeSignalCandidatesAllocationDone(); 846 MaybeSignalCandidatesAllocationDone();
847 } 847 }
848 848
849 void BasicPortAllocatorSession::OnPortError(Port* port) { 849 void BasicPortAllocatorSession::OnPortError(Port* port) {
850 RTC_DCHECK(rtc::Thread::Current() == network_thread_); 850 RTC_DCHECK(rtc::Thread::Current() == network_thread_);
851 LOG_J(LS_INFO, port) << "Port encountered error while gathering candidates."; 851 LOG_J(LS_INFO, port) << "Port encountered error while gathering candidates.";
852 PortData* data = FindPort(port); 852 PortData* data = FindPort(port);
853 RTC_DCHECK(data != NULL); 853 RTC_DCHECK(data != nullptr);
854 // We might have already given up on this port and stopped it. 854 // We might have already given up on this port and stopped it.
855 if (!data->inprogress()) { 855 if (!data->inprogress()) {
856 return; 856 return;
857 } 857 }
858 858
859 // SignalAddressError is currently sent from StunPort/TurnPort. 859 // SignalAddressError is currently sent from StunPort/TurnPort.
860 // But this signal itself is generic. 860 // But this signal itself is generic.
861 data->set_error(); 861 data->set_error();
862 // Send candidate allocation complete signal if this was the last port. 862 // Send candidate allocation complete signal if this was the last port.
863 MaybeSignalCandidatesAllocationDone(); 863 MaybeSignalCandidatesAllocationDone();
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
978 } 978 }
979 979
980 BasicPortAllocatorSession::PortData* BasicPortAllocatorSession::FindPort( 980 BasicPortAllocatorSession::PortData* BasicPortAllocatorSession::FindPort(
981 Port* port) { 981 Port* port) {
982 for (std::vector<PortData>::iterator it = ports_.begin(); 982 for (std::vector<PortData>::iterator it = ports_.begin();
983 it != ports_.end(); ++it) { 983 it != ports_.end(); ++it) {
984 if (it->port() == port) { 984 if (it->port() == port) {
985 return &*it; 985 return &*it;
986 } 986 }
987 } 987 }
988 return NULL; 988 return nullptr;
989 } 989 }
990 990
991 std::vector<BasicPortAllocatorSession::PortData*> 991 std::vector<BasicPortAllocatorSession::PortData*>
992 BasicPortAllocatorSession::GetUnprunedPorts( 992 BasicPortAllocatorSession::GetUnprunedPorts(
993 const std::vector<rtc::Network*>& networks) { 993 const std::vector<rtc::Network*>& networks) {
994 std::vector<PortData*> unpruned_ports; 994 std::vector<PortData*> unpruned_ports;
995 for (PortData& port : ports_) { 995 for (PortData& port : ports_) {
996 if (!port.pruned() && 996 if (!port.pruned() &&
997 std::find(networks.begin(), networks.end(), 997 std::find(networks.begin(), networks.end(),
998 port.sequence()->network()) != networks.end()) { 998 port.sequence()->network()) != networks.end()) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1032 rtc::Network* network, 1032 rtc::Network* network,
1033 PortConfiguration* config, 1033 PortConfiguration* config,
1034 uint32_t flags) 1034 uint32_t flags)
1035 : session_(session), 1035 : session_(session),
1036 network_(network), 1036 network_(network),
1037 ip_(network->GetBestIP()), 1037 ip_(network->GetBestIP()),
1038 config_(config), 1038 config_(config),
1039 state_(kInit), 1039 state_(kInit),
1040 flags_(flags), 1040 flags_(flags),
1041 udp_socket_(), 1041 udp_socket_(),
1042 udp_port_(NULL), 1042 udp_port_(nullptr),
1043 phase_(0) { 1043 phase_(0) {}
1044 }
1045 1044
1046 void AllocationSequence::Init() { 1045 void AllocationSequence::Init() {
1047 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET)) { 1046 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET)) {
1048 udp_socket_.reset(session_->socket_factory()->CreateUdpSocket( 1047 udp_socket_.reset(session_->socket_factory()->CreateUdpSocket(
1049 rtc::SocketAddress(ip_, 0), session_->allocator()->min_port(), 1048 rtc::SocketAddress(ip_, 0), session_->allocator()->min_port(),
1050 session_->allocator()->max_port())); 1049 session_->allocator()->max_port()));
1051 if (udp_socket_) { 1050 if (udp_socket_) {
1052 udp_socket_->SignalReadPacket.connect( 1051 udp_socket_->SignalReadPacket.connect(
1053 this, &AllocationSequence::OnReadPacket); 1052 this, &AllocationSequence::OnReadPacket);
1054 } 1053 }
1055 // Continuing if |udp_socket_| is NULL, as local TCP and RelayPort using TCP 1054 // Continuing if |udp_socket_| is null, as local TCP and RelayPort using TCP
1056 // are next available options to setup a communication channel. 1055 // are next available options to setup a communication channel.
1057 } 1056 }
1058 } 1057 }
1059 1058
1060 void AllocationSequence::Clear() { 1059 void AllocationSequence::Clear() {
1061 udp_port_ = NULL; 1060 udp_port_ = nullptr;
1062 turn_ports_.clear(); 1061 turn_ports_.clear();
1063 } 1062 }
1064 1063
1065 void AllocationSequence::OnNetworkFailed() { 1064 void AllocationSequence::OnNetworkFailed() {
1066 RTC_DCHECK(!network_failed_); 1065 RTC_DCHECK(!network_failed_);
1067 network_failed_ = true; 1066 network_failed_ = true;
1068 // Stop the allocation sequence if its network failed. 1067 // Stop the allocation sequence if its network failed.
1069 Stop(); 1068 Stop();
1070 } 1069 }
1071 1070
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
1188 } 1187 }
1189 1188
1190 void AllocationSequence::CreateUDPPorts() { 1189 void AllocationSequence::CreateUDPPorts() {
1191 if (IsFlagSet(PORTALLOCATOR_DISABLE_UDP)) { 1190 if (IsFlagSet(PORTALLOCATOR_DISABLE_UDP)) {
1192 LOG(LS_VERBOSE) << "AllocationSequence: UDP ports disabled, skipping."; 1191 LOG(LS_VERBOSE) << "AllocationSequence: UDP ports disabled, skipping.";
1193 return; 1192 return;
1194 } 1193 }
1195 1194
1196 // TODO(mallinath) - Remove UDPPort creating socket after shared socket 1195 // TODO(mallinath) - Remove UDPPort creating socket after shared socket
1197 // is enabled completely. 1196 // is enabled completely.
1198 UDPPort* port = NULL; 1197 UDPPort* port = nullptr;
1199 bool emit_local_candidate_for_anyaddress = 1198 bool emit_local_candidate_for_anyaddress =
1200 !IsFlagSet(PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE); 1199 !IsFlagSet(PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE);
1201 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET) && udp_socket_) { 1200 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET) && udp_socket_) {
1202 port = UDPPort::Create( 1201 port = UDPPort::Create(
1203 session_->network_thread(), session_->socket_factory(), network_, 1202 session_->network_thread(), session_->socket_factory(), network_,
1204 udp_socket_.get(), session_->username(), session_->password(), 1203 udp_socket_.get(), session_->username(), session_->password(),
1205 session_->allocator()->origin(), emit_local_candidate_for_anyaddress); 1204 session_->allocator()->origin(), emit_local_candidate_for_anyaddress);
1206 } else { 1205 } else {
1207 port = UDPPort::Create( 1206 port = UDPPort::Create(
1208 session_->network_thread(), session_->socket_factory(), network_, ip_, 1207 session_->network_thread(), session_->socket_factory(), network_, ip_,
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
1337 } 1336 }
1338 // Start fetching an address for this port. 1337 // Start fetching an address for this port.
1339 port->PrepareAddress(); 1338 port->PrepareAddress();
1340 } 1339 }
1341 } 1340 }
1342 1341
1343 void AllocationSequence::CreateTurnPort(const RelayServerConfig& config) { 1342 void AllocationSequence::CreateTurnPort(const RelayServerConfig& config) {
1344 PortList::const_iterator relay_port; 1343 PortList::const_iterator relay_port;
1345 for (relay_port = config.ports.begin(); 1344 for (relay_port = config.ports.begin();
1346 relay_port != config.ports.end(); ++relay_port) { 1345 relay_port != config.ports.end(); ++relay_port) {
1347 TurnPort* port = NULL; 1346 TurnPort* port = nullptr;
1348 1347
1349 // Skip UDP connections to relay servers if it's disallowed. 1348 // Skip UDP connections to relay servers if it's disallowed.
1350 if (IsFlagSet(PORTALLOCATOR_DISABLE_UDP_RELAY) && 1349 if (IsFlagSet(PORTALLOCATOR_DISABLE_UDP_RELAY) &&
1351 relay_port->proto == PROTO_UDP) { 1350 relay_port->proto == PROTO_UDP) {
1352 continue; 1351 continue;
1353 } 1352 }
1354 1353
1355 // Do not create a port if the server address family is known and does 1354 // Do not create a port if the server address family is known and does
1356 // not match the local IP address family. 1355 // not match the local IP address family.
1357 int server_ip_family = relay_port->address.ipaddr().family(); 1356 int server_ip_family = relay_port->address.ipaddr().family();
(...skipping 27 matching lines...) Expand all
1385 port = TurnPort::Create(session_->network_thread(), 1384 port = TurnPort::Create(session_->network_thread(),
1386 session_->socket_factory(), 1385 session_->socket_factory(),
1387 network_, ip_, 1386 network_, ip_,
1388 session_->allocator()->min_port(), 1387 session_->allocator()->min_port(),
1389 session_->allocator()->max_port(), 1388 session_->allocator()->max_port(),
1390 session_->username(), 1389 session_->username(),
1391 session_->password(), 1390 session_->password(),
1392 *relay_port, config.credentials, config.priority, 1391 *relay_port, config.credentials, config.priority,
1393 session_->allocator()->origin()); 1392 session_->allocator()->origin());
1394 } 1393 }
1395 RTC_DCHECK(port != NULL); 1394 RTC_DCHECK(port != nullptr);
1396 port->SetTlsCertPolicy(config.tls_cert_policy); 1395 port->SetTlsCertPolicy(config.tls_cert_policy);
1397 session_->AddAllocatedPort(port, this, true); 1396 session_->AddAllocatedPort(port, this, true);
1398 } 1397 }
1399 } 1398 }
1400 1399
1401 void AllocationSequence::OnReadPacket( 1400 void AllocationSequence::OnReadPacket(
1402 rtc::AsyncPacketSocket* socket, const char* data, size_t size, 1401 rtc::AsyncPacketSocket* socket, const char* data, size_t size,
1403 const rtc::SocketAddress& remote_addr, 1402 const rtc::SocketAddress& remote_addr,
1404 const rtc::PacketTime& packet_time) { 1403 const rtc::PacketTime& packet_time) {
1405 RTC_DCHECK(socket == udp_socket_.get()); 1404 RTC_DCHECK(socket == udp_socket_.get());
(...skipping 25 matching lines...) Expand all
1431 stun_servers.find(remote_addr) != stun_servers.end()) { 1430 stun_servers.find(remote_addr) != stun_servers.end()) {
1432 RTC_DCHECK(udp_port_->SharedSocket()); 1431 RTC_DCHECK(udp_port_->SharedSocket());
1433 udp_port_->HandleIncomingPacket(socket, data, size, remote_addr, 1432 udp_port_->HandleIncomingPacket(socket, data, size, remote_addr,
1434 packet_time); 1433 packet_time);
1435 } 1434 }
1436 } 1435 }
1437 } 1436 }
1438 1437
1439 void AllocationSequence::OnPortDestroyed(PortInterface* port) { 1438 void AllocationSequence::OnPortDestroyed(PortInterface* port) {
1440 if (udp_port_ == port) { 1439 if (udp_port_ == port) {
1441 udp_port_ = NULL; 1440 udp_port_ = nullptr;
1442 return; 1441 return;
1443 } 1442 }
1444 1443
1445 auto it = std::find(turn_ports_.begin(), turn_ports_.end(), port); 1444 auto it = std::find(turn_ports_.begin(), turn_ports_.end(), port);
1446 if (it != turn_ports_.end()) { 1445 if (it != turn_ports_.end()) {
1447 turn_ports_.erase(it); 1446 turn_ports_.erase(it);
1448 } else { 1447 } else {
1449 LOG(LS_ERROR) << "Unexpected OnPortDestroyed for nonexistent port."; 1448 LOG(LS_ERROR) << "Unexpected OnPortDestroyed for nonexistent port.";
1450 RTC_NOTREACHED(); 1449 RTC_NOTREACHED();
1451 } 1450 }
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1517 ServerAddresses servers; 1516 ServerAddresses servers;
1518 for (size_t i = 0; i < relays.size(); ++i) { 1517 for (size_t i = 0; i < relays.size(); ++i) {
1519 if (relays[i].type == turn_type && SupportsProtocol(relays[i], type)) { 1518 if (relays[i].type == turn_type && SupportsProtocol(relays[i], type)) {
1520 servers.insert(relays[i].ports.front().address); 1519 servers.insert(relays[i].ports.front().address);
1521 } 1520 }
1522 } 1521 }
1523 return servers; 1522 return servers;
1524 } 1523 }
1525 1524
1526 } // namespace cricket 1525 } // namespace cricket
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698