15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/listener/send_ping_task.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/listener/xml_element_util.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "talk/xmllite/qname.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "talk/xmllite/xmlelement.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "talk/xmpp/constants.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "talk/xmpp/jid.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "talk/xmpp/xmppclient.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace notifier {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SendPingTask::Delegate::~Delegate() {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SendPingTask::SendPingTask(buzz::XmppTaskParentInterface* parent,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           Delegate* delegate)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : XmppTask(parent, buzz::XmppEngine::HL_SINGLE), delegate_(delegate) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SendPingTask::~SendPingTask() {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SendPingTask::ProcessStart() {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ping_task_id_ = task_id();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<buzz::XmlElement> stanza(MakePingStanza(ping_task_id_));
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "Sending ping stanza " << XmlElementToString(*stanza);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SendStanza(stanza.get()) != buzz::XMPP_RETURN_OK) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DLOG(WARNING) << "Could not send stanza " << XmlElementToString(*stanza);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return STATE_ERROR;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return STATE_RESPONSE;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SendPingTask::ProcessResponse() {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const buzz::XmlElement* stanza = NextStanza();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (stanza == NULL) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return STATE_BLOCKED;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "Received stanza " << XmlElementToString(*stanza);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string type = stanza->Attr(buzz::QN_TYPE);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type != buzz::STR_RESULT) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DLOG(WARNING) << "No type=\"result\" attribute found in stanza "
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  << XmlElementToString(*stanza);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return STATE_ERROR;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->OnPingResponseReceived();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return STATE_DONE;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SendPingTask::HandleStanza(const buzz::XmlElement* stanza) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MatchResponseIq() matches the given Jid with the "from" field of the given
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // stanza, which in this case should be the empty string
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (signifying the server).
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (MatchResponseIq(stanza, buzz::Jid(buzz::STR_EMPTY), ping_task_id_)) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QueueStanza(stanza);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)buzz::XmlElement* SendPingTask::MakePingStanza(const std::string& task_id) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buzz::XmlElement* stanza = MakeIq(buzz::STR_GET,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    buzz::Jid(buzz::STR_EMPTY),
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    task_id);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  stanza->AddElement(new buzz::XmlElement(buzz::QN_PING));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return stanza;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace notifier
81