// Copyright (c) 2012 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 CHROMEOS_PROCESS_PROXY_PROCESS_PROXY_REGISTRY_H_ #define CHROMEOS_PROCESS_PROXY_PROCESS_PROXY_REGISTRY_H_ #include #include #include "base/callback.h" #include "base/lazy_instance.h" #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/threading/non_thread_safe.h" #include "base/threading/thread.h" #include "chromeos/chromeos_export.h" #include "chromeos/process_proxy/process_proxy.h" namespace chromeos { // Keeps track of all created ProcessProxies. It is created lazily and should // live on a single thread (where all methods must be called). class CHROMEOS_EXPORT ProcessProxyRegistry : public base::NonThreadSafe { public: using OutputCallback = base::Callback; // Info we need about a ProcessProxy instance. struct ProcessProxyInfo { scoped_refptr proxy; OutputCallback callback; ProcessProxyInfo(); // This is to make map::insert happy, we don't init anything. ProcessProxyInfo(const ProcessProxyInfo& other); ~ProcessProxyInfo(); }; static ProcessProxyRegistry* Get(); // Starts new ProcessProxy (which starts new process). // Returns ID used for the created process. Returns -1 on failure. int OpenProcess(const std::string& command, const OutputCallback& callback); // Sends data to the process identified by |id|. bool SendInput(int id, const std::string& data); // Stops the process identified by |id|. bool CloseProcess(int id); // Reports terminal resize to process proxy. bool OnTerminalResize(int id, int width, int height); // Notifies process proxy identified by |id| that previously reported output // has been handled. void AckOutput(int id); // Shuts down registry, closing all associated processed. void ShutDown(); private: friend struct ::base::DefaultLazyInstanceTraits; ProcessProxyRegistry(); ~ProcessProxyRegistry(); // Gets called when output gets detected. void OnProcessOutput(int id, ProcessOutputType type, const std::string& data); bool EnsureWatcherThreadStarted(); // Map of all existing ProcessProxies. std::map proxy_map_; scoped_ptr watcher_thread_; DISALLOW_COPY_AND_ASSIGN(ProcessProxyRegistry); }; } // namespace chromeos #endif // CHROMEOS_PROCESS_PROXY_PROCESS_PROXY_REGISTRY_H_