1// Copyright 2013 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 MOJO_SYSTEM_MESSAGE_PIPE_ENDPOINT_H_
6#define MOJO_SYSTEM_MESSAGE_PIPE_ENDPOINT_H_
7
8#include <stdint.h>
9
10#include <vector>
11
12#include "base/macros.h"
13#include "base/memory/ref_counted.h"
14#include "base/memory/scoped_ptr.h"
15#include "mojo/public/c/system/message_pipe.h"
16#include "mojo/public/c/system/types.h"
17#include "mojo/system/dispatcher.h"
18#include "mojo/system/memory.h"
19#include "mojo/system/message_in_transit.h"
20#include "mojo/system/system_impl_export.h"
21
22namespace mojo {
23namespace system {
24
25class ChannelEndpoint;
26class Waiter;
27
28// This is an interface to one of the ends of a message pipe, and is used by
29// |MessagePipe|. Its most important role is to provide a sink for messages
30// (i.e., a place where messages can be sent). It has a secondary role: When the
31// endpoint is local (i.e., in the current process), there'll be a dispatcher
32// corresponding to the endpoint. In that case, the implementation of
33// |MessagePipeEndpoint| also implements the functionality required by the
34// dispatcher, e.g., to read messages and to wait. Implementations of this class
35// are not thread-safe; instances are protected by |MesssagePipe|'s lock.
36class MOJO_SYSTEM_IMPL_EXPORT MessagePipeEndpoint {
37 public:
38  virtual ~MessagePipeEndpoint() {}
39
40  enum Type { kTypeLocal, kTypeProxy };
41  virtual Type GetType() const = 0;
42
43  // All implementations must implement these.
44  // Returns false if the endpoint should be closed and destroyed, else true.
45  virtual bool OnPeerClose() = 0;
46  // Implements |MessagePipe::EnqueueMessage()|. The major differences are that:
47  //  a) Dispatchers have been vetted and cloned/attached to the message.
48  //  b) At this point, we cannot report failure (if, e.g., a channel is torn
49  //     down at this point, we should silently swallow the message).
50  virtual void EnqueueMessage(scoped_ptr<MessageInTransit> message) = 0;
51
52  // Implementations must override these if they represent a local endpoint,
53  // i.e., one for which there's a |MessagePipeDispatcher| (and thus a handle).
54  // An implementation for a proxy endpoint (for which there's no dispatcher)
55  // needs not override these methods, since they should never be called.
56  //
57  // These methods implement the methods of the same name in |MessagePipe|,
58  // though |MessagePipe|'s implementation may have to do a little more if the
59  // operation involves both endpoints.
60  virtual void Close();
61  virtual void CancelAllWaiters();
62  virtual MojoResult ReadMessage(UserPointer<void> bytes,
63                                 UserPointer<uint32_t> num_bytes,
64                                 DispatcherVector* dispatchers,
65                                 uint32_t* num_dispatchers,
66                                 MojoReadMessageFlags flags);
67  virtual HandleSignalsState GetHandleSignalsState() const;
68  virtual MojoResult AddWaiter(Waiter* waiter,
69                               MojoHandleSignals signals,
70                               uint32_t context,
71                               HandleSignalsState* signals_state);
72  virtual void RemoveWaiter(Waiter* waiter, HandleSignalsState* signals_state);
73
74  // Implementations must override these if they represent a proxy endpoint. An
75  // implementation for a local endpoint needs not override these methods, since
76  // they should never be called.
77  virtual void Attach(ChannelEndpoint* channel_endpoint);
78
79 protected:
80  MessagePipeEndpoint() {}
81
82 private:
83  DISALLOW_COPY_AND_ASSIGN(MessagePipeEndpoint);
84};
85
86}  // namespace system
87}  // namespace mojo
88
89#endif  // MOJO_SYSTEM_MESSAGE_PIPE_ENDPOINT_H_
90