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