Commit 17c5c45b 17c5c45bfd3c8bb8aa82e6f7ddb46a435f4ac1da by Sergey Poznyakoff

Scheme primitives for handling mime messages.

1 parent 33c3cdba
/* GNU mailutils - a suite of utilities for electronic mail
Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
This program 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 2, or (at your option)
any later version.
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, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "mu_scm.h"
#include <mailutils/mime.h>
long mime_tag;
struct mu_mime
{
mime_t mime;
SCM owner;
};
/* SMOB functions: */
static SCM
mu_scm_mime_mark (SCM mime_smob)
{
struct mu_mime *mum = (struct mu_mime *) SCM_CDR (mime_smob);
return mum->owner;
}
static scm_sizet
mu_scm_mime_free (SCM mime_smob)
{
struct mu_mime *mum = (struct mu_mime *) SCM_CDR (mime_smob);
mime_destroy (&mum->mime);
free (mum);
return sizeof (struct mu_mime);
}
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;
mime_get_num_parts (mum->mime, &nparts);
scm_puts ("#<mime ", port);
scm_intprint (nparts, 10, port);
scm_putc ('>', port);
}
/* Internal calls: */
SCM
mu_scm_mime_create (SCM owner, mime_t mime)
{
struct mu_mime *mum;
mum = scm_must_malloc (sizeof (struct mu_mime), "mime");
mum->owner = owner;
mum->mime = mime;
SCM_RETURN_NEWSMOB (mime_tag, mum);
}
const 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) && SCM_CAR (scm) == mime_tag;
}
/* ************************************************************************* */
/* Guile primitives */
SCM_DEFINE (mu_mime_create, "mu-mime-create", 0, 2, 0,
(SCM FLAGS, SCM MESG),
"Creates a new MIME object.")
#define FUNC_NAME s_mu_mime_create
{
message_t msg = NULL;
mime_t mime;
int flags;
if (SCM_IMP (FLAGS) && SCM_BOOLP (FLAGS))
{
/*if (FLAGS == SCM_BOOL_F)*/
flags = 0;
}
else
{
SCM_ASSERT (SCM_IMP (FLAGS) && SCM_INUMP (FLAGS),
FLAGS, SCM_ARG1, FUNC_NAME);
flags = SCM_INUM (FLAGS);
}
if (!SCM_UNBNDP (MESG))
{
SCM_ASSERT (mu_scm_is_message (MESG), MESG, SCM_ARG2, FUNC_NAME);
msg = mu_scm_message_get (MESG);
}
if (mime_create (&mime, msg, flags))
return SCM_BOOL_F;
return mu_scm_mime_create (MESG, mime);
}
#undef FUNC_NAME
SCM_DEFINE (mu_mime_multipart_p, "mu-mime-multipart?", 1, 0, 0,
(SCM MIME),
"Returns #t if MIME is a multipart object.\n")
#define FUNC_NAME s_mu_mime_multipart_p
{
mime_t mime;
SCM_ASSERT (mu_scm_is_mime (MIME), MIME, SCM_ARG1, FUNC_NAME);
return mime_is_multipart (mu_scm_mime_get (MIME)) ? SCM_BOOL_T : SCM_BOOL_F;
}
#undef FUNC_NAME
SCM_DEFINE (mu_mime_get_num_parts, "mu-mime-get-num-parts", 1, 0, 0,
(SCM MIME),
"Returns number of parts in a MIME object.")
#define FUNC_NAME s_mu_mime_get_num_parts
{
mime_t mime;
size_t nparts;
SCM_ASSERT (mu_scm_is_mime (MIME), MIME, SCM_ARG1, FUNC_NAME);
mime = mu_scm_mime_get (MIME);
if (mime_get_num_parts (mime, &nparts))
return SCM_BOOL_F;
return scm_makenum (nparts);
}
#undef FUNC_NAME
SCM_DEFINE (mu_mime_get_part, "mu-mime-get-part", 2, 0, 0,
(SCM MIME, SCM PART),
"Returns part number PART from a MIME object.")
#define FUNC_NAME s_mu_mime_get_part
{
message_t msg = NULL;
SCM_ASSERT (mu_scm_is_mime (MIME), MIME, SCM_ARG1, FUNC_NAME);
SCM_ASSERT (SCM_IMP (PART) && SCM_INUMP (PART),
PART, SCM_ARG2, FUNC_NAME);
if (mime_get_part (mu_scm_mime_get (MIME), SCM_INUM (PART), &msg))
return SCM_BOOL_F;
return mu_scm_message_create (MIME, msg);
}
#undef FUNC_NAME
SCM_DEFINE (mu_mime_add_part, "mu-mime-add-part", 2, 0, 0,
(SCM MIME, SCM MESG),
"Adds MESG to the MIME object.")
#define FUNC_NAME s_mu_mime_add_part
{
mime_t mime;
message_t msg;
SCM_ASSERT (mu_scm_is_mime (MIME), MIME, SCM_ARG1, FUNC_NAME);
SCM_ASSERT (mu_scm_is_message (MESG), MESG, SCM_ARG2, FUNC_NAME);
mime = mu_scm_mime_get (MIME);
msg = mu_scm_message_get (MESG);
if (mime_add_part (mime, msg))
return SCM_BOOL_F;
mu_scm_message_add_owner (MESG, MIME);
return SCM_BOOL_T;
}
#undef FUNC_NAME
SCM_DEFINE (mu_mime_get_message, "mu-mime-get-message", 1, 0, 0,
(SCM MIME),
"Converts MIME object to a message.\n")
#define FUNC_NAME s_mu_mime_get_message
{
mime_t mime;
message_t msg;
SCM_ASSERT (mu_scm_is_mime (MIME), MIME, SCM_ARG1, FUNC_NAME);
mime = mu_scm_mime_get (MIME);
if (mime_get_message (mime, &msg))
return SCM_BOOL_F;
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_mark (mime_tag, mu_scm_mime_mark);
scm_set_smob_free (mime_tag, mu_scm_mime_free);
scm_set_smob_print (mime_tag, mu_scm_mime_print);
#include "mu_mime.x"
}