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