NeoMutt  2022-04-29-249-gaae397
Teaching an old dog new tricks
DOXYGEN
mdata.c
Go to the documentation of this file.
1
29#include "config.h"
30#include <stddef.h>
31#include "private.h"
32#include "core/lib.h"
33#include "mdata.h"
34#include "hcache/lib.h"
35#include "adata.h"
36
40void imap_mdata_free(void **ptr)
41{
42 if (!ptr || !*ptr)
43 return;
44
45 struct ImapMboxData *mdata = *ptr;
46
48 mutt_list_free(&mdata->flags);
49 FREE(&mdata->name);
50 FREE(&mdata->real_name);
51 FREE(&mdata->munge_name);
52 FREE(ptr);
53}
54
61{
62 if (!m || (m->type != MUTT_IMAP) || !m->mdata)
63 return NULL;
64 return m->mdata;
65}
66
73struct ImapMboxData *imap_mdata_new(struct ImapAccountData *adata, const char *name)
74{
75 char buf[1024] = { 0 };
76 struct ImapMboxData *mdata = mutt_mem_calloc(1, sizeof(struct ImapMboxData));
77
78 mdata->real_name = mutt_str_dup(name);
79
80 imap_fix_path(adata->delim, name, buf, sizeof(buf));
81 if (buf[0] == '\0')
82 mutt_str_copy(buf, "INBOX", sizeof(buf));
83 mdata->name = mutt_str_dup(buf);
84
85 imap_munge_mbox_name(adata->unicode, buf, sizeof(buf), mdata->name);
86 mdata->munge_name = mutt_str_dup(buf);
87
88 mdata->reopen &= IMAP_REOPEN_ALLOW;
89
90 STAILQ_INIT(&mdata->flags);
91
92#ifdef USE_HCACHE
93 imap_hcache_open(adata, mdata);
94 if (mdata->hcache)
95 {
96 size_t dlen = 0;
97 void *uidvalidity = mutt_hcache_fetch_raw(mdata->hcache, "/UIDVALIDITY", 12, &dlen);
98 if (uidvalidity && (dlen < sizeof(uint32_t)))
99 {
101 uidvalidity = NULL;
102 }
103 void *uidnext = mutt_hcache_fetch_raw(mdata->hcache, "/UIDNEXT", 8, &dlen);
104 if (uidnext && (dlen < sizeof(unsigned int)))
105 {
106 mutt_hcache_free_raw(mdata->hcache, &uidnext);
107 uidnext = NULL;
108 }
109 unsigned long long *modseq = mutt_hcache_fetch_raw(mdata->hcache, "/MODSEQ", 7, &dlen);
110 if (modseq && (dlen < sizeof(unsigned long long)))
111 {
112 mutt_hcache_free_raw(mdata->hcache, (void **) &modseq);
113 modseq = NULL;
114 }
115 if (uidvalidity)
116 {
117 mdata->uidvalidity = *(uint32_t *) uidvalidity;
118 mdata->uid_next = uidnext ? *(unsigned int *) uidnext : 0;
119 mdata->modseq = modseq ? *modseq : 0;
120 mutt_debug(LL_DEBUG3, "hcache uidvalidity %u, uidnext %u, modseq %llu\n",
121 mdata->uidvalidity, mdata->uid_next, mdata->modseq);
122 }
124 mutt_hcache_free_raw(mdata->hcache, &uidnext);
125 mutt_hcache_free_raw(mdata->hcache, (void **) &modseq);
127 }
128#endif
129
130 return mdata;
131}
Convenience wrapper for the core headers.
#define mutt_debug(LEVEL,...)
Definition: logging.h:84
Header cache multiplexor.
void * mutt_hcache_fetch_raw(struct HeaderCache *hc, const char *key, size_t keylen, size_t *dlen)
Fetch a message's header from the cache.
Definition: hcache.c:529
void mutt_hcache_free_raw(struct HeaderCache *hc, void **data)
Multiplexor for StoreOps::free.
Definition: hcache.c:548
struct ImapMboxData * imap_mdata_new(struct ImapAccountData *adata, const char *name)
Allocate and initialise a new ImapMboxData structure.
Definition: mdata.c:73
struct ImapMboxData * imap_mdata_get(struct Mailbox *m)
Get the Mailbox data for this mailbox.
Definition: mdata.c:60
void imap_mdata_free(void **ptr)
Free the private Mailbox data - Implements Mailbox::mdata_free()
Definition: mdata.c:40
#define IMAP_REOPEN_ALLOW
Allow re-opening a folder upon expunge.
Definition: private.h:66
void imap_mdata_cache_reset(struct ImapMboxData *mdata)
Release and clear cache data of ImapMboxData structure.
Definition: util.c:106
char * imap_fix_path(char delim, const char *mailbox, char *path, size_t plen)
Fix up the imap path.
Definition: util.c:685
void imap_hcache_close(struct ImapMboxData *mdata)
Close the header cache.
Definition: util.c:339
void imap_munge_mbox_name(bool unicode, char *dest, size_t dlen, const char *src)
Quote awkward characters in a mailbox name.
Definition: util.c:911
void imap_hcache_open(struct ImapAccountData *adata, struct ImapMboxData *mdata)
Open a header cache.
Definition: util.c:297
void mutt_list_free(struct ListHead *h)
Free a List AND its strings.
Definition: list.c:122
@ LL_DEBUG3
Log at debug level 3.
Definition: logging.h:42
@ MUTT_IMAP
'IMAP' Mailbox type
Definition: mailbox.h:50
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:50
#define FREE(x)
Definition: memory.h:43
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:250
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
Notmuch-specific Mailbox data.
Pop-specific Account data.
#define STAILQ_INIT(head)
Definition: queue.h:372
GUI display the mailboxes in a side panel.
IMAP-specific Account data -.
Definition: adata.h:40
char delim
Path delimiter.
Definition: adata.h:75
bool unicode
If true, we can send UTF-8, and the server will use UTF8 rather than mUTF7.
Definition: adata.h:62
IMAP-specific Mailbox data -.
Definition: mdata.h:39
unsigned long long modseq
Definition: mdata.h:52
uint32_t uidvalidity
Definition: mdata.h:50
char * name
Mailbox name.
Definition: mdata.h:40
A mailbox.
Definition: mailbox.h:79
enum MailboxType type
Mailbox type.
Definition: mailbox.h:102
void * mdata
Driver specific data.
Definition: mailbox.h:132