summaryrefslogtreecommitdiffstats
path: root/mojo/public/bindings/lib/connector.h
blob: 1fbf1d8bcc6c3ec355ce1e118b2173205fde7efc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// 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 {

// 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 EncounteredError() 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 mojo

#endif  // MOJO_PUBLIC_BINDINGS_LIB_CONNECTOR_H_