| // 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 "peridot/bin/sessionmgr/puppet_master/story_command_executor.h" |
| |
| #include <lib/fxl/functional/make_copyable.h> |
| |
| namespace modular { |
| |
| namespace { |
| std::vector<fuchsia::modular::StoryCommand> CloneCommands( |
| const std::vector<fuchsia::modular::StoryCommand>& commands) { |
| std::vector<fuchsia::modular::StoryCommand> commands_copy; |
| for (const auto& command : commands) { |
| fuchsia::modular::StoryCommand clone; |
| command.Clone(&clone); |
| commands_copy.push_back(std::move(clone)); |
| } |
| |
| return commands_copy; |
| } |
| } // namespace |
| |
| StoryCommandExecutor::StoryCommandExecutor() : weak_factory_(this) {} |
| StoryCommandExecutor::~StoryCommandExecutor() = default; |
| |
| void StoryCommandExecutor::ExecuteCommands( |
| fidl::StringPtr story_id, |
| std::vector<fuchsia::modular::StoryCommand> commands, |
| std::function<void(fuchsia::modular::ExecuteResult)> done) { |
| // TODO(thatguy): Cloning the commands here is unforunate. We will want to |
| // create a shared datastructure at some point, such as a |
| // ExecuteCommandsContext struct that contains the commands, and also allows |
| // command runners to make modifications to the commands so that observers get |
| // commands that are more fully specified. |
| // |
| // For now, we make a copy. |
| auto commands_copy = CloneCommands(commands); |
| auto on_execute_done = |
| [weak_this = weak_factory_.GetWeakPtr(), |
| commands_copy = std::move(commands_copy), |
| done = std::move(done)](fuchsia::modular::ExecuteResult result) { |
| if (!weak_this) |
| return; |
| |
| for (auto& listener : weak_this->listeners_) { |
| listener(commands_copy, result); |
| } |
| |
| done(result); |
| }; |
| |
| ExecuteCommandsInternal(std::move(story_id), std::move(commands), |
| fxl::MakeCopyable(std::move(on_execute_done))); |
| } |
| |
| StoryCommandExecutor::ListenerAutoCancel StoryCommandExecutor::AddListener( |
| ListenerCallback listener) { |
| auto it = listeners_.insert(listeners_.end(), std::move(listener)); |
| |
| auto auto_remove = [weak_this = weak_factory_.GetWeakPtr(), it] { |
| if (!weak_this) |
| return; |
| |
| weak_this->listeners_.erase(it); |
| }; |
| return ListenerAutoCancel(std::move(auto_remove)); |
| } |
| |
| } // namespace modular |