Home | History | Annotate | Download | only in host
      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.
      4 
      5 #include "remoting/host/server_log_entry.h"
      6 
      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"
     13 
     14 using base::SysInfo;
     15 using buzz::QName;
     16 using buzz::XmlElement;
     17 using remoting::protocol::Session;
     18 
     19 namespace remoting {
     20 
     21 namespace {
     22 const char kLogCommand[] = "log";
     23 
     24 const char kLogEntry[] = "entry";
     25 
     26 const char kKeyEventName[] = "event-name";
     27 const char kValueEventNameSessionState[] = "session-state";
     28 const char kValueEventNameHeartbeat[] = "heartbeat";
     29 const char kValueEventNameHostStatus[] = "host-status";
     30 
     31 const char kKeyRole[] = "role";
     32 const char kValueRoleHost[] = "host";
     33 
     34 const char kKeyMode[] = "mode";
     35 const char kValueModeIt2Me[] = "it2me";
     36 const char kValueModeMe2Me[] = "me2me";
     37 
     38 const char kKeySessionState[] = "session-state";
     39 const char kValueSessionStateConnected[] = "connected";
     40 const char kValueSessionStateClosed[] = "closed";
     41 
     42 const char kStatusName[] = "status";
     43 const char kExitCodeName[] = "exit-code";
     44 
     45 const char kKeyOsName[] = "os-name";
     46 
     47 #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
     48 const char kKeyOsVersion[] = "os-version";
     49 #endif
     50 
     51 const char kKeyHostVersion[] = "host-version";
     52 
     53 const char kKeyCpu[] = "cpu";
     54 
     55 const char kKeyConnectionType[] = "connection-type";
     56 
     57 }  // namespace
     58 
     59 ServerLogEntry::ServerLogEntry() {
     60 }
     61 
     62 ServerLogEntry::~ServerLogEntry() {
     63 }
     64 
     65 // static
     66 scoped_ptr<buzz::XmlElement> ServerLogEntry::MakeStanza() {
     67   return scoped_ptr<buzz::XmlElement>(
     68       new XmlElement(QName(kChromotingXmlNamespace, kLogCommand)));
     69 }
     70 
     71 // static
     72 scoped_ptr<ServerLogEntry> ServerLogEntry::MakeForSessionStateChange(
     73     bool connected) {
     74   scoped_ptr<ServerLogEntry> entry(new ServerLogEntry());
     75   entry->Set(kKeyRole, kValueRoleHost);
     76   entry->Set(kKeyEventName, kValueEventNameSessionState);
     77   entry->Set(kKeySessionState, GetValueSessionState(connected));
     78   return entry.Pass();
     79 }
     80 
     81 // static
     82 scoped_ptr<ServerLogEntry> ServerLogEntry::MakeForHeartbeat() {
     83   scoped_ptr<ServerLogEntry> entry(new ServerLogEntry());
     84   entry->Set(kKeyRole, kValueRoleHost);
     85   entry->Set(kKeyEventName, kValueEventNameHeartbeat);
     86   return entry.Pass();
     87 }
     88 
     89 // static
     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));
     98   return entry.Pass();
     99 }
    100 
    101 void ServerLogEntry::AddHostFields() {
    102 #if defined(OS_WIN)
    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");
    110 #endif
    111 
    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,
    120                                          &os_bugfix_version);
    121   os_version << os_major_version << "." << os_minor_version << "."
    122              << os_bugfix_version;
    123   Set(kKeyOsVersion, os_version.str());
    124 #endif
    125 
    126   Set(kKeyHostVersion, STRINGIZE(VERSION));
    127   Set(kKeyCpu, SysInfo::OperatingSystemArchitecture());
    128 };
    129 
    130 void ServerLogEntry::AddModeField(ServerLogEntry::Mode mode) {
    131   Set(kKeyMode, GetValueMode(mode));
    132 }
    133 
    134 void ServerLogEntry::AddConnectionTypeField(
    135     protocol::TransportRoute::RouteType type) {
    136   Set(kKeyConnectionType, protocol::TransportRoute::GetTypeString(type));
    137 }
    138 
    139 // static
    140 const char* ServerLogEntry::GetValueMode(ServerLogEntry::Mode mode) {
    141   switch (mode) {
    142     case IT2ME:
    143       return kValueModeIt2Me;
    144     case ME2ME:
    145       return kValueModeMe2Me;
    146     default:
    147       NOTREACHED();
    148       return NULL;
    149   }
    150 }
    151 
    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);
    158   }
    159   return stanza.Pass();
    160 }
    161 
    162 // static
    163 const char* ServerLogEntry::GetValueSessionState(bool connected) {
    164   return connected ? kValueSessionStateConnected : kValueSessionStateClosed;
    165 }
    166 
    167 void ServerLogEntry::Set(const std::string& key, const std::string& value) {
    168   values_map_[key] = value;
    169 }
    170 
    171 }  // namespace remoting
    172