From cd7a5c5d2469b6e9cbca9edaf12b7dd73b31c82d Mon Sep 17 00:00:00 2001 From: Nick Thomas Date: Thu, 11 Apr 2019 22:14:54 +0100 Subject: [PATCH] Move more processing out of the delta event handling --- delta-connection.c | 76 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 53 insertions(+), 23 deletions(-) diff --git a/delta-connection.c b/delta-connection.c index 1ae769c..3433e3b 100644 --- a/delta-connection.c +++ b/delta-connection.c @@ -150,46 +150,72 @@ err: typedef struct { DeltaConnectionData *conn; + + // Used by delta_process_incoming_message uint32_t msg_id; + + // Used by delta_process_connection_state + int connection_state; } ProcessRequest; gboolean -delta_process(void *data) +delta_process_incoming_message(void *data) { ProcessRequest *pr = (ProcessRequest *)data; + g_assert(pr != NULL); g_assert(pr->conn != NULL); delta_recv_im(pr->conn, pr->msg_id); + free(data); return FALSE; } -void -delta_fresh_messages(DeltaConnectionData *conn, dc_context_t *mailbox) +gboolean +delta_process_connection_state(void *data) { - g_assert(conn != NULL); - g_assert(mailbox != NULL); + ProcessRequest *pr = (ProcessRequest *)data; + g_assert(pr != NULL); + g_assert(pr->conn != NULL); + + purple_connection_update_progress( + pr->conn->pc, + "Connecting...", + pr->connection_state, + MAX_DELTA_CONFIGURE + ); + + if (pr->connection_state == MAX_DELTA_CONFIGURE) { + purple_connection_set_state(pr->conn->pc, PURPLE_CONNECTED); + } + + free(data); + + return FALSE; +} + +gboolean +delta_process_fresh_messages(void *data) +{ + ProcessRequest *pr = (ProcessRequest *)data; + g_assert(pr != NULL); + g_assert(pr->conn != NULL); + g_assert(pr->conn->mailbox != NULL); // Spot any messages received while offline - dc_array_t *fresh_msgs = dc_get_fresh_msgs(mailbox); + dc_array_t *fresh_msgs = dc_get_fresh_msgs(pr->conn->mailbox); size_t fresh_count = dc_array_get_cnt(fresh_msgs); printf("*** fresh_count: %zu\n", fresh_count); for(size_t i = 0; i < fresh_count; i++) { - ProcessRequest *pr = g_malloc(sizeof(ProcessRequest)); - g_assert(pr != NULL); - - pr->conn = conn; - pr->msg_id = dc_array_get_id(fresh_msgs, i); - - purple_timeout_add(0, delta_process, pr); + delta_recv_im(pr->conn, dc_array_get_id(fresh_msgs, i)); } free(fresh_msgs); - return; + return FALSE; } // Do not call any libpurple functions in here, as it is not thread-safe and @@ -222,7 +248,11 @@ my_delta_handler(dc_context_t* mailbox, int event, uintptr_t data1, uintptr_t da break; case DC_EVENT_MSGS_CHANGED: - delta_fresh_messages(conn, mailbox); + pr = g_malloc(sizeof(ProcessRequest)); + g_assert(pr != NULL); + + pr->conn = conn; + purple_timeout_add(0, delta_process_fresh_messages, pr); break; case DC_EVENT_INCOMING_MSG: @@ -230,9 +260,10 @@ my_delta_handler(dc_context_t* mailbox, int event, uintptr_t data1, uintptr_t da // TODO: It may be needed for group chats pr = g_malloc(sizeof(ProcessRequest)); g_assert(pr != NULL); + pr->conn = conn; pr->msg_id = (uint32_t)data2; - purple_timeout_add(0, delta_process, pr); + purple_timeout_add(0, delta_process_incoming_message, pr); break; // These are all to do with sending & receiving messages. The real meat of @@ -245,10 +276,12 @@ my_delta_handler(dc_context_t* mailbox, int event, uintptr_t data1, uintptr_t da break; case DC_EVENT_CONFIGURE_PROGRESS: - purple_connection_update_progress(conn->pc, "Connecting...", (int)data1, MAX_DELTA_CONFIGURE); - if ((int)data1 == MAX_DELTA_CONFIGURE) { - purple_connection_set_state(conn->pc, PURPLE_CONNECTED); - } + pr = g_malloc(sizeof(ProcessRequest)); + g_assert(pr != NULL); + + pr->conn = conn; + pr->connection_state = (int)data1; + purple_timeout_add(0, delta_process_connection_state, pr); break; case DC_EVENT_HTTP_GET: printf("HTTP GET requested: %s\n", (char *)data1); @@ -341,9 +374,6 @@ delta_connection_start_login(PurpleConnection *pc) pthread_create(&conn->imap_thread, NULL, imap_thread_func, conn); pthread_create(&conn->smtp_thread, NULL, smtp_thread_func, conn); - purple_connection_set_state(pc, PURPLE_CONNECTING); - purple_connection_update_progress(pc, "Connecting...", 1, MAX_DELTA_CONFIGURE); - dc_configure(mailbox); dc_maybe_network(mailbox);