Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(310)

Unified Diff: remoting/jingle_glue/jingle_info_task.cc

Issue 2690003: Copy the (early prototype of) remoting in Chrome into the public tree.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/jingle_glue/jingle_info_task.h ('k') | remoting/jingle_glue/jingle_test_client.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « remoting/jingle_glue/jingle_info_task.h ('k') | remoting/jingle_glue/jingle_test_client.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698