1 // Copyright (c) 2012 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.
5 #include "remoting/host/server_log_entry.h"
7 #include "base/logging.h"
8 #include "base/strings/stringize_macros.h"
9 #include "base/sys_info.h"
10 #include "remoting/base/constants.h"
11 #include "remoting/protocol/session.h"
12 #include "third_party/libjingle/source/talk/xmllite/xmlelement.h"
16 using buzz::XmlElement
;
17 using remoting::protocol::Session
;
22 const char kLogCommand
[] = "log";
24 const char kLogEntry
[] = "entry";
26 const char kKeyEventName
[] = "event-name";
27 const char kValueEventNameSessionState
[] = "session-state";
28 const char kValueEventNameHeartbeat
[] = "heartbeat";
29 const char kValueEventNameHostStatus
[] = "host-status";
31 const char kKeyRole
[] = "role";
32 const char kValueRoleHost
[] = "host";
34 const char kKeyMode
[] = "mode";
35 const char kValueModeIt2Me
[] = "it2me";
36 const char kValueModeMe2Me
[] = "me2me";
38 const char kKeySessionState
[] = "session-state";
39 const char kValueSessionStateConnected
[] = "connected";
40 const char kValueSessionStateClosed
[] = "closed";
42 const char kStatusName
[] = "status";
43 const char kExitCodeName
[] = "exit-code";
45 const char kKeyOsName
[] = "os-name";
47 #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
48 const char kKeyOsVersion
[] = "os-version";
51 const char kKeyHostVersion
[] = "host-version";
53 const char kKeyCpu
[] = "cpu";
55 const char kKeyConnectionType
[] = "connection-type";
59 ServerLogEntry::ServerLogEntry() {
62 ServerLogEntry::~ServerLogEntry() {
66 scoped_ptr
<buzz::XmlElement
> ServerLogEntry::MakeStanza() {
67 return scoped_ptr
<buzz::XmlElement
>(
68 new XmlElement(QName(kChromotingXmlNamespace
, kLogCommand
)));
72 scoped_ptr
<ServerLogEntry
> ServerLogEntry::MakeForSessionStateChange(
74 scoped_ptr
<ServerLogEntry
> entry(new ServerLogEntry());
75 entry
->Set(kKeyRole
, kValueRoleHost
);
76 entry
->Set(kKeyEventName
, kValueEventNameSessionState
);
77 entry
->Set(kKeySessionState
, GetValueSessionState(connected
));
82 scoped_ptr
<ServerLogEntry
> ServerLogEntry::MakeForHeartbeat() {
83 scoped_ptr
<ServerLogEntry
> entry(new ServerLogEntry());
84 entry
->Set(kKeyRole
, kValueRoleHost
);
85 entry
->Set(kKeyEventName
, kValueEventNameHeartbeat
);
90 scoped_ptr
<ServerLogEntry
> ServerLogEntry::MakeForHostStatus(
91 HostStatusSender::HostStatus host_status
, HostExitCodes exit_code
) {
92 scoped_ptr
<ServerLogEntry
> entry(new ServerLogEntry());
93 entry
->Set(kKeyRole
, kValueRoleHost
);
94 entry
->Set(kKeyEventName
, kValueEventNameHostStatus
);
95 entry
->Set(kStatusName
, HostStatusSender::HostStatusToString(host_status
));
96 if (host_status
== HostStatusSender::OFFLINE
)
97 entry
->Set(kExitCodeName
, ExitCodeToString(exit_code
));
101 void ServerLogEntry::AddHostFields() {
103 Set(kKeyOsName
, "Windows");
104 #elif defined(OS_MACOSX)
105 Set(kKeyOsName
, "Mac");
106 #elif defined(OS_CHROMEOS)
107 Set(kKeyOsName
, "ChromeOS");
108 #elif defined(OS_LINUX)
109 Set(kKeyOsName
, "Linux");
112 // SysInfo::OperatingSystemVersionNumbers is only defined for the following
113 // OSes: see base/sys_info_unittest.cc.
114 #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
115 std::stringstream os_version
;
116 int32 os_major_version
= 0;
117 int32 os_minor_version
= 0;
118 int32 os_bugfix_version
= 0;
119 SysInfo::OperatingSystemVersionNumbers(&os_major_version
, &os_minor_version
,
121 os_version
<< os_major_version
<< "." << os_minor_version
<< "."
122 << os_bugfix_version
;
123 Set(kKeyOsVersion
, os_version
.str());
126 Set(kKeyHostVersion
, STRINGIZE(VERSION
));
127 Set(kKeyCpu
, SysInfo::OperatingSystemArchitecture());
130 void ServerLogEntry::AddModeField(ServerLogEntry::Mode mode
) {
131 Set(kKeyMode
, GetValueMode(mode
));
134 void ServerLogEntry::AddConnectionTypeField(
135 protocol::TransportRoute::RouteType type
) {
136 Set(kKeyConnectionType
, protocol::TransportRoute::GetTypeString(type
));
140 const char* ServerLogEntry::GetValueMode(ServerLogEntry::Mode mode
) {
143 return kValueModeIt2Me
;
145 return kValueModeMe2Me
;
152 scoped_ptr
<XmlElement
> ServerLogEntry::ToStanza() const {
153 scoped_ptr
<XmlElement
> stanza(new XmlElement(QName(
154 kChromotingXmlNamespace
, kLogEntry
)));
155 ValuesMap::const_iterator iter
;
156 for (iter
= values_map_
.begin(); iter
!= values_map_
.end(); ++iter
) {
157 stanza
->AddAttr(QName(std::string(), iter
->first
), iter
->second
);
159 return stanza
.Pass();
163 const char* ServerLogEntry::GetValueSessionState(bool connected
) {
164 return connected
? kValueSessionStateConnected
: kValueSessionStateClosed
;
167 void ServerLogEntry::Set(const std::string
& key
, const std::string
& value
) {
168 values_map_
[key
] = value
;
171 } // namespace remoting