int mu_message_get_part (mu_message_t msg, size_t part, mu_message_t *pmsg) { if (msg == NULL || pmsg == NULL) return EINVAL; /* Overload. */ if (msg->_get_part) return msg->_get_part (msg, part, pmsg); if (msg->mime == NULL) { int status = mu_mime_create (&msg->mime, msg, 0); if (status != 0) return status; } return mu_mime_get_part (msg->mime, part, pmsg); }
static PyObject * api_mime_create (PyObject *self, PyObject *args) { int status, flags; PyMime *py_mime; PyMessage *py_msg; if (!PyArg_ParseTuple (args, "O!Oi", &PyMimeType, &py_mime, &py_msg, &flags)) return NULL; if (!PyMessage_Check ((PyObject *)py_msg)) { PyErr_SetString (PyExc_TypeError, ""); return NULL; } status = mu_mime_create (&py_mime->mime, py_msg->msg, flags); return _ro (PyInt_FromLong (status)); }
/* Build a mime response message from original message MSG. TEXT is the message text. */ static int build_mime (mu_sieve_machine_t mach, mu_list_t tags, mu_mime_t *pmime, mu_message_t msg, const char *text) { mu_mime_t mime = NULL; mu_message_t newmsg; mu_stream_t stream, input; mu_header_t hdr; mu_body_t body; const char *header = "Content-Type: text/plain;charset=" MU_SIEVE_CHARSET "\n" "Content-Transfer-Encoding: 8bit\n\n"; int rc; mu_mime_create (&mime, NULL, 0); mu_message_create (&newmsg, NULL); mu_message_get_body (newmsg, &body); if ((rc = mu_static_memory_stream_create (&input, text, strlen (text)))) { mu_sieve_error (mach, _("cannot create temporary stream: %s"), mu_strerror (rc)); mu_mime_destroy (&mime); mu_message_destroy (&newmsg, NULL); return 1; } if (mu_sieve_tag_lookup (tags, "mime", NULL)) { mu_stream_t fstr; rc = mu_filter_create (&fstr, input, "base64", MU_FILTER_ENCODE, MU_STREAM_READ); mu_stream_unref (input); if (rc == 0) { header = "Content-Type: text/plain;charset=" MU_SIEVE_CHARSET "\n" "Content-Transfer-Encoding: base64\n\n"; input = fstr; } } rc = mu_body_get_streamref (body, &stream); if (rc) { mu_sieve_error (mach, _("cannot get input body stream: %s"), mu_strerror (rc)); mu_mime_destroy (&mime); mu_message_destroy (&newmsg, NULL); mu_stream_destroy (&input); return 1; } rc = mu_stream_copy (stream, input, 0, NULL); if (rc) { mu_sieve_error (mach, _("stream copy failed: %s"), mu_strerror (rc)); mu_mime_destroy (&mime); mu_message_destroy (&newmsg, NULL); mu_stream_destroy (&input); mu_stream_destroy (&stream); return 1; } mu_stream_destroy (&input); mu_header_create (&hdr, header, strlen (header)); mu_message_set_header (newmsg, hdr, NULL); mu_mime_add_part (mime, newmsg); mu_message_unref (newmsg); *pmime = mime; return 0; }