blob: da0397003b3ce6ed8555298832894f7ada1a6b9f [file] [log] [blame]
// Copyright 2016 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 "peridot/bin/suggestion_engine/proposal_publisher_impl.h"
#include "peridot/bin/suggestion_engine/suggestion_engine_impl.h"
namespace modular {
ProposalPublisherImpl::ProposalPublisherImpl(SuggestionEngineImpl* engine,
const std::string& component_url)
: engine_(engine),
component_url_(component_url),
bindings_(this),
weak_ptr_factory_(this) {}
ProposalPublisherImpl::~ProposalPublisherImpl() = default;
void ProposalPublisherImpl::AddBinding(
fidl::InterfaceRequest<fuchsia::modular::ProposalPublisher> request) {
bindings_.emplace(new fidl::Binding<fuchsia::modular::ProposalPublisher>(
this, std::move(request)));
}
void ProposalPublisherImpl::Propose(fuchsia::modular::Proposal proposal) {
engine_->AddNextProposal(this, std::move(proposal));
}
void ProposalPublisherImpl::ProposeNavigation(
fuchsia::modular::NavigationAction navigation) {
engine_->ProposeNavigation(navigation);
}
void ProposalPublisherImpl::Remove(std::string proposal_id) {
engine_->RemoveNextProposal(component_url_, proposal_id);
}
ProposalPublisherImpl::BindingSet::BindingSet(ProposalPublisherImpl* impl)
: impl_(impl) {}
ProposalPublisherImpl::BindingSet::~BindingSet() = default;
void ProposalPublisherImpl::BindingSet::OnConnectionError(
fidl::Binding<fuchsia::modular::ProposalPublisher>* binding) {
::modular::BindingSet<fuchsia::modular::ProposalPublisher>::OnConnectionError(
binding);
if (impl_->ShouldEraseSelf())
impl_->EraseSelf();
}
bool ProposalPublisherImpl::ShouldEraseSelf() const {
return bindings_.empty() && !weak_ptr_factory_.HasWeakPtrs();
}
void ProposalPublisherImpl::EraseSelf() {
engine_->RemoveSourceClient(component_url_);
}
} // namespace modular