blob: 7b335b152b5ae73140ea8b6767b8125e0cab4030 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_LOCAL_DISCOVERY_SERVICE_DISCOVERY_HOST_CLIENT_H_
#define CHROME_BROWSER_LOCAL_DISCOVERY_SERVICE_DISCOVERY_HOST_CLIENT_H_
#include <map>
#include <string>
#include "chrome/common/local_discovery/service_discovery_client.h"
#include "content/public/browser/utility_process_host_client.h"
namespace base {
class TaskRunner;
}
namespace content {
class UtilityProcessHost;
}
namespace local_discovery {
// Implementation of ServiceDiscoveryClient that delegates all functionality to
// utility process.
class ServiceDiscoveryHostClient
: public ServiceDiscoveryClient,
public content::UtilityProcessHostClient {
public:
ServiceDiscoveryHostClient();
// Starts utility process with ServiceDiscoveryClient.
void Start(const base::Closure& error_callback);
// Shutdowns utility process.
void Shutdown();
// ServiceDiscoveryClient implementation.
virtual scoped_ptr<ServiceWatcher> CreateServiceWatcher(
const std::string& service_type,
const ServiceWatcher::UpdatedCallback& callback) OVERRIDE;
virtual scoped_ptr<ServiceResolver> CreateServiceResolver(
const std::string& service_name,
const ServiceResolver::ResolveCompleteCallback& callback) OVERRIDE;
virtual scoped_ptr<LocalDomainResolver> CreateLocalDomainResolver(
const std::string& domain,
net::AddressFamily address_family,
const LocalDomainResolver::IPAddressCallback& callback) OVERRIDE;
// UtilityProcessHostClient implementation.
virtual void OnProcessCrashed(int exit_code) OVERRIDE;
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
protected:
virtual ~ServiceDiscoveryHostClient();
private:
class ServiceWatcherProxy;
class ServiceResolverProxy;
class LocalDomainResolverProxy;
friend class ServiceDiscoveryClientMdns;
typedef std::map<uint64, ServiceWatcher::UpdatedCallback> WatcherCallbacks;
typedef std::map<uint64, ServiceResolver::ResolveCompleteCallback>
ResolverCallbacks;
typedef std::map<uint64, LocalDomainResolver::IPAddressCallback>
DomainResolverCallbacks;
void StartOnIOThread();
void ShutdownOnIOThread();
void InvalidateWatchers();
void Send(IPC::Message* msg);
void SendOnIOThread(IPC::Message* msg);
uint64 RegisterWatcherCallback(
const ServiceWatcher::UpdatedCallback& callback);
uint64 RegisterResolverCallback(
const ServiceResolver::ResolveCompleteCallback& callback);
uint64 RegisterLocalDomainResolverCallback(
const LocalDomainResolver::IPAddressCallback& callback);
void UnregisterWatcherCallback(uint64 id);
void UnregisterResolverCallback(uint64 id);
void UnregisterLocalDomainResolverCallback(uint64 id);
// IPC Message handlers.
void OnError();
void OnWatcherCallback(uint64 id,
ServiceWatcher::UpdateType update,
const std::string& service_name);
void OnResolverCallback(uint64 id,
ServiceResolver::RequestStatus status,
const ServiceDescription& description);
void OnLocalDomainResolverCallback(uint64 id,
bool success,
const net::IPAddressNumber& address_ipv4,
const net::IPAddressNumber& address_ipv6);
// Runs watcher callback on owning thread.
void RunWatcherCallback(uint64 id,
ServiceWatcher::UpdateType update,
const std::string& service_name);
// Runs resolver callback on owning thread.
void RunResolverCallback(uint64 id,
ServiceResolver::RequestStatus status,
const ServiceDescription& description);
// Runs local domain resolver callback on owning thread.
void RunLocalDomainResolverCallback(uint64 id,
bool success,
const net::IPAddressNumber& address_ipv4,
const net::IPAddressNumber& address_ipv6);
base::WeakPtr<content::UtilityProcessHost> utility_host_;
// Incrementing counter to assign ID to watchers and resolvers.
uint64 current_id_;
base::Closure error_callback_;
WatcherCallbacks service_watcher_callbacks_;
ResolverCallbacks service_resolver_callbacks_;
DomainResolverCallbacks domain_resolver_callbacks_;
scoped_refptr<base::TaskRunner> callback_runner_;
scoped_refptr<base::TaskRunner> io_runner_;
DISALLOW_COPY_AND_ASSIGN(ServiceDiscoveryHostClient);
};
} // namespace local_discovery
#endif // CHROME_BROWSER_LOCAL_DISCOVERY_SERVICE_DISCOVERY_HOST_CLIENT_H_