/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 2003-2021 Free Software Foundation, Inc.
GNU Mailutils is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GNU Mailutils 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 GNU Mailutils. If not, see . */
#include
static int
_add_to_list (size_t num, mu_message_t msg, void *data)
{
mu_list_t list = data;
return mu_list_append (list, msg);
}
void
mh_whatnow_env_from_environ_early (struct mh_whatnow_env *wh)
{
memset (wh, 0, sizeof (*wh));
wh->file = getenv ("mhdraft");
wh->msg = getenv ("mhaltmsg");
wh->draftfile = wh->file;
wh->editor = getenv ("mheditor");
wh->prompt = getenv ("mhprompt"); /* extension */
}
void
mh_whatnow_env_from_environ_late (struct mh_whatnow_env *wh)
{
char *folder = getenv ("mhfolder");
if (folder)
{
wh->anno_field = getenv ("mhannotate");
if (wh->anno_field)
{
char *p = getenv ("mhmessages");
if (!p)
wh->anno_field = NULL;
else
{
mu_msgset_t msgset;
mu_mailbox_t mbox = mh_open_folder (folder, MU_STREAM_RDWR);
mh_msgset_parse_string (&msgset, mbox, p, "cur");
wh->mbox = mbox;
mu_list_create (&wh->anno_list);
mu_msgset_foreach_message (msgset, _add_to_list, wh->anno_list);
mu_msgset_free (msgset);
/* FIXME:
wh->anno_inplace = getenv ("mhinplace");
*/
}
}
}
}
void
mh_whatnow_env_to_environ (struct mh_whatnow_env *wh)
{
if (wh->file)
setenv ("mhdraft", wh->file, 1);
if (wh->msg)
setenv ("mhaltmsg", wh->msg, 1);
if (wh->editor)
setenv ("mheditor", wh->editor, 1);
if (wh->prompt)
setenv ("mhprompt", wh->prompt, 1);
if (wh->anno_field)
setenv ("mhannotate", wh->anno_field, 1);
if (wh->anno_list)
{
mu_opool_t opool;
mu_iterator_t itr;
size_t prev_uid = 0;
int mrange = 0;
const char *s;
mu_opool_create (&opool, MU_OPOOL_ENOMEMABRT);
mu_list_get_iterator (wh->anno_list, &itr);
for (mu_iterator_first (itr); !mu_iterator_is_done (itr);
mu_iterator_next (itr))
{
mu_message_t msg;
size_t uid;
mu_iterator_current (itr, (void**)&msg);
mu_message_get_uid (msg, &uid);
if (prev_uid == 0)
{
s = mu_umaxtostr (0, uid);
mu_opool_appendz (opool, s);
mrange = 0;
}
else if (uid == prev_uid + 1)
mrange = 1;
else
{
if (mrange)
{
mu_opool_append_char (opool, '-');
s = mu_umaxtostr (0, prev_uid);
mu_opool_appendz (opool, s);
}
mu_opool_append_char (opool, ' ');
s = mu_umaxtostr (0, uid);
mu_opool_appendz (opool, s);
mrange = 0;
}
}
if (mrange)
{
mu_opool_append_char (opool, '-');
s = mu_umaxtostr (0, prev_uid);
mu_opool_appendz (opool, s);
}
mu_opool_append_char (opool, 0);
s = mu_opool_finish (opool, NULL);
setenv ("mhmessages", s, 1);
mu_opool_destroy (&opool);
}
}