Home | History | Annotate | Download | only in xmpp
      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