1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "remoting/host/host_status_logger.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/bind.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/message_loop/message_loop_proxy.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "remoting/base/constants.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "remoting/host/host_status_monitor.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "remoting/host/server_log_entry_host.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "remoting/protocol/transport.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "remoting/signaling/server_log_entry.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace remoting {
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
17116680a4aac90f2aa7413d9095a592090648e557Ben MurdochHostStatusLogger::HostStatusLogger(base::WeakPtr<HostStatusMonitor> monitor,
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   ServerLogEntry::Mode mode,
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   SignalStrategy* signal_strategy,
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   const std::string& directory_bot_jid)
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : log_to_server_(mode, signal_strategy, directory_bot_jid),
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      monitor_(monitor) {
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  monitor_->AddStatusObserver(this);
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
26116680a4aac90f2aa7413d9095a592090648e557Ben MurdochHostStatusLogger::~HostStatusLogger() {
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (monitor_.get())
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    monitor_->RemoveStatusObserver(this);
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid HostStatusLogger::LogSessionStateChange(const std::string& jid,
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                             bool connected) {
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(CalledOnValidThread());
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<ServerLogEntry> entry(
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      MakeLogEntryForSessionStateChange(connected));
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AddHostFieldsToLogEntry(entry.get());
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  entry->AddModeField(log_to_server_.mode());
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (connected) {
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DCHECK_EQ(connection_route_type_.count(jid), 1u);
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AddConnectionTypeToLogEntry(entry.get(), connection_route_type_[jid]);
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  log_to_server_.Log(*entry.get());
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid HostStatusLogger::OnClientConnected(const std::string& jid) {
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(CalledOnValidThread());
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  LogSessionStateChange(jid, true);
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid HostStatusLogger::OnClientDisconnected(const std::string& jid) {
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(CalledOnValidThread());
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  LogSessionStateChange(jid, false);
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  connection_route_type_.erase(jid);
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid HostStatusLogger::OnClientRouteChange(
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& jid,
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& channel_name,
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const protocol::TransportRoute& route) {
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Store connection type for the video channel. It is logged later
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // when client authentication is finished.
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (channel_name == kVideoChannelName) {
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    connection_route_type_[jid] = route.type;
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid HostStatusLogger::SetSignalingStateForTest(SignalStrategy::State state) {
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  log_to_server_.OnSignalStrategyStateChange(state);
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace remoting
74