NeoMutt  2025-12-11-435-g4ac674
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
lib.h File Reference

Notmuch virtual mailbox type. More...

#include <stdbool.h>
#include <stddef.h>
#include "core/lib.h"
+ Include dependency graph for lib.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void nm_db_debug_check (struct Mailbox *m)
 Check if the database is open.
 
void nm_db_longrun_done (struct Mailbox *m)
 Finish a long transaction.
 
void nm_db_longrun_init (struct Mailbox *m, bool writable)
 Start a long transaction.
 
char * nm_email_get_folder (struct Email *e)
 Get the folder for a Email.
 
char * nm_email_get_folder_rel_db (struct Mailbox *m, struct Email *e)
 Get the folder for a Email from the same level as the notmuch database.
 
int nm_get_all_tags (struct Mailbox *m, const char **tag_list, int *tag_count)
 Fill a list with all notmuch tags.
 
bool nm_message_is_still_queried (struct Mailbox *m, struct Email *e)
 Is a message still visible in the query?
 
enum MailboxType nm_path_probe (const char *path, const struct stat *st)
 Is this a Notmuch Mailbox?
 
bool nm_query_window_available (void)
 Are windowed queries enabled for use?
 
void nm_query_window_backward (void)
 Function to move the current search window backward in time.
 
void nm_query_window_forward (void)
 Function to move the current search window forward in time.
 
void nm_query_window_reset (void)
 Resets the vfolder window position to the present.
 
int nm_read_entire_thread (struct Mailbox *m, struct Email *e)
 Get the entire thread of an email.
 
int nm_record_message (struct Mailbox *m, char *path, struct Email *e)
 Add a message to the Notmuch database.
 
int nm_update_filename (struct Mailbox *m, const char *old_file, const char *new_file, struct Email *e)
 Change the filename.
 
char * nm_url_from_query (struct Mailbox *m, char *buf, size_t buflen)
 Turn a query into a URL.
 

Variables

const struct CompleteOps CompleteNmQueryOps
 Auto-Completion of NmQuerys.
 
const struct CompleteOps CompleteNmTagOps
 Auto-Completion of NmTags.
 
const struct MxOps MxNotmuchOps
 Notmuch Mailbox - Implements MxOps -.
 

Detailed Description

Notmuch virtual mailbox type.

Authors
  • Karel Zak
  • Richard Russon

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Definition in file lib.h.

Function Documentation

◆ nm_db_debug_check()

void nm_db_debug_check ( struct Mailbox * m)

Check if the database is open.

Parameters
mMailbox

Definition at line 397 of file db.c.

398{
399 struct NmAccountData *adata = nm_adata_get(m);
400 if (!adata || !adata->db)
401 return;
402
403 mutt_debug(LL_DEBUG1, "nm: ERROR: db is open, closing\n");
404 nm_db_release(m);
405}
#define mutt_debug(LEVEL,...)
Definition logging2.h:91
@ LL_DEBUG1
Log at debug level 1.
Definition logging2.h:45
struct NmAccountData * nm_adata_get(struct Mailbox *m)
Get the Notmuch Account data.
Definition adata.c:69
int nm_db_release(struct Mailbox *m)
Close the Notmuch database.
Definition db.c:233
void * adata
Private data (for Mailbox backends)
Definition account.h:42
Notmuch-specific Account data -.
Definition adata.h:35
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_db_longrun_done()

void nm_db_longrun_done ( struct Mailbox * m)

Finish a long transaction.

Parameters
mMailbox

Definition at line 379 of file db.c.

380{
381 struct NmAccountData *adata = nm_adata_get(m);
382
383 if (adata)
384 {
385 adata->longrun = false; /* to force nm_db_release() released DB */
386 if (nm_db_release(m) == 0)
387 mutt_debug(LL_DEBUG2, "nm: long run deinitialized\n");
388 else
389 adata->longrun = true;
390 }
391}
@ LL_DEBUG2
Log at debug level 2.
Definition logging2.h:46
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_db_longrun_init()

void nm_db_longrun_init ( struct Mailbox * m,
bool writable )

Start a long transaction.

Parameters
mMailbox
writableRead/write?

Definition at line 364 of file db.c.

365{
366 struct NmAccountData *adata = nm_adata_get(m);
367
368 if (!(adata && nm_db_get(m, writable)))
369 return;
370
371 adata->longrun = true;
372 mutt_debug(LL_DEBUG2, "nm: long run initialized\n");
373}
notmuch_database_t * nm_db_get(struct Mailbox *m, bool writable)
Get the Notmuch database.
Definition db.c:209
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_email_get_folder()

char * nm_email_get_folder ( struct Email * e)

Get the folder for a Email.

Parameters
eEmail
Return values
ptrFolder containing email
NULLError

Definition at line 1505 of file notmuch.c.

1506{
1507 struct NmEmailData *edata = nm_edata_get(e);
1508 if (!edata)
1509 return NULL;
1510
1511 return edata->folder;
1512}
struct NmEmailData * nm_edata_get(struct Email *e)
Get the Notmuch Email data.
Definition edata.c:72
void * edata
Driver-specific data.
Definition email.h:74
Notmuch-specific Email data -.
Definition edata.h:34
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_email_get_folder_rel_db()

char * nm_email_get_folder_rel_db ( struct Mailbox * m,
struct Email * e )

Get the folder for a Email from the same level as the notmuch database.

Parameters
mMailbox containing Email
eEmail
Return values
ptrFolder containing email from the same level as the notmuch db
NULLError

Instead of returning a path like /var/mail/account/Inbox, this returns account/Inbox. If wanting the full path, use nm_email_get_folder().

Definition at line 1524 of file notmuch.c.

1525{
1526 char *full_folder = nm_email_get_folder(e);
1527 if (!full_folder)
1528 return NULL;
1529
1530 const char *db_path = nm_db_get_filename(m);
1531 if (!db_path)
1532 return NULL;
1533
1534 size_t prefix = mutt_str_startswith(full_folder, db_path);
1535
1536 char *path = full_folder + prefix;
1537 if (*path == '/')
1538 path++;
1539
1540 return path;
1541}
size_t mutt_str_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix.
Definition string.c:234
const char * nm_db_get_filename(struct Mailbox *m)
Get the filename of the Notmuch database.
Definition db.c:58
char * nm_email_get_folder(struct Email *e)
Get the folder for a Email.
Definition notmuch.c:1505
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_get_all_tags()

int nm_get_all_tags ( struct Mailbox * m,
const char ** tag_list,
int * tag_count )

Fill a list with all notmuch tags.

Parameters
[in]mMailbox
[out]tag_listList of tags
[out]tag_countNumber of tags
Return values
0Success
-1Failure

If tag_list is NULL, just count the tags.

Definition at line 2024 of file notmuch.c.

2025{
2026 struct NmMboxData *mdata = nm_mdata_get(m);
2027 if (!mdata || !tag_count)
2028 return -1;
2029
2030 notmuch_database_t *db = NULL;
2031 notmuch_tags_t *tags = NULL;
2032 const char *tag = NULL;
2033 int rc = -1;
2034
2035 if (!(db = nm_db_get(m, false)) || !(tags = notmuch_database_get_all_tags(db)))
2036 goto done;
2037
2038 *tag_count = 0;
2039 mutt_debug(LL_DEBUG1, "nm: get all tags\n");
2040
2041 while (notmuch_tags_valid(tags))
2042 {
2043 tag = notmuch_tags_get(tags);
2044 /* Skip empty string */
2045 if (*tag)
2046 {
2047 if (tag_list)
2048 tag_list[*tag_count] = mutt_str_dup(tag);
2049 (*tag_count)++;
2050 }
2051 notmuch_tags_move_to_next(tags);
2052 }
2053
2054 rc = 0;
2055done:
2056 if (tags)
2057 notmuch_tags_destroy(tags);
2058
2059 nm_db_release(m);
2060
2061 mutt_debug(LL_DEBUG1, "nm: get all tags done [rc=%d tag_count=%u]\n", rc, *tag_count);
2062 return rc;
2063}
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition string.c:257
struct NmMboxData * nm_mdata_get(struct Mailbox *m)
Get the Notmuch Mailbox data.
Definition mdata.c:96
void * mdata
Driver specific data.
Definition mailbox.h:131
Notmuch-specific Mailbox data -.
Definition mdata.h:35
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_message_is_still_queried()

bool nm_message_is_still_queried ( struct Mailbox * m,
struct Email * e )

Is a message still visible in the query?

Parameters
mMailbox
eEmail
Return values
trueMessage is still in query

Definition at line 1734 of file notmuch.c.

1735{
1736 struct NmMboxData *mdata = nm_mdata_get(m);
1737 if (!mdata)
1738 return false;
1739
1740 notmuch_database_t *db = nm_db_get(m, false);
1741 char *orig_str = get_query_string(mdata, true);
1742
1743 if (!db || !orig_str)
1744 {
1745 nm_db_release(m);
1746 return false;
1747 }
1748
1749 char *new_str = NULL;
1750 bool rc = false;
1751 if (mutt_str_asprintf(&new_str, "id:%s and (%s)", email_get_id(e), orig_str) < 0)
1752 {
1753 nm_db_release(m);
1754 return false;
1755 }
1756
1757 mutt_debug(LL_DEBUG2, "nm: checking if message is still queried: %s\n", new_str);
1758
1759 notmuch_query_t *q = notmuch_query_create(db, new_str);
1760
1761 switch (mdata->query_type)
1762 {
1763 case NM_QUERY_TYPE_UNKNOWN: // UNKNOWN should never occur, but MESGS is default
1765 {
1766 notmuch_messages_t *messages = get_messages(q);
1767
1768 if (!messages)
1769 goto done;
1770
1771 rc = notmuch_messages_valid(messages);
1772 notmuch_messages_destroy(messages);
1773 break;
1774 }
1776 {
1777 notmuch_threads_t *threads = get_threads(q);
1778
1779 if (!threads)
1780 goto done;
1781
1782 rc = notmuch_threads_valid(threads);
1783 notmuch_threads_destroy(threads);
1784 break;
1785 }
1786 }
1787
1788done:
1789 notmuch_query_destroy(q);
1790
1791 mutt_debug(LL_DEBUG2, "nm: checking if message is still queried: %s = %s\n",
1792 new_str, rc ? "true" : "false");
1793
1794 FREE(&new_str);
1795 nm_db_release(m);
1796 return rc;
1797}
#define FREE(x)
Free memory and set the pointer to NULL.
Definition memory.h:68
int mutt_str_asprintf(char **strp, const char *fmt,...)
Definition string.c:805
static notmuch_threads_t * get_threads(notmuch_query_t *query)
Load threads for a query.
Definition notmuch.c:1016
static char * get_query_string(struct NmMboxData *mdata, bool window)
Builds the notmuch vfolder search string.
Definition notmuch.c:346
static char * email_get_id(struct Email *e)
Get the unique Notmuch Id.
Definition notmuch.c:214
static notmuch_messages_t * get_messages(notmuch_query_t *query)
Load messages for a query.
Definition notmuch.c:946
@ NM_QUERY_TYPE_UNKNOWN
Unknown query type. Error in notmuch query.
Definition query.h:38
@ NM_QUERY_TYPE_THREADS
Whole threads.
Definition query.h:37
@ NM_QUERY_TYPE_MESGS
Default: Messages only.
Definition query.h:36
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_query_window_available()

bool nm_query_window_available ( void )

Are windowed queries enabled for use?

Return values
trueWindowed queries in use

Definition at line 1674 of file notmuch.c.

1675{
1676 const short c_nm_query_window_duration = cs_subset_number(NeoMutt->sub, "nm_query_window_duration");
1677 const bool c_nm_query_window_enable = cs_subset_bool(NeoMutt->sub, "nm_query_window_enable");
1678
1679 return c_nm_query_window_enable || (c_nm_query_window_duration > 0);
1680}
short cs_subset_number(const struct ConfigSubset *sub, const char *name)
Get a number config item by name.
Definition helpers.c:143
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition helpers.c:47
Container for Accounts, Notifications.
Definition neomutt.h:41
struct ConfigSubset * sub
Inherited config items.
Definition neomutt.h:49
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_query_window_backward()

void nm_query_window_backward ( void )

Function to move the current search window backward in time.

Updates nm_query_window_current_position by incrementing it by 1

The higher the value of nm_query_window_current_position is, the less recent the result will be.

Definition at line 1711 of file notmuch.c.

1712{
1713 const short c_nm_query_window_current_position = cs_subset_number(NeoMutt->sub, "nm_query_window_current_position");
1714 cs_subset_str_native_set(NeoMutt->sub, "nm_query_window_current_position",
1715 c_nm_query_window_current_position + 1, NULL);
1716 mutt_debug(LL_DEBUG2, "(%d)\n", c_nm_query_window_current_position + 1);
1717}
int cs_subset_str_native_set(const struct ConfigSubset *sub, const char *name, intptr_t value, struct Buffer *err)
Natively set the value of a string config item.
Definition subset.c:303
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_query_window_forward()

void nm_query_window_forward ( void )

Function to move the current search window forward in time.

Updates nm_query_window_current_position by decrementing it by 1, or does nothing if the current window already is set to 0.

The lower the value of nm_query_window_current_position is, the more recent the result will be.

Definition at line 1691 of file notmuch.c.

1692{
1693 const short c_nm_query_window_current_position = cs_subset_number(NeoMutt->sub, "nm_query_window_current_position");
1694 if (c_nm_query_window_current_position != 0)
1695 {
1696 cs_subset_str_native_set(NeoMutt->sub, "nm_query_window_current_position",
1697 c_nm_query_window_current_position - 1, NULL);
1698 }
1699
1700 mutt_debug(LL_DEBUG2, "(%d)\n", c_nm_query_window_current_position - 1);
1701}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_query_window_reset()

void nm_query_window_reset ( void )

Resets the vfolder window position to the present.

Definition at line 1722 of file notmuch.c.

1723{
1724 cs_subset_str_native_set(NeoMutt->sub, "nm_query_window_current_position", 0, NULL);
1725 mutt_debug(LL_DEBUG2, "Reset nm_query_window_current_position to 0\n");
1726}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_read_entire_thread()

int nm_read_entire_thread ( struct Mailbox * m,
struct Email * e )

Get the entire thread of an email.

Parameters
mMailbox
eEmail
Return values
0Success
-1Failure

Definition at line 1550 of file notmuch.c.

1551{
1552 if (!m)
1553 return -1;
1554
1555 struct NmMboxData *mdata = nm_mdata_get(m);
1556 if (!mdata)
1557 return -1;
1558
1559 notmuch_query_t *q = NULL;
1560 notmuch_database_t *db = NULL;
1561 notmuch_message_t *msg = NULL;
1562 int rc = -1;
1563
1564 if (!(db = nm_db_get(m, false)) || !(msg = get_nm_message(db, e)))
1565 goto done;
1566
1567 mutt_debug(LL_DEBUG1, "nm: reading entire-thread messages...[current count=%d]\n",
1568 m->msg_count);
1569
1570 progress_setup(m);
1571 const char *id = notmuch_message_get_thread_id(msg);
1572 if (!id)
1573 goto done;
1574
1575 struct Buffer *qstr = buf_pool_get();
1576 buf_printf(qstr, "thread:%s", id);
1577 q = notmuch_query_create(db, buf_string(qstr));
1578 buf_pool_release(&qstr);
1579 if (!q)
1580 goto done;
1582 notmuch_query_set_sort(q, NOTMUCH_SORT_NEWEST_FIRST);
1583
1584 read_threads_query(m, q, true, 0);
1585 mdata->mtime.tv_sec = mutt_date_now();
1586 mdata->mtime.tv_nsec = 0;
1587 rc = 0;
1588
1589 if (m->msg_count > mdata->oldmsgcount)
1591done:
1592 if (q)
1593 notmuch_query_destroy(q);
1594
1595 nm_db_release(m);
1596
1597 if (m->msg_count == mdata->oldmsgcount)
1598 mutt_message(_("No more messages in the thread"));
1599
1600 mdata->oldmsgcount = 0;
1601 mutt_debug(LL_DEBUG1, "nm: reading entire-thread messages... done [rc=%d, count=%d]\n",
1602 rc, m->msg_count);
1603 progress_free(&mdata->progress);
1604 return rc;
1605}
int buf_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
Definition buffer.c:161
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition buffer.h:96
void mailbox_changed(struct Mailbox *m, enum NotifyMailbox action)
Notify observers of a change to a Mailbox.
Definition mailbox.c:232
@ NT_MAILBOX_INVALID
Email list was changed.
Definition mailbox.h:179
#define mutt_message(...)
Definition logging2.h:93
time_t mutt_date_now(void)
Return the number of seconds since the Unix epoch.
Definition date.c:457
#define _(a)
Definition message.h:28
static void apply_exclude_tags(notmuch_query_t *query)
Exclude the configured tags.
Definition notmuch.c:423
static notmuch_message_t * get_nm_message(notmuch_database_t *db, struct Email *e)
Find a Notmuch message.
Definition notmuch.c:1081
static bool read_threads_query(struct Mailbox *m, notmuch_query_t *q, bool dedup, int limit)
Perform a query with threads.
Definition notmuch.c:1044
static void progress_setup(struct Mailbox *m)
Set up the Progress Bar.
Definition notmuch.c:704
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition pool.c:91
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition pool.c:111
void progress_free(struct Progress **ptr)
Free a Progress Bar.
Definition progress.c:110
String manipulation buffer.
Definition buffer.h:36
int msg_count
Total number of messages.
Definition mailbox.h:87
int oldmsgcount
Old message count.
Definition mdata.h:42
struct Progress * progress
A progress bar.
Definition mdata.h:41
struct timespec mtime
Time Mailbox was last changed.
Definition mdata.h:44
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_record_message()

int nm_record_message ( struct Mailbox * m,
char * path,
struct Email * e )

Add a message to the Notmuch database.

Parameters
mMailbox
pathPath of the email
eEmail
Return values
0Success
-1Failure

Definition at line 1941 of file notmuch.c.

1942{
1943 notmuch_database_t *db = NULL;
1944 notmuch_status_t st;
1945 notmuch_message_t *msg = NULL;
1946 int rc = -1;
1947
1948 struct NmMboxData *mdata = nm_mdata_get(m);
1949
1950 // If no notmuch data, fall back to the default mailbox.
1951 //
1952 // IMPORTANT: DO NOT FREE THIS MAILBOX. Two reasons:
1953 // 1) If user has default mailbox in config, we'll be removing it. That's not
1954 // good program behavior!
1955 // 2) If not in user's config, keep mailbox around for future nm_record calls.
1956 // It saves NeoMutt from allocating/deallocating repeatedly.
1957 if (!mdata)
1958 {
1959 mutt_debug(LL_DEBUG1, "nm: non-nm mailbox. trying the default nm mailbox.\n");
1960 m = get_default_mailbox();
1961 mdata = nm_mdata_get(m);
1962 }
1963
1964 if (!path || !mdata || (access(path, F_OK) != 0))
1965 return 0;
1966 db = nm_db_get(m, true);
1967 if (!db)
1968 return -1;
1969
1970 mutt_debug(LL_DEBUG1, "nm: record message: %s\n", path);
1971 int trans = nm_db_trans_begin(m);
1972 if (trans < 0)
1973 goto done;
1974
1975#if LIBNOTMUCH_CHECK_VERSION(5, 1, 0)
1976 st = notmuch_database_index_file(db, path, NULL, &msg);
1977#else
1978 st = notmuch_database_add_message(db, path, &msg);
1979#endif
1980
1981 if ((st != NOTMUCH_STATUS_SUCCESS) && (st != NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID))
1982 {
1983 mutt_debug(LL_DEBUG1, "nm: failed to add '%s' [st=%d]\n", path, (int) st);
1984 goto done;
1985 }
1986
1987 if ((st == NOTMUCH_STATUS_SUCCESS) && msg)
1988 {
1989 notmuch_message_maildir_flags_to_tags(msg);
1990 if (e)
1991 {
1992 struct Buffer *tags = buf_pool_get();
1993 driver_tags_get(&e->tags, tags);
1994 update_tags(msg, buf_string(tags));
1995 buf_pool_release(&tags);
1996 }
1997 const char *const c_nm_record_tags = cs_subset_string(NeoMutt->sub, "nm_record_tags");
1998 if (c_nm_record_tags)
1999 update_tags(msg, c_nm_record_tags);
2000 }
2001
2002 rc = 0;
2003done:
2004 if (msg)
2005 notmuch_message_destroy(msg);
2006 if (trans == 1)
2007 nm_db_trans_end(m);
2008
2009 nm_db_release(m);
2010
2011 return rc;
2012}
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition helpers.c:291
int nm_db_trans_begin(struct Mailbox *m)
Start a Notmuch database transaction.
Definition db.c:266
int nm_db_trans_end(struct Mailbox *m)
End a database transaction.
Definition db.c:288
static struct Mailbox * get_default_mailbox(void)
Get Mailbox for notmuch without any parameters.
Definition notmuch.c:1918
static int update_tags(notmuch_message_t *msg, const char *tag_str)
Update the tags on a message.
Definition notmuch.c:1141
struct TagList tags
For drivers that support server tagging.
Definition email.h:72
void driver_tags_get(struct TagList *tl, struct Buffer *tags)
Get tags all tags separated by space.
Definition tags.c:165
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_update_filename()

int nm_update_filename ( struct Mailbox * m,
const char * old_file,
const char * new_file,
struct Email * e )

Change the filename.

Parameters
mMailbox
old_fileOld filename
new_fileNew filename
eEmail
Return values
0Success
-1Failure

Definition at line 1808 of file notmuch.c.

1810{
1811 char buf[PATH_MAX] = { 0 };
1812 struct NmMboxData *mdata = nm_mdata_get(m);
1813 if (!mdata || !new_file)
1814 return -1;
1815
1816 if (!old_file && nm_edata_get(e))
1817 {
1818 email_get_fullpath(e, buf, sizeof(buf));
1819 old_file = buf;
1820 }
1821
1822 int rc = rename_filename(m, old_file, new_file, e);
1823
1824 nm_db_release(m);
1825 mdata->mtime.tv_sec = mutt_date_now();
1826 mdata->mtime.tv_nsec = 0;
1827 return rc;
1828}
#define PATH_MAX
Definition mutt.h:49
static char * email_get_fullpath(struct Email *e, char *buf, size_t buflen)
Get the full path of an email.
Definition notmuch.c:230
static int rename_filename(struct Mailbox *m, const char *old_file, const char *new_file, struct Email *e)
Rename the file.
Definition notmuch.c:1367

◆ nm_url_from_query()

char * nm_url_from_query ( struct Mailbox * m,
char * buf,
size_t buflen )

Turn a query into a URL.

Parameters
mMailbox
bufBuffer for URL
buflenLength of buffer
Return values
ptrQuery as a URL
NULLError

Definition at line 1615 of file notmuch.c.

1616{
1617 mutt_debug(LL_DEBUG2, "(%s)\n", buf);
1618 struct NmMboxData *mdata = nm_mdata_get(m);
1619 char url[PATH_MAX + 1024 + 32]; /* path to DB + query + URL "decoration" */
1620 int added;
1621 bool using_default_data = false;
1622
1623 // No existing data. Try to get a default NmMboxData.
1624 if (!mdata)
1625 {
1627
1628 // Failed to get default data.
1629 if (!mdata)
1630 return NULL;
1631
1632 using_default_data = true;
1633 }
1634
1636 cs_subset_string(NeoMutt->sub, "nm_query_type"));
1637 mdata->query_type = nm_parse_type_from_query(buf, query_type);
1638
1639 const short c_nm_db_limit = cs_subset_number(NeoMutt->sub, "nm_db_limit");
1640 if (get_limit(mdata) == c_nm_db_limit)
1641 {
1642 added = snprintf(url, sizeof(url), "%s%s?type=%s&query=", NmUrlProtocol,
1644 }
1645 else
1646 {
1647 added = snprintf(url, sizeof(url), "%s%s?type=%s&limit=%d&query=", NmUrlProtocol,
1650 }
1651
1652 if (added >= sizeof(url))
1653 {
1654 // snprintf output was truncated, so can't create URL
1655 return NULL;
1656 }
1657
1658 url_pct_encode(&url[added], sizeof(url) - added, buf);
1659
1660 mutt_str_copy(buf, url, buflen);
1661 buf[buflen - 1] = '\0';
1662
1663 if (using_default_data)
1664 nm_mdata_free((void **) &mdata);
1665
1666 mutt_debug(LL_DEBUG1, "nm: url from query '%s'\n", buf);
1667 return buf;
1668}
void nm_mdata_free(void **ptr)
Free the private Mailbox data - Implements Mailbox::mdata_free() -.
Definition mdata.c:45
size_t mutt_str_copy(char *dest, const char *src, size_t dsize)
Copy a string into a buffer (guaranteeing NUL-termination)
Definition string.c:583
static int get_limit(struct NmMboxData *mdata)
Get the database limit.
Definition notmuch.c:414
static struct NmMboxData * nm_get_default_data(void)
Create a Mailbox with default Notmuch settings.
Definition notmuch.c:169
const char NmUrlProtocol[]
Protocol string for Notmuch URLs.
Definition notmuch.c:102
enum NmQueryType nm_string_to_query_type(const char *str)
Lookup a query type.
Definition query.c:111
enum NmQueryType nm_parse_type_from_query(char *buf, enum NmQueryType fallback)
Parse a query type out of a query.
Definition query.c:50
const char * nm_query_type_to_string(enum NmQueryType query_type)
Turn a query type into a string.
Definition query.c:97
NmQueryType
Notmuch Query Types.
Definition query.h:35
enum NmQueryType query_type
Messages or Threads.
Definition mdata.h:39
void url_pct_encode(char *buf, size_t buflen, const char *src)
Percent-encode a string.
Definition url.c:152
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ CompleteNmQueryOps

const struct CompleteOps CompleteNmQueryOps
extern

Auto-Completion of NmQuerys.

Definition at line 247 of file complete.c.

247 {
248 .complete = complete_nm_query,
249};
enum FunctionRetval complete_nm_query(struct EnterWindowData *wdata, int op)
Complete a Notmuch Query - Implements CompleteOps::complete() -.
Definition complete.c:213

◆ CompleteNmTagOps

const struct CompleteOps CompleteNmTagOps
extern

Auto-Completion of NmTags.

Definition at line 254 of file complete.c.

254 {
255 .complete = complete_nm_tag,
256};
enum FunctionRetval complete_nm_tag(struct EnterWindowData *wdata, int op)
Complete a Notmuch Tag - Implements CompleteOps::complete() -.
Definition complete.c:230