Home | History | Annotate | Download | only in lib
      1 // Copyright 2017 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 #include "mojo/public/cpp/bindings/lib/interface_ptr_state.h"
      6 
      7 #include "mojo/public/cpp/bindings/lib/task_runner_helper.h"
      8 
      9 namespace mojo {
     10 namespace internal {
     11 
     12 InterfacePtrStateBase::InterfacePtrStateBase() = default;
     13 
     14 InterfacePtrStateBase::~InterfacePtrStateBase() {
     15   endpoint_client_.reset();
     16   if (router_)
     17     router_->CloseMessagePipe();
     18 }
     19 
     20 void InterfacePtrStateBase::QueryVersion(
     21     const base::Callback<void(uint32_t)>& callback) {
     22   // It is safe to capture |this| because the callback won't be run after this
     23   // object goes away.
     24   endpoint_client_->QueryVersion(
     25       base::Bind(&InterfacePtrStateBase::OnQueryVersion, base::Unretained(this),
     26                  callback));
     27 }
     28 
     29 void InterfacePtrStateBase::RequireVersion(uint32_t version) {
     30   if (version <= version_)
     31     return;
     32 
     33   version_ = version;
     34   endpoint_client_->RequireVersion(version);
     35 }
     36 
     37 void InterfacePtrStateBase::Swap(InterfacePtrStateBase* other) {
     38   using std::swap;
     39   swap(other->router_, router_);
     40   swap(other->endpoint_client_, endpoint_client_);
     41   handle_.swap(other->handle_);
     42   runner_.swap(other->runner_);
     43   swap(other->version_, version_);
     44 }
     45 
     46 void InterfacePtrStateBase::Bind(
     47     ScopedMessagePipeHandle handle,
     48     uint32_t version,
     49     scoped_refptr<base::SequencedTaskRunner> task_runner) {
     50   DCHECK(!router_);
     51   DCHECK(!endpoint_client_);
     52   DCHECK(!handle_.is_valid());
     53   DCHECK_EQ(0u, version_);
     54   DCHECK(handle.is_valid());
     55 
     56   handle_ = std::move(handle);
     57   version_ = version;
     58   runner_ =
     59       GetTaskRunnerToUseFromUserProvidedTaskRunner(std::move(task_runner));
     60 }
     61 
     62 void InterfacePtrStateBase::OnQueryVersion(
     63     const base::Callback<void(uint32_t)>& callback,
     64     uint32_t version) {
     65   version_ = version;
     66   callback.Run(version);
     67 }
     68 
     69 bool InterfacePtrStateBase::InitializeEndpointClient(
     70     bool passes_associated_kinds,
     71     bool has_sync_methods,
     72     std::unique_ptr<MessageReceiver> payload_validator) {
     73   // The object hasn't been bound.
     74   if (!handle_.is_valid())
     75     return false;
     76 
     77   MultiplexRouter::Config config =
     78       passes_associated_kinds
     79           ? MultiplexRouter::MULTI_INTERFACE
     80           : (has_sync_methods
     81                  ? MultiplexRouter::SINGLE_INTERFACE_WITH_SYNC_METHODS
     82                  : MultiplexRouter::SINGLE_INTERFACE);
     83   router_ = new MultiplexRouter(std::move(handle_), config, true, runner_);
     84   endpoint_client_.reset(new InterfaceEndpointClient(
     85       router_->CreateLocalEndpointHandle(kMasterInterfaceId), nullptr,
     86       std::move(payload_validator), false, std::move(runner_),
     87       // The version is only queried from the client so the value passed here
     88       // will not be used.
     89       0u));
     90   return true;
     91 }
     92 
     93 }  // namespace internal
     94 }  // namespace mojo
     95