blob: 89a771782ca692af27280f2fcfabcfa9dac44f0c [file] [log] [blame]
// Copyright 2018 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/cpp/internal/pending_response.h"
#include "lib/fidl/cpp/internal/logging.h"
#include "lib/fidl/cpp/internal/stub_controller.h"
#include "lib/fidl/cpp/internal/weak_stub_controller.h"
namespace fidl {
namespace internal {
PendingResponse::PendingResponse() : txid_(0), weak_controller_(nullptr) {}
PendingResponse::PendingResponse(zx_txid_t txid, WeakStubController* weak_controller)
: txid_(txid), weak_controller_(weak_controller) {
if (weak_controller_)
weak_controller_->AddRef();
}
PendingResponse::~PendingResponse() {
if (weak_controller_)
weak_controller_->Release();
}
PendingResponse::PendingResponse(const PendingResponse& other)
: PendingResponse(other.txid_, other.weak_controller_) {}
PendingResponse& PendingResponse::operator=(const PendingResponse& other) {
if (this == &other)
return *this;
txid_ = other.txid_;
if (weak_controller_)
weak_controller_->Release();
weak_controller_ = other.weak_controller_;
if (weak_controller_)
weak_controller_->AddRef();
return *this;
}
PendingResponse::PendingResponse(PendingResponse&& other)
: txid_(other.txid_), weak_controller_(other.weak_controller_) {
other.weak_controller_ = nullptr;
}
PendingResponse& PendingResponse::operator=(PendingResponse&& other) {
if (this == &other)
return *this;
txid_ = other.txid_;
if (weak_controller_)
weak_controller_->Release();
weak_controller_ = other.weak_controller_;
other.weak_controller_ = nullptr;
return *this;
}
zx_status_t PendingResponse::Send(const fidl_type_t* type, HLCPPOutgoingMessage message) {
if (!weak_controller_)
return ZX_ERR_BAD_STATE;
StubController* controller = weak_controller_->controller();
if (!controller)
return ZX_ERR_BAD_STATE;
message.set_txid(txid_);
return fidl::internal::SendMessage(controller->reader().channel(), type, std::move(message));
}
} // namespace internal
} // namespace fidl