| OLD | NEW | 
|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <utility> | 5 #include <utility> | 
| 6 | 6 | 
| 7 #include "base/location.h" | 7 #include "base/location.h" | 
| 8 #include "base/logging.h" | 8 #include "base/logging.h" | 
| 9 #include "base/memory/singleton.h" | 9 #include "base/memory/singleton.h" | 
| 10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" | 
| (...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 428 } | 428 } | 
| 429 | 429 | 
| 430 void ServiceResolverImpl::ARecordTransactionResponse( | 430 void ServiceResolverImpl::ARecordTransactionResponse( | 
| 431     net::MDnsTransaction::Result status, const net::RecordParsed* record) { | 431     net::MDnsTransaction::Result status, const net::RecordParsed* record) { | 
| 432   a_transaction_.reset(); | 432   a_transaction_.reset(); | 
| 433 | 433 | 
| 434   if (status == net::MDnsTransaction::RESULT_RECORD) { | 434   if (status == net::MDnsTransaction::RESULT_RECORD) { | 
| 435     DCHECK(record); | 435     DCHECK(record); | 
| 436     service_staging_.ip_address = RecordToIPAddress(record); | 436     service_staging_.ip_address = RecordToIPAddress(record); | 
| 437   } else { | 437   } else { | 
| 438     service_staging_.ip_address = net::IPAddress(); | 438     service_staging_.ip_address = net::IPAddressNumber(); | 
| 439   } | 439   } | 
| 440 | 440 | 
| 441   address_resolved_ = true; | 441   address_resolved_ = true; | 
| 442   AlertCallbackIfReady(); | 442   AlertCallbackIfReady(); | 
| 443 } | 443 } | 
| 444 | 444 | 
| 445 void ServiceResolverImpl::AlertCallbackIfReady() { | 445 void ServiceResolverImpl::AlertCallbackIfReady() { | 
| 446   if (metadata_resolved_ && address_resolved_) { | 446   if (metadata_resolved_ && address_resolved_) { | 
| 447     txt_transaction_.reset(); | 447     txt_transaction_.reset(); | 
| 448     srv_transaction_.reset(); | 448     srv_transaction_.reset(); | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 486 } | 486 } | 
| 487 | 487 | 
| 488 net::HostPortPair ServiceResolverImpl::RecordToAddress( | 488 net::HostPortPair ServiceResolverImpl::RecordToAddress( | 
| 489     const net::RecordParsed* record) const { | 489     const net::RecordParsed* record) const { | 
| 490   DCHECK(record->type() == net::dns_protocol::kTypeSRV); | 490   DCHECK(record->type() == net::dns_protocol::kTypeSRV); | 
| 491   const net::SrvRecordRdata* srv_rdata = record->rdata<net::SrvRecordRdata>(); | 491   const net::SrvRecordRdata* srv_rdata = record->rdata<net::SrvRecordRdata>(); | 
| 492   DCHECK(srv_rdata); | 492   DCHECK(srv_rdata); | 
| 493   return net::HostPortPair(srv_rdata->target(), srv_rdata->port()); | 493   return net::HostPortPair(srv_rdata->target(), srv_rdata->port()); | 
| 494 } | 494 } | 
| 495 | 495 | 
| 496 net::IPAddress ServiceResolverImpl::RecordToIPAddress( | 496 const net::IPAddressNumber& ServiceResolverImpl::RecordToIPAddress( | 
| 497     const net::RecordParsed* record) const { | 497     const net::RecordParsed* record) const { | 
| 498   DCHECK(record->type() == net::dns_protocol::kTypeA); | 498   DCHECK(record->type() == net::dns_protocol::kTypeA); | 
| 499   const net::ARecordRdata* a_rdata = record->rdata<net::ARecordRdata>(); | 499   const net::ARecordRdata* a_rdata = record->rdata<net::ARecordRdata>(); | 
| 500   DCHECK(a_rdata); | 500   DCHECK(a_rdata); | 
| 501   return net::IPAddress(a_rdata->address()); | 501   return a_rdata->address(); | 
| 502 } | 502 } | 
| 503 | 503 | 
| 504 LocalDomainResolverImpl::LocalDomainResolverImpl( | 504 LocalDomainResolverImpl::LocalDomainResolverImpl( | 
| 505     const std::string& domain, | 505     const std::string& domain, | 
| 506     net::AddressFamily address_family, | 506     net::AddressFamily address_family, | 
| 507     const IPAddressCallback& callback, | 507     const IPAddressCallback& callback, | 
| 508     net::MDnsClient* mdns_client) | 508     net::MDnsClient* mdns_client) | 
| 509     : domain_(domain), address_family_(address_family), callback_(callback), | 509     : domain_(domain), address_family_(address_family), callback_(callback), | 
| 510       transactions_finished_(0), mdns_client_(mdns_client) { | 510       transactions_finished_(0), mdns_client_(mdns_client) { | 
| 511 } | 511 } | 
| (...skipping 26 matching lines...) Expand all  Loading... | 
| 538                  base::Unretained(this))); | 538                  base::Unretained(this))); | 
| 539 } | 539 } | 
| 540 | 540 | 
| 541 void LocalDomainResolverImpl::OnTransactionComplete( | 541 void LocalDomainResolverImpl::OnTransactionComplete( | 
| 542     net::MDnsTransaction::Result result, const net::RecordParsed* record) { | 542     net::MDnsTransaction::Result result, const net::RecordParsed* record) { | 
| 543   transactions_finished_++; | 543   transactions_finished_++; | 
| 544 | 544 | 
| 545   if (result == net::MDnsTransaction::RESULT_RECORD) { | 545   if (result == net::MDnsTransaction::RESULT_RECORD) { | 
| 546     if (record->type() == net::dns_protocol::kTypeA) { | 546     if (record->type() == net::dns_protocol::kTypeA) { | 
| 547       const net::ARecordRdata* rdata = record->rdata<net::ARecordRdata>(); | 547       const net::ARecordRdata* rdata = record->rdata<net::ARecordRdata>(); | 
| 548       address_ipv4_ = net::IPAddress(rdata->address()); | 548       address_ipv4_ = rdata->address(); | 
| 549     } else { | 549     } else { | 
| 550       DCHECK_EQ(net::dns_protocol::kTypeAAAA, record->type()); | 550       DCHECK_EQ(net::dns_protocol::kTypeAAAA, record->type()); | 
| 551       const net::AAAARecordRdata* rdata = record->rdata<net::AAAARecordRdata>(); | 551       const net::AAAARecordRdata* rdata = record->rdata<net::AAAARecordRdata>(); | 
| 552       address_ipv6_ = net::IPAddress(rdata->address()); | 552       address_ipv6_ = rdata->address(); | 
| 553     } | 553     } | 
| 554   } | 554   } | 
| 555 | 555 | 
| 556   if (transactions_finished_ == 1 && | 556   if (transactions_finished_ == 1 && | 
| 557       address_family_ == net::ADDRESS_FAMILY_UNSPECIFIED) { | 557       address_family_ == net::ADDRESS_FAMILY_UNSPECIFIED) { | 
| 558     timeout_callback_.Reset(base::Bind( | 558     timeout_callback_.Reset(base::Bind( | 
| 559         &LocalDomainResolverImpl::SendResolvedAddresses, | 559         &LocalDomainResolverImpl::SendResolvedAddresses, | 
| 560         base::Unretained(this))); | 560         base::Unretained(this))); | 
| 561 | 561 | 
| 562     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 562     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 
| 563         FROM_HERE, timeout_callback_.callback(), | 563         FROM_HERE, timeout_callback_.callback(), | 
| 564         base::TimeDelta::FromMilliseconds(kLocalDomainSecondAddressTimeoutMs)); | 564         base::TimeDelta::FromMilliseconds(kLocalDomainSecondAddressTimeoutMs)); | 
| 565   } else if (transactions_finished_ == 2 | 565   } else if (transactions_finished_ == 2 | 
| 566       || address_family_ != net::ADDRESS_FAMILY_UNSPECIFIED) { | 566       || address_family_ != net::ADDRESS_FAMILY_UNSPECIFIED) { | 
| 567     SendResolvedAddresses(); | 567     SendResolvedAddresses(); | 
| 568   } | 568   } | 
| 569 } | 569 } | 
| 570 | 570 | 
| 571 bool LocalDomainResolverImpl::IsSuccess() { | 571 bool LocalDomainResolverImpl::IsSuccess() { | 
| 572   return address_ipv4_.IsValid() || address_ipv6_.IsValid(); | 572   return !address_ipv4_.empty() || !address_ipv6_.empty(); | 
| 573 } | 573 } | 
| 574 | 574 | 
| 575 void LocalDomainResolverImpl::SendResolvedAddresses() { | 575 void LocalDomainResolverImpl::SendResolvedAddresses() { | 
| 576   transaction_a_.reset(); | 576   transaction_a_.reset(); | 
| 577   transaction_aaaa_.reset(); | 577   transaction_aaaa_.reset(); | 
| 578   timeout_callback_.Cancel(); | 578   timeout_callback_.Cancel(); | 
| 579   callback_.Run(IsSuccess(), address_ipv4_, address_ipv6_); | 579   callback_.Run(IsSuccess(), address_ipv4_, address_ipv6_); | 
| 580 } | 580 } | 
| 581 | 581 | 
| 582 }  // namespace local_discovery | 582 }  // namespace local_discovery | 
| OLD | NEW | 
|---|