Home | History | Annotate | Download | only in process_proxy
      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