/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