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 chromeos { 14 15 enum ProcessOutputType { 16 PROCESS_OUTPUT_TYPE_OUT, 17 PROCESS_OUTPUT_TYPE_ERR, 18 PROCESS_OUTPUT_TYPE_EXIT 19 }; 20 21 typedef base::Callback<void(ProcessOutputType, const std::string&)> 22 ProcessOutputCallback; 23 24 // Observes output on |out_fd| and invokes |callback| when some output is 25 // detected. It assumes UTF8 output. 26 // If output is detected in |stop_fd|, the watcher is stopped. 27 // This class should live on its own thread because running class makes 28 // underlying thread block. It deletes itself when watching is stopped. 29 class CHROMEOS_EXPORT ProcessOutputWatcher { 30 public: 31 ProcessOutputWatcher(int out_fd, int stop_fd, 32 const ProcessOutputCallback& callback); 33 34 // This will block current thread!!!! 35 void Start(); 36 37 private: 38 // The object will destroy itself when it stops watching process output. 39 ~ProcessOutputWatcher(); 40 41 // Listens to output from supplied fds. It guarantees data written to one fd 42 // will be reported in order that it has been written (this is not true across 43 // fds, it would be nicer if it was). 44 void WatchProcessOutput(); 45 46 // Verifies that fds that we got are properly set. 47 void VerifyFileDescriptor(int fd); 48 49 // Reads data from fd, and when it's done, invokes callback function. 50 void ReadFromFd(ProcessOutputType type, int* fd); 51 52 // Checks if the read buffer has any trailing incomplete UTF8 characters and 53 // returns the read buffer size without them. 54 size_t OutputSizeWithoutIncompleteUTF8(); 55 56 // Processes new |read_buffer_| state and notifies observer about new process 57 // output. 58 void ReportOutput(ProcessOutputType type, size_t new_bytes_count); 59 60 // It will just delete this. 61 void OnStop(); 62 63 char read_buffer_[256]; 64 // Maximum read buffer content size. 65 size_t read_buffer_capacity_; 66 // Current read bufferi content size. 67 size_t read_buffer_size_; 68 69 int out_fd_; 70 int stop_fd_; 71 int max_fd_; 72 73 // Callback that will be invoked when some output is detected. 74 ProcessOutputCallback on_read_callback_; 75 76 DISALLOW_COPY_AND_ASSIGN(ProcessOutputWatcher); 77 }; 78 79 } // namespace chromeos 80 81 #endif // CHROMEOS_PROCESS_PROXY_PROCESS_OUTPUT_WATCHER_H_ 82