// 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_UTILITY_LOCAL_DISCOVERY_SERVICE_DISCOVERY_MESSAGE_HANDLER_H_ #define CHROME_UTILITY_LOCAL_DISCOVERY_SERVICE_DISCOVERY_MESSAGE_HANDLER_H_ #include #include #include "base/memory/linked_ptr.h" #include "chrome/common/local_discovery/service_discovery_client.h" #include "chrome/utility/utility_message_handler.h" struct LocalDiscoveryMsg_SocketInfo; namespace net { class MDnsClient; } namespace base { struct FileDescriptor; class TaskRunner; class Thread; } namespace tracked_objects { class Location; } namespace local_discovery { class ServiceDiscoveryClient; // Handles messages related to local discovery inside utility process. class ServiceDiscoveryMessageHandler : public UtilityMessageHandler { public: ServiceDiscoveryMessageHandler(); virtual ~ServiceDiscoveryMessageHandler(); // UtilityMessageHandler implementation. virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; static void PreSandboxStartup(); private: typedef std::map > ServiceWatchers; typedef std::map > ServiceResolvers; typedef std::map > LocalDomainResolvers; // Lazy initializes ServiceDiscoveryClient. bool InitializeThread(); void PostTask(const tracked_objects::Location& from_here, const base::Closure& task); // IPC message handlers. #if defined(OS_POSIX) void OnSetSockets(const std::vector& sockets); #endif // OS_POSIX void OnStartWatcher(uint64 id, const std::string& service_type); void OnDiscoverServices(uint64 id, bool force_update); void OnSetActivelyRefreshServices(uint64 id, bool actively_refresh_services); void OnDestroyWatcher(uint64 id); void OnResolveService(uint64 id, const std::string& service_name); void OnDestroyResolver(uint64 id); void OnResolveLocalDomain(uint64 id, const std::string& domain, net::AddressFamily address_family); void OnDestroyLocalDomainResolver(uint64 id); void InitializeMdns(); void StartWatcher(uint64 id, const std::string& service_type); void DiscoverServices(uint64 id, bool force_update); void SetActivelyRefreshServices(uint64 id, bool actively_refresh_services); void DestroyWatcher(uint64 id); void ResolveService(uint64 id, const std::string& service_name); void DestroyResolver(uint64 id); void ResolveLocalDomain(uint64 id, const std::string& domain, net::AddressFamily address_family); void DestroyLocalDomainResolver(uint64 id); void ShutdownLocalDiscovery(); void ShutdownOnIOThread(); // Is called by ServiceWatcher as callback. void OnServiceUpdated(uint64 id, ServiceWatcher::UpdateType update, const std::string& name); // Is called by ServiceResolver as callback. void OnServiceResolved(uint64 id, ServiceResolver::RequestStatus status, const ServiceDescription& description); // Is called by LocalDomainResolver as callback. void OnLocalDomainResolved(uint64 id, bool success, const net::IPAddressNumber& address_ipv4, const net::IPAddressNumber& address_ipv6); void Send(IPC::Message* msg); ServiceWatchers service_watchers_; ServiceResolvers service_resolvers_; LocalDomainResolvers local_domain_resolvers_; scoped_ptr mdns_client_; scoped_ptr service_discovery_client_; scoped_refptr utility_task_runner_; scoped_refptr discovery_task_runner_; scoped_ptr discovery_thread_; }; } // namespace local_discovery #endif // CHROME_UTILITY_LOCAL_DISCOVERY_SERVICE_DISCOVERY_MESSAGE_HANDLER_H_