1 // Copyright (c) 2012 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. 4 5 #ifndef CHROMEOS_PROCESS_PROXY_PROCESS_OUTPUT_WATCHER_H_ 6 #define CHROMEOS_PROCESS_PROXY_PROCESS_OUTPUT_WATCHER_H_ 7 8 #include <string> 9 10 #include "base/callback.h" 11 #include "chromeos/chromeos_export.h" 12 13 namespace { 14 15 const int kReadBufferSize = 256; 16 17 } // namespace 18 19 namespace chromeos { 20 21 enum ProcessOutputType { 22 PROCESS_OUTPUT_TYPE_OUT, 23 PROCESS_OUTPUT_TYPE_ERR, 24 PROCESS_OUTPUT_TYPE_EXIT 25 }; 26 27 typedef base::Callback<void(ProcessOutputType, const std::string&)> 28 ProcessOutputCallback; 29 30 // This class should live on its own thread because running class makes 31 // underlying thread block. It deletes itself when watching is stopped. 32 class CHROMEOS_EXPORT ProcessOutputWatcher { 33 public: 34 ProcessOutputWatcher(int out_fd, int stop_fd, 35 const ProcessOutputCallback& callback); 36 37 // This will block current thread!!!! 38 void Start(); 39 40 private: 41 // The object will destroy itself when it stops watching process output. 42 ~ProcessOutputWatcher(); 43 44 // Listens to output from supplied fds. It guarantees data written to one fd 45 // will be reported in order that it has been written (this is not true across 46 // fds, it would be nicer if it was). 47 void WatchProcessOutput(); 48 49 // Verifies that fds that we got are properly set. 50 void VerifyFileDescriptor(int fd); 51 52 // Reads data from fd, and when it's done, invokes callback function. 53 void ReadFromFd(ProcessOutputType type, int* fd); 54 55 // It will just delete this. 56 void OnStop(); 57 58 char read_buffer_[kReadBufferSize]; 59 ssize_t read_buffer_size_; 60 61 int out_fd_; 62 int stop_fd_; 63 int max_fd_; 64 65 // Callback that will be invoked when some output is detected. 66 ProcessOutputCallback on_read_callback_; 67 68 DISALLOW_COPY_AND_ASSIGN(ProcessOutputWatcher); 69 }; 70 71 } // namespace chromeos 72 73 #endif // CHROMEOS_PROCESS_PROXY_PROCESS_OUTPUT_WATCHER_H_ 74