12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- // Copyright 2014 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.
- #include "remoting/signaling/xmpp_log_to_server.h"
- #include <memory>
- #include <utility>
- #include "base/bind.h"
- #include "remoting/base/constants.h"
- #include "remoting/signaling/iq_sender.h"
- #include "remoting/signaling/signal_strategy.h"
- #include "remoting/signaling/xmpp_constants.h"
- #include "third_party/libjingle_xmpp/xmllite/xmlelement.h"
- using jingle_xmpp::QName;
- using jingle_xmpp::XmlElement;
- namespace remoting {
- XmppLogToServer::XmppLogToServer(
- ServerLogEntry::Mode mode,
- SignalStrategy* signal_strategy,
- const std::string& directory_bot_jid,
- scoped_refptr<base::SequencedTaskRunner> caller_task_runner)
- : mode_(mode),
- signal_strategy_(signal_strategy),
- directory_bot_jid_(directory_bot_jid) {
- DETACH_FROM_SEQUENCE(sequence_checker_);
- if (!caller_task_runner || caller_task_runner->RunsTasksInCurrentSequence()) {
- Init();
- return;
- }
- caller_task_runner->PostTask(
- FROM_HERE,
- base::BindOnce(&XmppLogToServer::Init, weak_factory_.GetWeakPtr()));
- }
- XmppLogToServer::~XmppLogToServer() {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- signal_strategy_->RemoveListener(this);
- }
- void XmppLogToServer::OnSignalStrategyStateChange(SignalStrategy::State state) {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- if (state == SignalStrategy::CONNECTED) {
- iq_sender_ = std::make_unique<IqSender>(signal_strategy_);
- SendPendingEntries();
- } else if (state == SignalStrategy::DISCONNECTED) {
- iq_sender_.reset();
- }
- }
- bool XmppLogToServer::OnSignalStrategyIncomingStanza(
- const jingle_xmpp::XmlElement* stanza) {
- return false;
- }
- void XmppLogToServer::Log(const ServerLogEntry& entry) {
- pending_entries_.push_back(entry);
- SendPendingEntries();
- }
- void XmppLogToServer::Init() {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- signal_strategy_->AddListener(this);
- }
- void XmppLogToServer::SendPendingEntries() {
- if (iq_sender_ == nullptr) {
- return;
- }
- if (pending_entries_.empty()) {
- return;
- }
- // Make one stanza containing all the pending entries.
- std::unique_ptr<XmlElement> stanza(ServerLogEntry::MakeStanza());
- while (!pending_entries_.empty()) {
- ServerLogEntry& entry = pending_entries_.front();
- stanza->AddElement(entry.ToStanza().release());
- pending_entries_.pop_front();
- }
- // Send the stanza to the server and ignore the response.
- iq_sender_->SendIq(kIqTypeSet, directory_bot_jid_, std::move(stanza),
- IqSender::ReplyCallback());
- }
- ServerLogEntry::Mode XmppLogToServer::mode() const {
- return mode_;
- }
- } // namespace remoting
|