diff options
Diffstat (limited to 'remoting/jingle_glue/iq_request.cc')
-rw-r--r-- | remoting/jingle_glue/iq_request.cc | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/remoting/jingle_glue/iq_request.cc b/remoting/jingle_glue/iq_request.cc new file mode 100644 index 0000000..b9fd6bf --- /dev/null +++ b/remoting/jingle_glue/iq_request.cc @@ -0,0 +1,79 @@ +// Copyright (c) 2010 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/jingle_glue/iq_request.h" + +#include "base/logging.h" +#include "base/message_loop.h" +#include "base/scoped_ptr.h" +#include "remoting/jingle_glue/jingle_client.h" +#include "talk/xmpp/constants.h" +#include "talk/xmpp/xmppengine.h" + +namespace remoting { + +IqRequest::IqRequest(JingleClient* jingle_client) + : jingle_client_(jingle_client), + cookie_(NULL) { + DCHECK(jingle_client_ != NULL); + DCHECK(MessageLoop::current() == jingle_client_->message_loop()); +} + +IqRequest::~IqRequest() { + DCHECK(MessageLoop::current() == jingle_client_->message_loop()); + Unregister(); +} + +void IqRequest::SendIq(const std::string& type, + const std::string& addressee, + buzz::XmlElement* iq_body) { + DCHECK(MessageLoop::current() == jingle_client_->message_loop()); + + // Unregister the handler if it is already registered. + Unregister(); + + DCHECK(type.length() > 0); + DCHECK(addressee.length() > 0); + + buzz::XmppClient* xmpp_client = jingle_client_->xmpp_client(); + DCHECK(xmpp_client); // Expect that connection is active. + + scoped_ptr<buzz::XmlElement> stanza(MakeIqStanza(type, addressee, iq_body, + xmpp_client->NextId())); + + xmpp_client->engine()->SendIq(stanza.get(), this, &cookie_); +} + +// static +buzz::XmlElement* IqRequest::MakeIqStanza(const std::string& type, + const std::string& addressee, + buzz::XmlElement* iq_body, + const std::string& id) { + buzz::XmlElement* stanza = new buzz::XmlElement(buzz::QN_IQ); + stanza->AddAttr(buzz::QN_TYPE, type); + stanza->AddAttr(buzz::QN_TO, addressee); + stanza->AddAttr(buzz::QN_ID, id); + stanza->AddElement(iq_body); + return stanza; +} + +void IqRequest::Unregister() { + if (cookie_) { + buzz::XmppClient* xmpp_client = jingle_client_->xmpp_client(); + // No need to unregister the handler if the client has been destroyed. + if (xmpp_client) { + xmpp_client->engine()->RemoveIqHandler(cookie_, NULL); + } + cookie_ = NULL; + } +} + +void IqRequest::IqResponse(buzz::XmppIqCookie cookie, + const buzz::XmlElement* stanza) { + if (callback_.get() != NULL) { + callback_->Run(stanza); + } +} + +} // namespace remoting |