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
3 // found in the LICENSE file.
5 #ifndef CHROME_BROWSER_LOCAL_DISCOVERY_SERVICE_DISCOVERY_HOST_CLIENT_H_
6 #define CHROME_BROWSER_LOCAL_DISCOVERY_SERVICE_DISCOVERY_HOST_CLIENT_H_
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/scoped_vector.h"
14 #include "base/memory/weak_ptr.h"
15 #include "chrome/common/local_discovery/service_discovery_client.h"
16 #include "content/public/browser/utility_process_host_client.h"
18 struct LocalDiscoveryMsg_SocketInfo
;
25 class UtilityProcessHost
;
28 namespace local_discovery
{
31 typedef std::vector
<LocalDiscoveryMsg_SocketInfo
> SocketInfoList
;
34 // Implementation of ServiceDiscoveryClient that delegates all functionality to
36 class ServiceDiscoveryHostClient
37 : public ServiceDiscoveryClient
,
38 public content::UtilityProcessHostClient
{
40 ServiceDiscoveryHostClient();
42 // Starts utility process with ServiceDiscoveryClient.
43 void Start(const base::Closure
& error_callback
);
45 // Shutdowns utility process.
48 // ServiceDiscoveryClient implementation.
49 virtual scoped_ptr
<ServiceWatcher
> CreateServiceWatcher(
50 const std::string
& service_type
,
51 const ServiceWatcher::UpdatedCallback
& callback
) OVERRIDE
;
52 virtual scoped_ptr
<ServiceResolver
> CreateServiceResolver(
53 const std::string
& service_name
,
54 const ServiceResolver::ResolveCompleteCallback
& callback
) OVERRIDE
;
55 virtual scoped_ptr
<LocalDomainResolver
> CreateLocalDomainResolver(
56 const std::string
& domain
,
57 net::AddressFamily address_family
,
58 const LocalDomainResolver::IPAddressCallback
& callback
) OVERRIDE
;
60 // UtilityProcessHostClient implementation.
61 virtual void OnProcessCrashed(int exit_code
) OVERRIDE
;
62 virtual bool OnMessageReceived(const IPC::Message
& message
) OVERRIDE
;
65 virtual ~ServiceDiscoveryHostClient();
68 class ServiceWatcherProxy
;
69 class ServiceResolverProxy
;
70 class LocalDomainResolverProxy
;
71 friend class ServiceDiscoveryClientUtility
;
73 typedef std::map
<uint64
, ServiceWatcher::UpdatedCallback
> WatcherCallbacks
;
74 typedef std::map
<uint64
, ServiceResolver::ResolveCompleteCallback
>
76 typedef std::map
<uint64
, LocalDomainResolver::IPAddressCallback
>
77 DomainResolverCallbacks
;
79 void StartOnIOThread();
80 void ShutdownOnIOThread();
83 void OnSocketsReady(const SocketInfoList
& interfaces
);
86 void InvalidateWatchers();
88 void Send(IPC::Message
* msg
);
89 void SendOnIOThread(IPC::Message
* msg
);
91 uint64
RegisterWatcherCallback(
92 const ServiceWatcher::UpdatedCallback
& callback
);
93 uint64
RegisterResolverCallback(
94 const ServiceResolver::ResolveCompleteCallback
& callback
);
95 uint64
RegisterLocalDomainResolverCallback(
96 const LocalDomainResolver::IPAddressCallback
& callback
);
98 void UnregisterWatcherCallback(uint64 id
);
99 void UnregisterResolverCallback(uint64 id
);
100 void UnregisterLocalDomainResolverCallback(uint64 id
);
102 // IPC Message handlers.
104 void OnWatcherCallback(uint64 id
,
105 ServiceWatcher::UpdateType update
,
106 const std::string
& service_name
);
107 void OnResolverCallback(uint64 id
,
108 ServiceResolver::RequestStatus status
,
109 const ServiceDescription
& description
);
110 void OnLocalDomainResolverCallback(uint64 id
,
112 const net::IPAddressNumber
& address_ipv4
,
113 const net::IPAddressNumber
& address_ipv6
);
116 // Runs watcher callback on owning thread.
117 void RunWatcherCallback(uint64 id
,
118 ServiceWatcher::UpdateType update
,
119 const std::string
& service_name
);
120 // Runs resolver callback on owning thread.
121 void RunResolverCallback(uint64 id
,
122 ServiceResolver::RequestStatus status
,
123 const ServiceDescription
& description
);
124 // Runs local domain resolver callback on owning thread.
125 void RunLocalDomainResolverCallback(uint64 id
,
127 const net::IPAddressNumber
& address_ipv4
,
128 const net::IPAddressNumber
& address_ipv6
);
131 base::WeakPtr
<content::UtilityProcessHost
> utility_host_
;
133 // Incrementing counter to assign ID to watchers and resolvers.
135 base::Closure error_callback_
;
136 WatcherCallbacks service_watcher_callbacks_
;
137 ResolverCallbacks service_resolver_callbacks_
;
138 DomainResolverCallbacks domain_resolver_callbacks_
;
139 scoped_refptr
<base::TaskRunner
> callback_runner_
;
140 scoped_refptr
<base::TaskRunner
> io_runner_
;
141 ScopedVector
<IPC::Message
> delayed_messages_
;
143 DISALLOW_COPY_AND_ASSIGN(ServiceDiscoveryHostClient
);
146 } // namespace local_discovery
148 #endif // CHROME_BROWSER_LOCAL_DISCOVERY_SERVICE_DISCOVERY_HOST_CLIENT_H_