C++程序  |  81行  |  2.4 KB

// 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 MOJO_PUBLIC_BINDINGS_LIB_CONNECTOR_H_
#define MOJO_PUBLIC_BINDINGS_LIB_CONNECTOR_H_

#include "mojo/public/bindings/lib/bindings_support.h"
#include "mojo/public/bindings/lib/message.h"
#include "mojo/public/bindings/lib/message_queue.h"
#include "mojo/public/system/core_cpp.h"

namespace mojo {
namespace internal {

// The Connector class is responsible for performing read/write operations on a
// MessagePipe. It writes messages it receives through the MessageReceiver
// interface that it subclasses, and it forwards messages it reads through the
// MessageReceiver interface assigned as its incoming receiver.
//
// NOTE: MessagePipe I/O is non-blocking.
//
class Connector : public MessageReceiver {
 public:
  // The Connector takes ownership of |message_pipe|.
  explicit Connector(ScopedMessagePipeHandle message_pipe);
  virtual ~Connector();

  // Sets the receiver to handle messages read from the message pipe.  The
  // Connector will only read messages from the pipe if an incoming receiver
  // has been set.
  void SetIncomingReceiver(MessageReceiver* receiver);

  // Returns true if an error was encountered while reading from or writing to
  // the message pipe.
  bool encountered_error() const { return error_; }

  // MessageReceiver implementation:
  virtual bool Accept(Message* message) MOJO_OVERRIDE;

 private:
  class Callback : public BindingsSupport::AsyncWaitCallback {
   public:
    Callback();
    virtual ~Callback();

    void SetOwnerToNotify(Connector* owner);
    void SetAsyncWaitID(BindingsSupport::AsyncWaitID async_wait_id);

    virtual void OnHandleReady(MojoResult result) MOJO_OVERRIDE;

   private:
    Connector* owner_;
    BindingsSupport::AsyncWaitID async_wait_id_;
  };
  friend class Callback;

  void OnHandleReady(Callback* callback, MojoResult result);
  void WaitToReadMore();
  void WaitToWriteMore();
  void ReadMore();
  void WriteMore();
  void WriteOne(Message* message, bool* wait_to_write);

  ScopedMessagePipeHandle message_pipe_;
  MessageReceiver* incoming_receiver_;
  MessageQueue write_queue_;

  Callback read_callback_;
  Callback write_callback_;

  bool error_;

  MOJO_DISALLOW_COPY_AND_ASSIGN(Connector);
};

}  // namespace internal
}  // namespace mojo

#endif  // MOJO_PUBLIC_BINDINGS_LIB_CONNECTOR_H_