/soc/2015/nakulgulati/main: 84474d2d3cbd: hangouts: channel conn...

[email protected]
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: 84474d2d3cbd9afbb7646efeda94f3318e4c7dbc
Author:	 Nakul Gulati
Date:	 2015-08-21 06:14 +0530
Branch:	 hangouts
URL: https://hg.pidgin.im/soc/2015/nakulgulati/main/rev/84474d2d3cbd

Description:

hangouts: channel connect and subscribe signals

diffstat:

 libpurple/protocols/hangouts/api.c     |  55 +++++++++++++-----
 libpurple/protocols/hangouts/channel.c |  99 ++++++++++++++++++++++++++-------
 libpurple/protocols/hangouts/channel.h |   7 ++
 3 files changed, 122 insertions(+), 39 deletions(-)

diffs (truncated from 356 to 300 lines):

diff --git a/libpurple/protocols/hangouts/api.c b/libpurple/protocols/hangouts/api.c
--- a/libpurple/protocols/hangouts/api.c
+++ b/libpurple/protocols/hangouts/api.c
@@ -93,14 +93,12 @@ struct _HangoutsApiHttpInfo
 
 const gchar *chat_init_path[] =
   {
-
   "$.ds:7[0][2]",
   "$.ds:34[0][2]",
   "$.ds:2[0][4]",
   "$.ds:2[0][6]",
   "$.ds:4[0][7]",
   "$.ds:21[0][1][4]"
-
   };
 
 static void
@@ -115,7 +113,7 @@ hangouts_api_dispose (GObject *obj)
 
   purple_http_cookie_jar_unref (priv->cookie_jar);
 
-  json_node_free(priv->chat_init_dict);
+  json_node_free (priv->chat_init_dict);
 
   g_free (priv->cookies);
   g_free (priv->access_token);
@@ -137,20 +135,20 @@ hangouts_api_class_init (HangoutsApiClas
   g_type_class_add_private (klass, sizeof(HangoutsApiPrivate));
 
   g_signal_new ("auth",
-  		G_TYPE_FROM_CLASS(klass),
-  		G_SIGNAL_ACTION, 0,
-  		NULL, NULL,
-  		g_cclosure_marshal_VOID__VOID,
-    		G_TYPE_NONE,
-    		NULL);
-
+    		G_TYPE_FROM_CLASS(klass),
+    		G_SIGNAL_ACTION, 0,
+    		NULL, NULL,
+    		g_cclosure_marshal_VOID__VOID,
+      		G_TYPE_NONE,
+      		NULL);
+  
   g_signal_new ("get-chat-init",
-		G_TYPE_FROM_CLASS(klass),
-		G_SIGNAL_ACTION, 0,
-		NULL, NULL,
-		g_cclosure_marshal_VOID__VOID,
-  		G_TYPE_NONE,
-  		NULL);
+		  G_TYPE_FROM_CLASS(klass),
+		  G_SIGNAL_ACTION, 0,
+		  NULL, NULL,
+		  g_cclosure_marshal_VOID__VOID,
+		  G_TYPE_NONE,
+		  NULL);
 }
 
 static void
@@ -163,6 +161,21 @@ hangouts_api_init (HangoutsApi *api)
   api->priv = priv;
 }
 
+static void
+hangouts_api_cb_connect (HangoutsChannel *channel, gpointer *data)
+{
+  if (!hangouts_channel_is_subscribed (channel))
+    {
+      hangouts_channel_subscribe (channel);
+    }
+}
+
+static void
+hangouts_api_cb_subscribe (HangoutsChannel *channel, gpointer *data)
+{
+  purple_debug_misc ("hangouts-api", "channel subscribed");
+}
+
 HangoutsApi *
 hangouts_api_new (PurpleConnection *gc)
 {
@@ -175,6 +188,11 @@ hangouts_api_new (PurpleConnection *gc)
   priv->cookies = g_new0(HangoutsApiCookies, 1);
   priv->gc = gc;
 
+  g_signal_connect(priv->channel, "connect",
+		   G_CALLBACK(hangouts_api_cb_connect), NULL);
+  g_signal_connect(priv->channel, "subscribe",
+		   G_CALLBACK(hangouts_api_cb_subscribe), NULL);
+
   return api;
 }
 
@@ -362,6 +380,7 @@ hangouts_api_auth_with_code_cb (PurpleHt
 							"$['refresh_token']",
 							NULL);
 
+      hangouts_channel_set_access_token (priv->channel, priv->access_token);
       purple_account_set_remember_password (acct, TRUE);
       purple_account_set_password (acct, priv->refresh_token, NULL, NULL);
 
@@ -424,6 +443,7 @@ hangouts_api_oauth_refresh_token_cb (Pur
       priv->access_token = hangouts_json_node_get_str (node,
 						       "$['access_token']",
 						       NULL);
+      hangouts_channel_set_access_token (priv->channel, priv->access_token);
       g_signal_emit_by_name (api, "auth");
     }
   else
@@ -543,7 +563,8 @@ hangouts_api_get_chat_init_cb (PurpleHtt
       priv->chat_init_dict = root;
 
       g_signal_emit_by_name (api, "get-chat-init");
-      g_hash_table_destroy(chat_init_tab);
+      g_hash_table_destroy (chat_init_tab);
+      hangouts_channel_get_gsid (priv->channel);
     }
   else
     {
diff --git a/libpurple/protocols/hangouts/channel.c b/libpurple/protocols/hangouts/channel.c
--- a/libpurple/protocols/hangouts/channel.c
+++ b/libpurple/protocols/hangouts/channel.c
@@ -3,6 +3,8 @@
 
 #include "connection.h"
 #include "http.h"
+#include "http.c"
+#include "purple-socket.h"
 
 #include "channel.h"
 #include "api.h"
@@ -41,8 +43,14 @@ static void
 hangouts_channel_class_init (HangoutsChannelClass *klass)
 {
   GObjectClass *g_class = G_OBJECT_CLASS(klass);
+  g_class->dispose = hangouts_channel_dispose;
   g_type_class_add_private (g_class, sizeof(HangoutsChannelPrivate));
-  g_class->dispose = hangouts_channel_dispose;
+
+  g_signal_new ("connect", G_TYPE_FROM_CLASS(klass), G_SIGNAL_ACTION, 0, NULL,
+		NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, NULL);
+
+  g_signal_new ("subscribe", G_TYPE_FROM_CLASS(klass), G_SIGNAL_ACTION, 0, NULL,
+		NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, NULL);
 }
 
 static void
@@ -70,6 +78,18 @@ hangouts_channel_new (PurpleConnection *
   return channel;
 }
 
+gboolean
+hangouts_channel_is_connected (HangoutsChannel *channel)
+{
+  return channel->priv->connected;
+}
+
+gboolean
+hangouts_channel_is_subscribed (HangoutsChannel *channel)
+{
+  return channel->priv->subscribed;
+}
+
 void
 hangouts_channel_set_access_token (HangoutsChannel *channel,
 				   gchar *access_token)
@@ -86,10 +106,15 @@ static void
 hangouts_channel_subscribe_cb (PurpleHttpConnection *http_conn,
 			       PurpleHttpResponse *response, gpointer user_data)
 {
-  gchar *raw;
+  HangoutsChannel *channel;
 
-  raw = purple_http_response_get_data (response, NULL);
-  purple_debug_misc ("hangouts-channel-subscribe", "response: %s", raw);
+  channel = user_data;
+
+  if (purple_http_response_is_successful (response))
+    {
+      channel->priv->subscribed = TRUE;
+      g_signal_emit_by_name (channel, "subscribe");
+    }
 }
 
 void
@@ -99,11 +124,10 @@ hangouts_channel_subscribe (HangoutsChan
   PurpleHttpRequest *request;
   gchar *end_point;
   gchar *params;
-  guint64 *timestamp;
+  guint64 timestamp;
   gchar *req0, *req1, *req2, *body;
 
   timestamp = (unsigned) time (NULL);
-  purple_debug_misc ("hangouts-channel-time", "timestamp: %u", timestamp);
   req0 =
       g_strdup_printf (
 	  "{\"1\":{\"1\":{\"1\":{\"1\":3,\"2\":2}},\"2\":{\"1\":{\"1\":3,\"2\":2},\"2\":\"\",\"3\":\"JS\",\"4\":\"lcsclient\"},\"3\":%u,\"4\":0,\"5\":\"c1\"},\"2\":{}}",
@@ -118,8 +142,12 @@ hangouts_channel_subscribe (HangoutsChan
 	  "{\"1\":{\"1\":{\"1\":{\"1\":3,\"2\":2}},\"2\":{\"1\":{\"1\":3,\"2\":2},\"2\":\"\",\"3\":\"JS\",\"4\":\"lcsclient\"},\"3\":%u,\"4\":%u,\"5\":\"c4\"},\"3\":{\"1\":{\"1\":\"hangout_invite\"}}}",
 	  timestamp, timestamp);
 
-  body = g_strdup_printf ("count=3&ofs=0&req0_p=%s&req1_p=%s&req2_p=%s", req0,
-			  req1, req2);
+  body = g_strdup_printf ("count=3"
+			  "&ofs=0"
+			  "&req0_p=%s"
+			  "&req1_p=%s"
+			  "&req2_p=%s",
+			  req0, req1, req2);
 
   priv = channel->priv;
   end_point = "channel/bind";
@@ -140,24 +168,51 @@ hangouts_channel_subscribe (HangoutsChan
       request, "Authorization",
       g_strdup_printf ("Bearer %s", priv->access_token));
   purple_http_request_header_add (request, "X-Origin",
-				  g_strdup ("https://talkgadget.google.com"));
+  HANGOUTS_CHANNEL_X_ORIGIN_URL);
   purple_http_request_header_add (request, "X-Goog-AuthUser", g_strdup ("0"));
   purple_http_request_header_add (request, "Content-Type",
 				  "application/x-www-form-urlencoded");
   purple_http_request_set_contents (request, g_strcompress (body), -1);
   purple_http_request (priv->gc, request, hangouts_channel_subscribe_cb,
 		       channel);
-
 }
 
 static void
 hangouts_channel_long_poll_cb (PurpleHttpConnection *http_conn,
 			       PurpleHttpResponse *response, gpointer user_data)
 {
-  gchar *raw;
+  HangoutsChannel *channel;
+  const gchar *raw;
 
-  raw = purple_http_response_get_data (response, NULL);
-  purple_debug_misc ("hangouts-channel-long-poll", "response: %s", raw);
+  channel = user_data;
+
+  if (purple_http_response_is_successful (response))
+    {
+      //TODO: fire event for disconnect
+      channel->priv->connected = FALSE;
+      channel->priv->subscribed = FALSE;
+    }
+}
+
+static void
+hangouts_channel_long_poll_watcher (PurpleHttpConnection *http_conn,
+				    gboolean reading_state, int processed,
+				    int total, gpointer user_data)
+{
+  HangoutsChannel *channel;
+  HangoutsChannelPrivate *priv;
+  gchar *chunk;
+
+  channel = user_data;
+  priv = channel->priv;
+
+  if (processed > 0 && !priv->connected)
+    {
+      priv->connected = TRUE;
+      g_signal_emit_by_name (channel, "connect");
+    }
+  //TODO: parse chunk
+  chunk = g_strdup (http_conn->response_buffer->str);
 }
 
 void
@@ -165,6 +220,7 @@ hangouts_channel_long_poll (HangoutsChan
 {
   HangoutsChannelPrivate *priv;
   PurpleHttpRequest *request;
+  PurpleHttpConnection *hc;
   gchar *end_point;
   gchar *params;
 
@@ -189,8 +245,10 @@ hangouts_channel_long_poll (HangoutsChan
   purple_http_request_header_add (
       request, "Authorization",
       g_strdup_printf ("Bearer %s", priv->access_token));
-  purple_http_request (priv->gc, request, hangouts_channel_long_poll_cb,
-		       channel);
+  hc = purple_http_request (priv->gc, request, hangouts_channel_long_poll_cb,
+			    channel);
+  purple_http_conn_set_progress_watcher (hc, hangouts_channel_long_poll_watcher,
+					 channel, -1);
 }
 
 static void
@@ -202,17 +260,16 @@ hangouts_channel_get_gsid_cb (PurpleHttp
    * [1,[{"gsid":"<gsid>"}]]
    * ]
    */
-  gchar *res_raw;
-  gchar *gsid;
-  gchar *sid;

_______________________________________________
Commits mailing list
[email protected]
https://pidgin.im/cgi-bin/mailman/listinfo/commits
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.