summaryrefslogtreecommitdiff
path: root/libmu_scm/mu_mime.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmu_scm/mu_mime.c')
-rw-r--r--libmu_scm/mu_mime.c220
1 files changed, 220 insertions, 0 deletions
diff --git a/libmu_scm/mu_mime.c b/libmu_scm/mu_mime.c
new file mode 100644
index 000000000..e75a57b1c
--- /dev/null
+++ b/libmu_scm/mu_mime.c
@@ -0,0 +1,220 @@
+/* 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"
+
+}
+

Return to:

Send suggestions and report system problems to the System administrator.