| Index: mojo/system/proxy_message_pipe_endpoint.h
|
| diff --git a/mojo/system/proxy_message_pipe_endpoint.h b/mojo/system/proxy_message_pipe_endpoint.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..43b59b415ad90f3c72ab4a5f7d7fdbca350834f3
|
| --- /dev/null
|
| +++ b/mojo/system/proxy_message_pipe_endpoint.h
|
| @@ -0,0 +1,94 @@
|
| +// 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_SYSTEM_PROXY_MESSAGE_PIPE_ENDPOINT_H_
|
| +#define MOJO_SYSTEM_PROXY_MESSAGE_PIPE_ENDPOINT_H_
|
| +
|
| +#include <stdint.h>
|
| +
|
| +#include <deque>
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/compiler_specific.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "mojo/public/system/core.h"
|
| +#include "mojo/public/system/system_export.h"
|
| +#include "mojo/system/message_in_transit.h"
|
| +#include "mojo/system/message_pipe_endpoint.h"
|
| +
|
| +namespace mojo {
|
| +namespace system {
|
| +
|
| +class Channel;
|
| +
|
| +// A |ProxyMessagePipeEndpoint| connects an end of a |MessagePipe| to a
|
| +// |Channel|, over which it transmits and receives data (to/from another
|
| +// |ProxyMessagePipeEndpoint|). So a |MessagePipe| with one endpoint local and
|
| +// the other endpoint remote consists of a |LocalMessagePipeEndpoint| and a
|
| +// |ProxyMessagePipeEndpoint|, with only the local endpoint being accessible via
|
| +// a |MessagePipeDispatcher|.
|
| +//
|
| +// Like any |MessagePipeEndpoint|, a |ProxyMessagePipeEndpoint| is owned by a
|
| +// |MessagePipe|.
|
| +// - A |ProxyMessagePipeEndpoint| starts out *detached*, i.e., not associated
|
| +// to any |Channel|. When *attached*, it gets a reference to a |Channel| and
|
| +// is assigned a local ID. A |ProxyMessagePipeEndpoint| must be detached
|
| +// before destruction; this is done inside |Close()|.
|
| +// - When attached, a |ProxyMessagePipeEndpoint| starts out not running. When
|
| +// run, it gets a remote ID.
|
| +class MOJO_SYSTEM_EXPORT ProxyMessagePipeEndpoint : public MessagePipeEndpoint {
|
| + public:
|
| + ProxyMessagePipeEndpoint();
|
| + virtual ~ProxyMessagePipeEndpoint();
|
| +
|
| + // |MessagePipeEndpoint| implementation:
|
| + virtual void Close() OVERRIDE;
|
| + virtual bool OnPeerClose() OVERRIDE;
|
| + virtual MojoResult EnqueueMessage(MessageInTransit* message) OVERRIDE;
|
| + virtual void Attach(scoped_refptr<Channel> channel,
|
| + MessageInTransit::EndpointId local_id) OVERRIDE;
|
| + virtual bool Run(MessageInTransit::EndpointId remote_id) OVERRIDE;
|
| +
|
| + private:
|
| + bool is_attached() const {
|
| + return !!channel_.get();
|
| + }
|
| +
|
| + bool is_running() const {
|
| + return remote_id_ != MessageInTransit::kInvalidEndpointId;
|
| + }
|
| +
|
| +#ifdef NDEBUG
|
| + void AssertConsistentState() const {}
|
| +#else
|
| + void AssertConsistentState() const;
|
| +#endif
|
| +
|
| + // This should only be set if we're attached.
|
| + scoped_refptr<Channel> channel_;
|
| +
|
| + // |local_id_| should be set to something other than
|
| + // |MessageInTransit::kInvalidEndpointId| when we're attached.
|
| + MessageInTransit::EndpointId local_id_;
|
| +
|
| + // |remote_id_| being set to anything other than
|
| + // |MessageInTransit::kInvalidEndpointId| indicates that we're "running",
|
| + // i.e., actively able to send messages. We should only ever be running if
|
| + // we're attached.
|
| + MessageInTransit::EndpointId remote_id_;
|
| +
|
| + bool is_open_;
|
| + bool is_peer_open_;
|
| +
|
| + // This queue is only used while we're detached, to store messages while we're
|
| + // not ready to send them yet.
|
| + std::deque<MessageInTransit*> paused_message_queue_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ProxyMessagePipeEndpoint);
|
| +};
|
| +
|
| +} // namespace system
|
| +} // namespace mojo
|
| +
|
| +#endif // MOJO_SYSTEM_PROXY_MESSAGE_PIPE_ENDPOINT_H_
|
|
|