void sipe_mime_parts_foreach(const gchar *type, const gchar *body, sipe_mime_parts_cb callback, gpointer user_data) { gchar *doc = g_strdup_printf("Content-Type: %s\r\n\r\n%s", type, body); GMimeStream *stream = g_mime_stream_mem_new_with_buffer(doc, strlen(doc)); if (stream) { GMimeParser *parser = g_mime_parser_new_with_stream(stream); GMimeMultipart *multipart = (GMimeMultipart *)g_mime_parser_construct_part(parser); if (multipart) { struct gmime_callback_data cd = {callback, user_data}; SIPE_DEBUG_INFO("sipe_mime_parts_foreach: %d parts", g_mime_multipart_get_count(multipart)); g_mime_multipart_foreach(multipart, gmime_callback, &cd); g_object_unref(multipart); } g_object_unref(parser); g_object_unref(stream); } g_free(doc); }
MNMessage * mn_message_new_from_buffer (MNMailbox *mailbox, const char *buffer, unsigned int len, const char *mid, MNMessageFlags flags, gboolean handle_status, GError **err) { GMimeStream *stream; MNMessage *message; g_return_val_if_fail(MN_IS_MAILBOX(mailbox), NULL); g_return_val_if_fail(buffer != NULL, NULL); stream = g_mime_stream_mem_new_with_buffer(buffer, len); message = mn_message_new_from_mime_stream(mailbox, stream, mid, NULL, flags, handle_status, err); g_object_unref(stream); return message; }
int remove_part(GMimeObject *parent, GMimeObject *part) { int attachment = is_attachment(part); if (attachment && GMIME_IS_MULTIPART(parent)) { g_mime_multipart_remove((GMimeMultipart*)parent, part); return 1; } else if (attachment && GMIME_IS_MESSAGE(parent)) { // I'm not sure if this could ever occur or even makes sense. GMimePart *new_part; new_part = g_mime_part_new_with_type("text", "plain"); g_mime_part_set_content_object(new_part, g_mime_data_wrapper_new_with_stream(g_mime_stream_mem_new_with_buffer("Attachment Removed.", 19), GMIME_CONTENT_ENCODING_DEFAULT)); g_mime_message_set_mime_part((GMimeMessage*)parent, (GMimeObject*)new_part); g_object_unref(part); } else if (GMIME_IS_MESSAGE_PART(part)) { remove_message(g_mime_message_part_get_message((GMimeMessagePart*)part)); } return 0; }
gboolean g_mime_gpgme_mpe_encrypt(GMimeMultipartEncrypted * mpe, GMimeObject * content, GPtrArray * recipients, gboolean trust_all, GtkWindow * parent, GError ** err) { GMimeStream *filtered_stream; GMimeStream *ciphertext; GMimeStream *stream; GMimePart *version_part; GMimePart *encrypted_part; GMimeDataWrapper *wrapper; GMimeFilter *crlf_filter; g_return_val_if_fail(GMIME_IS_MULTIPART_ENCRYPTED(mpe), FALSE); g_return_val_if_fail(GMIME_IS_OBJECT(content), FALSE); /* get the cleartext */ stream = g_mime_stream_mem_new(); filtered_stream = g_mime_stream_filter_new(stream); crlf_filter = g_mime_filter_crlf_new(TRUE, FALSE); g_mime_stream_filter_add(GMIME_STREAM_FILTER(filtered_stream), crlf_filter); g_object_unref(crlf_filter); g_mime_object_write_to_stream(content, filtered_stream); g_mime_stream_flush(filtered_stream); g_object_unref(filtered_stream); /* reset the content stream */ g_mime_stream_reset(stream); /* encrypt the content stream */ ciphertext = g_mime_stream_mem_new(); if (!libbalsa_gpgme_encrypt (recipients, NULL, stream, ciphertext, GPGME_PROTOCOL_OpenPGP, FALSE, trust_all, parent, err)) { g_object_unref(ciphertext); g_object_unref(stream); return FALSE; } g_object_unref(stream); g_mime_stream_reset(ciphertext); /* construct the version part */ version_part = g_mime_part_new_with_type("application", "pgp-encrypted"); g_mime_part_set_content_encoding(version_part, GMIME_CONTENT_ENCODING_7BIT); stream = g_mime_stream_mem_new_with_buffer("Version: 1\n", strlen("Version: 1\n")); wrapper = g_mime_data_wrapper_new_with_stream(stream, GMIME_CONTENT_ENCODING_7BIT); g_mime_part_set_content_object(version_part, wrapper); g_object_unref(wrapper); g_object_unref(stream); /* construct the encrypted mime part */ encrypted_part = g_mime_part_new_with_type("application", "octet-stream"); g_mime_part_set_content_encoding(encrypted_part, GMIME_CONTENT_ENCODING_7BIT); wrapper = g_mime_data_wrapper_new_with_stream(ciphertext, GMIME_CONTENT_ENCODING_7BIT); g_mime_part_set_content_object(encrypted_part, wrapper); g_object_unref(ciphertext); g_object_unref(wrapper); /* save the version and encrypted parts */ /* FIXME: make sure there aren't any other parts?? */ g_mime_multipart_add(GMIME_MULTIPART(mpe), GMIME_OBJECT(version_part)); g_mime_multipart_add(GMIME_MULTIPART(mpe), GMIME_OBJECT(encrypted_part)); g_object_unref(encrypted_part); g_object_unref(version_part); /* set the content-type params for this multipart/encrypted part */ g_mime_object_set_content_type_parameter(GMIME_OBJECT(mpe), "protocol", "application/pgp-encrypted"); g_mime_multipart_set_boundary(GMIME_MULTIPART(mpe), NULL); return TRUE; }