blob: e2e00a31e9f205d990b2733dcbef7b17dec89312 [file] [log] [blame]
// Copyright 2019 The Fuchsia 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 <lib/fidl/llcpp/transaction.h>
namespace fidl {
CompleterBase& CompleterBase::operator=(CompleterBase&& other) noexcept {
if (this != &other) {
DropTransaction();
transaction_ = other.transaction_;
owned_ = other.owned_;
method_expects_reply_ = other.method_expects_reply_;
other.transaction_ = nullptr;
other.owned_ = false;
}
return *this;
}
void CompleterBase::Close(zx_status_t status) {
EnsureHasTransaction();
transaction_->Close(status);
DropTransaction();
}
CompleterBase::CompleterBase(CompleterBase&& other) noexcept
: transaction_(other.transaction_),
owned_(other.owned_),
method_expects_reply_(other.method_expects_reply_) {
other.transaction_ = nullptr;
other.owned_ = false;
}
CompleterBase::~CompleterBase() {
ZX_ASSERT(!method_expects_reply() || !pending());
}
std::unique_ptr<Transaction> CompleterBase::TakeOwnership() {
EnsureHasTransaction();
std::unique_ptr<Transaction> clone = transaction_->TakeOwnership();
DropTransaction();
return clone;
}
void CompleterBase::SendReply(Message msg) {
EnsureHasTransaction();
transaction_->Reply(std::move(msg));
DropTransaction();
}
void CompleterBase::EnsureHasTransaction() {
ZX_ASSERT(transaction_);
}
void CompleterBase::DropTransaction() {
if (owned_) {
owned_ = false;
delete transaction_;
}
transaction_ = nullptr;
}
}