158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file. 458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_MDNS_DNS_SD_REGISTRY_H_ 658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_MDNS_DNS_SD_REGISTRY_H_ 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <map> 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <string> 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <utility> 1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <vector> 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/linked_ptr.h" 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/observer_list.h" 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/api/mdns/dns_sd_delegate.h" 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace local_discovery { 19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class ServiceDiscoverySharedClient; 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class ServiceDiscoveryClient; 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace extensions { 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class DnsSdDeviceLister; 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class ServiceTypeData; 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Registry class for keeping track of discovered network services over DNS-SD. 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class DnsSdRegistry : public DnsSdDelegate { 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) typedef std::vector<DnsSdService> DnsSdServiceList; 3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) class DnsSdObserver { 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void OnDnsSdEvent(const std::string& service_type, 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const DnsSdServiceList& services) = 0; 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~DnsSdObserver() {} 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdRegistry(); 43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) explicit DnsSdRegistry(local_discovery::ServiceDiscoverySharedClient* client); 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~DnsSdRegistry(); 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Observer registration for parties interested in discovery events. 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void AddObserver(DnsSdObserver* observer); 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void RemoveObserver(DnsSdObserver* observer); 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // DNS-SD-related discovery functionality. 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void RegisterDnsSdListener(std::string service_type); 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void UnregisterDnsSdListener(std::string service_type); 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Data class for managing all the resources and information related to a 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // particular service type. 5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) class ServiceTypeData { 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) explicit ServiceTypeData(scoped_ptr<DnsSdDeviceLister> lister); 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~ServiceTypeData(); 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Notify the data class of listeners so that it can be reference counted. 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void ListenerAdded(); 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Returns true if the last listener was removed. 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool ListenerRemoved(); 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int GetListenerCount(); 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Methods for adding, updating or removing services for this service type. 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool UpdateService(bool added, const DnsSdService& service); 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool RemoveService(const std::string& service_name); 718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool ClearServices(); 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const DnsSdRegistry::DnsSdServiceList& GetServiceList(); 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int ref_count; 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<DnsSdDeviceLister> lister_; 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdRegistry::DnsSdServiceList service_list_; 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ServiceTypeData); 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Maps service types to associated data such as listers and service lists. 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) typedef std::map<std::string, linked_ptr<ServiceTypeData> > 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdServiceTypeDataMap; 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual DnsSdDeviceLister* CreateDnsSdDeviceLister( 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdDelegate* delegate, 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& service_type, 89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) local_discovery::ServiceDiscoverySharedClient* discovery_client); 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // DnsSdDelegate implementation: 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void ServiceChanged(const std::string& service_type, 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool added, 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const DnsSdService& service) OVERRIDE; 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void ServiceRemoved(const std::string& service_type, 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& service_name) OVERRIDE; 978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void ServicesFlushed(const std::string& service_type) OVERRIDE; 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdServiceTypeDataMap service_data_map_; 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void DispatchApiEvent(const std::string& service_type); 1038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool IsRegistered(const std::string& service_type); 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_refptr<local_discovery::ServiceDiscoverySharedClient> 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service_discovery_client_; 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ObserverList<DnsSdObserver> observers_; 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DnsSdRegistry); 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace extensions 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_API_MDNS_DNS_SD_REGISTRY_H_ 115