12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- // Copyright 2018 The Chromium 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 "remoting/host/action_message_handler.h"
- #include <utility>
- #include "base/callback_helpers.h"
- #include "remoting/base/compound_buffer.h"
- #include "remoting/host/action_executor.h"
- #include "remoting/proto/action.pb.h"
- #include "remoting/protocol/message_serialization.h"
- namespace remoting {
- using protocol::ActionResponse;
- ActionMessageHandler::ActionMessageHandler(
- const std::string& name,
- const std::vector<protocol::ActionRequest::Action>& actions,
- std::unique_ptr<protocol::MessagePipe> pipe,
- std::unique_ptr<ActionExecutor> action_executor)
- : protocol::NamedMessagePipeHandler(name, std::move(pipe)),
- action_executor_(std::move(action_executor)),
- supported_actions_(actions) {
- DCHECK(action_executor_);
- }
- ActionMessageHandler::~ActionMessageHandler() = default;
- void ActionMessageHandler::OnIncomingMessage(
- std::unique_ptr<CompoundBuffer> message) {
- DCHECK(message);
- std::unique_ptr<protocol::ActionRequest> request =
- protocol::ParseMessage<protocol::ActionRequest>(message.get());
- ActionResponse response;
- response.set_request_id(request ? request->request_id() : 0);
- if (!request) {
- response.set_code(ActionResponse::PROTOCOL_ERROR);
- response.set_protocol_error_type(ActionResponse::INVALID_MESSAGE_ERROR);
- } else if (!request->has_action()) {
- // |has_action()| will return false if either the field is not set or the
- // value is out of range. Unfortunately we can't distinguish between these
- // two conditions so we return the same error for both.
- response.set_code(ActionResponse::PROTOCOL_ERROR);
- response.set_protocol_error_type(ActionResponse::INVALID_ACTION_ERROR);
- } else if (supported_actions_.count(request->action()) == 0) {
- // We received an action which is valid, but not supported by this platform
- // or connection mode.
- response.set_code(ActionResponse::PROTOCOL_ERROR);
- response.set_protocol_error_type(ActionResponse::UNSUPPORTED_ACTION_ERROR);
- } else {
- // Valid action request received. None of the supported actions at this
- // time support return codes, if we add actions in the future which could
- // fail in an observable way, we should consider returning that info to the
- // client.
- action_executor_->ExecuteAction(*request);
- response.set_code(ActionResponse::ACTION_SUCCESS);
- }
- Send(response, base::DoNothing());
- }
- } // namespace remoting
|