1 /* 2 * Copyright 2011 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/mucroomlookuptask.h" 12 13 #include "webrtc/libjingle/xmpp/constants.h" 14 #include "webrtc/base/logging.h" 15 #include "webrtc/base/scoped_ptr.h" 16 17 18 namespace buzz { 19 20 MucRoomLookupTask* 21 MucRoomLookupTask::CreateLookupTaskForRoomName(XmppTaskParentInterface* parent, 22 const Jid& lookup_server_jid, 23 const std::string& room_name, 24 const std::string& room_domain) { 25 return new MucRoomLookupTask(parent, lookup_server_jid, 26 MakeNameQuery(room_name, room_domain)); 27 } 28 29 MucRoomLookupTask* 30 MucRoomLookupTask::CreateLookupTaskForRoomJid(XmppTaskParentInterface* parent, 31 const Jid& lookup_server_jid, 32 const Jid& room_jid) { 33 return new MucRoomLookupTask(parent, lookup_server_jid, 34 MakeJidQuery(room_jid)); 35 } 36 37 MucRoomLookupTask* 38 MucRoomLookupTask::CreateLookupTaskForHangoutId(XmppTaskParentInterface* parent, 39 const Jid& lookup_server_jid, 40 const std::string& hangout_id) { 41 return new MucRoomLookupTask(parent, lookup_server_jid, 42 MakeHangoutIdQuery(hangout_id)); 43 } 44 45 MucRoomLookupTask* 46 MucRoomLookupTask::CreateLookupTaskForExternalId( 47 XmppTaskParentInterface* parent, 48 const Jid& lookup_server_jid, 49 const std::string& external_id, 50 const std::string& type) { 51 return new MucRoomLookupTask(parent, lookup_server_jid, 52 MakeExternalIdQuery(external_id, type)); 53 } 54 55 MucRoomLookupTask::MucRoomLookupTask(XmppTaskParentInterface* parent, 56 const Jid& lookup_server_jid, 57 XmlElement* query) 58 : IqTask(parent, STR_SET, lookup_server_jid, query) { 59 } 60 61 XmlElement* MucRoomLookupTask::MakeNameQuery( 62 const std::string& room_name, const std::string& room_domain) { 63 XmlElement* name_elem = new XmlElement(QN_SEARCH_ROOM_NAME, false); 64 name_elem->SetBodyText(room_name); 65 66 XmlElement* domain_elem = new XmlElement(QN_SEARCH_ROOM_DOMAIN, false); 67 domain_elem->SetBodyText(room_domain); 68 69 XmlElement* query = new XmlElement(QN_SEARCH_QUERY, true); 70 query->AddElement(name_elem); 71 query->AddElement(domain_elem); 72 return query; 73 } 74 75 XmlElement* MucRoomLookupTask::MakeJidQuery(const Jid& room_jid) { 76 XmlElement* jid_elem = new XmlElement(QN_SEARCH_ROOM_JID); 77 jid_elem->SetBodyText(room_jid.Str()); 78 79 XmlElement* query = new XmlElement(QN_SEARCH_QUERY); 80 query->AddElement(jid_elem); 81 return query; 82 } 83 84 XmlElement* MucRoomLookupTask::MakeExternalIdQuery( 85 const std::string& external_id, const std::string& type) { 86 XmlElement* external_id_elem = new XmlElement(QN_SEARCH_EXTERNAL_ID); 87 external_id_elem->SetAttr(QN_TYPE, type); 88 external_id_elem->SetBodyText(external_id); 89 90 XmlElement* query = new XmlElement(QN_SEARCH_QUERY); 91 query->AddElement(external_id_elem); 92 return query; 93 } 94 95 // Construct a stanza to lookup the muc jid for a given hangout id. eg: 96 // 97 // <query xmlns="jabber:iq:search"> 98 // <hangout-id>0b48ad092c893a53b7bfc87422caf38e93978798e</hangout-id> 99 // </query> 100 XmlElement* MucRoomLookupTask::MakeHangoutIdQuery( 101 const std::string& hangout_id) { 102 XmlElement* hangout_id_elem = new XmlElement(QN_SEARCH_HANGOUT_ID, false); 103 hangout_id_elem->SetBodyText(hangout_id); 104 105 XmlElement* query = new XmlElement(QN_SEARCH_QUERY, true); 106 query->AddElement(hangout_id_elem); 107 return query; 108 } 109 110 // Handle a response like the following: 111 // 112 // <query xmlns="jabber:iq:search"> 113 // <item jid="muvc-private-chat-guid (at) groupchat.google.com"> 114 // <room-name>0b48ad092c893a53b7bfc87422caf38e93978798e</room-name> 115 // <room-domain>hangout.google.com</room-domain> 116 // </item> 117 // </query> 118 void MucRoomLookupTask::HandleResult(const XmlElement* stanza) { 119 const XmlElement* query_elem = stanza->FirstNamed(QN_SEARCH_QUERY); 120 if (query_elem == NULL) { 121 SignalError(this, stanza); 122 return; 123 } 124 125 const XmlElement* item_elem = query_elem->FirstNamed(QN_SEARCH_ITEM); 126 if (item_elem == NULL) { 127 SignalError(this, stanza); 128 return; 129 } 130 131 MucRoomInfo room; 132 room.jid = Jid(item_elem->Attr(buzz::QN_JID)); 133 if (!room.jid.IsValid()) { 134 SignalError(this, stanza); 135 return; 136 } 137 138 const XmlElement* room_name_elem = 139 item_elem->FirstNamed(QN_SEARCH_ROOM_NAME); 140 if (room_name_elem != NULL) { 141 room.name = room_name_elem->BodyText(); 142 } 143 144 const XmlElement* room_domain_elem = 145 item_elem->FirstNamed(QN_SEARCH_ROOM_DOMAIN); 146 if (room_domain_elem != NULL) { 147 room.domain = room_domain_elem->BodyText(); 148 } 149 150 const XmlElement* hangout_id_elem = 151 item_elem->FirstNamed(QN_SEARCH_HANGOUT_ID); 152 if (hangout_id_elem != NULL) { 153 room.hangout_id = hangout_id_elem->BodyText(); 154 } 155 156 SignalResult(this, room); 157 } 158 159 } // namespace buzz 160