NeoMutt  2023-03-22-27-g3cb248
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 101 of file notmuch.c.

102{
104}
void commands_register(const struct Command *cmds, const size_t num_cmds)
Add commands to Commands array.
Definition: command.c:53
#define mutt_array_size(x)
Definition: memory.h:36
static const struct Command NmCommands[]
Notmuch Commands.
Definition: notmuch.c:88
+ 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 388 of file db.c.

389{
390 struct NmAccountData *adata = nm_adata_get(m);
391 if (!adata || !adata->db)
392 return;
393
394 mutt_debug(LL_DEBUG1, "nm: ERROR: db is open, closing\n");
395 nm_db_release(m);
396}
#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:224
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 370 of file db.c.

371{
372 struct NmAccountData *adata = nm_adata_get(m);
373
374 if (adata)
375 {
376 adata->longrun = false; /* to force nm_db_release() released DB */
377 if (nm_db_release(m) == 0)
378 mutt_debug(LL_DEBUG2, "nm: long run deinitialized\n");
379 else
380 adata->longrun = true;
381 }
382}
@ 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 355 of file db.c.

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

1457{
1458 struct NmEmailData *edata = nm_edata_get(e);
1459 if (!edata)
1460 return NULL;
1461
1462 return edata->folder;
1463}
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 1475 of file notmuch.c.

1476{
1477 char *full_folder = nm_email_get_folder(e);
1478 if (!full_folder)
1479 return NULL;
1480
1481 const char *db_path = nm_db_get_filename(m);
1482 if (!db_path)
1483 return NULL;
1484
1485 return full_folder + strlen(db_path);
1486}
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:1456
+ 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 1959 of file notmuch.c.

1960{
1961 struct NmMboxData *mdata = nm_mdata_get(m);
1962 if (!mdata)
1963 return -1;
1964
1965 notmuch_database_t *db = NULL;
1966 notmuch_tags_t *tags = NULL;
1967 const char *tag = NULL;
1968 int rc = -1;
1969
1970 if (!(db = nm_db_get(m, false)) || !(tags = notmuch_database_get_all_tags(db)))
1971 goto done;
1972
1973 *tag_count = 0;
1974 mutt_debug(LL_DEBUG1, "nm: get all tags\n");
1975
1976 while (notmuch_tags_valid(tags))
1977 {
1978 tag = notmuch_tags_get(tags);
1979 /* Skip empty string */
1980 if (*tag)
1981 {
1982 if (tag_list)
1983 tag_list[*tag_count] = mutt_str_dup(tag);
1984 (*tag_count)++;
1985 }
1986 notmuch_tags_move_to_next(tags);
1987 }
1988
1989 rc = 0;
1990done:
1991 if (tags)
1992 notmuch_tags_destroy(tags);
1993
1994 nm_db_release(m);
1995
1996 mutt_debug(LL_DEBUG1, "nm: get all tags done [rc=%d tag_count=%u]\n", rc, *tag_count);
1997 return rc;
1998}
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 1681 of file notmuch.c.

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

1622{
1623 const short c_nm_query_window_duration = cs_subset_number(NeoMutt->sub, "nm_query_window_duration");
1624 const bool c_nm_query_window_enable = cs_subset_bool(NeoMutt->sub, "nm_query_window_enable");
1625
1626 return c_nm_query_window_enable || (c_nm_query_window_duration > 0);
1627}
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 1658 of file notmuch.c.

1659{
1660 const short c_nm_query_window_current_position = cs_subset_number(NeoMutt->sub, "nm_query_window_current_position");
1661 cs_subset_str_native_set(NeoMutt->sub, "nm_query_window_current_position",
1662 c_nm_query_window_current_position + 1, NULL);
1663 mutt_debug(LL_DEBUG2, "(%d)\n", c_nm_query_window_current_position + 1);
1664}
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 1638 of file notmuch.c.

1639{
1640 const short c_nm_query_window_current_position = cs_subset_number(NeoMutt->sub, "nm_query_window_current_position");
1641 if (c_nm_query_window_current_position != 0)
1642 {
1643 cs_subset_str_native_set(NeoMutt->sub, "nm_query_window_current_position",
1644 c_nm_query_window_current_position - 1, NULL);
1645 }
1646
1647 mutt_debug(LL_DEBUG2, "(%d)\n", c_nm_query_window_current_position - 1);
1648}
+ 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 1669 of file notmuch.c.

1670{
1671 cs_subset_str_native_set(NeoMutt->sub, "nm_query_window_current_position", 0, NULL);
1672 mutt_debug(LL_DEBUG2, "Reset nm_query_window_current_position to 0\n");
1673}
+ 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 1495 of file notmuch.c.

1496{
1497 if (!m)
1498 return -1;
1499
1500 struct NmMboxData *mdata = nm_mdata_get(m);
1501 if (!mdata)
1502 return -1;
1503
1504 notmuch_query_t *q = NULL;
1505 notmuch_database_t *db = NULL;
1506 notmuch_message_t *msg = NULL;
1507 int rc = -1;
1508
1509 if (!(db = nm_db_get(m, false)) || !(msg = get_nm_message(db, e)))
1510 goto done;
1511
1512 mutt_debug(LL_DEBUG1, "nm: reading entire-thread messages...[current count=%d]\n",
1513 m->msg_count);
1514
1515 progress_setup(m);
1516 const char *id = notmuch_message_get_thread_id(msg);
1517 if (!id)
1518 goto done;
1519
1520 char *qstr = NULL;
1521 mutt_str_append_item(&qstr, "thread:", '\0');
1522 mutt_str_append_item(&qstr, id, '\0');
1523
1524 q = notmuch_query_create(db, qstr);
1525 FREE(&qstr);
1526 if (!q)
1527 goto done;
1529 notmuch_query_set_sort(q, NOTMUCH_SORT_NEWEST_FIRST);
1530
1531 read_threads_query(m, q, true, 0);
1532 m->mtime.tv_sec = mutt_date_now();
1533 m->mtime.tv_nsec = 0;
1534 rc = 0;
1535
1536 if (m->msg_count > mdata->oldmsgcount)
1538done:
1539 if (q)
1540 notmuch_query_destroy(q);
1541
1542 nm_db_release(m);
1543
1544 if (m->msg_count == mdata->oldmsgcount)
1545 mutt_message(_("No more messages in the thread"));
1546
1547 mdata->oldmsgcount = 0;
1548 mutt_debug(LL_DEBUG1, "nm: reading entire-thread messages... done [rc=%d, count=%d]\n",
1549 rc, m->msg_count);
1550 progress_free(&mdata->progress);
1551 return rc;
1552}
time_t mutt_date_now(void)
Return the number of seconds since the Unix epoch.
Definition: date.c:432
#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:175
#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:409
static notmuch_message_t * get_nm_message(notmuch_database_t *db, struct Email *e)
Find a Notmuch message.
Definition: notmuch.c:1036
static bool read_threads_query(struct Mailbox *m, notmuch_query_t *q, bool dedup, int limit)
Perform a query with threads.
Definition: notmuch.c:999
static void progress_setup(struct Mailbox *m)
Set up the Progress Bar.
Definition: notmuch.c:667
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:52
time_t tv_sec
Number of seconds since the epoch.
Definition: file.h:51
+ 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 1877 of file notmuch.c.

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

1745{
1746 char buf[PATH_MAX] = { 0 };
1747 struct NmMboxData *mdata = nm_mdata_get(m);
1748 if (!mdata || !new_file)
1749 return -1;
1750
1751 if (!old_file && nm_edata_get(e))
1752 {
1753 email_get_fullpath(e, buf, sizeof(buf));
1754 old_file = buf;
1755 }
1756
1757 int rc = rename_filename(m, old_file, new_file, e);
1758
1759 nm_db_release(m);
1760 m->mtime.tv_sec = mutt_date_now();
1761 m->mtime.tv_nsec = 0;
1762 return rc;
1763}
#define PATH_MAX
Definition: mutt.h:41
static char * email_get_fullpath(struct Email *e, char *buf, size_t buflen)
Get the full path of an email.
Definition: notmuch.c:226
static int rename_filename(struct Mailbox *m, const char *old_file, const char *new_file, struct Email *e)
Rename the file.
Definition: notmuch.c:1319
+ 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 1562 of file notmuch.c.

1563{
1564 mutt_debug(LL_DEBUG2, "(%s)\n", buf);
1565 struct NmMboxData *mdata = nm_mdata_get(m);
1566 char url[PATH_MAX + 1024 + 32]; /* path to DB + query + URL "decoration" */
1567 int added;
1568 bool using_default_data = false;
1569
1570 // No existing data. Try to get a default NmMboxData.
1571 if (!mdata)
1572 {
1574
1575 // Failed to get default data.
1576 if (!mdata)
1577 return NULL;
1578
1579 using_default_data = true;
1580 }
1581
1583 cs_subset_string(NeoMutt->sub, "nm_query_type"));
1584 mdata->query_type = nm_parse_type_from_query(buf, query_type);
1585
1586 const short c_nm_db_limit = cs_subset_number(NeoMutt->sub, "nm_db_limit");
1587 if (get_limit(mdata) == c_nm_db_limit)
1588 {
1589 added = snprintf(url, sizeof(url), "%s%s?type=%s&query=", NmUrlProtocol,
1591 }
1592 else
1593 {
1594 added = snprintf(url, sizeof(url), "%s%s?type=%s&limit=%d&query=", NmUrlProtocol,
1597 }
1598
1599 if (added >= sizeof(url))
1600 {
1601 // snprintf output was truncated, so can't create URL
1602 return NULL;
1603 }
1604
1605 url_pct_encode(&url[added], sizeof(url) - added, buf);
1606
1607 mutt_str_copy(buf, url, buflen);
1608 buf[buflen - 1] = '\0';
1609
1610 if (using_default_data)
1611 nm_mdata_free((void **) &mdata);
1612
1613 mutt_debug(LL_DEBUG1, "nm: url from query '%s'\n", buf);
1614 return buf;
1615}
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:400
static struct NmMboxData * nm_get_default_data(void)
Create a Mailbox with default Notmuch settings.
Definition: notmuch.c:165
const char NmUrlProtocol[]
Definition: notmuch.c:95
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:38
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: