blob: 1c7a85383ad261d7f1f3a5c8037a02d100c25ccf [file] [log] [blame]
Yuwei Huang50ce2272018-02-28 01:41:331// Copyright 2018 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "remoting/client/feedback_data.h"
6
7#include "base/values.h"
8#include "remoting/base/name_value_map.h"
9
10namespace remoting {
11
12namespace {
13
14const NameMapElement<FeedbackData::Key> kFeedbackDataKeyNames[]{
15 {FeedbackData::Key::SESSION_PREVIOUS_STATE, "session-previous-state"},
16 {FeedbackData::Key::SESSION_STATE, "session-state"},
17 {FeedbackData::Key::SESSION_ERROR, "session-error"},
18 {FeedbackData::Key::SESSION_MODE, "session-mode"},
19 {FeedbackData::Key::SESSION_HOST_OS, "session-host-os"},
20 {FeedbackData::Key::SESSION_HOST_OS_VERSION, "session-host-os-version"},
21 {FeedbackData::Key::SESSION_HOST_VERSION, "session-host-version"},
Yuwei Huangdc3753e2018-03-28 23:47:5822 {FeedbackData::Key::SESSION_CREDENTIALS_TYPE, "session-credentials-type"},
Yuwei Huang50ce2272018-02-28 01:41:3323
24 // TODO(yuweih): Collect session info for these fields.
Yuwei Huang50ce2272018-02-28 01:41:3325 {FeedbackData::Key::SESSION_PERFORMANCE_STATS, "session-performance-stats"},
26 {FeedbackData::Key::SESSION_PEER_CONNECTION_STATS,
27 "session-peer-connection-stats"},
28};
29
30template <typename EnumType>
31void SetEnumIfNotEmpty(std::map<FeedbackData::Key, std::string>* data,
32 FeedbackData::Key key,
33 const ChromotingEvent& event,
34 const std::string& event_key) {
35 const base::Value* value = event.GetValue(event_key);
36 if (!value) {
37 return;
38 }
39 auto enum_value = static_cast<EnumType>(value->GetInt());
40 const char* string_value = ChromotingEvent::EnumToString(enum_value);
41 DCHECK(string_value);
42 (*data)[key] = string_value;
43}
44
45void SetStringIfNotEmpty(std::map<FeedbackData::Key, std::string>* data,
46 FeedbackData::Key key,
47 const ChromotingEvent& event,
48 const std::string& event_key) {
49 const base::Value* value = event.GetValue(event_key);
50 if (!value) {
51 return;
52 }
53 (*data)[key] = value->GetString();
54}
55
56} // namespace
57
58FeedbackData::FeedbackData() {}
59
60FeedbackData::~FeedbackData() {}
61
62void FeedbackData::SetData(Key key, const std::string& data) {
63 data_[key] = data;
64}
65
66void FeedbackData::FillWithChromotingEvent(const ChromotingEvent& event) {
67 SetEnumIfNotEmpty<ChromotingEvent::SessionState>(
68 &data_, Key::SESSION_PREVIOUS_STATE, event,
69 ChromotingEvent::kPreviousSessionStateKey);
70 SetEnumIfNotEmpty<ChromotingEvent::SessionState>(
71 &data_, Key::SESSION_STATE, event, ChromotingEvent::kSessionStateKey);
72 SetEnumIfNotEmpty<ChromotingEvent::ConnectionError>(
73 &data_, Key::SESSION_ERROR, event, ChromotingEvent::kConnectionErrorKey);
74 SetEnumIfNotEmpty<ChromotingEvent::Mode>(&data_, Key::SESSION_MODE, event,
75 ChromotingEvent::kModeKey);
76 SetEnumIfNotEmpty<ChromotingEvent::Os>(&data_, Key::SESSION_HOST_OS, event,
77 ChromotingEvent::kHostOsKey);
Yuwei Huangdc3753e2018-03-28 23:47:5878 SetEnumIfNotEmpty<ChromotingEvent::AuthMethod>(
79 &data_, Key::SESSION_CREDENTIALS_TYPE, event,
80 ChromotingEvent::kAuthMethodKey);
Yuwei Huang50ce2272018-02-28 01:41:3381 SetStringIfNotEmpty(&data_, Key::SESSION_HOST_OS_VERSION, event,
82 ChromotingEvent::kHostOsVersionKey);
83 SetStringIfNotEmpty(&data_, Key::SESSION_HOST_VERSION, event,
84 ChromotingEvent::kHostVersionKey);
85}
86
87// static
88std::string FeedbackData::KeyToString(Key key) {
89 return ValueToName(kFeedbackDataKeyNames, key);
90}
91
92} // namespace remoting