blob: 6f4b78be8f0331b5679bff7c1bc21d30b48d6dc9 [file] [log] [blame]
// Copyright 2017 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.
#include "mojo/public/cpp/bindings/lib/associated_interface_ptr_state.h"
#include "mojo/public/cpp/bindings/lib/task_runner_helper.h"
namespace mojo {
namespace internal {
AssociatedInterfacePtrStateBase::AssociatedInterfacePtrStateBase() = default;
AssociatedInterfacePtrStateBase::~AssociatedInterfacePtrStateBase() = default;
void AssociatedInterfacePtrStateBase::QueryVersion(
const base::Callback<void(uint32_t)>& callback) {
// It is safe to capture |this| because the callback won't be run after this
// object goes away.
endpoint_client_->QueryVersion(
base::Bind(&AssociatedInterfacePtrStateBase::OnQueryVersion,
base::Unretained(this), callback));
}
void AssociatedInterfacePtrStateBase::RequireVersion(uint32_t version) {
if (version <= version_)
return;
version_ = version;
endpoint_client_->RequireVersion(version);
}
void AssociatedInterfacePtrStateBase::OnQueryVersion(
const base::Callback<void(uint32_t)>& callback,
uint32_t version) {
version_ = version;
callback.Run(version);
}
void AssociatedInterfacePtrStateBase::FlushForTesting() {
endpoint_client_->FlushForTesting();
}
void AssociatedInterfacePtrStateBase::CloseWithReason(
uint32_t custom_reason,
const std::string& description) {
endpoint_client_->CloseWithReason(custom_reason, description);
}
void AssociatedInterfacePtrStateBase::Swap(
AssociatedInterfacePtrStateBase* other) {
using std::swap;
swap(other->endpoint_client_, endpoint_client_);
swap(other->version_, version_);
}
void AssociatedInterfacePtrStateBase::Bind(
ScopedInterfaceEndpointHandle handle,
uint32_t version,
std::unique_ptr<MessageReceiver> validator,
scoped_refptr<base::SingleThreadTaskRunner> runner) {
DCHECK(!endpoint_client_);
DCHECK_EQ(0u, version_);
DCHECK(handle.is_valid());
version_ = version;
// The version is only queried from the client so the value passed here
// will not be used.
endpoint_client_ = std::make_unique<InterfaceEndpointClient>(
std::move(handle), nullptr, std::move(validator), false,
GetTaskRunnerToUseFromUserProvidedTaskRunner(std::move(runner)), 0u);
}
ScopedInterfaceEndpointHandle AssociatedInterfacePtrStateBase::PassHandle() {
auto handle = endpoint_client_->PassHandle();
endpoint_client_.reset();
return handle;
}
} // namespace internal
} // namespace mojo