* Update libjingle to 50389769.
* Together with "Add texture support for i420 video frame." from
wuchengli@chromium.org.
https://webrtc-codereview.appspot.com/1413004

RISK=P1
TESTED=try bots
R=fischman@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/1967004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@4489 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/talk/xmpp/constants.cc b/talk/xmpp/constants.cc
index 193ae2b..196a1ec 100644
--- a/talk/xmpp/constants.cc
+++ b/talk/xmpp/constants.cc
@@ -119,6 +119,27 @@
 const char STR_MUC_ROOM_FEATURE_BROADCAST[] = "broadcast";
 const char STR_MUC_ROOM_FEATURE_MULTI_USER_VC[] = "muc_muvc";
 
+const char STR_ID_TYPE_CONVERSATION[] = "conversation";
+const char NS_GOOGLE_MUC_HANGOUT[] = "google:muc#hangout";
+const StaticQName QN_GOOGLE_MUC_HANGOUT_INVITE =
+    { NS_GOOGLE_MUC_HANGOUT, "invite" };
+const StaticQName QN_GOOGLE_MUC_HANGOUT_INVITE_TYPE =
+    { NS_GOOGLE_MUC_HANGOUT, "invite-type" };
+const StaticQName QN_ATTR_CREATE_ACTIVITY =
+    { STR_EMPTY, "create-activity" };
+const StaticQName QN_GOOGLE_MUC_HANGOUT_PUBLIC =
+    { NS_GOOGLE_MUC_HANGOUT, "public" };
+const StaticQName QN_GOOGLE_MUC_HANGOUT_INVITEE =
+    { NS_GOOGLE_MUC_HANGOUT, "invitee" };
+const StaticQName QN_GOOGLE_MUC_HANGOUT_NOTIFICATION_STATUS =
+    { NS_GOOGLE_MUC_HANGOUT, "notification-status" };
+const StaticQName QN_GOOGLE_MUC_HANGOUT_NOTIFICATION_TYPE = {
+    NS_GOOGLE_MUC_HANGOUT, "notification-type" };
+const StaticQName QN_GOOGLE_MUC_HANGOUT_HANGOUT_START_CONTEXT = {
+    NS_GOOGLE_MUC_HANGOUT, "hangout-start-context" };
+const StaticQName QN_GOOGLE_MUC_HANGOUT_CONVERSATION_ID = {
+    NS_GOOGLE_MUC_HANGOUT, "conversation-id" };
+
 const StaticQName QN_STREAM_STREAM = { NS_STREAM, STR_STREAM };
 const StaticQName QN_STREAM_FEATURES = { NS_STREAM, "features" };
 const StaticQName QN_STREAM_ERROR = { NS_STREAM, "error" };
diff --git a/talk/xmpp/constants.h b/talk/xmpp/constants.h
index e01a798..cd6d2b7 100644
--- a/talk/xmpp/constants.h
+++ b/talk/xmpp/constants.h
@@ -112,6 +112,17 @@
 extern const char STR_MUC_ROOM_FEATURE_BROADCAST[];
 extern const char STR_MUC_ROOM_FEATURE_MULTI_USER_VC[];
 
+extern const char STR_ID_TYPE_CONVERSATION[];
+extern const char NS_GOOGLE_MUC_HANGOUT[];
+extern const StaticQName QN_GOOGLE_MUC_HANGOUT_INVITE;
+extern const StaticQName QN_GOOGLE_MUC_HANGOUT_INVITE_TYPE;
+extern const StaticQName QN_ATTR_CREATE_ACTIVITY;
+extern const StaticQName QN_GOOGLE_MUC_HANGOUT_PUBLIC;
+extern const StaticQName QN_GOOGLE_MUC_HANGOUT_INVITEE;
+extern const StaticQName QN_GOOGLE_MUC_HANGOUT_NOTIFICATION_TYPE;
+extern const StaticQName QN_GOOGLE_MUC_HANGOUT_HANGOUT_START_CONTEXT;
+extern const StaticQName QN_GOOGLE_MUC_HANGOUT_CONVERSATION_ID;
+
 extern const StaticQName QN_STREAM_STREAM;
 extern const StaticQName QN_STREAM_FEATURES;
 extern const StaticQName QN_STREAM_ERROR;
diff --git a/talk/xmpp/mucroomdiscoverytask.cc b/talk/xmpp/mucroomdiscoverytask.cc
index e0770fd..a5055d2 100644
--- a/talk/xmpp/mucroomdiscoverytask.cc
+++ b/talk/xmpp/mucroomdiscoverytask.cc
@@ -49,12 +49,20 @@
   std::map<std::string, std::string> extended_info;
   const XmlElement* identity = query->FirstNamed(QN_DISCO_IDENTITY);
   if (identity == NULL || !identity->HasAttr(QN_NAME)) {
-    SignalResult(this, false, "", features, extended_info);
+    SignalResult(this, false, "", "", features, extended_info);
     return;
   }
 
   const std::string name(identity->Attr(QN_NAME));
 
+  // Get the conversation id
+  const XmlElement* convIdElement =
+      identity->FirstNamed(QN_GOOGLE_MUC_HANGOUT_CONVERSATION_ID);
+  std::string conversation_id;
+  if (convIdElement != NULL) {
+    conversation_id = convIdElement->BodyText();
+  }
+
   for (const XmlElement* feature = query->FirstNamed(QN_DISCO_FEATURE);
        feature != NULL; feature = feature->NextNamed(QN_DISCO_FEATURE)) {
     features.insert(feature->Attr(QN_VAR));
@@ -69,7 +77,7 @@
     }
   }
 
-  SignalResult(this, true, name, features, extended_info);
+  SignalResult(this, true, name, conversation_id, features, extended_info);
 }
 
 }  // namespace buzz
diff --git a/talk/xmpp/mucroomdiscoverytask.h b/talk/xmpp/mucroomdiscoverytask.h
index 6e3a21a..4097cc6 100644
--- a/talk/xmpp/mucroomdiscoverytask.h
+++ b/talk/xmpp/mucroomdiscoverytask.h
@@ -41,10 +41,11 @@
   MucRoomDiscoveryTask(XmppTaskParentInterface* parent,
                        const Jid& room_jid);
 
-  // Signal (exists, name, features, extended_info)
-  sigslot::signal5<MucRoomDiscoveryTask*,
+  // Signal (exists, name, conversationId, features, extended_info)
+  sigslot::signal6<MucRoomDiscoveryTask*,
                    bool,
                    const std::string&,
+                   const std::string&,
                    const std::set<std::string>&,
                    const std::map<std::string, std::string>& > SignalResult;
 
diff --git a/talk/xmpp/mucroomdiscoverytask_unittest.cc b/talk/xmpp/mucroomdiscoverytask_unittest.cc
index b88b6f2..354503f 100644
--- a/talk/xmpp/mucroomdiscoverytask_unittest.cc
+++ b/talk/xmpp/mucroomdiscoverytask_unittest.cc
@@ -43,10 +43,12 @@
   void OnResult(buzz::MucRoomDiscoveryTask* task,
                 bool exists,
                 const std::string& name,
+                const std::string& conversation_id,
                 const std::set<std::string>& features,
                 const std::map<std::string, std::string>& extended_info) {
     last_exists = exists;
     last_name = name;
+    last_conversation_id = conversation_id;
     last_features = features;
     last_extended_info = extended_info;
   }
@@ -58,6 +60,7 @@
 
   bool last_exists;
   std::string last_name;
+  std::string last_conversation_id;
   std::set<std::string> last_features;
   std::map<std::string, std::string> last_extended_info;
   int error_count;
@@ -67,7 +70,8 @@
  public:
   MucRoomDiscoveryTaskTest() :
       room_jid("muc-jid-ponies@domain.com"),
-      room_name("ponies") {
+      room_name("ponies"),
+      conversation_id("test_conversation_id") {
   }
 
   virtual void SetUp() {
@@ -87,6 +91,7 @@
   MucRoomDiscoveryListener* listener;
   buzz::Jid room_jid;
   std::string room_name;
+  std::string conversation_id;
 };
 
 TEST_F(MucRoomDiscoveryTaskTest, TestDiscovery) {
@@ -107,12 +112,16 @@
   EXPECT_EQ(expected_iq, xmpp_client->sent_stanzas()[0]->Str());
 
   EXPECT_EQ("", listener->last_name);
+  EXPECT_EQ("", listener->last_conversation_id);
 
   std::string response_iq =
       "<iq xmlns='jabber:client'"
       "    from='muc-jid-ponies@domain.com' id='0' type='result'>"
       "  <info:query xmlns:info='http://jabber.org/protocol/disco#info'>"
-      "    <info:identity name='ponies'/>"
+      "    <info:identity name='ponies'>"
+      "      <han:conversation-id xmlns:han='google:muc#hangout'>"
+      "test_conversation_id</han:conversation-id>"
+      "    </info:identity>"
       "    <info:feature var='feature1'/>"
       "    <info:feature var='feature2'/>"
       "    <data:x xmlns:data='jabber:x:data'>"
@@ -126,6 +135,7 @@
 
   EXPECT_EQ(true, listener->last_exists);
   EXPECT_EQ(room_name, listener->last_name);
+  EXPECT_EQ(conversation_id, listener->last_conversation_id);
   EXPECT_EQ(2U, listener->last_features.size());
   EXPECT_EQ(1U, listener->last_features.count("feature1"));
   EXPECT_EQ(2U, listener->last_extended_info.size());
diff --git a/talk/xmpp/mucroomlookuptask.h b/talk/xmpp/mucroomlookuptask.h
index 60001ff..48f2484 100644
--- a/talk/xmpp/mucroomlookuptask.h
+++ b/talk/xmpp/mucroomlookuptask.h
@@ -46,6 +46,11 @@
 
 class MucRoomLookupTask : public IqTask {
  public:
+  enum IdType {
+    ID_TYPE_CONVERSATION,
+    ID_TYPE_HANGOUT
+  };
+
   static MucRoomLookupTask*
       CreateLookupTaskForRoomName(XmppTaskParentInterface* parent,
                                   const Jid& lookup_server_jid,