diff options
author | garykac@google.com <garykac@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-07 19:58:23 +0000 |
---|---|---|
committer | garykac@google.com <garykac@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-07 19:58:23 +0000 |
commit | cb3b1f93130040a150e7fcc57cd4d5a75569685a (patch) | |
tree | ff93665e3c1478c61663d1107cd42dc25b31448d /remoting/jingle_glue/iq_request.cc | |
parent | b0110e822ac2b2db56d1b1542aad06da573cd544 (diff) | |
download | chromium_src-cb3b1f93130040a150e7fcc57cd4d5a75569685a.zip chromium_src-cb3b1f93130040a150e7fcc57cd4d5a75569685a.tar.gz chromium_src-cb3b1f93130040a150e7fcc57cd4d5a75569685a.tar.bz2 |
Copy the (early prototype of) remoting in Chrome into the public tree.
At the moment, this is a semi-functional demo.
BUG=none
TEST=build/run all unittests on linux
Review URL: http://codereview.chromium.org/2690003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@49087 0039d316-1c4b-4281-b951-d872f2087c98
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 |