/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 1999-2021 Free Software Foundation, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General
Public License along with this library. If not, see
. */
#include "mu_scm.h"
static scm_t_bits mime_tag;
struct mu_mime
{
mu_mime_t mime;
SCM owner;
};
/* SMOB functions: */
static size_t
mu_scm_mime_free (SCM mime_smob)
{
struct mu_mime *mum = (struct mu_mime *) SCM_CDR (mime_smob);
mu_mime_destroy (&mum->mime);
return 0;
}
static int
mu_scm_mime_print (SCM mime_smob, SCM port, scm_print_state * pstate)
{
struct mu_mime *mum = (struct mu_mime *) SCM_CDR (mime_smob);
size_t nparts = 0;
mu_mime_get_num_parts (mum->mime, &nparts);
scm_puts ("#', port);
return 1;
}
/* Internal calls: */
SCM
mu_scm_mime_create (SCM owner, mu_mime_t mime)
{
struct mu_mime *mum;
mum = scm_gc_malloc (sizeof (struct mu_mime), "mime");
mum->owner = owner;
mum->mime = mime;
SCM_RETURN_NEWSMOB (mime_tag, mum);
}
mu_mime_t
mu_scm_mime_get (SCM MIME)
{
struct mu_mime *mum = (struct mu_mime *) SCM_CDR (MIME);
return mum->mime;
}
int
mu_scm_is_mime (SCM scm)
{
return SCM_NIMP (scm) && (long) SCM_CAR (scm) == mime_tag;
}
/* ************************************************************************* */
/* Guile primitives */
SCM_DEFINE_PUBLIC (scm_mu_mime_p, "mu-mime?", 1, 0, 0,
(SCM scm),
"Return @code{true} if @var{scm} is a Mailutils MIME object.\n")
#define FUNC_NAME s_scm_mu_mime_p
{
return scm_from_bool (mu_scm_is_mime (scm));
}
#undef FUNC_NAME
SCM_DEFINE_PUBLIC (scm_mu_mime_create, "mu-mime-create", 0, 2, 0,
(SCM flags, SCM mesg),
"Creates a new @acronym{MIME} object. Both arguments are optional.\n"
"@var{Flags} specifies the type of the object to create (@samp{0} is a\n"
"reasonable value). @var{mesg} gives the message to create the\n"
"@acronym{MIME} object from.")
#define FUNC_NAME s_scm_mu_mime_create
{
mu_message_t msg = NULL;
mu_mime_t mime;
int fl;
int status;
if (SCM_UNBNDP (flags) || scm_is_bool (flags))
{
/*if (flags == SCM_BOOL_F)*/
fl = 0;
}
else
{
SCM_ASSERT (scm_is_integer (flags), flags, SCM_ARG1, FUNC_NAME);
fl = scm_to_int (flags);
}
if (!SCM_UNBNDP (mesg))
{
SCM_ASSERT (mu_scm_is_message (mesg), mesg, SCM_ARG2, FUNC_NAME);
msg = mu_scm_message_get (mesg);
}
status = mu_mime_create (&mime, msg, fl);
if (status)
mu_scm_error (FUNC_NAME, status,
"Cannot create MIME object", SCM_BOOL_F);
return mu_scm_mime_create (mesg, mime);
}
#undef FUNC_NAME
SCM_DEFINE_PUBLIC (scm_mu_mime_multipart_p, "mu-mime-multipart?", 1, 0, 0,
(SCM mime),
"Returns @code{#t} if @var{mime} is a multipart object.\n")
#define FUNC_NAME s_scm_mu_mime_multipart_p
{
SCM_ASSERT (mu_scm_is_mime (mime), mime, SCM_ARG1, FUNC_NAME);
return mu_mime_is_multipart (mu_scm_mime_get (mime)) ? SCM_BOOL_T : SCM_BOOL_F;
}
#undef FUNC_NAME
SCM_DEFINE_PUBLIC (scm_mu_mime_get_num_parts, "mu-mime-get-num-parts", 1, 0, 0,
(SCM mime),
"Returns number of parts in the @acronym{MIME} object @var{mime}.")
#define FUNC_NAME s_scm_mu_mime_get_num_parts
{
mu_mime_t mimeobj;
size_t nparts;
int status;
SCM_ASSERT (mu_scm_is_mime (mime), mime, SCM_ARG1, FUNC_NAME);
mimeobj = mu_scm_mime_get (mime);
status = mu_mime_get_num_parts (mimeobj, &nparts);
if (status)
mu_scm_error (FUNC_NAME, status,
"Cannot count MIME parts", SCM_BOOL_F);
return scm_from_size_t (nparts);
}
#undef FUNC_NAME
SCM_DEFINE_PUBLIC (scm_mu_mime_get_part, "mu-mime-get-part", 2, 0, 0,
(SCM mime, SCM num),
"Returns @var{num}th part from the @acronym{MIME} object @var{mime}.")
#define FUNC_NAME s_scm_mu_mime_get_part
{
mu_message_t msg = NULL;
int status;
SCM_ASSERT (mu_scm_is_mime (mime), mime, SCM_ARG1, FUNC_NAME);
SCM_ASSERT (scm_is_integer (num), num, SCM_ARG2, FUNC_NAME);
status = mu_mime_get_part (mu_scm_mime_get (mime),
scm_to_int (num), &msg);
if (status)
mu_scm_error (FUNC_NAME, status,
"Cannot get part ~A from MIME object ~A",
scm_list_2 (num, mime));
return mu_scm_message_create (mime, msg);
}
#undef FUNC_NAME
SCM_DEFINE_PUBLIC (scm_mu_mime_add_part, "mu-mime-add-part", 2, 0, 0,
(SCM mime, SCM mesg),
"Adds message @var{mesg} to the @acronym{MIME} object @var{mime}.")
#define FUNC_NAME s_scm_mu_mime_add_part
{
mu_mime_t mimeobj;
mu_message_t msg;
int status;
SCM_ASSERT (mu_scm_is_mime (mime), mime, SCM_ARG1, FUNC_NAME);
SCM_ASSERT (mu_scm_is_message (mesg), mesg, SCM_ARG2, FUNC_NAME);
mimeobj = mu_scm_mime_get (mime);
msg = mu_scm_message_get (mesg);
status = mu_mime_add_part (mimeobj, msg);
if (status)
mu_scm_error (FUNC_NAME, status,
"Cannot add new part to MIME object ~A",
scm_list_1 (mime));
mu_scm_message_add_owner (mesg, mime);
return SCM_BOOL_T;
}
#undef FUNC_NAME
SCM_DEFINE_PUBLIC (scm_mu_mime_get_message, "mu-mime-get-message", 1, 0, 0,
(SCM mime),
"Converts @acronym{MIME} object @var{mime} to a message.\n")
#define FUNC_NAME s_scm_mu_mime_get_message
{
mu_mime_t mimeobj;
mu_message_t msg;
int status;
SCM_ASSERT (mu_scm_is_mime (mime), mime, SCM_ARG1, FUNC_NAME);
mimeobj = mu_scm_mime_get (mime);
status = mu_mime_get_message (mimeobj, &msg);
if (status)
mu_scm_error (FUNC_NAME, status,
"Cannot get message from MIME object ~A",
scm_list_1 (mime));
return mu_scm_message_create (mime, msg);
}
#undef FUNC_NAME
/* Initialize the module */
void
mu_scm_mime_init ()
{
mime_tag = scm_make_smob_type ("mime", sizeof (struct mu_mime));
scm_set_smob_free (mime_tag, mu_scm_mime_free);
scm_set_smob_print (mime_tag, mu_scm_mime_print);
#include "mu_mime.x"
}