| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2014 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/server_log_entry.h" |
| 6 |
| 7 #include "base/logging.h" |
| 8 #include "base/macros.h" |
| 9 #include "base/rand_util.h" |
| 10 #include "base/strings/string_number_conversions.h" |
| 11 #include "base/strings/stringize_macros.h" |
| 12 #include "base/strings/stringprintf.h" |
| 13 #include "base/sys_info.h" |
| 14 #include "remoting/base/constants.h" |
| 15 #include "remoting/client/chromoting_stats.h" |
| 16 #include "remoting/protocol/connection_to_host.h" |
| 17 #include "remoting/protocol/errors.h" |
| 18 #include "third_party/libjingle/source/talk/xmllite/xmlelement.h" |
| 19 |
| 20 using base::StringPrintf; |
| 21 using base::SysInfo; |
| 22 using buzz::QName; |
| 23 using buzz::XmlElement; |
| 24 using remoting::protocol::ConnectionToHost; |
| 25 |
| 26 namespace remoting { |
| 27 |
| 28 namespace client { |
| 29 |
| 30 namespace { |
| 31 const char kLogCommand[] = "log"; |
| 32 |
| 33 const char kLogEntry[] = "entry"; |
| 34 |
| 35 const char kKeyEventName[] = "event-name"; |
| 36 const char kValueEventNameSessionState[] = "session-state"; |
| 37 const char kValueEventNameStatistics[] = "connection-statistics"; |
| 38 const char kValueEventNameSessionIdOld[] = "session-id-old"; |
| 39 const char kValueEventNameSessionIdNew[] = "session-id-new"; |
| 40 |
| 41 const char kKeyRole[] = "role"; |
| 42 const char kValueRoleClient[] = "client"; |
| 43 |
| 44 const char kKeyMode[] = "mode"; |
| 45 const char kValueModeIt2Me[] = "it2me"; |
| 46 const char kValueModeMe2Me[] = "me2me"; |
| 47 |
| 48 const char kKeySessionState[] = "session-state"; |
| 49 const char kValueSessionStateConnected[] = "connected"; |
| 50 const char kValueSessionStateClosed[] = "closed"; |
| 51 |
| 52 const char kKeyOsName[] = "os-name"; |
| 53 const char kKeyOsVersion[] = "os-version"; |
| 54 const char kKeyAppVersion[] = "app-version"; |
| 55 |
| 56 const char kKeyCpu[] = "cpu"; |
| 57 |
| 58 } // namespace |
| 59 |
| 60 ServerLogEntry::ServerLogEntry() { |
| 61 } |
| 62 |
| 63 ServerLogEntry::~ServerLogEntry() { |
| 64 } |
| 65 |
| 66 // static |
| 67 scoped_ptr<buzz::XmlElement> ServerLogEntry::MakeStanza() { |
| 68 return scoped_ptr<buzz::XmlElement>( |
| 69 new XmlElement(QName(kChromotingXmlNamespace, kLogCommand))); |
| 70 } |
| 71 |
| 72 // static |
| 73 scoped_ptr<ServerLogEntry> ServerLogEntry::MakeForSessionStateChange( |
| 74 protocol::ConnectionToHost::State state, |
| 75 protocol::ErrorCode error) { |
| 76 scoped_ptr<ServerLogEntry> entry(new ServerLogEntry()); |
| 77 entry->Set(kKeyRole, kValueRoleClient); |
| 78 entry->Set(kKeyEventName, kValueEventNameSessionState); |
| 79 |
| 80 entry->Set(kKeySessionState, GetValueSessionState(state)); |
| 81 if (error != protocol::OK) { |
| 82 entry->Set("connection-error", GetValueError(error)); |
| 83 } |
| 84 |
| 85 return entry.Pass(); |
| 86 } |
| 87 |
| 88 // static |
| 89 scoped_ptr<ServerLogEntry> ServerLogEntry::MakeForStatistics( |
| 90 ChromotingStats* statistics) { |
| 91 scoped_ptr<ServerLogEntry> entry(new ServerLogEntry()); |
| 92 entry->Set(kKeyRole, kValueRoleClient); |
| 93 entry->Set(kKeyEventName, kValueEventNameStatistics); |
| 94 |
| 95 entry->Set("video-bandwidth", |
| 96 StringPrintf("%.2f", statistics->video_bandwidth()->Rate())); |
| 97 entry->Set("capture-latency", |
| 98 StringPrintf("%.2f", statistics->video_capture_ms()->Average())); |
| 99 entry->Set("encode-latency", |
| 100 StringPrintf("%.2f", statistics->video_encode_ms()->Average())); |
| 101 entry->Set("decode-latency", |
| 102 StringPrintf("%.2f", statistics->video_decode_ms()->Average())); |
| 103 entry->Set("render-latency", |
| 104 StringPrintf("%.2f", statistics->video_frame_rate()->Rate())); |
| 105 entry->Set("roundtrip-latency", |
| 106 StringPrintf("%.2f", statistics->round_trip_ms()->Average())); |
| 107 |
| 108 return entry.Pass(); |
| 109 } |
| 110 |
| 111 // static |
| 112 scoped_ptr<ServerLogEntry> ServerLogEntry::MakeForSessionIdOld( |
| 113 const std::string& session_id) { |
| 114 scoped_ptr<ServerLogEntry> entry(new ServerLogEntry()); |
| 115 entry->Set(kKeyRole, kValueRoleClient); |
| 116 entry->Set(kKeyEventName, kValueEventNameSessionIdOld); |
| 117 entry->AddSessionId(session_id); |
| 118 return entry.Pass(); |
| 119 } |
| 120 |
| 121 // static |
| 122 scoped_ptr<ServerLogEntry> ServerLogEntry::MakeForSessionIdNew( |
| 123 const std::string& session_id) { |
| 124 scoped_ptr<ServerLogEntry> entry(new ServerLogEntry()); |
| 125 entry->Set(kKeyRole, kValueRoleClient); |
| 126 entry->Set(kKeyEventName, kValueEventNameSessionIdNew); |
| 127 entry->AddSessionId(session_id); |
| 128 return entry.Pass(); |
| 129 } |
| 130 |
| 131 void ServerLogEntry::AddClientFields() { |
| 132 Set(kKeyOsName, SysInfo::OperatingSystemName()); |
| 133 Set(kKeyOsVersion, SysInfo::OperatingSystemVersion()); |
| 134 Set(kKeyAppVersion, STRINGIZE(VERSION)); |
| 135 Set(kKeyCpu, SysInfo::OperatingSystemArchitecture()); |
| 136 }; |
| 137 |
| 138 void ServerLogEntry::AddModeField(ServerLogEntry::Mode mode) { |
| 139 Set(kKeyMode, GetValueMode(mode)); |
| 140 } |
| 141 |
| 142 void ServerLogEntry::AddSessionId(const std::string& session_id) { |
| 143 Set("session-id", session_id); |
| 144 } |
| 145 |
| 146 void ServerLogEntry::AddSessionDuration(base::TimeDelta duration) { |
| 147 Set("session-duration", base::Int64ToString(duration.InSeconds())); |
| 148 } |
| 149 |
| 150 // static |
| 151 const char* ServerLogEntry::GetValueMode(ServerLogEntry::Mode mode) { |
| 152 switch (mode) { |
| 153 case IT2ME: |
| 154 return kValueModeIt2Me; |
| 155 case ME2ME: |
| 156 return kValueModeMe2Me; |
| 157 default: |
| 158 NOTREACHED(); |
| 159 return NULL; |
| 160 } |
| 161 } |
| 162 |
| 163 scoped_ptr<XmlElement> ServerLogEntry::ToStanza() const { |
| 164 scoped_ptr<XmlElement> stanza(new XmlElement(QName( |
| 165 kChromotingXmlNamespace, kLogEntry))); |
| 166 ValuesMap::const_iterator iter; |
| 167 for (iter = values_map_.begin(); iter != values_map_.end(); ++iter) { |
| 168 stanza->AddAttr(QName(std::string(), iter->first), iter->second); |
| 169 } |
| 170 return stanza.Pass(); |
| 171 } |
| 172 |
| 173 // static |
| 174 const char* ServerLogEntry::GetValueSessionState( |
| 175 ConnectionToHost::State state) { |
| 176 switch (state) { |
| 177 // Where possible, these are the same strings that the webapp sends for the |
| 178 // corresponding state - see remoting/webapp/server_log_entry.js. |
| 179 case ConnectionToHost::INITIALIZING: |
| 180 return "initializing"; |
| 181 case ConnectionToHost::CONNECTING: |
| 182 return "connecting"; |
| 183 case ConnectionToHost::AUTHENTICATED: |
| 184 return "authenticated"; |
| 185 case ConnectionToHost::CONNECTED: |
| 186 return kValueSessionStateConnected; |
| 187 case ConnectionToHost::FAILED: |
| 188 return "connection-failed"; |
| 189 case ConnectionToHost::CLOSED: |
| 190 return kValueSessionStateClosed; |
| 191 default: |
| 192 NOTREACHED(); |
| 193 return NULL; |
| 194 } |
| 195 } |
| 196 |
| 197 // static |
| 198 const char* ServerLogEntry::GetValueError(protocol::ErrorCode error) { |
| 199 switch (error) { |
| 200 // Where possible, these are the same strings that the webapp sends for the |
| 201 // corresponding error - see remoting/webapp/server_log_entry.js. |
| 202 case protocol::OK: |
| 203 return "none"; |
| 204 case protocol::PEER_IS_OFFLINE: |
| 205 return "host-is-offline"; |
| 206 case protocol::SESSION_REJECTED: |
| 207 return "session-rejected"; |
| 208 case protocol::INCOMPATIBLE_PROTOCOL: |
| 209 return "incompatible-protocol"; |
| 210 case protocol::AUTHENTICATION_FAILED: |
| 211 return "authentication-failed"; |
| 212 case protocol::CHANNEL_CONNECTION_ERROR: |
| 213 return "channel-connection-error"; |
| 214 case protocol::SIGNALING_ERROR: |
| 215 return "signaling-error"; |
| 216 case protocol::SIGNALING_TIMEOUT: |
| 217 return "signaling-timeout"; |
| 218 case protocol::HOST_OVERLOAD: |
| 219 return "host-overload"; |
| 220 case protocol::UNKNOWN_ERROR: |
| 221 return "unknown-error"; |
| 222 default: |
| 223 NOTREACHED(); |
| 224 return NULL; |
| 225 } |
| 226 } |
| 227 |
| 228 void ServerLogEntry::AddEventName(const std::string& event_name) { |
| 229 Set("event-name", event_name); |
| 230 } |
| 231 |
| 232 void ServerLogEntry::Set(const std::string& key, const std::string& value) { |
| 233 values_map_[key] = value; |
| 234 } |
| 235 |
| 236 } // namespace client |
| 237 |
| 238 } // namespace remoting |
| OLD | NEW |