OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright 2010 The WebRTC Project Authors. All rights reserved. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license | |
5 * that can be found in the LICENSE file in the root of the source | |
6 * tree. An additional intellectual property rights grant can be found | |
7 * in the file PATENTS. All contributing project authors may | |
8 * be found in the AUTHORS file in the root of the source tree. | |
9 */ | |
10 | |
11 #include "webrtc/libjingle/xmpp/jingleinfotask.h" | |
12 | |
13 #include <memory> | |
14 | |
15 #include "webrtc/libjingle/xmpp/constants.h" | |
16 #include "webrtc/libjingle/xmpp/xmppclient.h" | |
17 #include "webrtc/libjingle/xmpp/xmpptask.h" | |
18 #include "webrtc/base/socketaddress.h" | |
19 | |
20 namespace buzz { | |
21 | |
22 class JingleInfoTask::JingleInfoGetTask : public XmppTask { | |
23 public: | |
24 explicit JingleInfoGetTask(XmppTaskParentInterface* parent) | |
25 : XmppTask(parent, XmppEngine::HL_SINGLE), | |
26 done_(false) {} | |
27 | |
28 virtual int ProcessStart() { | |
29 std::unique_ptr<XmlElement> get( | |
30 MakeIq(STR_GET, Jid(), task_id())); | |
31 get->AddElement(new XmlElement(QN_JINGLE_INFO_QUERY, true)); | |
32 if (SendStanza(get.get()) != XMPP_RETURN_OK) { | |
33 return STATE_ERROR; | |
34 } | |
35 return STATE_RESPONSE; | |
36 } | |
37 virtual int ProcessResponse() { | |
38 if (done_) | |
39 return STATE_DONE; | |
40 return STATE_BLOCKED; | |
41 } | |
42 | |
43 protected: | |
44 virtual bool HandleStanza(const XmlElement * stanza) { | |
45 if (!MatchResponseIq(stanza, Jid(), task_id())) | |
46 return false; | |
47 | |
48 if (stanza->Attr(QN_TYPE) != STR_RESULT) | |
49 return false; | |
50 | |
51 // Queue the stanza with the parent so these don't get handled out of order | |
52 JingleInfoTask* parent = static_cast<JingleInfoTask*>(GetParent()); | |
53 parent->QueueStanza(stanza); | |
54 | |
55 // Wake ourselves so we can go into the done state | |
56 done_ = true; | |
57 Wake(); | |
58 return true; | |
59 } | |
60 | |
61 bool done_; | |
62 }; | |
63 | |
64 | |
65 void JingleInfoTask::RefreshJingleInfoNow() { | |
66 JingleInfoGetTask* get_task = new JingleInfoGetTask(this); | |
67 get_task->Start(); | |
68 } | |
69 | |
70 bool | |
71 JingleInfoTask::HandleStanza(const XmlElement * stanza) { | |
72 if (!MatchRequestIq(stanza, "set", QN_JINGLE_INFO_QUERY)) | |
73 return false; | |
74 | |
75 // only respect relay push from the server | |
76 Jid from(stanza->Attr(QN_FROM)); | |
77 if (!from.IsEmpty() && | |
78 !from.BareEquals(GetClient()->jid()) && | |
79 from != Jid(GetClient()->jid().domain())) | |
80 return false; | |
81 | |
82 QueueStanza(stanza); | |
83 return true; | |
84 } | |
85 | |
86 int | |
87 JingleInfoTask::ProcessStart() { | |
88 std::vector<std::string> relay_hosts; | |
89 std::vector<rtc::SocketAddress> stun_hosts; | |
90 std::string relay_token; | |
91 const XmlElement * stanza = NextStanza(); | |
92 if (stanza == NULL) | |
93 return STATE_BLOCKED; | |
94 const XmlElement * query = stanza->FirstNamed(QN_JINGLE_INFO_QUERY); | |
95 if (query == NULL) | |
96 return STATE_START; | |
97 const XmlElement *stun = query->FirstNamed(QN_JINGLE_INFO_STUN); | |
98 if (stun) { | |
99 for (const XmlElement *server = stun->FirstNamed(QN_JINGLE_INFO_SERVER); | |
100 server != NULL; server = server->NextNamed(QN_JINGLE_INFO_SERVER)) { | |
101 std::string host = server->Attr(QN_JINGLE_INFO_HOST); | |
102 std::string port = server->Attr(QN_JINGLE_INFO_UDP); | |
103 if (host != STR_EMPTY && host != STR_EMPTY) { | |
104 stun_hosts.push_back(rtc::SocketAddress(host, atoi(port.c_str()))); | |
105 } | |
106 } | |
107 } | |
108 | |
109 const XmlElement *relay = query->FirstNamed(QN_JINGLE_INFO_RELAY); | |
110 if (relay) { | |
111 relay_token = relay->TextNamed(QN_JINGLE_INFO_TOKEN); | |
112 for (const XmlElement *server = relay->FirstNamed(QN_JINGLE_INFO_SERVER); | |
113 server != NULL; server = server->NextNamed(QN_JINGLE_INFO_SERVER)) { | |
114 std::string host = server->Attr(QN_JINGLE_INFO_HOST); | |
115 if (host != STR_EMPTY) { | |
116 relay_hosts.push_back(host); | |
117 } | |
118 } | |
119 } | |
120 SignalJingleInfo(relay_token, relay_hosts, stun_hosts); | |
121 return STATE_START; | |
122 } | |
123 } | |
OLD | NEW |