Index: remoting/jingle_glue/jingle_info_task.cc |
=================================================================== |
--- remoting/jingle_glue/jingle_info_task.cc (revision 0) |
+++ remoting/jingle_glue/jingle_info_task.cc (revision 0) |
@@ -0,0 +1,132 @@ |
+// 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/jingle_info_task.h" |
+ |
+#include "base/scoped_ptr.h" |
+#include "talk/base/socketaddress.h" |
+#include "talk/xmpp/constants.h" |
+#include "talk/xmpp/xmppclient.h" |
+ |
+namespace remoting { |
+ |
+// This code is a copy of googleclient/talk/app/jingleinfotask.cc . |
+ |
+class JingleInfoTask::JingleInfoGetTask : public XmppTask { |
+ public: |
+ explicit JingleInfoGetTask(talk_base::TaskParent* parent) : |
+ XmppTask(parent, buzz::XmppEngine::HL_SINGLE), |
+ done_(false) { } |
+ |
+ virtual int ProcessStart() { |
+ // Set jingle info query IQ stanza. |
+ scoped_ptr<buzz::XmlElement> get_iq( |
+ MakeIq(buzz::STR_GET, buzz::JID_EMPTY, task_id())); |
+ get_iq->AddElement(new buzz::XmlElement(buzz::QN_JINGLE_INFO_QUERY, true)); |
+ if (SendStanza(get_iq.get()) != buzz::XMPP_RETURN_OK) { |
+ return STATE_ERROR; |
+ } |
+ return STATE_RESPONSE; |
+ } |
+ |
+ virtual int ProcessResponse() { |
+ if (done_) { |
+ return STATE_DONE; |
+ } |
+ return STATE_BLOCKED; |
+ } |
+ |
+ protected: |
+ virtual bool HandleStanza(const buzz::XmlElement* stanza) { |
+ if (!MatchResponseIq(stanza, buzz::JID_EMPTY, task_id())) { |
+ return false; |
+ } |
+ |
+ if (stanza->Attr(buzz::QN_TYPE) != buzz::STR_RESULT) { |
+ return false; |
+ } |
+ |
+ // Queue the stanza with the parent so these don't get handled out of order. |
+ JingleInfoTask* parent = static_cast<JingleInfoTask*>(GetParent()); |
+ parent->QueueStanza(stanza); |
+ |
+ // Wake ourselves so we can go into the done state. |
+ done_ = true; |
+ Wake(); |
+ return true; |
+ } |
+ |
+ bool done_; |
+}; |
+ |
+ |
+void JingleInfoTask::RefreshJingleInfoNow() { |
+ JingleInfoGetTask* get_task = new JingleInfoGetTask(this); |
+ get_task->Start(); |
+} |
+ |
+bool JingleInfoTask::HandleStanza(const buzz::XmlElement* stanza) { |
+ if (!MatchRequestIq(stanza, "set", buzz::QN_JINGLE_INFO_QUERY)) { |
+ return false; |
+ } |
+ |
+ // Only respect relay push from the server. |
+ buzz::Jid from(stanza->Attr(buzz::QN_FROM)); |
+ if (from != buzz::JID_EMPTY && |
+ !from.BareEquals(GetClient()->jid()) && |
+ from != buzz::Jid(GetClient()->jid().domain())) { |
+ return false; |
+ } |
+ |
+ QueueStanza(stanza); |
+ return true; |
+} |
+ |
+int JingleInfoTask::ProcessStart() { |
+ std::vector<std::string> relay_hosts; |
+ std::vector<talk_base::SocketAddress> stun_hosts; |
+ std::string relay_token; |
+ const buzz::XmlElement* stanza = NextStanza(); |
+ if (stanza == NULL) { |
+ return STATE_BLOCKED; |
+ } |
+ const buzz::XmlElement* query = |
+ stanza->FirstNamed(buzz::QN_JINGLE_INFO_QUERY); |
+ if (query == NULL) { |
+ return STATE_START; |
+ } |
+ const buzz::XmlElement* stun = query->FirstNamed(buzz::QN_JINGLE_INFO_STUN); |
+ if (stun) { |
+ for (const buzz::XmlElement* server = |
+ stun->FirstNamed(buzz::QN_JINGLE_INFO_SERVER); |
+ server != NULL; |
+ server = server->NextNamed(buzz::QN_JINGLE_INFO_SERVER)) { |
+ std::string host = server->Attr(buzz::QN_JINGLE_INFO_HOST); |
+ std::string port = server->Attr(buzz::QN_JINGLE_INFO_UDP); |
+ if (host != buzz::STR_EMPTY && host != buzz::STR_EMPTY) { |
+ // TODO(sergeyu): Avoid atoi() here. |
+ stun_hosts.push_back( |
+ talk_base::SocketAddress(host, atoi(port.c_str()))); |
+ } |
+ } |
+ } |
+ |
+ const buzz::XmlElement* relay = query->FirstNamed(buzz::QN_JINGLE_INFO_RELAY); |
+ if (relay) { |
+ relay_token = relay->TextNamed(buzz::QN_JINGLE_INFO_TOKEN); |
+ for (const buzz::XmlElement* server = |
+ relay->FirstNamed(buzz::QN_JINGLE_INFO_SERVER); |
+ server != NULL; |
+ server = server->NextNamed(buzz::QN_JINGLE_INFO_SERVER)) { |
+ std::string host = server->Attr(buzz::QN_JINGLE_INFO_HOST); |
+ if (host != buzz::STR_EMPTY) { |
+ relay_hosts.push_back(host); |
+ } |
+ } |
+ } |
+ SignalJingleInfo(relay_token, relay_hosts, stun_hosts); |
+ return STATE_START; |
+} |
+ |
+} // namespace remoting |
Property changes on: remoting/jingle_glue/jingle_info_task.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |