NeoMutt  2025-01-09-156-g99fdbd
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_init (void)
 Setup feature commands.
 
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? - Implements MxOps::path_probe() -.
 
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_init()

void nm_init ( void  )

Setup feature commands.

Definition at line 109 of file notmuch.c.

110{
112}
bool commands_register(struct CommandArray *ca, const struct Command *cmds)
Add commands to Commands array.
Definition: command.c:51
static const struct Command NmCommands[]
Notmuch Commands.
Definition: notmuch.c:93
Container for Accounts, Notifications.
Definition: neomutt.h:43
struct CommandArray commands
NeoMutt commands.
Definition: neomutt.h:51
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ 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:90
@ LL_DEBUG1
Log at debug level 1.
Definition: logging2.h:44
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:45
+ 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 1491 of file notmuch.c.

1492{
1493 struct NmEmailData *edata = nm_edata_get(e);
1494 if (!edata)
1495 return NULL;
1496
1497 return edata->folder;
1498}
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 1510 of file notmuch.c.

1511{
1512 char *full_folder = nm_email_get_folder(e);
1513 if (!full_folder)
1514 return NULL;
1515
1516 const char *db_path = nm_db_get_filename(m);
1517 if (!db_path)
1518 return NULL;
1519
1520 size_t prefix = mutt_str_startswith(full_folder, db_path);
1521
1522 char *path = full_folder + prefix;
1523 if (*path == '/')
1524 path++;
1525
1526 return path;
1527}
size_t mutt_str_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix.
Definition: string.c:231
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:1491
+ 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 2001 of file notmuch.c.

2002{
2003 struct NmMboxData *mdata = nm_mdata_get(m);
2004 if (!mdata)
2005 return -1;
2006
2007 notmuch_database_t *db = NULL;
2008 notmuch_tags_t *tags = NULL;
2009 const char *tag = NULL;
2010 int rc = -1;
2011
2012 if (!(db = nm_db_get(m, false)) || !(tags = notmuch_database_get_all_tags(db)))
2013 goto done;
2014
2015 *tag_count = 0;
2016 mutt_debug(LL_DEBUG1, "nm: get all tags\n");
2017
2018 while (notmuch_tags_valid(tags))
2019 {
2020 tag = notmuch_tags_get(tags);
2021 /* Skip empty string */
2022 if (*tag)
2023 {
2024 if (tag_list)
2025 tag_list[*tag_count] = mutt_str_dup(tag);
2026 (*tag_count)++;
2027 }
2028 notmuch_tags_move_to_next(tags);
2029 }
2030
2031 rc = 0;
2032done:
2033 if (tags)
2034 notmuch_tags_destroy(tags);
2035
2036 nm_db_release(m);
2037
2038 mutt_debug(LL_DEBUG1, "nm: get all tags done [rc=%d tag_count=%u]\n", rc, *tag_count);
2039 return rc;
2040}
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:254
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:132
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 1720 of file notmuch.c.

1721{
1722 struct NmMboxData *mdata = nm_mdata_get(m);
1723 if (!mdata)
1724 return false;
1725
1726 notmuch_database_t *db = nm_db_get(m, false);
1727 char *orig_str = get_query_string(mdata, true);
1728
1729 if (!db || !orig_str)
1730 return false;
1731
1732 char *new_str = NULL;
1733 bool rc = false;
1734 if (mutt_str_asprintf(&new_str, "id:%s and (%s)", email_get_id(e), orig_str) < 0)
1735 return false;
1736
1737 mutt_debug(LL_DEBUG2, "nm: checking if message is still queried: %s\n", new_str);
1738
1739 notmuch_query_t *q = notmuch_query_create(db, new_str);
1740
1741 switch (mdata->query_type)
1742 {
1743 case NM_QUERY_TYPE_UNKNOWN: // UNKNOWN should never occur, but MESGS is default
1745 {
1746 notmuch_messages_t *messages = get_messages(q);
1747
1748 if (!messages)
1749 return false;
1750
1751 rc = notmuch_messages_valid(messages);
1752 notmuch_messages_destroy(messages);
1753 break;
1754 }
1756 {
1757 notmuch_threads_t *threads = get_threads(q);
1758
1759 if (!threads)
1760 return false;
1761
1762 rc = notmuch_threads_valid(threads);
1763 notmuch_threads_destroy(threads);
1764 break;
1765 }
1766 }
1767
1768 notmuch_query_destroy(q);
1769
1770 mutt_debug(LL_DEBUG2, "nm: checking if message is still queried: %s = %s\n",
1771 new_str, rc ? "true" : "false");
1772
1773 return rc;
1774}
int mutt_str_asprintf(char **strp, const char *fmt,...)
Definition: string.c:804
static notmuch_threads_t * get_threads(notmuch_query_t *query)
Load threads for a query.
Definition: notmuch.c:1004
static char * get_query_string(struct NmMboxData *mdata, bool window)
Builds the notmuch vfolder search string.
Definition: notmuch.c:347
static char * email_get_id(struct Email *e)
Get the unique Notmuch Id.
Definition: notmuch.c:222
static notmuch_messages_t * get_messages(notmuch_query_t *query)
Load messages for a query.
Definition: notmuch.c:934
@ 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 1660 of file notmuch.c.

1661{
1662 const short c_nm_query_window_duration = cs_subset_number(NeoMutt->sub, "nm_query_window_duration");
1663 const bool c_nm_query_window_enable = cs_subset_bool(NeoMutt->sub, "nm_query_window_enable");
1664
1665 return c_nm_query_window_enable || (c_nm_query_window_duration > 0);
1666}
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
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:47
+ 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 1697 of file notmuch.c.

1698{
1699 const short c_nm_query_window_current_position = cs_subset_number(NeoMutt->sub, "nm_query_window_current_position");
1700 cs_subset_str_native_set(NeoMutt->sub, "nm_query_window_current_position",
1701 c_nm_query_window_current_position + 1, NULL);
1702 mutt_debug(LL_DEBUG2, "(%d)\n", c_nm_query_window_current_position + 1);
1703}
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:299
+ 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 1677 of file notmuch.c.

1678{
1679 const short c_nm_query_window_current_position = cs_subset_number(NeoMutt->sub, "nm_query_window_current_position");
1680 if (c_nm_query_window_current_position != 0)
1681 {
1682 cs_subset_str_native_set(NeoMutt->sub, "nm_query_window_current_position",
1683 c_nm_query_window_current_position - 1, NULL);
1684 }
1685
1686 mutt_debug(LL_DEBUG2, "(%d)\n", c_nm_query_window_current_position - 1);
1687}
+ 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 1708 of file notmuch.c.

1709{
1710 cs_subset_str_native_set(NeoMutt->sub, "nm_query_window_current_position", 0, NULL);
1711 mutt_debug(LL_DEBUG2, "Reset nm_query_window_current_position to 0\n");
1712}
+ 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 1536 of file notmuch.c.

1537{
1538 if (!m)
1539 return -1;
1540
1541 struct NmMboxData *mdata = nm_mdata_get(m);
1542 if (!mdata)
1543 return -1;
1544
1545 notmuch_query_t *q = NULL;
1546 notmuch_database_t *db = NULL;
1547 notmuch_message_t *msg = NULL;
1548 int rc = -1;
1549
1550 if (!(db = nm_db_get(m, false)) || !(msg = get_nm_message(db, e)))
1551 goto done;
1552
1553 mutt_debug(LL_DEBUG1, "nm: reading entire-thread messages...[current count=%d]\n",
1554 m->msg_count);
1555
1556 progress_setup(m);
1557 const char *id = notmuch_message_get_thread_id(msg);
1558 if (!id)
1559 goto done;
1560
1561 struct Buffer *qstr = buf_pool_get();
1562 buf_printf(qstr, "thread:%s", id);
1563 q = notmuch_query_create(db, buf_string(qstr));
1564 buf_pool_release(&qstr);
1565 if (!q)
1566 goto done;
1568 notmuch_query_set_sort(q, NOTMUCH_SORT_NEWEST_FIRST);
1569
1570 read_threads_query(m, q, true, 0);
1571 mdata->mtime.tv_sec = mutt_date_now();
1572 mdata->mtime.tv_nsec = 0;
1573 rc = 0;
1574
1575 if (m->msg_count > mdata->oldmsgcount)
1577done:
1578 if (q)
1579 notmuch_query_destroy(q);
1580
1581 nm_db_release(m);
1582
1583 if (m->msg_count == mdata->oldmsgcount)
1584 mutt_message(_("No more messages in the thread"));
1585
1586 mdata->oldmsgcount = 0;
1587 mutt_debug(LL_DEBUG1, "nm: reading entire-thread messages... done [rc=%d, count=%d]\n",
1588 rc, m->msg_count);
1589 progress_free(&mdata->progress);
1590 return rc;
1591}
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:233
@ NT_MAILBOX_INVALID
Email list was changed.
Definition: mailbox.h:189
#define mutt_message(...)
Definition: logging2.h:92
time_t mutt_date_now(void)
Return the number of seconds since the Unix epoch.
Definition: date.c:456
#define _(a)
Definition: message.h:28
static void apply_exclude_tags(notmuch_query_t *query)
Exclude the configured tags.
Definition: notmuch.c:424
static notmuch_message_t * get_nm_message(notmuch_database_t *db, struct Email *e)
Find a Notmuch message.
Definition: notmuch.c:1069
static bool read_threads_query(struct Mailbox *m, notmuch_query_t *q, bool dedup, int limit)
Perform a query with threads.
Definition: notmuch.c:1032
static void progress_setup(struct Mailbox *m)
Set up the Progress Bar.
Definition: notmuch.c:700
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition: pool.c:82
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition: pool.c:96
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:88
int oldmsgcount
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 1918 of file notmuch.c.

1919{
1920 notmuch_database_t *db = NULL;
1921 notmuch_status_t st;
1922 notmuch_message_t *msg = NULL;
1923 int rc = -1;
1924
1925 struct NmMboxData *mdata = nm_mdata_get(m);
1926
1927 // If no notmuch data, fall back to the default mailbox.
1928 //
1929 // IMPORTANT: DO NOT FREE THIS MAILBOX. Two reasons:
1930 // 1) If user has default mailbox in config, we'll be removing it. That's not
1931 // good program behavior!
1932 // 2) If not in user's config, keep mailbox around for future nm_record calls.
1933 // It saves NeoMutt from allocating/deallocating repeatedly.
1934 if (!mdata)
1935 {
1936 mutt_debug(LL_DEBUG1, "nm: non-nm mailbox. trying the default nm mailbox.\n");
1937 m = get_default_mailbox();
1938 mdata = nm_mdata_get(m);
1939 }
1940
1941 if (!path || !mdata || (access(path, F_OK) != 0))
1942 return 0;
1943 db = nm_db_get(m, true);
1944 if (!db)
1945 return -1;
1946
1947 mutt_debug(LL_DEBUG1, "nm: record message: %s\n", path);
1948 int trans = nm_db_trans_begin(m);
1949 if (trans < 0)
1950 goto done;
1951
1952#if LIBNOTMUCH_CHECK_VERSION(5, 1, 0)
1953 st = notmuch_database_index_file(db, path, NULL, &msg);
1954#else
1955 st = notmuch_database_add_message(db, path, &msg);
1956#endif
1957
1958 if ((st != NOTMUCH_STATUS_SUCCESS) && (st != NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID))
1959 {
1960 mutt_debug(LL_DEBUG1, "nm: failed to add '%s' [st=%d]\n", path, (int) st);
1961 goto done;
1962 }
1963
1964 if ((st == NOTMUCH_STATUS_SUCCESS) && msg)
1965 {
1966 notmuch_message_maildir_flags_to_tags(msg);
1967 if (e)
1968 {
1969 struct Buffer *tags = buf_pool_get();
1970 driver_tags_get(&e->tags, tags);
1971 update_tags(msg, buf_string(tags));
1972 buf_pool_release(&tags);
1973 }
1974 const char *const c_nm_record_tags = cs_subset_string(NeoMutt->sub, "nm_record_tags");
1975 if (c_nm_record_tags)
1976 update_tags(msg, c_nm_record_tags);
1977 }
1978
1979 rc = 0;
1980done:
1981 if (msg)
1982 notmuch_message_destroy(msg);
1983 if (trans == 1)
1984 nm_db_trans_end(m);
1985
1986 nm_db_release(m);
1987
1988 return rc;
1989}
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:1895
static int update_tags(notmuch_message_t *msg, const char *tag_str)
Update the tags on a message.
Definition: notmuch.c:1127
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:164
+ 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 1785 of file notmuch.c.

1787{
1788 char buf[PATH_MAX] = { 0 };
1789 struct NmMboxData *mdata = nm_mdata_get(m);
1790 if (!mdata || !new_file)
1791 return -1;
1792
1793 if (!old_file && nm_edata_get(e))
1794 {
1795 email_get_fullpath(e, buf, sizeof(buf));
1796 old_file = buf;
1797 }
1798
1799 int rc = rename_filename(m, old_file, new_file, e);
1800
1801 nm_db_release(m);
1802 mdata->mtime.tv_sec = mutt_date_now();
1803 mdata->mtime.tv_nsec = 0;
1804 return rc;
1805}
#define PATH_MAX
Definition: mutt.h:42
static char * email_get_fullpath(struct Email *e, char *buf, size_t buflen)
Get the full path of an email.
Definition: notmuch.c:238
static int rename_filename(struct Mailbox *m, const char *old_file, const char *new_file, struct Email *e)
Rename the file.
Definition: notmuch.c:1353

◆ 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 1601 of file notmuch.c.

1602{
1603 mutt_debug(LL_DEBUG2, "(%s)\n", buf);
1604 struct NmMboxData *mdata = nm_mdata_get(m);
1605 char url[PATH_MAX + 1024 + 32]; /* path to DB + query + URL "decoration" */
1606 int added;
1607 bool using_default_data = false;
1608
1609 // No existing data. Try to get a default NmMboxData.
1610 if (!mdata)
1611 {
1613
1614 // Failed to get default data.
1615 if (!mdata)
1616 return NULL;
1617
1618 using_default_data = true;
1619 }
1620
1622 cs_subset_string(NeoMutt->sub, "nm_query_type"));
1623 mdata->query_type = nm_parse_type_from_query(buf, query_type);
1624
1625 const short c_nm_db_limit = cs_subset_number(NeoMutt->sub, "nm_db_limit");
1626 if (get_limit(mdata) == c_nm_db_limit)
1627 {
1628 added = snprintf(url, sizeof(url), "%s%s?type=%s&query=", NmUrlProtocol,
1630 }
1631 else
1632 {
1633 added = snprintf(url, sizeof(url), "%s%s?type=%s&limit=%d&query=", NmUrlProtocol,
1636 }
1637
1638 if (added >= sizeof(url))
1639 {
1640 // snprintf output was truncated, so can't create URL
1641 return NULL;
1642 }
1643
1644 url_pct_encode(&url[added], sizeof(url) - added, buf);
1645
1646 mutt_str_copy(buf, url, buflen);
1647 buf[buflen - 1] = '\0';
1648
1649 if (using_default_data)
1650 nm_mdata_free((void **) &mdata);
1651
1652 mutt_debug(LL_DEBUG1, "nm: url from query '%s'\n", buf);
1653 return buf;
1654}
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:582
static int get_limit(struct NmMboxData *mdata)
Get the database limit.
Definition: notmuch.c:415
static struct NmMboxData * nm_get_default_data(void)
Create a Mailbox with default Notmuch settings.
Definition: notmuch.c:177
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:110
enum NmQueryType nm_parse_type_from_query(char *buf, enum NmQueryType fallback)
Parse a query type out of a query.
Definition: query.c:49
const char * nm_query_type_to_string(enum NmQueryType query_type)
Turn a query type into a string.
Definition: query.c:96
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.

◆ CompleteNmTagOps

const struct CompleteOps CompleteNmTagOps
extern

Auto-Completion of NmTags.

Definition at line 254 of file complete.c.