X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=lib%2Fnotmuch-private.h;h=f38ccb39b1ecfcbc5884341fc4024f50762665e4;hp=5a0cf92540619ff5fa50951c5326c84e191051b8;hb=16aa65ba2575fd504c31d9671d8c5150f8e8adf1;hpb=7b78eb4af6e87532795d09bd82152002ab4a74b1 diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h index 5a0cf925..f38ccb39 100644 --- a/lib/notmuch-private.h +++ b/lib/notmuch-private.h @@ -47,6 +47,9 @@ NOTMUCH_BEGIN_DECLS #include #include "xutil.h" +#include "error_util.h" + +#pragma GCC visibility push(hidden) #ifdef DEBUG # define DEBUG_DATABASE_SANITY 1 @@ -55,27 +58,17 @@ NOTMUCH_BEGIN_DECLS #define COMPILE_TIME_ASSERT(pred) ((void)sizeof(char[1 - 2*!(pred)])) -/* There's no point in continuing when we've detected that we've done - * something wrong internally (as opposed to the user passing in a - * bogus value). - * - * Note that PRINTF_ATTRIBUTE comes from talloc.h - */ -int -_internal_error (const char *format, ...) PRINTF_ATTRIBUTE (1, 2); - -/* There's no point in continuing when we've detected that we've done - * something wrong internally (as opposed to the user passing in a - * bogus value). - * - * Note that __location__ comes from talloc.h. - */ -#define INTERNAL_ERROR(format, ...) \ - _internal_error (format " (%s).\n", \ - ##__VA_ARGS__, __location__) +#define STRNCMP_LITERAL(var, literal) \ + strncmp ((var), (literal), sizeof (literal) - 1) #define unused(x) x __attribute__ ((unused)) +#ifdef __cplusplus +# define visible __attribute__((visibility("default"))) +#else +# define visible +#endif + /* Thanks to Andrew Tridgell's (SAMBA's) talloc for this definition of * unlikely. The talloc source code comes to us via the GNU LGPL v. 3. */ @@ -100,7 +93,9 @@ _internal_error (const char *format, ...) PRINTF_ATTRIBUTE (1, 2); typedef enum { NOTMUCH_VALUE_TIMESTAMP = 0, - NOTMUCH_VALUE_MESSAGE_ID + NOTMUCH_VALUE_MESSAGE_ID, + NOTMUCH_VALUE_FROM, + NOTMUCH_VALUE_SUBJECT } notmuch_value_t; /* Xapian (with flint backend) complains if we provide a term longer @@ -141,16 +136,34 @@ typedef enum _notmuch_private_status { * to or greater than NOTMUCH_STATUS_LAST_STATUS. (The idea here is * that the caller has previously handled any expected * notmuch_private_status_t values.) + * + * Note that the function _internal_error does not return. Evaluating + * to NOTMUCH_STATUS_SUCCESS is done purely to appease the compiler. */ #define COERCE_STATUS(private_status, format, ...) \ ((private_status >= (notmuch_private_status_t) NOTMUCH_STATUS_LAST_STATUS)\ ? \ - (notmuch_status_t) _internal_error (format " (%s).\n", \ - ##__VA_ARGS__, \ - __location__) \ + _internal_error (format " (%s).\n", \ + ##__VA_ARGS__, \ + __location__), \ + (notmuch_status_t) NOTMUCH_PRIVATE_STATUS_SUCCESS \ : \ (notmuch_status_t) private_status) +/* Flags shared by various lookup functions. */ +typedef enum _notmuch_find_flags { + /* Lookup without creating any documents. This is the default + * behavior. */ + NOTMUCH_FIND_LOOKUP = 0, + /* If set, create the necessary document (or documents) if they + * are missing. Requires a read/write database. */ + NOTMUCH_FIND_CREATE = 1<<0, +} notmuch_find_flags_t; + +typedef struct _notmuch_doc_id_set notmuch_doc_id_set_t; + +typedef struct _notmuch_string_list notmuch_string_list_t; + /* database.cc */ /* Lookup a prefix value by name. @@ -189,6 +202,7 @@ _notmuch_database_find_unique_doc_id (notmuch_database_t *notmuch, notmuch_status_t _notmuch_database_find_directory_id (notmuch_database_t *database, const char *path, + notmuch_find_flags_t flags, unsigned int *directory_id); const char * @@ -200,6 +214,7 @@ notmuch_status_t _notmuch_database_filename_to_direntry (void *ctx, notmuch_database_t *notmuch, const char *filename, + notmuch_find_flags_t flags, char **direntry); /* directory.cc */ @@ -207,6 +222,7 @@ _notmuch_database_filename_to_direntry (void *ctx, notmuch_directory_t * _notmuch_directory_create (notmuch_database_t *notmuch, const char *path, + notmuch_find_flags_t flags, notmuch_status_t *status_ret); unsigned int @@ -217,8 +233,9 @@ _notmuch_directory_get_document_id (notmuch_directory_t *directory); notmuch_thread_t * _notmuch_thread_create (void *ctx, notmuch_database_t *notmuch, - const char *thread_id, - const char *query_string, + unsigned int seed_doc_id, + notmuch_doc_id_set_t *match_set, + notmuch_string_list_t *excluded_terms, notmuch_sort_t sort); /* message.cc */ @@ -234,6 +251,9 @@ _notmuch_message_create_for_message_id (notmuch_database_t *notmuch, const char *message_id, notmuch_private_status_t *status); +unsigned int +_notmuch_message_get_doc_id (notmuch_message_t *message); + const char * _notmuch_message_get_in_reply_to (notmuch_message_t *message); @@ -259,16 +279,28 @@ notmuch_status_t _notmuch_message_add_filename (notmuch_message_t *message, const char *filename); +notmuch_status_t +_notmuch_message_remove_filename (notmuch_message_t *message, + const char *filename); + +notmuch_status_t +_notmuch_message_rename (notmuch_message_t *message, + const char *new_filename); + void _notmuch_message_ensure_thread_id (notmuch_message_t *message); void -_notmuch_message_set_date (notmuch_message_t *message, - const char *date); - +_notmuch_message_set_header_values (notmuch_message_t *message, + const char *date, + const char *from, + const char *subject); void _notmuch_message_sync (notmuch_message_t *message); +notmuch_status_t +_notmuch_message_delete (notmuch_message_t *message); + void _notmuch_message_close (notmuch_message_t *message); @@ -387,18 +419,15 @@ typedef struct _notmuch_message_list { * somewhere with some nasty C++ objects in it. We'll try to maintain * ignorance of that here. (See notmuch_mset_messages_t in query.cc) */ -struct _notmuch_messages { +struct visible _notmuch_messages { notmuch_bool_t is_of_list_type; + notmuch_doc_id_set_t *excluded_doc_ids; notmuch_message_node_t *iterator; }; notmuch_message_list_t * _notmuch_message_list_create (const void *ctx); -void -_notmuch_message_list_append (notmuch_message_list_t *list, - notmuch_message_node_t *node); - void _notmuch_message_list_add_message (notmuch_message_list_t *list, notmuch_message_t *message); @@ -417,11 +446,19 @@ _notmuch_mset_messages_get (notmuch_messages_t *messages); void _notmuch_mset_messages_move_to_next (notmuch_messages_t *messages); +notmuch_bool_t +_notmuch_doc_id_set_contains (notmuch_doc_id_set_t *doc_ids, + unsigned int doc_id); + +void +_notmuch_doc_id_set_remove (notmuch_doc_id_set_t *doc_ids, + unsigned int doc_id); + /* message.cc */ void _notmuch_message_add_reply (notmuch_message_t *message, - notmuch_message_node_t *reply); + notmuch_message_t *reply); /* sha1.c */ @@ -431,17 +468,66 @@ notmuch_sha1_of_string (const char *str); char * notmuch_sha1_of_file (const char *filename); -/* tags.c */ +/* string-list.c */ -notmuch_tags_t * -_notmuch_tags_create (void *ctx); +typedef struct _notmuch_string_node { + char *string; + struct _notmuch_string_node *next; +} notmuch_string_node_t; + +struct visible _notmuch_string_list { + int length; + notmuch_string_node_t *head; + notmuch_string_node_t **tail; +}; +notmuch_string_list_t * +_notmuch_string_list_create (const void *ctx); + +/* Add 'string' to 'list'. + * + * The list will create its own talloced copy of 'string'. + */ void -_notmuch_tags_add_tag (notmuch_tags_t *tags, const char *tag); +_notmuch_string_list_append (notmuch_string_list_t *list, + const char *string); void -_notmuch_tags_prepare_iterator (notmuch_tags_t *tags); +_notmuch_string_list_sort (notmuch_string_list_t *list); + +/* tags.c */ + +notmuch_tags_t * +_notmuch_tags_create (const void *ctx, notmuch_string_list_t *list); + +/* filenames.c */ + +/* The notmuch_filenames_t iterates over a notmuch_string_list_t of + * file names */ +notmuch_filenames_t * +_notmuch_filenames_create (const void *ctx, + notmuch_string_list_t *list); NOTMUCH_END_DECLS +#ifdef __cplusplus +/* Implicit typecast from 'void *' to 'T *' is okay in C, but not in + * C++. In talloc_steal, an explicit cast is provided for type safety + * in some GCC versions. Otherwise, a cast is required. Provide a + * template function for this to maintain type safety, and redefine + * talloc_steal to use it. + */ +#if !(__GNUC__ >= 3) +template T * +_notmuch_talloc_steal (const void *new_ctx, const T *ptr) +{ + return static_cast (talloc_steal (new_ctx, ptr)); +} +#undef talloc_steal +#define talloc_steal _notmuch_talloc_steal +#endif +#endif + +#pragma GCC visibility pop + #endif