NeoMutt  2022-04-29-247-gc6aae8
Teaching an old dog new tricks
DOXYGEN
lib.h File Reference

Notmuch virtual mailbox type. More...

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

Variables

struct MxOps MxNotmuchOps
 Notmuch Mailbox - Implements MxOps -. More...
 

Detailed Description

Notmuch virtual mailbox type.

Authors
  • Karel Zak

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

100{
102}
#define COMMANDS_REGISTER(cmds)
Definition: mutt_commands.h:47
static const struct Command nm_commands[]
Definition: notmuch.c:86
+ 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 386 of file db.c.

387{
388 struct NmAccountData *adata = nm_adata_get(m);
389 if (!adata || !adata->db)
390 return;
391
392 mutt_debug(LL_DEBUG1, "nm: ERROR: db is open, closing\n");
393 nm_db_release(m);
394}
#define mutt_debug(LEVEL,...)
Definition: logging.h:84
@ LL_DEBUG1
Log at debug level 1.
Definition: logging.h:40
struct NmAccountData * nm_adata_get(struct Mailbox *m)
Get the Notmuch Account data.
Definition: adata.c:68
int nm_db_release(struct Mailbox *m)
Close the Notmuch database.
Definition: db.c:222
void * adata
Private data (for Mailbox backends)
Definition: account.h:43
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 368 of file db.c.

369{
370 struct NmAccountData *adata = nm_adata_get(m);
371
372 if (adata)
373 {
374 adata->longrun = false; /* to force nm_db_release() released DB */
375 if (nm_db_release(m) == 0)
376 mutt_debug(LL_DEBUG2, "nm: long run deinitialized\n");
377 else
378 adata->longrun = true;
379 }
380}
@ LL_DEBUG2
Log at debug level 2.
Definition: logging.h:41
+ 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 353 of file db.c.

354{
355 struct NmAccountData *adata = nm_adata_get(m);
356
357 if (!(adata && nm_db_get(m, writable)))
358 return;
359
360 adata->longrun = true;
361 mutt_debug(LL_DEBUG2, "nm: long run initialized\n");
362}
notmuch_database_t * nm_db_get(struct Mailbox *m, bool writable)
Get the Notmuch database.
Definition: db.c:198
+ 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 1450 of file notmuch.c.

1451{
1452 struct NmEmailData *edata = nm_edata_get(e);
1453 if (!edata)
1454 return NULL;
1455
1456 return edata->folder;
1457}
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:72
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 1469 of file notmuch.c.

1470{
1471 char *full_folder = nm_email_get_folder(e);
1472 if (!full_folder)
1473 return NULL;
1474
1475 const char *db_path = nm_db_get_filename(m);
1476 if (!db_path)
1477 return NULL;
1478
1479 return full_folder + strlen(db_path);
1480}
const char * nm_db_get_filename(struct Mailbox *m)
Get the filename of the Notmuch database.
Definition: db.c:54
char * nm_email_get_folder(struct Email *e)
Get the folder for a Email.
Definition: notmuch.c:1450
+ 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 1951 of file notmuch.c.

1952{
1953 struct NmMboxData *mdata = nm_mdata_get(m);
1954 if (!mdata)
1955 return -1;
1956
1957 notmuch_database_t *db = NULL;
1958 notmuch_tags_t *tags = NULL;
1959 const char *tag = NULL;
1960 int rc = -1;
1961
1962 if (!(db = nm_db_get(m, false)) || !(tags = notmuch_database_get_all_tags(db)))
1963 goto done;
1964
1965 *tag_count = 0;
1966 mutt_debug(LL_DEBUG1, "nm: get all tags\n");
1967
1968 while (notmuch_tags_valid(tags))
1969 {
1970 tag = notmuch_tags_get(tags);
1971 /* Skip empty string */
1972 if (*tag)
1973 {
1974 if (tag_list)
1975 tag_list[*tag_count] = mutt_str_dup(tag);
1976 (*tag_count)++;
1977 }
1978 notmuch_tags_move_to_next(tags);
1979 }
1980
1981 rc = 0;
1982done:
1983 if (tags)
1984 notmuch_tags_destroy(tags);
1985
1986 nm_db_release(m);
1987
1988 mutt_debug(LL_DEBUG1, "nm: get all tags done [rc=%d tag_count=%u]\n", rc, *tag_count);
1989 return rc;
1990}
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:250
struct NmMboxData * nm_mdata_get(struct Mailbox *m)
Get the Notmuch Mailbox data.
Definition: mdata.c:97
void * mdata
Driver specific data.
Definition: mailbox.h:132
Notmuch-specific Mailbox data -.
Definition: mdata.h:34
+ 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 1675 of file notmuch.c.

1676{
1677 struct NmMboxData *mdata = nm_mdata_get(m);
1678 notmuch_database_t *db = nm_db_get(m, false);
1679 char *orig_str = get_query_string(mdata, true);
1680
1681 if (!db || !orig_str)
1682 return false;
1683
1684 char *new_str = NULL;
1685 bool rc = false;
1686 if (mutt_str_asprintf(&new_str, "id:%s and (%s)", email_get_id(e), orig_str) < 0)
1687 return false;
1688
1689 mutt_debug(LL_DEBUG2, "nm: checking if message is still queried: %s\n", new_str);
1690
1691 notmuch_query_t *q = notmuch_query_create(db, new_str);
1692
1693 switch (mdata->query_type)
1694 {
1695 case NM_QUERY_TYPE_UNKNOWN: // UNKNOWN should never occur, but MESGS is default
1697 {
1698 notmuch_messages_t *messages = get_messages(q);
1699
1700 if (!messages)
1701 return false;
1702
1703 rc = notmuch_messages_valid(messages);
1704 notmuch_messages_destroy(messages);
1705 break;
1706 }
1708 {
1709 notmuch_threads_t *threads = get_threads(q);
1710
1711 if (!threads)
1712 return false;
1713
1714 rc = notmuch_threads_valid(threads);
1715 notmuch_threads_destroy(threads);
1716 break;
1717 }
1718 }
1719
1720 notmuch_query_destroy(q);
1721
1722 mutt_debug(LL_DEBUG2, "nm: checking if message is still queried: %s = %s\n",
1723 new_str, rc ? "true" : "false");
1724
1725 return rc;
1726}
int mutt_str_asprintf(char **strp, const char *fmt,...)
Definition: string.c:1031
static notmuch_threads_t * get_threads(notmuch_query_t *query)
Load threads for a query.
Definition: notmuch.c:967
static char * get_query_string(struct NmMboxData *mdata, bool window)
Builds the notmuch vfolder search string.
Definition: notmuch.c:334
static char * email_get_id(struct Email *e)
Get the unique Notmuch Id.
Definition: notmuch.c:208
static notmuch_messages_t * get_messages(notmuch_query_t *query)
Load messages for a query.
Definition: notmuch.c:897
@ 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 1615 of file notmuch.c.

1616{
1617 const short c_nm_query_window_duration = cs_subset_number(NeoMutt->sub, "nm_query_window_duration");
1618 const bool c_nm_query_window_enable = cs_subset_bool(NeoMutt->sub, "nm_query_window_enable");
1619
1620 return c_nm_query_window_enable || (c_nm_query_window_duration > 0);
1621}
short cs_subset_number(const struct ConfigSubset *sub, const char *name)
Get a number config item by name.
Definition: helpers.c:169
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition: helpers.c:73
Container for Accounts, Notifications.
Definition: neomutt.h:37
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:39
+ 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 1652 of file notmuch.c.

1653{
1654 const short c_nm_query_window_current_position = cs_subset_number(NeoMutt->sub, "nm_query_window_current_position");
1655 cs_subset_str_native_set(NeoMutt->sub, "nm_query_window_current_position",
1656 c_nm_query_window_current_position + 1, NULL);
1657 mutt_debug(LL_DEBUG2, "(%d)\n", c_nm_query_window_current_position + 1);
1658}
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:305
+ 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 1632 of file notmuch.c.

1633{
1634 const short c_nm_query_window_current_position = cs_subset_number(NeoMutt->sub, "nm_query_window_current_position");
1635 if (c_nm_query_window_current_position != 0)
1636 {
1637 cs_subset_str_native_set(NeoMutt->sub, "nm_query_window_current_position",
1638 c_nm_query_window_current_position - 1, NULL);
1639 }
1640
1641 mutt_debug(LL_DEBUG2, "(%d)\n", c_nm_query_window_current_position - 1);
1642}
+ 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 1663 of file notmuch.c.

1664{
1665 cs_subset_str_native_set(NeoMutt->sub, "nm_query_window_current_position", 0, NULL);
1666 mutt_debug(LL_DEBUG2, "Reset nm_query_window_current_position to 0\n");
1667}
+ 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 1489 of file notmuch.c.

1490{
1491 if (!m)
1492 return -1;
1493
1494 struct NmMboxData *mdata = nm_mdata_get(m);
1495 if (!mdata)
1496 return -1;
1497
1498 notmuch_query_t *q = NULL;
1499 notmuch_database_t *db = NULL;
1500 notmuch_message_t *msg = NULL;
1501 int rc = -1;
1502
1503 if (!(db = nm_db_get(m, false)) || !(msg = get_nm_message(db, e)))
1504 goto done;
1505
1506 mutt_debug(LL_DEBUG1, "nm: reading entire-thread messages...[current count=%d]\n",
1507 m->msg_count);
1508
1509 progress_setup(m);
1510 const char *id = notmuch_message_get_thread_id(msg);
1511 if (!id)
1512 goto done;
1513
1514 char *qstr = NULL;
1515 mutt_str_append_item(&qstr, "thread:", '\0');
1516 mutt_str_append_item(&qstr, id, '\0');
1517
1518 q = notmuch_query_create(db, qstr);
1519 FREE(&qstr);
1520 if (!q)
1521 goto done;
1523 notmuch_query_set_sort(q, NOTMUCH_SORT_NEWEST_FIRST);
1524
1525 read_threads_query(m, q, true, 0);
1527 m->mtime.tv_nsec = 0;
1528 rc = 0;
1529
1530 if (m->msg_count > mdata->oldmsgcount)
1532done:
1533 if (q)
1534 notmuch_query_destroy(q);
1535
1536 nm_db_release(m);
1537
1538 if (m->msg_count == mdata->oldmsgcount)
1539 mutt_message(_("No more messages in the thread"));
1540
1541 mdata->oldmsgcount = 0;
1542 mutt_debug(LL_DEBUG1, "nm: reading entire-thread messages... done [rc=%d, count=%d]\n",
1543 rc, m->msg_count);
1544 progress_free(&mdata->progress);
1545 return rc;
1546}
time_t mutt_date_epoch(void)
Return the number of seconds since the Unix epoch.
Definition: date.c:428
#define mutt_message(...)
Definition: logging.h:86
void mailbox_changed(struct Mailbox *m, enum NotifyMailbox action)
Notify observers of a change to a Mailbox.
Definition: mailbox.c:222
@ NT_MAILBOX_INVALID
Email list was changed.
Definition: mailbox.h:176
#define FREE(x)
Definition: memory.h:43
#define _(a)
Definition: message.h:28
void mutt_str_append_item(char **str, const char *item, char sep)
Add string to another separated by sep.
Definition: string.c:346
static void apply_exclude_tags(notmuch_query_t *query)
Exclude the configured tags.
Definition: notmuch.c:405
static notmuch_message_t * get_nm_message(notmuch_database_t *db, struct Email *e)
Find a Notmuch message.
Definition: notmuch.c:1032
static bool read_threads_query(struct Mailbox *m, notmuch_query_t *q, bool dedup, int limit)
Perform a query with threads.
Definition: notmuch.c:995
static void progress_setup(struct Mailbox *m)
Set up the Progress Bar.
Definition: notmuch.c:663
void progress_free(struct Progress **ptr)
Free a Progress Bar.
Definition: progress.c:86
struct timespec mtime
Time Mailbox was last changed.
Definition: mailbox.h:104
int msg_count
Total number of messages.
Definition: mailbox.h:88
long tv_nsec
Number of nanosecond, on top.
Definition: file.h:51
time_t tv_sec
Number of seconds since the epoch.
Definition: file.h:50
+ 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 1869 of file notmuch.c.

1870{
1871 notmuch_database_t *db = NULL;
1872 notmuch_status_t st;
1873 notmuch_message_t *msg = NULL;
1874 int rc = -1;
1875
1876 struct NmMboxData *mdata = nm_mdata_get(m);
1877
1878 // If no notmuch data, fall back to the default mailbox.
1879 //
1880 // IMPORTANT: DO NOT FREE THIS MAILBOX. Two reasons:
1881 // 1) If user has default mailbox in config, we'll be removing it. That's not
1882 // good program behavior!
1883 // 2) If not in user's config, keep mailbox around for future nm_record calls.
1884 // It saves NeoMutt from allocating/deallocating repeatedly.
1885 if (!mdata)
1886 {
1887 mutt_debug(LL_DEBUG1, "nm: non-nm mailbox. trying the default nm mailbox.");
1888 m = get_default_mailbox();
1889 mdata = nm_mdata_get(m);
1890 }
1891
1892 if (!path || !mdata || (access(path, F_OK) != 0))
1893 return 0;
1894 db = nm_db_get(m, true);
1895 if (!db)
1896 return -1;
1897
1898 mutt_debug(LL_DEBUG1, "nm: record message: %s\n", path);
1899 int trans = nm_db_trans_begin(m);
1900 if (trans < 0)
1901 goto done;
1902
1903#if LIBNOTMUCH_CHECK_VERSION(5, 1, 0)
1904 st = notmuch_database_index_file(db, path, NULL, &msg);
1905#else
1906 st = notmuch_database_add_message(db, path, &msg);
1907#endif
1908
1909 if ((st != NOTMUCH_STATUS_SUCCESS) && (st != NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID))
1910 {
1911 mutt_debug(LL_DEBUG1, "nm: failed to add '%s' [st=%d]\n", path, (int) st);
1912 goto done;
1913 }
1914
1915 if ((st == NOTMUCH_STATUS_SUCCESS) && msg)
1916 {
1917 notmuch_message_maildir_flags_to_tags(msg);
1918 if (e)
1919 {
1920 char *tags = driver_tags_get(&e->tags);
1921 update_tags(msg, tags);
1922 FREE(&tags);
1923 }
1924 const char *const c_nm_record_tags = cs_subset_string(NeoMutt->sub, "nm_record_tags");
1925 if (c_nm_record_tags)
1926 update_tags(msg, c_nm_record_tags);
1927 }
1928
1929 rc = 0;
1930done:
1931 if (msg)
1932 notmuch_message_destroy(msg);
1933 if (trans == 1)
1934 nm_db_trans_end(m);
1935
1936 nm_db_release(m);
1937
1938 return rc;
1939}
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition: helpers.c:317
int nm_db_trans_begin(struct Mailbox *m)
Start a Notmuch database transaction.
Definition: db.c:255
int nm_db_trans_end(struct Mailbox *m)
End a database transaction.
Definition: db.c:277
static struct Mailbox * get_default_mailbox(void)
Get Mailbox for notmuch without any parameters.
Definition: notmuch.c:1846
static int update_tags(notmuch_message_t *msg, const char *tag_str)
Update the tags on a message.
Definition: notmuch.c:1090
struct TagList tags
For drivers that support server tagging.
Definition: email.h:70
char * driver_tags_get(struct TagList *list)
Get tags.
Definition: tags.c:145
+ 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 1737 of file notmuch.c.

1739{
1740 char buf[PATH_MAX] = { 0 };
1741 struct NmMboxData *mdata = nm_mdata_get(m);
1742 if (!mdata || !new_file)
1743 return -1;
1744
1745 if (!old_file && nm_edata_get(e))
1746 {
1747 email_get_fullpath(e, buf, sizeof(buf));
1748 old_file = buf;
1749 }
1750
1751 int rc = rename_filename(m, old_file, new_file, e);
1752
1753 nm_db_release(m);
1755 m->mtime.tv_nsec = 0;
1756 return rc;
1757}
#define PATH_MAX
Definition: mutt.h:40
static char * email_get_fullpath(struct Email *e, char *buf, size_t buflen)
Get the full path of an email.
Definition: notmuch.c:224
static int rename_filename(struct Mailbox *m, const char *old_file, const char *new_file, struct Email *e)
Rename the file.
Definition: notmuch.c:1313
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

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

1557{
1558 mutt_debug(LL_DEBUG2, "(%s)\n", buf);
1559 struct NmMboxData *mdata = nm_mdata_get(m);
1560 char url[PATH_MAX + 1024 + 32]; /* path to DB + query + URL "decoration" */
1561 int added;
1562 bool using_default_data = false;
1563
1564 // No existing data. Try to get a default NmMboxData.
1565 if (!mdata)
1566 {
1568
1569 // Failed to get default data.
1570 if (!mdata)
1571 return NULL;
1572
1573 using_default_data = true;
1574 }
1575
1576 enum NmQueryType c_nm_query_type = nm_string_to_query_type(
1577 cs_subset_string(NeoMutt->sub, "nm_query_type"));
1578 mdata->query_type = nm_parse_type_from_query(buf, c_nm_query_type);
1579
1580 const short c_nm_db_limit = cs_subset_number(NeoMutt->sub, "nm_db_limit");
1581 if (get_limit(mdata) == c_nm_db_limit)
1582 {
1583 added = snprintf(url, sizeof(url), "%s%s?type=%s&query=", NmUrlProtocol,
1585 }
1586 else
1587 {
1588 added = snprintf(url, sizeof(url), "%s%s?type=%s&limit=%d&query=", NmUrlProtocol,
1591 }
1592
1593 if (added >= sizeof(url))
1594 {
1595 // snprintf output was truncated, so can't create URL
1596 return NULL;
1597 }
1598
1599 url_pct_encode(&url[added], sizeof(url) - added, buf);
1600
1601 mutt_str_copy(buf, url, buflen);
1602 buf[buflen - 1] = '\0';
1603
1604 if (using_default_data)
1605 nm_mdata_free((void **) &mdata);
1606
1607 mutt_debug(LL_DEBUG1, "nm: url from query '%s'\n", buf);
1608 return buf;
1609}
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:652
void nm_mdata_free(void **ptr)
Free the private Mailbox data - Implements Mailbox::mdata_free()
Definition: mdata.c:46
static int get_limit(struct NmMboxData *mdata)
Get the database limit.
Definition: notmuch.c:396
static struct NmMboxData * nm_get_default_data(void)
Create a Mailbox with default Notmuch settings.
Definition: notmuch.c:163
const char NmUrlProtocol[]
Definition: notmuch.c:93
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
void url_pct_encode(char *buf, size_t buflen, const char *src)
Percent-encode a string.
Definition: url.c:151
+ Here is the call graph for this function:
+ Here is the caller graph for this function: