1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "remoting/host/server_log_entry_host.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/stringize_macros.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/sys_info.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "remoting/signaling/server_log_entry.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using base::SysInfo;
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace remoting {
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kValueEventNameSessionState[] = "session-state";
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kValueEventNameHeartbeat[] = "heartbeat";
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kValueEventNameHostStatus[] = "host-status";
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kValueRoleHost[] = "host";
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kKeySessionState[] = "session-state";
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kValueSessionStateConnected[] = "connected";
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kValueSessionStateClosed[] = "closed";
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kStatusName[] = "status";
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kExitCodeName[] = "exit-code";
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kKeyOsName[] = "os-name";
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kKeyOsVersion[] = "os-version";
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kKeyHostVersion[] = "host-version";
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kKeyConnectionType[] = "connection-type";
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char* GetValueSessionState(bool connected) {
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return connected ? kValueSessionStateConnected : kValueSessionStateClosed;
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_ptr<ServerLogEntry> MakeLogEntryForSessionStateChange(
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool connected) {
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<ServerLogEntry> entry(new ServerLogEntry());
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  entry->AddRoleField(kValueRoleHost);
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  entry->AddEventNameField(kValueEventNameSessionState);
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  entry->Set(kKeySessionState, GetValueSessionState(connected));
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return entry.Pass();
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_ptr<ServerLogEntry> MakeLogEntryForHeartbeat() {
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<ServerLogEntry> entry(new ServerLogEntry());
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  entry->AddRoleField(kValueRoleHost);
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  entry->AddEventNameField(kValueEventNameHeartbeat);
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return entry.Pass();
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_ptr<ServerLogEntry> MakeLogEntryForHostStatus(
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    HostStatusSender::HostStatus host_status, HostExitCodes exit_code) {
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<ServerLogEntry> entry(new ServerLogEntry());
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  entry->AddRoleField(kValueRoleHost);
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  entry->AddEventNameField(kValueEventNameHostStatus);
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  entry->Set(kStatusName, HostStatusSender::HostStatusToString(host_status));
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (host_status == HostStatusSender::OFFLINE)
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    entry->Set(kExitCodeName, ExitCodeToString(exit_code));
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return entry.Pass();
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AddHostFieldsToLogEntry(ServerLogEntry* entry) {
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_WIN)
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  entry->Set(kKeyOsName, "Windows");
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#elif defined(OS_MACOSX)
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  entry->Set(kKeyOsName, "Mac");
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#elif defined(OS_CHROMEOS)
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  entry->Set(kKeyOsName, "ChromeOS");
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#elif defined(OS_LINUX)
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  entry->Set(kKeyOsName, "Linux");
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // SysInfo::OperatingSystemVersionNumbers is only defined for the following
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // OSes: see base/sys_info_unittest.cc.
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::stringstream os_version;
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int32 os_major_version = 0;
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int32 os_minor_version = 0;
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int32 os_bugfix_version = 0;
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SysInfo::OperatingSystemVersionNumbers(&os_major_version, &os_minor_version,
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                         &os_bugfix_version);
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  os_version << os_major_version << "." << os_minor_version << "."
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)             << os_bugfix_version;
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  entry->Set(kKeyOsVersion, os_version.str());
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  entry->Set(kKeyHostVersion, STRINGIZE(VERSION));
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  entry->AddCpuField();
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AddConnectionTypeToLogEntry(ServerLogEntry* entry,
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    protocol::TransportRoute::RouteType type) {
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  entry->Set(kKeyConnectionType, protocol::TransportRoute::GetTypeString(type));
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace remoting
108