| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "net/dns/mdns_client_impl.h" | 5 #include "net/dns/mdns_client_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <queue> | 8 #include <queue> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 208 } | 208 } |
| 209 | 209 |
| 210 MDnsClientImpl::Core::~Core() { | 210 MDnsClientImpl::Core::~Core() { |
| 211 STLDeleteValues(&listeners_); | 211 STLDeleteValues(&listeners_); |
| 212 } | 212 } |
| 213 | 213 |
| 214 bool MDnsClientImpl::Core::Init(MDnsSocketFactory* socket_factory) { | 214 bool MDnsClientImpl::Core::Init(MDnsSocketFactory* socket_factory) { |
| 215 return connection_->Init(socket_factory); | 215 return connection_->Init(socket_factory); |
| 216 } | 216 } |
| 217 | 217 |
| 218 bool MDnsClientImpl::Core::SendQuery(uint16 rrtype, const std::string& name) { | 218 bool MDnsClientImpl::Core::SendQuery(uint16_t rrtype, const std::string& name) { |
| 219 std::string name_dns; | 219 std::string name_dns; |
| 220 if (!DNSDomainFromDot(name, &name_dns)) | 220 if (!DNSDomainFromDot(name, &name_dns)) |
| 221 return false; | 221 return false; |
| 222 | 222 |
| 223 DnsQuery query(0, name_dns, rrtype); | 223 DnsQuery query(0, name_dns, rrtype); |
| 224 query.set_flags(0); // Remove the RD flag from the query. It is unneeded. | 224 query.set_flags(0); // Remove the RD flag from the query. It is unneeded. |
| 225 | 225 |
| 226 connection_->Send(query.io_buffer(), query.io_buffer()->size()); | 226 connection_->Send(query.io_buffer(), query.io_buffer()->size()); |
| 227 return true; | 227 return true; |
| 228 } | 228 } |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 414 ScheduleCleanup(cache_.next_expiration()); | 414 ScheduleCleanup(cache_.next_expiration()); |
| 415 } | 415 } |
| 416 | 416 |
| 417 void MDnsClientImpl::Core::OnRecordRemoved( | 417 void MDnsClientImpl::Core::OnRecordRemoved( |
| 418 const RecordParsed* record) { | 418 const RecordParsed* record) { |
| 419 AlertListeners(MDnsCache::RecordRemoved, | 419 AlertListeners(MDnsCache::RecordRemoved, |
| 420 ListenerKey(record->name(), record->type()), record); | 420 ListenerKey(record->name(), record->type()), record); |
| 421 } | 421 } |
| 422 | 422 |
| 423 void MDnsClientImpl::Core::QueryCache( | 423 void MDnsClientImpl::Core::QueryCache( |
| 424 uint16 rrtype, const std::string& name, | 424 uint16_t rrtype, |
| 425 const std::string& name, |
| 425 std::vector<const RecordParsed*>* records) const { | 426 std::vector<const RecordParsed*>* records) const { |
| 426 cache_.FindDnsRecords(rrtype, name, records, clock_->Now()); | 427 cache_.FindDnsRecords(rrtype, name, records, clock_->Now()); |
| 427 } | 428 } |
| 428 | 429 |
| 429 MDnsClientImpl::MDnsClientImpl() | 430 MDnsClientImpl::MDnsClientImpl() |
| 430 : clock_(new base::DefaultClock), | 431 : clock_(new base::DefaultClock), |
| 431 cleanup_timer_(new base::Timer(false, false)) { | 432 cleanup_timer_(new base::Timer(false, false)) { |
| 432 } | 433 } |
| 433 | 434 |
| 434 MDnsClientImpl::MDnsClientImpl(scoped_ptr<base::Clock> clock, | 435 MDnsClientImpl::MDnsClientImpl(scoped_ptr<base::Clock> clock, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 451 | 452 |
| 452 void MDnsClientImpl::StopListening() { | 453 void MDnsClientImpl::StopListening() { |
| 453 core_.reset(); | 454 core_.reset(); |
| 454 } | 455 } |
| 455 | 456 |
| 456 bool MDnsClientImpl::IsListening() const { | 457 bool MDnsClientImpl::IsListening() const { |
| 457 return core_.get() != NULL; | 458 return core_.get() != NULL; |
| 458 } | 459 } |
| 459 | 460 |
| 460 scoped_ptr<MDnsListener> MDnsClientImpl::CreateListener( | 461 scoped_ptr<MDnsListener> MDnsClientImpl::CreateListener( |
| 461 uint16 rrtype, | 462 uint16_t rrtype, |
| 462 const std::string& name, | 463 const std::string& name, |
| 463 MDnsListener::Delegate* delegate) { | 464 MDnsListener::Delegate* delegate) { |
| 464 return scoped_ptr<MDnsListener>( | 465 return scoped_ptr<MDnsListener>( |
| 465 new MDnsListenerImpl(rrtype, name, clock_.get(), delegate, this)); | 466 new MDnsListenerImpl(rrtype, name, clock_.get(), delegate, this)); |
| 466 } | 467 } |
| 467 | 468 |
| 468 scoped_ptr<MDnsTransaction> MDnsClientImpl::CreateTransaction( | 469 scoped_ptr<MDnsTransaction> MDnsClientImpl::CreateTransaction( |
| 469 uint16 rrtype, | 470 uint16_t rrtype, |
| 470 const std::string& name, | 471 const std::string& name, |
| 471 int flags, | 472 int flags, |
| 472 const MDnsTransaction::ResultCallback& callback) { | 473 const MDnsTransaction::ResultCallback& callback) { |
| 473 return scoped_ptr<MDnsTransaction>( | 474 return scoped_ptr<MDnsTransaction>( |
| 474 new MDnsTransactionImpl(rrtype, name, flags, callback, this)); | 475 new MDnsTransactionImpl(rrtype, name, flags, callback, this)); |
| 475 } | 476 } |
| 476 | 477 |
| 477 MDnsListenerImpl::MDnsListenerImpl(uint16 rrtype, | 478 MDnsListenerImpl::MDnsListenerImpl(uint16_t rrtype, |
| 478 const std::string& name, | 479 const std::string& name, |
| 479 base::Clock* clock, | 480 base::Clock* clock, |
| 480 MDnsListener::Delegate* delegate, | 481 MDnsListener::Delegate* delegate, |
| 481 MDnsClientImpl* client) | 482 MDnsClientImpl* client) |
| 482 : rrtype_(rrtype), | 483 : rrtype_(rrtype), |
| 483 name_(name), | 484 name_(name), |
| 484 clock_(clock), | 485 clock_(clock), |
| 485 client_(client), | 486 client_(client), |
| 486 delegate_(delegate), | 487 delegate_(delegate), |
| 487 started_(false), | 488 started_(false), |
| 488 active_refresh_(false) { | 489 active_refresh_(false) {} |
| 489 } | |
| 490 | 490 |
| 491 MDnsListenerImpl::~MDnsListenerImpl() { | 491 MDnsListenerImpl::~MDnsListenerImpl() { |
| 492 if (started_) { | 492 if (started_) { |
| 493 DCHECK(client_->core()); | 493 DCHECK(client_->core()); |
| 494 client_->core()->RemoveListener(this); | 494 client_->core()->RemoveListener(this); |
| 495 } | 495 } |
| 496 } | 496 } |
| 497 | 497 |
| 498 bool MDnsListenerImpl::Start() { | 498 bool MDnsListenerImpl::Start() { |
| 499 DCHECK(!started_); | 499 DCHECK(!started_); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 515 } else if (last_update_ != base::Time()) { | 515 } else if (last_update_ != base::Time()) { |
| 516 ScheduleNextRefresh(); | 516 ScheduleNextRefresh(); |
| 517 } | 517 } |
| 518 } | 518 } |
| 519 } | 519 } |
| 520 | 520 |
| 521 const std::string& MDnsListenerImpl::GetName() const { | 521 const std::string& MDnsListenerImpl::GetName() const { |
| 522 return name_; | 522 return name_; |
| 523 } | 523 } |
| 524 | 524 |
| 525 uint16 MDnsListenerImpl::GetType() const { | 525 uint16_t MDnsListenerImpl::GetType() const { |
| 526 return rrtype_; | 526 return rrtype_; |
| 527 } | 527 } |
| 528 | 528 |
| 529 void MDnsListenerImpl::HandleRecordUpdate(MDnsCache::UpdateType update_type, | 529 void MDnsListenerImpl::HandleRecordUpdate(MDnsCache::UpdateType update_type, |
| 530 const RecordParsed* record) { | 530 const RecordParsed* record) { |
| 531 DCHECK(started_); | 531 DCHECK(started_); |
| 532 | 532 |
| 533 if (update_type != MDnsCache::RecordRemoved) { | 533 if (update_type != MDnsCache::RecordRemoved) { |
| 534 ttl_ = record->ttl(); | 534 ttl_ = record->ttl(); |
| 535 last_update_ = record->time_created(); | 535 last_update_ = record->time_created(); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 598 | 598 |
| 599 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 599 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| 600 FROM_HERE, next_refresh_.callback(), next_refresh2 - clock_->Now()); | 600 FROM_HERE, next_refresh_.callback(), next_refresh2 - clock_->Now()); |
| 601 } | 601 } |
| 602 | 602 |
| 603 void MDnsListenerImpl::DoRefresh() { | 603 void MDnsListenerImpl::DoRefresh() { |
| 604 client_->core()->SendQuery(rrtype_, name_); | 604 client_->core()->SendQuery(rrtype_, name_); |
| 605 } | 605 } |
| 606 | 606 |
| 607 MDnsTransactionImpl::MDnsTransactionImpl( | 607 MDnsTransactionImpl::MDnsTransactionImpl( |
| 608 uint16 rrtype, | 608 uint16_t rrtype, |
| 609 const std::string& name, | 609 const std::string& name, |
| 610 int flags, | 610 int flags, |
| 611 const MDnsTransaction::ResultCallback& callback, | 611 const MDnsTransaction::ResultCallback& callback, |
| 612 MDnsClientImpl* client) | 612 MDnsClientImpl* client) |
| 613 : rrtype_(rrtype), name_(name), callback_(callback), client_(client), | 613 : rrtype_(rrtype), |
| 614 started_(false), flags_(flags) { | 614 name_(name), |
| 615 callback_(callback), |
| 616 client_(client), |
| 617 started_(false), |
| 618 flags_(flags) { |
| 615 DCHECK((flags_ & MDnsTransaction::FLAG_MASK) == flags_); | 619 DCHECK((flags_ & MDnsTransaction::FLAG_MASK) == flags_); |
| 616 DCHECK(flags_ & MDnsTransaction::QUERY_CACHE || | 620 DCHECK(flags_ & MDnsTransaction::QUERY_CACHE || |
| 617 flags_ & MDnsTransaction::QUERY_NETWORK); | 621 flags_ & MDnsTransaction::QUERY_NETWORK); |
| 618 } | 622 } |
| 619 | 623 |
| 620 MDnsTransactionImpl::~MDnsTransactionImpl() { | 624 MDnsTransactionImpl::~MDnsTransactionImpl() { |
| 621 timeout_.Cancel(); | 625 timeout_.Cancel(); |
| 622 } | 626 } |
| 623 | 627 |
| 624 bool MDnsTransactionImpl::Start() { | 628 bool MDnsTransactionImpl::Start() { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 639 // If this is a cache only query, signal that the transaction is over | 643 // If this is a cache only query, signal that the transaction is over |
| 640 // immediately. | 644 // immediately. |
| 641 SignalTransactionOver(); | 645 SignalTransactionOver(); |
| 642 return true; | 646 return true; |
| 643 } | 647 } |
| 644 | 648 |
| 645 const std::string& MDnsTransactionImpl::GetName() const { | 649 const std::string& MDnsTransactionImpl::GetName() const { |
| 646 return name_; | 650 return name_; |
| 647 } | 651 } |
| 648 | 652 |
| 649 uint16 MDnsTransactionImpl::GetType() const { | 653 uint16_t MDnsTransactionImpl::GetType() const { |
| 650 return rrtype_; | 654 return rrtype_; |
| 651 } | 655 } |
| 652 | 656 |
| 653 void MDnsTransactionImpl::CacheRecordFound(const RecordParsed* record) { | 657 void MDnsTransactionImpl::CacheRecordFound(const RecordParsed* record) { |
| 654 DCHECK(started_); | 658 DCHECK(started_); |
| 655 OnRecordUpdate(MDnsListener::RECORD_ADDED, record); | 659 OnRecordUpdate(MDnsListener::RECORD_ADDED, record); |
| 656 } | 660 } |
| 657 | 661 |
| 658 void MDnsTransactionImpl::TriggerCallback(MDnsTransaction::Result result, | 662 void MDnsTransactionImpl::TriggerCallback(MDnsTransaction::Result result, |
| 659 const RecordParsed* record) { | 663 const RecordParsed* record) { |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 744 | 748 |
| 745 void MDnsTransactionImpl::OnNsecRecord(const std::string& name, unsigned type) { | 749 void MDnsTransactionImpl::OnNsecRecord(const std::string& name, unsigned type) { |
| 746 TriggerCallback(RESULT_NSEC, NULL); | 750 TriggerCallback(RESULT_NSEC, NULL); |
| 747 } | 751 } |
| 748 | 752 |
| 749 void MDnsTransactionImpl::OnCachePurged() { | 753 void MDnsTransactionImpl::OnCachePurged() { |
| 750 // TODO(noamsml): Cache purge situations not yet implemented | 754 // TODO(noamsml): Cache purge situations not yet implemented |
| 751 } | 755 } |
| 752 | 756 |
| 753 } // namespace net | 757 } // namespace net |
| OLD | NEW |