// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromecast/bindings/bindings_manager_cast.h"
#include <memory>
#include <string_view>
#include <utility>
#include <vector>
#include "base/functional/bind.h"
#include "components/cast/message_port/cast/message_port_cast.h"
namespace chromecast {
namespace bindings {
BindingsManagerCast::BindingsManagerCast() = default;
BindingsManagerCast::~BindingsManagerCast() = default;
mojo::PendingRemote<mojom::ApiBindings> BindingsManagerCast::CreateRemote() {
DCHECK(!receiver_.is_bound());
mojo::PendingRemote<mojom::ApiBindings> pending_remote =
receiver_.BindNewPipeAndPassRemote();
receiver_.set_disconnect_handler(base::BindOnce(
&BindingsManagerCast::OnClientDisconnected, base::Unretained(this)));
return pending_remote;
}
void BindingsManagerCast::AddBinding(std::string_view binding_name,
std::string_view binding_script) {
std::pair<std::string, std::string> new_entry = {std::string(binding_name),
std::string(binding_script)};
for (auto it = bindings_.begin(); it != bindings_.end(); ++it) {
if (it->first == new_entry.first) {
*it = std::move(new_entry);
return;
}
}
bindings_.emplace_back(std::move(new_entry));
}
void BindingsManagerCast::OnClientDisconnected() {
receiver_.reset();
}
void BindingsManagerCast::GetAll(GetAllCallback callback) {
std::vector<chromecast::mojom::ApiBindingPtr> bindings_vector;
for (const auto& entry : bindings_) {
bindings_vector.emplace_back(
chromecast::mojom::ApiBinding::New(entry.second));
}
std::move(callback).Run(std::move(bindings_vector));
}
void BindingsManagerCast::Connect(const std::string& port_name,
blink::MessagePortDescriptor port) {
OnPortConnected(port_name,
cast_api_bindings::MessagePortCast::Create(std::move(port)));
}
} // namespace bindings
} // namespace chromecast