| // 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/client/feedback_data.h" |
| |
| #include "base/values.h" |
| #include "remoting/base/name_value_map.h" |
| |
| namespace remoting { |
| |
| namespace { |
| |
| const NameMapElement<FeedbackData::Key> kFeedbackDataKeyNames[]{ |
| {FeedbackData::Key::SESSION_PREVIOUS_STATE, "session-previous-state"}, |
| {FeedbackData::Key::SESSION_STATE, "session-state"}, |
| {FeedbackData::Key::SESSION_ERROR, "session-error"}, |
| {FeedbackData::Key::SESSION_MODE, "session-mode"}, |
| {FeedbackData::Key::SESSION_HOST_OS, "session-host-os"}, |
| {FeedbackData::Key::SESSION_HOST_OS_VERSION, "session-host-os-version"}, |
| {FeedbackData::Key::SESSION_HOST_VERSION, "session-host-version"}, |
| {FeedbackData::Key::SESSION_CREDENTIALS_TYPE, "session-credentials-type"}, |
| |
| // TODO(yuweih): Collect session info for these fields. |
| {FeedbackData::Key::SESSION_PERFORMANCE_STATS, "session-performance-stats"}, |
| {FeedbackData::Key::SESSION_PEER_CONNECTION_STATS, |
| "session-peer-connection-stats"}, |
| }; |
| |
| template <typename EnumType> |
| void SetEnumIfNotEmpty(std::map<FeedbackData::Key, std::string>* data, |
| FeedbackData::Key key, |
| const ChromotingEvent& event, |
| const std::string& event_key) { |
| const base::Value* value = event.GetValue(event_key); |
| if (!value) { |
| return; |
| } |
| auto enum_value = static_cast<EnumType>(value->GetInt()); |
| const char* string_value = ChromotingEvent::EnumToString(enum_value); |
| DCHECK(string_value); |
| (*data)[key] = string_value; |
| } |
| |
| void SetStringIfNotEmpty(std::map<FeedbackData::Key, std::string>* data, |
| FeedbackData::Key key, |
| const ChromotingEvent& event, |
| const std::string& event_key) { |
| const base::Value* value = event.GetValue(event_key); |
| if (!value) { |
| return; |
| } |
| (*data)[key] = value->GetString(); |
| } |
| |
| } // namespace |
| |
| FeedbackData::FeedbackData() {} |
| |
| FeedbackData::~FeedbackData() {} |
| |
| void FeedbackData::SetData(Key key, const std::string& data) { |
| data_[key] = data; |
| } |
| |
| void FeedbackData::FillWithChromotingEvent(const ChromotingEvent& event) { |
| SetEnumIfNotEmpty<ChromotingEvent::SessionState>( |
| &data_, Key::SESSION_PREVIOUS_STATE, event, |
| ChromotingEvent::kPreviousSessionStateKey); |
| SetEnumIfNotEmpty<ChromotingEvent::SessionState>( |
| &data_, Key::SESSION_STATE, event, ChromotingEvent::kSessionStateKey); |
| SetEnumIfNotEmpty<ChromotingEvent::ConnectionError>( |
| &data_, Key::SESSION_ERROR, event, ChromotingEvent::kConnectionErrorKey); |
| SetEnumIfNotEmpty<ChromotingEvent::Mode>(&data_, Key::SESSION_MODE, event, |
| ChromotingEvent::kModeKey); |
| SetEnumIfNotEmpty<ChromotingEvent::Os>(&data_, Key::SESSION_HOST_OS, event, |
| ChromotingEvent::kHostOsKey); |
| SetEnumIfNotEmpty<ChromotingEvent::AuthMethod>( |
| &data_, Key::SESSION_CREDENTIALS_TYPE, event, |
| ChromotingEvent::kAuthMethodKey); |
| SetStringIfNotEmpty(&data_, Key::SESSION_HOST_OS_VERSION, event, |
| ChromotingEvent::kHostOsVersionKey); |
| SetStringIfNotEmpty(&data_, Key::SESSION_HOST_VERSION, event, |
| ChromotingEvent::kHostVersionKey); |
| } |
| |
| // static |
| std::string FeedbackData::KeyToString(Key key) { |
| return ValueToName(kFeedbackDataKeyNames, key); |
| } |
| |
| } // namespace remoting |