/soc/2015/jgeboski/facebook: 6545b86a0705: facebook: refactored ...

James Geboski <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: 6545b86a0705fa12e4d0a9c44f2cac6b536b3c9d
Author:	 James Geboski <[email protected]>
Date:	 2015-08-18 19:11 -0400
Branch:	 facebook
URL: https://hg.pidgin.im/soc/2015/jgeboski/facebook/rev/6545b86a0705

Description:

facebook: refactored for future inline images

diffstat:

 libpurple/protocols/facebook/api.c      |    9 +-
 libpurple/protocols/facebook/api.h      |   17 +-
 libpurple/protocols/facebook/data.c     |  261 +++++++++++++++++++++----------
 libpurple/protocols/facebook/data.h     |  164 +++++++++++++++----
 libpurple/protocols/facebook/facebook.c |   81 ++++-----
 5 files changed, 361 insertions(+), 171 deletions(-)

diffs (truncated from 750 to 300 lines):

diff --git a/libpurple/protocols/facebook/api.c b/libpurple/protocols/facebook/api.c
--- a/libpurple/protocols/facebook/api.c
+++ b/libpurple/protocols/facebook/api.c
@@ -1387,12 +1387,11 @@ fb_api_cb_publish_ms(FbApi *api, GByteAr
 		oid = fb_json_values_next_int(values, 0);
 		msg.tid = fb_json_values_next_int(values, 0);
 
-		if (uid != priv->uid) {
-			msg.isself = FALSE;
+		if (uid == priv->uid) {
+			msg.flags |= FB_API_MESSAGE_FLAG_SELF;
+			msg.uid = oid;
+		} else {
 			msg.uid = uid;
-		} else {
-			msg.isself = TRUE;
-			msg.uid = oid;
 		}
 
 		if (msg.uid == 0) {
diff --git a/libpurple/protocols/facebook/api.h b/libpurple/protocols/facebook/api.h
--- a/libpurple/protocols/facebook/api.h
+++ b/libpurple/protocols/facebook/api.h
@@ -255,7 +255,7 @@ typedef enum
  * @FB_API_EVENT_TYPE_THREAD_USER_ADDED: A thread user was added.
  * @FB_API_EVENT_TYPE_THREAD_USER_REMOVED: A thread user was removed.
  *
- * The FbApiEvent types.
+ * The #FbApiEvent types.
  */
 typedef enum
 {
@@ -264,6 +264,17 @@ typedef enum
 } FbApiEventType;
 
 /**
+ * FbApiMessageFlags:
+ * @FB_API_MESSAGE_FLAG_SELF: The text is from the #FbApi user.
+ *
+ * The #FbApiMessage flags.
+ */
+typedef enum
+{
+	FB_API_MESSAGE_FLAG_SELF = 1 << 0
+} FbApiMessageFlags;
+
+/**
  * FbApi:
  *
  * Represents a Facebook Messenger connection.
@@ -303,19 +314,19 @@ struct _FbApiEvent
 
 /**
  * FbApiMessage:
+ * @flags: The #FbApiMessageFlags.
  * @uid: The user #FbId.
  * @tid: The thread #FbId.
  * @text: The message text.
- * @isself: #TRUE if the user is the #FbApi user, otherwise #FALSE.
  *
  * Represents a Facebook user message.
  */
 struct _FbApiMessage
 {
+	FbApiMessageFlags flags;
 	FbId uid;
 	FbId tid;
 	gchar *text;
-	gboolean isself;
 };
 
 /**
diff --git a/libpurple/protocols/facebook/data.c b/libpurple/protocols/facebook/data.c
--- a/libpurple/protocols/facebook/data.c
+++ b/libpurple/protocols/facebook/data.c
@@ -33,12 +33,23 @@ struct _FbDataPrivate
 	PurpleConnection *gc;
 	PurpleRoomlist *roomlist;
 	GQueue *msgs;
-	GHashTable *icons;
-	GHashTable *icona;
+	GHashTable *imgs;
 	GHashTable *unread;
 	GHashTable *evs;
 };
 
+struct _FbDataImagePrivate
+{
+	FbData *fata;
+	gchar *url;
+	FbDataImageFunc func;
+	gpointer data;
+
+	gboolean active;
+	const guint8 *image;
+	gsize size;
+};
+
 static const gchar *fb_props_strs[] = {
 	"cid",
 	"did",
@@ -46,10 +57,8 @@ static const gchar *fb_props_strs[] = {
 	"token"
 };
 
-static void
-fb_data_icon_free(FbDataIcon *icon);
-
 G_DEFINE_TYPE(FbData, fb_data, G_TYPE_OBJECT);
+G_DEFINE_TYPE(FbDataImage, fb_data_image, G_TYPE_OBJECT);
 
 static void
 fb_data_dispose(GObject *obj)
@@ -70,8 +79,7 @@ fb_data_dispose(GObject *obj)
 
 	g_queue_free_full(priv->msgs, (GDestroyNotify) fb_api_message_free);
 
-	g_hash_table_destroy(priv->icons);
-	g_hash_table_destroy(priv->icona);
+	g_hash_table_destroy(priv->imgs);
 	g_hash_table_destroy(priv->unread);
 	g_hash_table_destroy(priv->evs);
 }
@@ -94,16 +102,42 @@ fb_data_init(FbData *fata)
 	fata->priv = priv;
 
 	priv->msgs = g_queue_new();
-	priv->icons = g_hash_table_new_full(g_direct_hash, g_direct_equal,
-	                                    (GDestroyNotify) fb_data_icon_free,
-					    NULL);
-	priv->icona = g_hash_table_new_full(g_direct_hash, g_direct_equal,
-	                                    (GDestroyNotify) fb_data_icon_free,
-					    NULL);
-	priv->unread = g_hash_table_new_full(fb_id_hash, fb_id_equal, g_free,
-	                                     NULL);
-	priv->evs = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
-	                                  NULL);
+	priv->imgs = g_hash_table_new_full(g_direct_hash, g_direct_equal,
+	                                   g_object_unref, NULL);
+	priv->unread = g_hash_table_new_full(fb_id_hash, fb_id_equal,
+	                                     g_free, NULL);
+	priv->evs = g_hash_table_new_full(g_str_hash, g_str_equal,
+					  g_free, NULL);
+}
+
+static void
+fb_data_image_dispose(GObject *obj)
+{
+	FbDataImage *img = FB_DATA_IMAGE(obj);
+	FbDataImagePrivate *priv = img->priv;
+	FbData *fata = priv->fata;
+
+	g_free(priv->url);
+	g_hash_table_steal(fata->priv->imgs, img);
+}
+
+static void
+fb_data_image_class_init(FbDataImageClass *klass)
+{
+	GObjectClass *gklass = G_OBJECT_CLASS(klass);
+
+	gklass->dispose = fb_data_image_dispose;
+	g_type_class_add_private(klass, sizeof (FbDataImagePrivate));
+}
+
+static void
+fb_data_image_init(FbDataImage *img)
+{
+	FbDataImagePrivate *priv;
+
+	priv = G_TYPE_INSTANCE_GET_PRIVATE(img, FB_TYPE_DATA_IMAGE,
+	                                   FbDataImagePrivate);
+	img->priv = priv;
 }
 
 FbData *
@@ -376,101 +410,162 @@ fb_data_take_messages(FbData *fata, FbId
 	return msgs;
 }
 
-FbDataIcon *
-fb_data_icon_add(FbData *fata, PurpleBuddy *buddy, const gchar *url,
-                 PurpleHttpCallback func)
+FbDataImage *
+fb_data_image_add(FbData *fata, const gchar *url, FbDataImageFunc func,
+                  gpointer data)
 {
-	FbDataIcon *icon;
-	FbDataPrivate *priv;
+	FbDataImage *img;
+	FbDataImagePrivate *priv;
 
 	g_return_val_if_fail(FB_IS_DATA(fata), NULL);
-	g_return_val_if_fail(PURPLE_IS_BUDDY(buddy), NULL);
 	g_return_val_if_fail(url != NULL, NULL);
-	priv = fata->priv;
+	g_return_val_if_fail(func != NULL, NULL);
 
-	icon = g_new(FbDataIcon, 1);
-	icon->fata = fata;
-	icon->buddy = buddy;
-	icon->url = g_strdup(url);
-	icon->func = func;
+	img = g_object_new(FB_TYPE_DATA_IMAGE, NULL);
+	priv = img->priv;
 
-	g_hash_table_replace(priv->icons, icon, icon);
-	return icon;
+	priv->fata = fata;
+	priv->url = g_strdup(url);
+	priv->func = func;
+	priv->data = data;
+
+	g_hash_table_insert(fata->priv->imgs, img, img);
+	return img;
+}
+
+gboolean
+fb_data_image_get_active(FbDataImage *img)
+{
+	FbDataImagePrivate *priv;
+
+	g_return_val_if_fail(FB_IS_DATA_IMAGE(img), NULL);
+	priv = img->priv;
+
+	return priv->active;
+}
+
+gpointer
+fb_data_image_get_data(FbDataImage *img)
+{
+	FbDataImagePrivate *priv;
+
+	g_return_val_if_fail(FB_IS_DATA_IMAGE(img), NULL);
+	priv = img->priv;
+
+	return priv->data;
+}
+
+FbData *
+fb_data_image_get_fata(FbDataImage *img)
+{
+	FbDataImagePrivate *priv;
+
+	g_return_val_if_fail(FB_IS_DATA_IMAGE(img), NULL);
+	priv = img->priv;
+
+	return priv->fata;
+}
+
+const guint8 *
+fb_data_image_get_image(FbDataImage *img, gsize *size)
+{
+	FbDataImagePrivate *priv;
+
+	g_return_val_if_fail(FB_IS_DATA_IMAGE(img), NULL);
+	priv = img->priv;
+
+	if (size != NULL) {
+		*size = priv->size;
+	}
+
+	return priv->image;
+}
+
+guint8 *
+fb_data_image_dup_image(FbDataImage *img, gsize *size)
+{
+	FbDataImagePrivate *priv;
+
+	g_return_val_if_fail(FB_IS_DATA_IMAGE(img), NULL);
+	priv = img->priv;
+
+	if (size != NULL) {
+		*size = priv->size;
+	}
+
+	if (priv->size < 1) {
+		return NULL;
+	}
+
+	return g_memdup(priv->image, priv->size);
+}
+
+const gchar *
+fb_data_image_get_url(FbDataImage *img)
+{
+	FbDataImagePrivate *priv;
+
+	g_return_val_if_fail(FB_IS_DATA_IMAGE(img), NULL);
+	priv = img->priv;
+
+	return priv->url;
 }
 
 static void
-fb_data_icon_free(FbDataIcon *icon)
+fb_data_image_cb(PurpleHttpConnection *con, PurpleHttpResponse *res,
+                 gpointer data)
 {

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