void init_msgs()

in prpl/messages.c [271:333]


void init_msgs(PurpleConnection *conn, struct chime_msgs *msgs, ChimeObject *obj, chime_msg_cb cb, const gchar *name, JsonNode *first_msg)
{
	msgs->conn = conn;
	msgs->obj = g_object_ref(obj);
	msgs->cb = cb;
	msgs->seen_msgs = g_queue_new();

	const gchar *last_seen = NULL;
	gchar *last_id = NULL;
	chime_read_last_msg(conn, obj, &last_seen, &last_id);
	msgs->last_seen = g_strdup(last_seen ? : "1970-01-01T00:00:00.000Z");

	if (last_id) {
		mark_msg_seen(msgs->seen_msgs, last_id);
		g_free(last_id);
	}

	g_signal_connect(obj, "notify::last-sent", G_CALLBACK(on_last_sent_updated), msgs);
	g_signal_connect(obj, "message", G_CALLBACK(on_message_received), msgs);

	if (CHIME_IS_ROOM(obj)) {
		g_signal_connect(obj, "members-done", G_CALLBACK(on_room_members_done), msgs);
		/* Always fetch messages for rooms since we won't have been told of any
		 * updates to LastSent anyway. */
	} else {
		msgs->members_done = TRUE;

		/* Do we need to fetch new messages? */
		gchar *last_sent;
		g_object_get(obj, "last-sent", &last_sent, NULL);

		if (!last_sent || ! strcmp(msgs->last_seen, last_sent))
			msgs->msgs_done = TRUE;

		g_free(last_sent);
	}

	if (!msgs->msgs_done) {
		GTimeVal before_tv;
		const gchar *start_from = last_seen;

		if (!start_from) {
			if (CHIME_IS_ROOM(obj))
				start_from = chime_room_get_created_on(CHIME_ROOM(obj));
			else
				start_from = chime_conversation_get_created_on(CHIME_CONVERSATION(obj));
		}
		if (g_time_val_from_iso8601(start_from, &before_tv)) {
			before_tv.tv_sec += FETCH_TIME_CHUNK;
			if (before_tv.tv_sec < time(NULL) - 86400)
				msgs->fetch_until = g_time_val_to_iso8601(&before_tv);
		}
		purple_debug(PURPLE_DEBUG_INFO, "chime", "Fetch messages for %s from %s until %s\n", name, msgs->last_seen, msgs->fetch_until);
		chime_connection_fetch_messages_async(PURPLE_CHIME_CXN(conn), obj, msgs->fetch_until,
						      msgs->last_seen, NULL, fetch_msgs_cb, msgs);
	}

	if (!msgs->msgs_done || !msgs->members_done)
		msgs->msg_gather = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, (GDestroyNotify)json_node_unref);

	if (first_msg)
		on_message_received(obj, first_msg, msgs);
}