/soc/2015/nakulgulati/main: c2cc0f9ab9d0: hangouts: api - refact...

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

Description:

hangouts: api - refactor using json wrapper and signals

diffstat:

 libpurple/protocols/hangouts/api.c      |  112 ++++++++++++++++++--------------
 libpurple/protocols/hangouts/hangouts.c |    8 ++
 libpurple/protocols/hangouts/json.c     |    4 +-
 libpurple/protocols/hangouts/json.h     |    3 +-
 4 files changed, 74 insertions(+), 53 deletions(-)

diffs (281 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
@@ -27,6 +27,7 @@
 
 #include "api.h"
 #include "channel.h"
+#include "json.h"
 #include "util.h"
 //TODO api call backs
 
@@ -106,8 +107,14 @@ static void
 hangouts_api_class_init (HangoutsApiClass *klass)
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+  gobject_class->dispose = hangouts_api_dispose;
   g_type_class_add_private (klass, sizeof(HangoutsApiPrivate));
-  gobject_class->dispose = hangouts_api_dispose;
+
+  g_signal_new ("auth", G_TYPE_FROM_CLASS(klass), G_SIGNAL_ACTION, 0,
+  NULL,
+		NULL, g_cclosure_marshal_VOID__VOID,
+		G_TYPE_NONE,
+		NULL);
 }
 
 static void
@@ -286,44 +293,41 @@ hangouts_api_get_galx_cookie (HangoutsAp
 static void
 hangouts_api_auth_with_code_cb (PurpleHttpConnection *http_conn,
 				PurpleHttpResponse *response,
-				gpointer *user_data)
+				gpointer user_data)
 {
-  JsonParser *parser;
-  JsonObject *json_ob;
   HangoutsApi *api;
   HangoutsApiPrivate *priv;
+  JsonNode *node;
   PurpleAccount *acct;
-  gchar *error, *access_token, *refresh_token;
+  const gchar *raw_response;
 
   api = user_data;
   priv = api->priv;
   acct = purple_connection_get_account (priv->gc);
-  gchar *raw_res = purple_http_response_get_data (response, NULL);
-  purple_debug_misc ("hangouts-prpl", "raw:\n%s", raw_res);
+  raw_response = purple_http_response_get_data (response, NULL);
 
-  parser = json_parser_new ();
-  json_parser_load_from_data (parser, raw_res, -1, NULL);
-  json_ob = json_node_get_object (json_parser_get_root (parser));
+  node = hangouts_json_node_new (raw_response, -1, FALSE);
 
-  if (json_object_has_member (json_ob, "error"))
-    error = json_object_get_string_member (json_ob, "error");
+  if (purple_http_response_is_successful (response))
+    {
+      priv->access_token = hangouts_json_node_get_str (node,
+						       "$['access_token']",
+						       NULL);
+      priv->refresh_token = hangouts_json_node_get_str (node,
+							"$['refresh_token']",
+							NULL);
 
-  if (json_object_has_member (json_ob, "access_token"))
+      purple_account_set_remember_password (acct, TRUE);
+      purple_account_set_password (acct, priv->refresh_token, NULL, NULL);
+
+      g_signal_emit_by_name (api, "auth");
+    }
+  else
     {
-      priv->access_token = g_strdup (
-	  json_object_get_string_member (json_ob, "access_token"));
-      hangouts_channel_set_access_token (priv->channel, priv->access_token);
+      //TODO handle error
     }
 
-  if (json_object_has_member (json_ob, "refresh_token"))
-    {
-      priv->refresh_token = g_strdup (
-	  json_object_get_string_member (json_ob, "refresh_token"));
-      purple_debug_misc ("hangouts-prpl", "refresh_token: %s",
-			 priv->refresh_token);
-      purple_account_set_remember_password (acct, TRUE);
-      purple_account_set_password (acct, priv->refresh_token, NULL, NULL);
-    }
+  json_node_free (node);
 }
 
 void
@@ -360,26 +364,29 @@ hangouts_api_oauth_refresh_token_cb (Pur
 				     PurpleHttpResponse *response,
 				     gpointer user_data)
 {
-  JsonParser *parser;
-  JsonObject *json_ob;
   HangoutsApi *api;
-  gchar *raw_res;
-  gchar *error;
+  HangoutsApiPrivate *priv;
+  JsonNode *node;
+  const gchar *raw_response;
 
   api = user_data;
-  raw_res = purple_http_response_get_data (response, NULL);
+  priv = api->priv;
+  raw_response = purple_http_response_get_data (response, NULL);
+  node = hangouts_json_node_new (raw_response, -1, FALSE);
 
-  parser = json_parser_new ();
-  json_parser_load_from_data (parser, raw_res, -1, NULL);
-  json_ob = json_node_get_object (json_parser_get_root (parser));
+  if (purple_http_response_is_successful (response))
+    {
+      priv->access_token = hangouts_json_node_get_str (node,
+						       "$['access_token']",
+						       NULL);
+      g_signal_emit_by_name (api, "auth");
+    }
+  else
+    {
+      //TODO: handle refresh token request error
+    }
 
-  if (json_object_has_member (json_ob, "error"))
-    /*TODO Throw error*/
-    error = json_object_get_string_member (json_ob, "error");
-
-  if (json_object_has_member (json_ob, "access_token"))
-    api->priv->access_token = g_strdup (
-	json_object_get_string_member (json_ob, "access_token"));
+  json_node_free (node);
 }
 
 void
@@ -576,7 +583,7 @@ hangouts_api_get_request_header (Hangout
   gchar *header = g_strdup_printf ("["
 				   "[6, 3, %s, %s],"
 				   "[%s, %s],"
-				   "None,"
+				   "null,"
 				   "\"en\""
 				   "]",
 				   priv->header_version, priv->header_date,
@@ -591,20 +598,24 @@ hangouts_api_request (HangoutsApi *api, 
 {
 
   HangoutsApiPrivate *priv = api->priv;
-  gchar *url = g_strconcat (HANGOUTS_API_BASE_URL, info->endpoint, "?alt=json");
+  gchar *url;
+  gchar *content_type = "application/json+protobuf";
   PurpleHttpRequest *request;
 
+  url = g_strconcat (HANGOUTS_API_BASE_URL, info->endpoint, "?alt=json",
+  NULL);
   request = purple_http_request_new (url);
   purple_http_request_set_max_len (request, -1);
 
-  gchar *content_type = "application/json+protobuf";
-
   if (use_json)
     {
       content_type = "application/json";
     }
 
   purple_http_request_header_add (request, "content-type", content_type);
+  purple_http_request_header_add (
+      request, "Authorization",
+      g_strdup_printf ("Bearer %s", priv->access_token));
   purple_http_request_set_method (request, info->method);
   purple_http_request_set_contents (request, request_body, -1);
   purple_http_request (priv->gc, request, info->callback, api);
@@ -653,7 +664,7 @@ hangouts_api_syncallevents (HangoutsApi 
 			  "%s, "
 			  "%s,"
 			  "[], "
-			  "None, "
+			  "null, "
 			  "[], "
 			  "False, "
 			  "[], "
@@ -669,7 +680,10 @@ hangouts_api_sendchatmessage_cb (PurpleH
 				 PurpleHttpResponse *response,
 				 gpointer user_data)
 {
+  gchar *raw;
 
+  raw = purple_http_response_get_data (response, NULL);
+  purple_debug_misc ("hangouts-api-send", "response: %s", raw);
 }
 
 void
@@ -686,7 +700,7 @@ hangouts_api_sendchatmessage (HangoutsAp
 
   client_generated_id = g_random_int_range (0, G_MAXINT32);
   header = hangouts_api_get_request_header (api);
-  image_info = "None";
+  image_info = "null";
 
   if (image_id != NULL)
     {
@@ -695,18 +709,18 @@ hangouts_api_sendchatmessage (HangoutsAp
 
   body = g_strdup_printf ("["
 			  "%s"
-			  ",None, None, None, [], "
+			  ",null, null, null, [], "
 			  "[%s, []], "
 			  "%s,"
 			  "[[%s],"
 			  "%d,"
 			  "%d,],"
-			  "None, None, None, "
+			  "null, null, null, "
 			  "[]]",
 			  header, segments, image_info, conversation_id,
 			  client_generated_id, otr_status);
 
-  hangouts_api_request (api, &info, FALSE, body);
+  hangouts_api_request (api, &info, FALSE, g_strcompress (body));
 }
 
 static void
diff --git a/libpurple/protocols/hangouts/hangouts.c b/libpurple/protocols/hangouts/hangouts.c
--- a/libpurple/protocols/hangouts/hangouts.c
+++ b/libpurple/protocols/hangouts/hangouts.c
@@ -34,6 +34,12 @@
 #include "hangouts.h"
 #include "api.h"
 
+void
+hangouts_cb_api_auth (HangoutsApi *api, gpointer *data)
+{
+  purple_debug_misc ("hangouts-prpl", "auth done");
+}
+
 static PurpleProtocol *_hangouts_protocol = NULL;
 
 static void
@@ -57,6 +63,8 @@ hangouts_login (PurpleAccount *acct)
   password = purple_connection_get_password (gc);
   api = hangouts_api_new (gc);
 
+  g_signal_connect(api, "auth", G_CALLBACK(hangouts_cb_api_auth), NULL);
+
   if (password != NULL)
     {
       hangouts_api_set_refresh_token (api, password);
diff --git a/libpurple/protocols/hangouts/json.c b/libpurple/protocols/hangouts/json.c
--- a/libpurple/protocols/hangouts/json.c
+++ b/libpurple/protocols/hangouts/json.c
@@ -19,12 +19,10 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
-#include "debug.h"
-
 #include "json.h"
 
 JsonNode *
-hangouts_json_node_new (gchar *data, gssize length, gboolean empty_values)
+hangouts_json_node_new (const gchar *data, gssize length, gboolean empty_values)
 {
   JsonNode *root;
   JsonParser *parser;
diff --git a/libpurple/protocols/hangouts/json.h b/libpurple/protocols/hangouts/json.h
--- a/libpurple/protocols/hangouts/json.h
+++ b/libpurple/protocols/hangouts/json.h
@@ -26,7 +26,8 @@
 #include <json-glib/json-glib.h>
 
 JsonNode *
-hangouts_json_node_new (gchar *data, gssize length, gboolean empty_values);
+hangouts_json_node_new (const gchar *data, gssize length,
+			gboolean empty_values);
 
 JsonNode *
 hangouts_json_node_get (JsonNode *root, const gchar *expr, GError **error);

_______________________________________________
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.