// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef REMOTING_HOST_STATUS_SENDER_H_
#define REMOTING_HOST_STATUS_SENDER_H_

#include <string>

#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "remoting/base/rsa_key_pair.h"
#include "remoting/host/host_exit_codes.h"
#include "remoting/jingle_glue/signal_strategy.h"

namespace base {
class MessageLoopProxy;
}  // namespace base

namespace buzz {
class XmlElement;
}  // namespace buzz

namespace remoting {

class RsaKeyPair;
class IqSender;

// HostStatusSender sends the host status to the Chromoting Bot.
// Each host status stanza looks as follows:
//
// <cli:iq type="set" to="user@gmail.com/chromoting123123"
//     id="123" xmlns:cli="jabber:client">
//   <rem:host-status rem:hostid="0"
//       rem:status="OFFLINE" rem:exit-code="INVALID_HOST_CONFIGURATION"
//       xmlns:rem="google:remoting">
//     <rem:signature rem:time="1372878097">.signature.</rem:signature>
//     <rem:host-version>30.0.1554.0</rem:host-version>
//     <rem:log><rem:entry cpu="x86_64" event-name="host-status"
//         host-version="30.0.1560.0" os-name="Linux" role="host"/>
//     </rem:log>
//   </rem:host-status>
// </cli:iq>
//
// The signature is a base-64 encoded SHA-1 hash, signed with the host's
// private RSA key. The message being signed contains the full Jid (e.g.
// "user@gmail.com/chromoting123123"), the timestamp, the host status,
// and the exit code.
class HostStatusSender : SignalStrategy::Listener {
 public:

  enum HostStatus {
    OFFLINE = 0,
    ONLINE = 1
  };

  HostStatusSender(const std::string& host_id,
                   SignalStrategy* signal_strategy,
                   scoped_refptr<RsaKeyPair> key_pair,
                   const std::string& directory_bot_jid);
  virtual ~HostStatusSender();

  // SignalStrategy::Listener interface.
  virtual void OnSignalStrategyStateChange(
      SignalStrategy::State state) OVERRIDE;
  virtual bool OnSignalStrategyIncomingStanza(
      const buzz::XmlElement* stanza) OVERRIDE;

  // APIs for sending host status XMPP messages to the chromoting bot.
  // status: the reason (exit code) why the host is offline.
  void SendOnlineStatus();
  void SendOfflineStatus(HostExitCodes exit_code);

  inline static const char* HostStatusToString(HostStatus host_status) {
    return host_status_strings_[host_status];
  }

 private:
  // Helper method for sending either an online or an offline status message.
  void SendHostStatus(HostStatus status, HostExitCodes exit_code);

  // Helper method to compose host status stanzas.
  scoped_ptr<buzz::XmlElement> CreateHostStatusMessage(
      HostStatus status, HostExitCodes exit_code);

  // Helper method to create the signature blob used in the host status stanza.
  scoped_ptr<buzz::XmlElement> CreateSignature(
      HostStatus status, HostExitCodes exit_code);

  std::string host_id_;
  SignalStrategy* signal_strategy_;
  scoped_refptr<RsaKeyPair> key_pair_;
  std::string directory_bot_jid_;
  scoped_ptr<IqSender> iq_sender_;

  // The string representation of the HostStatus values.
  static const char* const host_status_strings_[2];

  DISALLOW_COPY_AND_ASSIGN(HostStatusSender);
};

}  // namespace remoting

#endif  // REMOTING_HOST_STATUS_SENDER_H_
