X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=thread.cc;h=b67dfade5e16091fde964ddbafd69e1da6b5eb01;hp=891572990ad8ec9b7af2783d9571528592978487;hb=d4c4318fb95ba2ed86823389cf82b11a2bcae073;hpb=1ba3d46fab12d616b2085f5794543444cc4bc750 diff --git a/thread.cc b/thread.cc index 89157299..b67dfade 100644 --- a/thread.cc +++ b/thread.cc @@ -23,11 +23,27 @@ #include +#include /* GHashTable */ + struct _notmuch_thread { notmuch_database_t *notmuch; char *thread_id; + char *subject; + GHashTable *tags; + + notmuch_bool_t has_message; + time_t oldest; + time_t newest; }; +static int +_notmuch_thread_destructor (notmuch_thread_t *thread) +{ + g_hash_table_unref (thread->tags); + + return 0; +} + /* Create a new notmuch_thread_t object for an existing document in * the database. * @@ -54,8 +70,17 @@ _notmuch_thread_create (const void *talloc_owner, if (unlikely (thread == NULL)) return NULL; + talloc_set_destructor (thread, _notmuch_thread_destructor); + thread->notmuch = notmuch; thread->thread_id = talloc_strdup (thread, thread_id); + thread->subject = NULL; + thread->tags = g_hash_table_new_full (g_str_hash, g_str_equal, + free, NULL); + + thread->has_message = 0; + thread->oldest = 0; + thread->newest = 0; return thread; } @@ -66,6 +91,79 @@ notmuch_thread_get_thread_id (notmuch_thread_t *thread) return thread->thread_id; } +void +_notmuch_thread_add_message (notmuch_thread_t *thread, + notmuch_message_t *message) +{ + notmuch_tags_t *tags; + const char *tag; + time_t date; + + if (! thread->subject) { + const char *subject; + subject = notmuch_message_get_header (message, "subject"); + thread->subject = talloc_strdup (thread, subject); + } + + for (tags = notmuch_message_get_tags (message); + notmuch_tags_has_more (tags); + notmuch_tags_advance (tags)) + { + tag = notmuch_tags_get (tags); + g_hash_table_insert (thread->tags, xstrdup (tag), NULL); + } + + date = notmuch_message_get_date (message); + + if (date < thread->oldest || ! thread->has_message) + thread->oldest = date; + + if (date > thread->newest || ! thread->has_message) + thread->newest = date; + + thread->has_message = 1; +} + +const char * +notmuch_thread_get_subject (notmuch_thread_t *thread) +{ + return thread->subject; +} + +time_t +notmuch_thread_get_oldest_date (notmuch_thread_t *thread) +{ + return thread->oldest; +} + +time_t +notmuch_thread_get_newest_date (notmuch_thread_t *thread) +{ + return thread->newest; +} + +notmuch_tags_t * +notmuch_thread_get_tags (notmuch_thread_t *thread) +{ + notmuch_tags_t *tags; + GList *keys, *l; + + tags = _notmuch_tags_create (thread); + if (unlikely (tags == NULL)) + return NULL; + + keys = g_hash_table_get_keys (thread->tags); + + for (l = keys; l; l = l->next) + _notmuch_tags_add_tag (tags, (char *) l->data); + + g_list_free (keys); + + _notmuch_tags_prepare_iterator (tags); + + return tags; +} + void notmuch_thread_destroy (notmuch_thread_t *thread) {