Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Unified Diff: mojo/public/cpp/bindings/lib/interface_endpoint_client.h

Issue 1455063004: Mojo C++ bindings: introduce MultiplexRouter and related classes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/public/cpp/bindings/lib/interface_endpoint_client.h
diff --git a/mojo/public/cpp/bindings/lib/interface_endpoint_client.h b/mojo/public/cpp/bindings/lib/interface_endpoint_client.h
new file mode 100644
index 0000000000000000000000000000000000000000..b3f3f5a6069e3cf8fc74da83c912c8781f8f8a64
--- /dev/null
+++ b/mojo/public/cpp/bindings/lib/interface_endpoint_client.h
@@ -0,0 +1,120 @@
+// Copyright 2015 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_CPP_BINDINGS_LIB_INTERFACE_ENDPOINT_CLIENT_H_
+#define MOJO_PUBLIC_CPP_BINDINGS_LIB_INTERFACE_ENDPOINT_CLIENT_H_
+
+#include <map>
+
+#include "base/logging.h"
+#include "base/macros.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/memory/weak_ptr.h"
+#include "base/threading/thread_checker.h"
+#include "mojo/public/cpp/bindings/callback.h"
+#include "mojo/public/cpp/bindings/lib/scoped_interface_endpoint_handle.h"
+#include "mojo/public/cpp/bindings/message.h"
+#include "mojo/public/cpp/bindings/message_filter.h"
+
+namespace mojo {
+namespace internal {
+
+// InterfaceEndpointClient handles message sending and receiving of an interface
+// endpoint, either the implementation side or the client side.
+// It should only be accessed and destructed on the creating thread.
+class InterfaceEndpointClient : public MessageReceiverWithResponder {
+ public:
+ // |receiver| is okay to be null. If it is not null, it must outlive this
+ // object.
+ InterfaceEndpointClient(ScopedInterfaceEndpointHandle handle,
+ MessageReceiverWithResponderStatus* receiver,
+ scoped_ptr<MessageFilter> payload_validator);
+ ~InterfaceEndpointClient() override;
+
+ // Sets the error handler to receive notifications when an error is
+ // encountered.
+ void set_connection_error_handler(const Closure& error_handler) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ error_handler_ = error_handler;
+ }
+
+ // Returns true if an error was encountered.
+ bool encountered_error() const {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ return encountered_error_;
+ }
+
+ // Returns true if this endpoint has any pending callbacks.
+ bool has_pending_responders() const {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ return !responders_.empty();
+ }
+
+ MultiplexRouter* router() const { return handle_.router(); }
+
+ // After this call the object is in an invalid state and shouldn't be reused.
+ ScopedInterfaceEndpointHandle PassHandle();
+
+ // Raises an error on the underlying message pipe. It disconnects the pipe
+ // and notifies all interfaces running on this pipe.
+ void RaiseError();
+
+ // MessageReceiverWithResponder implementation:
+ bool Accept(Message* message) override;
+ bool AcceptWithResponder(Message* message,
+ MessageReceiver* responder) override;
+
+ // The following methods are called by the router. They must be called
+ // outside of the router's lock.
+
+ // NOTE: |message| must have passed message header validation.
+ bool HandleIncomingMessage(Message* message);
+ void NotifyError();
+
+ private:
+ using ResponderMap = std::map<uint64_t, MessageReceiver*>;
+
+ // Used as the sink for |payload_validator_| and forwards messages to
+ // HandleValidatedMessage().
+ class HandleIncomingMessageThunk : public MessageReceiver {
+ public:
+ explicit HandleIncomingMessageThunk(InterfaceEndpointClient* owner);
+ ~HandleIncomingMessageThunk() override;
+
+ // MessageReceiver implementation:
+ bool Accept(Message* message) override;
+
+ private:
+ InterfaceEndpointClient* const owner_;
+
+ DISALLOW_COPY_AND_ASSIGN(HandleIncomingMessageThunk);
+ };
+
+ bool HandleValidatedMessage(Message* message);
+
+ ScopedInterfaceEndpointHandle handle_;
+
+ MessageReceiverWithResponderStatus* const incoming_receiver_;
+ scoped_ptr<MessageFilter> payload_validator_;
+ HandleIncomingMessageThunk thunk_;
+
+ // Maps from the ID of a response to the MessageReceiver that handles the
+ // response.
+ ResponderMap responders_;
+ uint64_t next_request_id_;
+
+ Closure error_handler_;
+ bool encountered_error_;
+
+ base::ThreadChecker thread_checker_;
+
+ base::WeakPtrFactory<InterfaceEndpointClient> weak_ptr_factory_;
+
+ DISALLOW_COPY_AND_ASSIGN(InterfaceEndpointClient);
+};
+
+} // namespace internal
+} // namespace mojo
+
+#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_INTERFACE_ENDPOINT_CLIENT_H_
« no previous file with comments | « mojo/public/cpp/bindings/lib/connector.cc ('k') | mojo/public/cpp/bindings/lib/interface_endpoint_client.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698