--- a/libpurple/protocols/facebook/api.c Tue Sep 20 03:31:39 2022 -0500
+++ b/libpurple/protocols/facebook/api.c Tue Sep 20 22:43:37 2022 -0500
@@ -49,8 +49,14 @@
+ * Represents a Facebook Messenger connection. @@ -69,17 +75,6 @@
- * Represents a Facebook Messenger connection.
static void fb_api_error_literal(FbApi *api, FbApiError error,
@@ -100,36 +95,36 @@
fb_api_contacts_delta(FbApi *api, const gchar *delta_cursor);
-G_DEFINE_TYPE_WITH_PRIVATE(FbApi, fb_api, G_TYPE_OBJECT);
+G_DEFINE_TYPE(FbApi, fb_api, G_TYPE_OBJECT); fb_api_set_property(GObject *obj, guint prop, const GValue *val,
- FbApiPrivate *priv = FB_API(obj)->priv;
+ FbApi *api = FB_API(obj);
- priv->cid = g_value_dup_string(val);
+ api->cid = g_value_dup_string(val);
- priv->did = g_value_dup_string(val);
+ api->did = g_value_dup_string(val); - priv->mid = g_value_get_uint64(val);
+ api->mid = g_value_get_uint64(val);
- priv->stoken = g_value_dup_string(val);
+ api->stoken = g_value_dup_string(val);
- priv->token = g_value_dup_string(val);
+ api->token = g_value_dup_string(val); - priv->uid = g_value_get_int64(val);
+ api->uid = g_value_get_int64(val); @@ -141,26 +136,26 @@
fb_api_get_property(GObject *obj, guint prop, GValue *val, GParamSpec *pspec)
- FbApiPrivate *priv = FB_API(obj)->priv;
+ FbApi *api = FB_API(obj); - g_value_set_string(val, priv->cid);
+ g_value_set_string(val, api->cid); - g_value_set_string(val, priv->did);
+ g_value_set_string(val, api->did); - g_value_set_uint64(val, priv->mid);
+ g_value_set_uint64(val, api->mid); - g_value_set_string(val, priv->stoken);
+ g_value_set_string(val, api->stoken); - g_value_set_string(val, priv->token);
+ g_value_set_string(val, api->token); - g_value_set_int64(val, priv->uid);
+ g_value_set_int64(val, api->uid); @@ -173,22 +168,25 @@
fb_api_dispose(GObject *obj)
- FbApiPrivate *priv = FB_API(obj)->priv;
- soup_session_abort(priv->cons);
- if (G_UNLIKELY(priv->mqtt != NULL)) {
- g_object_unref(priv->mqtt);
+ FbApi *api = FB_API(obj); + if(api->cons != NULL) { + soup_session_abort(api->cons); - g_object_unref(priv->cons);
- g_queue_free_full(priv->msgs, (GDestroyNotify) fb_api_message_free);
- g_free(priv->contacts_delta);
+ g_clear_object(&api->mqtt); + g_clear_object(&api->cons); + if(api->msgs != NULL) { + g_queue_free_full(api->msgs, (GDestroyNotify)fb_api_message_free); + g_clear_pointer(&api->cid, g_free); + g_clear_pointer(&api->did, g_free); + g_clear_pointer(&api->stoken, g_free); + g_clear_pointer(&api->token, g_free); + g_clear_pointer(&api->contacts_delta, g_free); @@ -506,10 +504,7 @@
- FbApiPrivate *priv = fb_api_get_instance_private(api);
- priv->msgs = g_queue_new();
+ api->msgs = g_queue_new(); @@ -529,7 +524,6 @@
FbApiError errc = FB_API_ERROR_GENERAL;
@@ -547,7 +541,6 @@
g_return_val_if_fail(FB_IS_API(api), FALSE);
if (G_UNLIKELY(size == 0)) {
fb_api_error_literal(api, FB_API_ERROR_GENERAL, _("Empty JSON data"));
@@ -579,11 +572,8 @@
errc = FB_API_ERROR_AUTH;
+ g_clear_pointer(&api->stoken, g_free); + g_clear_pointer(&api->token, g_free); /* 509 is used for "invalid attachment id" */
@@ -600,8 +590,7 @@
errc = FB_API_ERROR_QUEUE;
+ g_clear_pointer(&api->stoken, g_free); @@ -688,7 +677,6 @@
const gchar *method, FbHttpParams *params,
SoupSessionCallback callback)
- FbApiPrivate *priv = api->priv;
@@ -698,7 +686,7 @@
fb_http_params_set_str(params, "api_key", FB_API_KEY);
- fb_http_params_set_str(params, "device_id", priv->did);
+ fb_http_params_set_str(params, "device_id", api->did); fb_http_params_set_str(params, "fb_api_req_friendly_name", name);
fb_http_params_set_str(params, "format", "json");
fb_http_params_set_str(params, "method", method);
@@ -731,14 +719,14 @@
msg = soup_message_new_from_encoded_form("POST", url, soup_form_encode_hash(params));
fb_http_params_free(params);
- if (priv->token != NULL) {
- data = g_strdup_printf("OAuth %s", priv->token);
+ if (api->token != NULL) { + data = g_strdup_printf("OAuth %s", api->token); soup_message_headers_replace(soup_message_get_request_headers(msg),
- soup_session_queue_message(priv->cons, msg, callback, api);
+ soup_session_queue_message(api->cons, msg, callback, api); fb_util_debug(FB_UTIL_DEBUG_INFO, "HTTP Request (%p):", msg);
fb_util_debug(FB_UTIL_DEBUG_INFO, " Request URL: %s", url);
@@ -815,12 +803,11 @@
fb_api_cb_mqtt_error(FbMqtt *mqtt, GError *error, gpointer data)
- FbApiPrivate *priv = api->priv;
fb_util_debug_info("Attempting to reconnect the MQTT stream...");
- fb_api_connect(api, priv->invisible);
+ fb_api_connect(api, api->invisible); g_signal_emit_by_name(api, "error", error);
@@ -831,7 +818,6 @@
- FbApiPrivate *priv = api->priv;
@@ -844,13 +830,13 @@
/* Write the client identifier */
fb_thrift_write_field(thft, FB_THRIFT_TYPE_STRING, 1, 0);
- fb_thrift_write_str(thft, priv->cid);
+ fb_thrift_write_str(thft, api->cid); fb_thrift_write_field(thft, FB_THRIFT_TYPE_STRUCT, 4, 1);
/* Write the user identifier */
fb_thrift_write_field(thft, FB_THRIFT_TYPE_I64, 1, 0);
- fb_thrift_write_i64(thft, priv->uid);
+ fb_thrift_write_i64(thft, api->uid); /* Write the information string */
fb_thrift_write_field(thft, FB_THRIFT_TYPE_STRING, 2, 1);
@@ -874,11 +860,11 @@
/* Write the visibility state */
fb_thrift_write_field(thft, FB_THRIFT_TYPE_BOOL, 7, 6);
- fb_thrift_write_bool(thft, !priv->invisible);
+ fb_thrift_write_bool(thft, !api->invisible); /* Write the device identifier */
fb_thrift_write_field(thft, FB_THRIFT_TYPE_STRING, 8, 7);
- fb_thrift_write_str(thft, priv->did);
+ fb_thrift_write_str(thft, api->did); /* Write the UNKNOWN ("fg"?) */
fb_thrift_write_field(thft, FB_THRIFT_TYPE_BOOL, 9, 8);
@@ -894,7 +880,7 @@
/* Write the MQTT identifier */
fb_thrift_write_field(thft, FB_THRIFT_TYPE_I64, 12, 11);
- fb_thrift_write_i64(thft, priv->mid);
+ fb_thrift_write_i64(thft, api->mid); fb_thrift_write_field(thft, FB_THRIFT_TYPE_LIST, 14, 12);
@@ -903,7 +889,7 @@
fb_thrift_write_field(thft, FB_THRIFT_TYPE_STRING, 15, 14);
- fb_thrift_write_str(thft, priv->token);
+ fb_thrift_write_str(thft, api->token); /* Write the STOP for the struct */
fb_thrift_write_stop(thft);
@@ -927,7 +913,6 @@
fb_api_connect_queue(FbApi *api)
- FbApiPrivate *priv = api->priv;
@@ -937,11 +922,10 @@
fb_json_bldr_add_int(bldr, "sync_api_version", 3);
fb_json_bldr_add_str(bldr, "encoding", "JSON");
- if (priv->stoken == NULL) {
- fb_json_bldr_add_int(bldr, "initial_titan_sequence_id",
- fb_json_bldr_add_str(bldr, "device_id", priv->did);
- fb_json_bldr_add_int(bldr, "entity_fbid", priv->uid);
+ if (api->stoken == NULL) { + fb_json_bldr_add_int(bldr, "initial_titan_sequence_id", api->sid); + fb_json_bldr_add_str(bldr, "device_id", api->did); + fb_json_bldr_add_int(bldr, "entity_fbid", api->uid); fb_json_bldr_obj_begin(bldr, "queue_params");
fb_json_bldr_add_str(bldr, "buzz_on_deltas_enabled", "false");
@@ -965,21 +949,21 @@
- fb_json_bldr_add_int(bldr, "last_seq_id", priv->sid);
- fb_json_bldr_add_str(bldr, "sync_token", priv->stoken);
+ fb_json_bldr_add_int(bldr, "last_seq_id", api->sid); + fb_json_bldr_add_str(bldr, "sync_token", api->stoken); json = fb_json_bldr_close(bldr, JSON_NODE_OBJECT, NULL);
fb_api_publish(api, "/messenger_sync_get_diffs", "%s", json);
g_signal_emit_by_name(api, "connect");
- if (!g_queue_is_empty(priv->msgs)) {
- msg = g_queue_peek_head(priv->msgs);
+ if (!g_queue_is_empty(api->msgs)) { + msg = g_queue_peek_head(api->msgs); fb_api_message_send(api, msg);
- priv->retrying = FALSE;
fb_util_debug_info("Reconnected the MQTT stream");
@@ -990,7 +974,6 @@
- FbApiPrivate *priv = api->priv;
@@ -1013,10 +996,10 @@
str = fb_json_values_next_str(values, "0");
- priv->sid = g_ascii_strtoll(str, NULL, 10);
- priv->unread = fb_json_values_next_int(values, 0);
+ api->sid = g_ascii_strtoll(str, NULL, 10); + api->unread = fb_json_values_next_int(values, 0); fb_api_error_literal(api, FB_API_ERROR_GENERAL,
_("Failed to get sync_sequence_id"));
@@ -1031,7 +1014,6 @@
fb_api_cb_mqtt_connect(FbMqtt *mqtt, gpointer data)
- FbApiPrivate *priv = api->priv;
@@ -1061,7 +1043,7 @@
/* Notifications seem to lead to some sort of sending rate limit */
fb_mqtt_unsubscribe(mqtt, "/orca_message_notifications", NULL);
bldr = fb_json_bldr_new(JSON_NODE_OBJECT);
fb_json_bldr_add_str(bldr, "1", "0");
fb_api_http_query(api, FB_API_QUERY_SEQ_ID, bldr,
@@ -1230,7 +1212,6 @@
fb_api_cb_publish_typing(FbApi *api, GByteArray *pload)
- FbApiPrivate *priv = api->priv;
@@ -1257,7 +1238,7 @@
if (g_ascii_strcasecmp(str, "typ") == 0) {
typg.uid = fb_json_values_next_int(values, 0);
- if (typg.uid != priv->uid) {
+ if (typg.uid != api->uid) { typg.state = fb_json_values_next_int(values, 0);
g_signal_emit_by_name(api, "typing", &typg);
@@ -1271,7 +1252,6 @@
fb_api_cb_publish_ms_r(FbApi *api, GByteArray *pload)
- FbApiPrivate *priv = api->priv;
@@ -1292,11 +1272,11 @@
if (fb_json_values_next_bool(values, TRUE)) {
/* Pop and free the successful message */
- msg = g_queue_pop_head(priv->msgs);
+ msg = g_queue_pop_head(api->msgs); fb_api_message_free(msg);
- if (!g_queue_is_empty(priv->msgs)) {
- msg = g_queue_peek_head(priv->msgs);
+ if (!g_queue_is_empty(api->msgs)) { + msg = g_queue_peek_head(api->msgs); fb_api_message_send(api, msg);
@@ -1449,7 +1429,6 @@
fb_api_cb_publish_ms(FbApi *api, GByteArray *pload)
- FbApiPrivate *priv = api->priv;
@@ -1503,13 +1482,13 @@
- priv->sid = fb_json_values_next_int(values, 0);
+ api->sid = fb_json_values_next_int(values, 0); stoken = fb_json_values_next_str_dup(values, NULL);
if (G_UNLIKELY(stoken != NULL)) {
g_signal_emit_by_name(api, "connect");
@@ -1569,7 +1548,6 @@
- FbApiPrivate *priv = api->priv;
@@ -1606,19 +1584,19 @@
/* Ignore sequential duplicates */
- if (id == priv->lastmid) {
+ if (id == api->lastmid) { fb_util_debug_info("Ignoring duplicate %" FB_ID_FORMAT, id);
fb_api_message_reset(&msg, FALSE);
msg.uid = fb_json_values_next_int(values, 0);
oid = fb_json_values_next_int(values, 0);
msg.tid = fb_json_values_next_int(values, 0);
msg.tstamp = fb_json_values_next_int(values, 0);
- if (msg.uid == priv->uid) {
+ if (msg.uid == api->uid) { msg.flags |= FB_API_MESSAGE_FLAG_SELF;
@@ -1919,31 +1897,29 @@
fb_api_new(PurpleConnection *gc, GProxyResolver *resolver)
api = g_object_new(FB_TYPE_API, NULL);
- priv->cons = soup_session_new_with_options(
+ api->cons = soup_session_new_with_options( "proxy-resolver", resolver,
"user-agent", FB_API_AGENT,
- priv->mqtt = fb_mqtt_new(gc);
- g_signal_connect(priv->mqtt,
+ api->mqtt = fb_mqtt_new(gc); + g_signal_connect(api->mqtt, G_CALLBACK(fb_api_cb_mqtt_connect),
- g_signal_connect(priv->mqtt,
+ g_signal_connect(api->mqtt, G_CALLBACK(fb_api_cb_mqtt_error),
- g_signal_connect(priv->mqtt,
+ g_signal_connect(api->mqtt, G_CALLBACK(fb_api_cb_mqtt_open),
- g_signal_connect(priv->mqtt,
+ g_signal_connect(api->mqtt, G_CALLBACK(fb_api_cb_mqtt_publish),
@@ -1954,38 +1930,32 @@
fb_api_rehash(FbApi *api)
g_return_if_fail(FB_IS_API(api));
- if (priv->cid == NULL) {
- priv->cid = fb_util_rand_alnum(32);
+ if (api->cid == NULL) { + api->cid = fb_util_rand_alnum(32); + if (api->did == NULL) { + api->did = g_uuid_string_random(); - if (priv->did == NULL) {
- priv->did = g_uuid_string_random();
+ api->mid = g_random_int();
- priv->mid = g_random_int();
- if (strlen(priv->cid) > 20) {
- priv->cid = g_realloc_n(priv->cid , 21, sizeof *priv->cid);
+ if (strlen(api->cid) > 20) { + api->cid = g_realloc_n(api->cid , 21, sizeof *api->cid); fb_api_is_invisible(FbApi *api)
g_return_val_if_fail(FB_IS_API(api), FALSE);
- return priv->invisible;
@@ -2100,7 +2070,6 @@
- FbApiPrivate *priv = api->priv;
@@ -2120,9 +2089,9 @@
- priv->token = fb_json_values_next_str_dup(values, NULL);
- priv->uid = fb_json_values_next_int(values, 0);
+ api->token = fb_json_values_next_str_dup(values, NULL); + api->uid = fb_json_values_next_int(values, 0); g_signal_emit_by_name(api, "auth");
@@ -2233,7 +2202,6 @@
fb_api_cb_contacts_nodes(FbApi *api, JsonNode *root, GSList *users)
- FbApiPrivate *priv = api->priv;
@@ -2262,7 +2230,7 @@
str = fb_json_values_next_str(values, NULL);
if ((!purple_strequal(str, "ARE_FRIENDS") &&
- (uid != priv->uid)) || (uid == 0))
+ (uid != api->uid)) || (uid == 0)) @@ -2323,7 +2291,6 @@
const gchar *delta_cursor;
- FbApiPrivate *priv = api->priv;
@@ -2391,8 +2358,8 @@
if (G_UNLIKELY(err == NULL)) {
if (is_delta || complete) {
- g_free(priv->contacts_delta);
- priv->contacts_delta = g_strdup(is_delta ? cursor : delta_cursor);
+ g_free(api->contacts_delta); + api->contacts_delta = g_strdup(is_delta ? cursor : delta_cursor); @@ -2416,14 +2383,12 @@
fb_api_contacts(FbApi *api)
g_return_if_fail(FB_IS_API(api));
- if (priv->contacts_delta) {
- fb_api_contacts_delta(api, priv->contacts_delta);
+ if (api->contacts_delta) { + fb_api_contacts_delta(api, api->contacts_delta); @@ -2474,38 +2439,31 @@
fb_api_connect(FbApi *api, gboolean invisible)
g_return_if_fail(FB_IS_API(api));
- priv->invisible = invisible;
- fb_mqtt_open(priv->mqtt, FB_MQTT_HOST, FB_MQTT_PORT);
+ api->invisible = invisible; + fb_mqtt_open(api->mqtt, FB_MQTT_HOST, FB_MQTT_PORT); fb_api_disconnect(FbApi *api)
g_return_if_fail(FB_IS_API(api));
- fb_mqtt_disconnect(priv->mqtt);
+ fb_mqtt_disconnect(api->mqtt); fb_api_message_send(FbApi *api, FbApiMessage *msg)
- FbApiPrivate *priv = api->priv;
mid = FB_API_MSGID(g_get_real_time() / 1000, g_random_int());
@@ -2518,7 +2476,7 @@
bldr = fb_json_bldr_new(JSON_NODE_OBJECT);
fb_json_bldr_add_str(bldr, "body", msg->text);
fb_json_bldr_add_strf(bldr, "msgid", "%" FB_ID_FORMAT, mid);
- fb_json_bldr_add_strf(bldr, "sender_fbid", "%" FB_ID_FORMAT, priv->uid);
+ fb_json_bldr_add_strf(bldr, "sender_fbid", "%" FB_ID_FORMAT, api->uid); fb_json_bldr_add_strf(bldr, "to", "%s%" FB_ID_FORMAT, tpfx, id);
json = fb_json_bldr_close(bldr, JSON_NODE_OBJECT, NULL);
@@ -2530,12 +2488,10 @@
fb_api_message(FbApi *api, FbId id, gboolean thread, const gchar *text)
g_return_if_fail(FB_IS_API(api));
g_return_if_fail(text != NULL);
msg = g_new0(FbApiMessage, 1);
msg->text = g_strdup(text);
@@ -2546,10 +2502,10 @@
- empty = g_queue_is_empty(priv->msgs);
- g_queue_push_tail(priv->msgs, msg);
- if (empty && fb_mqtt_connected(priv->mqtt, FALSE)) {
+ empty = g_queue_is_empty(api->msgs); + g_queue_push_tail(api->msgs, msg); + if (empty && fb_mqtt_connected(api->mqtt, FALSE)) { fb_api_message_send(api, msg);
@@ -2557,7 +2513,6 @@
fb_api_publish(FbApi *api, const gchar *topic, const gchar *format, ...)
@@ -2567,7 +2522,6 @@
g_return_if_fail(FB_IS_API(api));
g_return_if_fail(topic != NULL);
g_return_if_fail(format != NULL);
msg = g_strdup_vprintf(format, ap);
@@ -2585,7 +2539,7 @@
"Writing message (topic: %s)",
- fb_mqtt_publish(priv->mqtt, topic, cytes);
+ fb_mqtt_publish(api->mqtt, topic, cytes); g_byte_array_free(cytes, TRUE);
g_byte_array_free(bytes, TRUE);
@@ -2594,16 +2548,14 @@
fb_api_read(FbApi *api, FbId id, gboolean thread)
g_return_if_fail(FB_IS_API(api));
bldr = fb_json_bldr_new(JSON_NODE_OBJECT);
fb_json_bldr_add_bool(bldr, "state", TRUE);
- fb_json_bldr_add_int(bldr, "syncSeqId", priv->sid);
+ fb_json_bldr_add_int(bldr, "syncSeqId", api->sid); fb_json_bldr_add_str(bldr, "mark", "read");
key = thread ? "threadFbId" : "otherUserFbId";
@@ -2838,19 +2790,17 @@
fb_api_unread(FbApi *api)
g_return_if_fail(FB_IS_API(api));
- if (priv->unread < 1) {
bldr = fb_json_bldr_new(JSON_NODE_OBJECT);
fb_json_bldr_add_str(bldr, "2", "true");
- fb_json_bldr_add_int(bldr, "1", priv->unread);
+ fb_json_bldr_add_int(bldr, "1", api->unread); fb_json_bldr_add_str(bldr, "12", "true");
fb_json_bldr_add_str(bldr, "13", "false");
fb_api_http_query(api, FB_API_QUERY_THREADS, bldr,
@@ -2918,7 +2868,6 @@
- FbApiPrivate *priv = api->priv;
@@ -2961,7 +2910,7 @@
uid = FB_ID_FROM_STR(str);
- if (uid != priv->uid) {
user = g_new0(FbApiUser, 1);
user->name = fb_json_values_next_str_dup(values, NULL);
@@ -3083,7 +3032,6 @@
fb_api_thread_create(FbApi *api, GSList *uids)
@@ -3092,12 +3040,11 @@
g_return_if_fail(FB_IS_API(api));
g_warn_if_fail(g_slist_length(uids) > 1);
bldr = fb_json_bldr_new(JSON_NODE_ARRAY);
fb_json_bldr_obj_begin(bldr, NULL);
fb_json_bldr_add_str(bldr, "type", "id");
- fb_json_bldr_add_strf(bldr, "id", "%" FB_ID_FORMAT, priv->uid);
+ fb_json_bldr_add_strf(bldr, "id", "%" FB_ID_FORMAT, api->uid); fb_json_bldr_obj_end(bldr);
for (l = uids; l != NULL; l = l->next) {
@@ -3141,22 +3088,20 @@
fb_api_thread_remove(FbApi *api, FbId tid, FbId uid)
g_return_if_fail(FB_IS_API(api));
prms = fb_http_params_new();
fb_http_params_set_strf(prms, "id", "t_%" FB_ID_FORMAT, tid);
- if (uid != priv->uid) {
bldr = fb_json_bldr_new(JSON_NODE_ARRAY);
fb_json_bldr_add_strf(bldr, NULL, "%" FB_ID_FORMAT, uid);
json = fb_json_bldr_close(bldr, JSON_NODE_ARRAY, NULL);
--- a/libpurple/protocols/facebook/data.c Tue Sep 20 03:31:39 2022 -0500
+++ b/libpurple/protocols/facebook/data.c Tue Sep 20 22:43:37 2022 -0500
@@ -28,8 +28,14 @@
+ * Represents the connection data used by #FacebookProtocol. @@ -41,18 +47,13 @@
- * Represents the connection data used by #FacebookProtocol.
+ * Represents the data used for fetching images.
@@ -62,17 +63,6 @@
- * Represents the data used for fetching images.
- FbDataImagePrivate *priv;
static const gchar *fb_props_strs[] = {
@@ -82,33 +72,39 @@
-G_DEFINE_TYPE_WITH_PRIVATE(FbData, fb_data, G_TYPE_OBJECT);
-G_DEFINE_TYPE_WITH_PRIVATE(FbDataImage, fb_data_image, G_TYPE_OBJECT);
+G_DEFINE_TYPE(FbData, fb_data, G_TYPE_OBJECT); +G_DEFINE_TYPE(FbDataImage, fb_data_image, G_TYPE_OBJECT); fb_data_dispose(GObject *obj)
- FbDataPrivate *priv = FB_DATA(obj)->priv;
+ FbData *fata = FB_DATA(obj); - soup_session_abort(priv->cons);
- g_hash_table_iter_init(&iter, priv->evs);
- while (g_hash_table_iter_next(&iter, NULL, &ptr)) {
- g_source_remove(GPOINTER_TO_UINT(ptr));
+ if(fata->cons != NULL) { + soup_session_abort(fata->cons); - if (G_LIKELY(priv->api != NULL)) {
- g_object_unref(priv->api);
+ if(fata->evs != NULL) { + g_hash_table_iter_init(&iter, fata->evs); + while (g_hash_table_iter_next(&iter, NULL, &ptr)) { + g_source_remove(GPOINTER_TO_UINT(ptr)); - g_object_unref(priv->cons);
- g_queue_free_full(priv->msgs, (GDestroyNotify) fb_api_message_free);
+ g_clear_object(&fata->api); - g_hash_table_destroy(priv->imgs);
- g_hash_table_destroy(priv->unread);
- g_hash_table_destroy(priv->evs);
+ g_clear_object(&fata->cons); + if(fata->msgs != NULL) { + g_queue_free_full(fata->msgs, (GDestroyNotify)fb_api_message_free); + g_clear_pointer(&fata->imgs, g_hash_table_destroy); + g_clear_pointer(&fata->unread, g_hash_table_destroy); + g_clear_pointer(&fata->evs, g_hash_table_destroy); @@ -122,32 +118,28 @@
fb_data_init(FbData *fata)
- FbDataPrivate *priv = fb_data_get_instance_private(fata);
- priv->msgs = g_queue_new();
+ fata->msgs = g_queue_new(); - priv->imgs = g_hash_table_new_full(g_direct_hash, g_direct_equal,
+ fata->imgs = g_hash_table_new_full(g_direct_hash, g_direct_equal, - priv->unread = g_hash_table_new_full(fb_id_hash, fb_id_equal,
+ fata->unread = g_hash_table_new_full(fb_id_hash, fb_id_equal, - priv->evs = g_hash_table_new_full(g_str_hash, g_str_equal,
+ fata->evs = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); fb_data_image_dispose(GObject *obj)
FbDataImage *img = FB_DATA_IMAGE(obj);
- FbDataImagePrivate *priv = img->priv;
- FbData *fata = priv->fata;
+ FbData *fata = img->fata; - if ((priv->dunc != NULL) && (priv->data != NULL)) {
- priv->dunc(priv->data);
+ if (img->dunc != NULL && img->data != NULL) {
- g_hash_table_steal(fata->priv->imgs, img);
+ g_clear_pointer(&img->url, g_free); + g_hash_table_steal(fata->imgs, img); @@ -161,23 +153,19 @@
fb_data_image_init(FbDataImage *img)
- FbDataImagePrivate *priv = fb_data_image_get_instance_private(img);
fb_data_new(PurpleConnection *gc, GProxyResolver *resolver)
fata = g_object_new(FB_TYPE_DATA, NULL);
- priv->cons = soup_session_new_with_options("proxy-resolver", resolver,
+ fata->cons = soup_session_new_with_options("proxy-resolver", resolver, - priv->api = fb_api_new(gc, resolver);
+ fata->api = fb_api_new(gc, resolver); @@ -186,7 +174,6 @@
fb_data_load(FbData *fata)
@@ -195,8 +182,7 @@
g_return_val_if_fail(FB_IS_DATA(fata), FALSE);
- acct = purple_connection_get_account(priv->gc);
+ acct = purple_connection_get_account(fata->gc); for (i = 0; i < G_N_ELEMENTS(fb_props_strs); i++) {
str = purple_account_get_string(acct, fb_props_strs[i], NULL);
@@ -207,7 +193,7 @@
g_value_init(&val, G_TYPE_STRING);
g_value_set_string(&val, str);
- g_object_set_property(G_OBJECT(priv->api), fb_props_strs[i],
+ g_object_set_property(G_OBJECT(fata->api), fb_props_strs[i], @@ -218,7 +204,7 @@
uint = g_ascii_strtoull(str, NULL, 10);
g_value_init(&val, G_TYPE_UINT64);
g_value_set_uint64(&val, uint);
- g_object_set_property(G_OBJECT(priv->api), "mid", &val);
+ g_object_set_property(G_OBJECT(fata->api), "mid", &val); @@ -230,13 +216,13 @@
id = FB_ID_FROM_STR(str);
g_value_init(&val, FB_TYPE_ID);
g_value_set_int64(&val, id);
- g_object_set_property(G_OBJECT(priv->api), "uid", &val);
+ g_object_set_property(G_OBJECT(fata->api), "uid", &val); - fb_api_rehash(priv->api);
+ fb_api_rehash(fata->api); @@ -244,7 +230,6 @@
fb_data_save(FbData *fata)
@@ -252,12 +237,11 @@
g_return_if_fail(FB_IS_DATA(fata));
- acct = purple_connection_get_account(priv->gc);
+ acct = purple_connection_get_account(fata->gc); for (i = 0; i < G_N_ELEMENTS(fb_props_strs); i++) {
g_value_init(&val, G_TYPE_STRING);
- g_object_get_property(G_OBJECT(priv->api), fb_props_strs[i],
+ g_object_get_property(G_OBJECT(fata->api), fb_props_strs[i], str = g_value_get_string(&val);
@@ -269,7 +253,7 @@
g_value_init(&val, G_TYPE_UINT64);
- g_object_get_property(G_OBJECT(priv->api), "mid", &val);
+ g_object_get_property(G_OBJECT(fata->api), "mid", &val); uint = g_value_get_uint64(&val);
@@ -278,7 +262,7 @@
g_value_init(&val, G_TYPE_INT64);
- g_object_get_property(G_OBJECT(priv->api), "uid", &val);
+ g_object_get_property(G_OBJECT(fata->api), "uid", &val); uint = g_value_get_int64(&val);
@@ -290,147 +274,119 @@
fb_data_save_timeout(FbData *fata, const gchar *name, guint id)
g_return_if_fail(FB_IS_DATA(fata));
fb_data_clear_timeout(fata, name, TRUE);
- g_hash_table_replace(priv->evs, g_strdup(name), GUINT_TO_POINTER(id));
+ g_hash_table_replace(fata->evs, g_strdup(name), GUINT_TO_POINTER(id)); fb_data_clear_timeout(FbData *fata, const gchar *name, gboolean remove)
g_return_if_fail(FB_IS_DATA(fata));
- ptr = g_hash_table_lookup(priv->evs, name);
+ ptr = g_hash_table_lookup(fata->evs, name); id = GPOINTER_TO_UINT(ptr);
if ((id > 0) && remove) {
- g_hash_table_remove(priv->evs, name);
+ g_hash_table_remove(fata->evs, name); fb_data_get_api(FbData *fata)
g_return_val_if_fail(FB_IS_DATA(fata), NULL);
fb_data_get_connection(FbData *fata)
+ g_return_val_if_fail(FB_IS_DATA(fata), NULL); - g_return_val_if_fail(FB_IS_DATA(fata), NULL);
fb_data_get_roomlist(FbData *fata)
+ g_return_val_if_fail(FB_IS_DATA(fata), NULL); - g_return_val_if_fail(FB_IS_DATA(fata), NULL);
fb_data_get_unread(FbData *fata, FbId id)
g_return_val_if_fail(FB_IS_DATA(fata), FALSE);
g_return_val_if_fail(id != 0, FALSE);
- ptr = g_hash_table_lookup(priv->unread, &id);
+ ptr = g_hash_table_lookup(fata->unread, &id); return GPOINTER_TO_INT(ptr);
fb_data_set_roomlist(FbData *fata, PurpleRoomlist *list)
+ g_return_if_fail(FB_IS_DATA(fata)); - g_return_if_fail(FB_IS_DATA(fata));
fb_data_set_unread(FbData *fata, FbId id, gboolean unread)
g_return_if_fail(FB_IS_DATA(fata));
g_return_if_fail(id != 0);
- g_hash_table_remove(priv->unread, &id);
+ g_hash_table_remove(fata->unread, &id); key = g_memdup2(&id, sizeof id);
- g_hash_table_replace(priv->unread, key, GINT_TO_POINTER(unread));
+ g_hash_table_replace(fata->unread, key, GINT_TO_POINTER(unread)); fb_data_add_message(FbData *fata, FbApiMessage *msg)
+ g_return_if_fail(FB_IS_DATA(fata)); - g_return_if_fail(FB_IS_DATA(fata));
- g_queue_push_tail(priv->msgs, msg);
+ g_queue_push_tail(fata->msgs, msg); fb_data_remove_message(FbData *fata, FbApiMessage *msg)
+ g_return_if_fail(FB_IS_DATA(fata)); - g_return_if_fail(FB_IS_DATA(fata));
- g_queue_remove(priv->msgs, msg);
+ g_queue_remove(fata->msgs, msg); fb_data_take_messages(FbData *fata, FbId uid)
g_return_val_if_fail(FB_IS_DATA(fata), NULL);
@@ -438,7 +394,7 @@
msgs = g_slist_prepend(msgs, msg);
- g_queue_delete_link(priv->msgs, l);
+ g_queue_delete_link(fata->msgs, l); @@ -452,101 +408,81 @@
gpointer data, GDestroyNotify dunc)
- FbDataImagePrivate *priv;
g_return_val_if_fail(FB_IS_DATA(fata), NULL);
g_return_val_if_fail(url != NULL, NULL);
g_return_val_if_fail(func != NULL, NULL);
img = g_object_new(FB_TYPE_DATA_IMAGE, NULL);
- priv->url = g_strdup(url);
+ img->url = g_strdup(url); - g_hash_table_insert(fata->priv->imgs, img, img);
+ g_hash_table_insert(fata->imgs, img, img); fb_data_image_get_active(FbDataImage *img)
- FbDataImagePrivate *priv;
+ g_return_val_if_fail(FB_IS_DATA_IMAGE(img), FALSE); - g_return_val_if_fail(FB_IS_DATA_IMAGE(img), FALSE);
fb_data_image_get_data(FbDataImage *img)
- FbDataImagePrivate *priv;
+ g_return_val_if_fail(FB_IS_DATA_IMAGE(img), NULL); - g_return_val_if_fail(FB_IS_DATA_IMAGE(img), NULL);
fb_data_image_get_fata(FbDataImage *img)
- FbDataImagePrivate *priv;
+ g_return_val_if_fail(FB_IS_DATA_IMAGE(img), NULL); - g_return_val_if_fail(FB_IS_DATA_IMAGE(img), NULL);
fb_data_image_get_image(FbDataImage *img, gsize *size)
- FbDataImagePrivate *priv;
g_return_val_if_fail(FB_IS_DATA_IMAGE(img), NULL);
fb_data_image_dup_image(FbDataImage *img, gsize *size)
- FbDataImagePrivate *priv;
g_return_val_if_fail(FB_IS_DATA_IMAGE(img), NULL);
- return g_memdup2(priv->image, priv->size);
+ return g_memdup2(img->image, img->size); fb_data_image_get_url(FbDataImage *img)
- FbDataImagePrivate *priv;
+ g_return_val_if_fail(FB_IS_DATA_IMAGE(img), NULL); - g_return_val_if_fail(FB_IS_DATA_IMAGE(img), NULL);
@@ -554,17 +490,16 @@
- FbDataImagePrivate *priv = img->priv;
fb_http_error_chk(res, &err);
- priv->image = (guint8 *)res->response_body->data;
- priv->size = res->response_body->length;
+ img->image = (guint8 *)res->response_body->data; + img->size = res->response_body->length; if (G_LIKELY(err == NULL)) {
- fb_data_image_queue(priv->fata);
+ fb_data_image_queue(img->fata); @@ -577,13 +512,11 @@
g_return_if_fail(FB_IS_DATA(fata));
- g_hash_table_iter_init(&iter, priv->imgs);
+ g_hash_table_iter_init(&iter, fata->imgs); while (g_hash_table_iter_next(&iter, (gpointer *) &img, NULL)) {
if (fb_data_image_get_active(img)) {
@@ -595,7 +528,7 @@
- g_hash_table_iter_init(&iter, priv->imgs);
+ g_hash_table_iter_init(&iter, fata->imgs); while (g_hash_table_iter_next(&iter, (gpointer *) &img, NULL)) {
@@ -604,12 +537,12 @@
- img->priv->active = TRUE;
url = fb_data_image_get_url(img);
msg = soup_message_new("GET", url);
// purple_http_request_set_max_len(req, FB_DATA_ICON_SIZE_MAX);
- soup_session_queue_message(priv->cons, msg, fb_data_image_cb, img);
+ soup_session_queue_message(fata->cons, msg, fb_data_image_cb, img); if (++active >= FB_DATA_ICON_MAX) {
--- a/libpurple/protocols/facebook/thrift.c Tue Sep 20 03:31:39 2022 -0500
+++ b/libpurple/protocols/facebook/thrift.c Tue Sep 20 22:43:37 2022 -0500
@@ -23,35 +23,32 @@
* Represents a reader/writer for compact Thrift data.
-G_DEFINE_TYPE_WITH_PRIVATE(FbThrift, fb_thrift, G_TYPE_OBJECT);
+G_DEFINE_TYPE(FbThrift, fb_thrift, G_TYPE_OBJECT); fb_thrift_dispose(GObject *obj)
- FbThriftPrivate *priv = FB_THRIFT(obj)->priv;
+ FbThrift* thft = FB_THRIFT(obj);
- g_byte_array_free(priv->bytes, TRUE);
+ g_byte_array_free(thft->bytes, TRUE); + thft->internal = FALSE; @@ -66,27 +63,22 @@
fb_thrift_init(FbThrift *thft)
- FbThriftPrivate *priv = fb_thrift_get_instance_private(thft);
fb_thrift_new(GByteArray *bytes, guint offset)
thft = g_object_new(FB_TYPE_THRIFT, NULL);
- priv->bytes = g_byte_array_new();
+ thft->bytes = g_byte_array_new(); @@ -95,73 +87,60 @@
fb_thrift_get_bytes(FbThrift *thft)
+ g_return_val_if_fail(FB_IS_THRIFT(thft), NULL); - g_return_val_if_fail(FB_IS_THRIFT(thft), NULL);
fb_thrift_get_pos(FbThrift *thft)
+ g_return_val_if_fail(FB_IS_THRIFT(thft), 0); - g_return_val_if_fail(FB_IS_THRIFT(thft), 0);
fb_thrift_set_pos(FbThrift *thft, guint pos)
+ g_return_if_fail(FB_IS_THRIFT(thft)); - g_return_if_fail(FB_IS_THRIFT(thft));
fb_thrift_reset(FbThrift *thft)
+ g_return_if_fail(FB_IS_THRIFT(thft)); - g_return_if_fail(FB_IS_THRIFT(thft));
- priv->pos = priv->offset;
+ thft->pos = thft->offset; fb_thrift_read(FbThrift *thft, gpointer data, guint size)
+ g_return_val_if_fail(FB_IS_THRIFT(thft), FALSE); - g_return_val_if_fail(FB_IS_THRIFT(thft), FALSE);
- if ((priv->pos + size) > priv->bytes->len) {
+ if ((thft->pos + size) > thft->bytes->len) { if ((data != NULL) && (size > 0)) {
- memcpy(data, priv->bytes->data + priv->pos, size);
+ memcpy(data, thft->bytes->data + thft->pos, size);
fb_thrift_read_bool(FbThrift *thft, gboolean *value)
g_return_val_if_fail(FB_IS_THRIFT(thft), FALSE);
- if ((priv->lastbool & 0x03) != 0x01) {
+ if ((thft->lastbool & 0x03) != 0x01) { if (!fb_thrift_read_byte(thft, &byte)) {
@@ -170,15 +149,15 @@
*value = (byte & 0x0F) == 0x01;
- *value = ((priv->lastbool & 0x04) >> 2) != 0;
+ *value = ((thft->lastbool & 0x04) >> 2) != 0;
@@ -344,14 +323,12 @@
fb_thrift_read_field(FbThrift *thft, FbThriftType *type, gint16 *id,
g_return_val_if_fail(FB_IS_THRIFT(thft), FALSE);
g_return_val_if_fail(type != NULL, FALSE);
g_return_val_if_fail(id != NULL, FALSE);
if (!fb_thrift_read_byte(thft, &byte)) {
@@ -374,10 +351,10 @@
if (*type == FB_THRIFT_TYPE_BOOL) {
if ((byte & 0x0F) == 0x01) {
- priv->lastbool |= 0x01 << 2;
+ thft->lastbool |= 0x01 << 2; @@ -396,17 +373,15 @@
fb_thrift_read_isstop(FbThrift *thft)
g_return_val_if_fail(FB_IS_THRIFT(thft), FALSE);
if (!fb_thrift_read_byte(thft, &byte)) {
return byte == FB_THRIFT_TYPE_STOP;
@@ -477,35 +452,30 @@
fb_thrift_write(FbThrift *thft, gconstpointer data, guint size)
+ g_return_if_fail(FB_IS_THRIFT(thft)); - g_return_if_fail(FB_IS_THRIFT(thft));
- g_byte_array_append(priv->bytes, data, size);
+ g_byte_array_append(thft->bytes, data, size); fb_thrift_write_bool(FbThrift *thft, gboolean value)
g_return_if_fail(FB_IS_THRIFT(thft));
- if ((priv->lastbool & 0x03) != 0x02) {
+ if ((thft->lastbool & 0x03) != 0x02) { fb_thrift_write_byte(thft, value ? 0x01 : 0x02);
- pos = priv->lastbool >> 3;
+ pos = thft->lastbool >> 3; - if ((pos >= priv->offset) && (pos < priv->bytes->len)) {
- priv->bytes->data[pos] &= ~0x0F;
- priv->bytes->data[pos] |= value ? 0x01 : 0x02;
+ if ((pos >= thft->offset) && (pos < thft->bytes->len)) { + thft->bytes->data[pos] &= ~0x0F; + thft->bytes->data[pos] |= value ? 0x01 : 0x02; @@ -594,14 +564,12 @@
fb_thrift_write_field(FbThrift *thft, FbThriftType type, gint16 id,
g_return_if_fail(FB_IS_THRIFT(thft));
if (type == FB_THRIFT_TYPE_BOOL) {
- priv->lastbool = (priv->pos << 3) | 0x02;
+ thft->lastbool = (thft->pos << 3) | 0x02; type = fb_thrift_t2ct(type);