-static void compose_attach_parts(Compose *compose, MsgInfo *msginfo)
-{
- FILE *fp;
- gchar *file;
- MimeInfo *mimeinfo;
- MsgInfo *tmpmsginfo;
- gchar *p;
- gchar *boundary;
- gint boundary_len = 0;
- gchar buf[BUFFSIZE];
- glong fpos, prev_fpos;
- gint npart;
- gchar *source;
- gchar *filename;
-
- g_return_if_fail(msginfo != NULL);
-
-#if USE_GPGME
- for (;;) {
- if ((fp = procmsg_open_message(msginfo)) == NULL) return;
- mimeinfo = procmime_scan_mime_header(fp, MIME_TEXT);
- if (!mimeinfo) break;
-
- if (!MSG_IS_ENCRYPTED(msginfo->flags) &&
- rfc2015_is_encrypted(mimeinfo)) {
- MSG_SET_TMP_FLAGS(msginfo->flags, MSG_ENCRYPTED);
- }
- if (MSG_IS_ENCRYPTED(msginfo->flags) &&
- !msginfo->plaintext_file &&
- !msginfo->decryption_failed) {
- rfc2015_decrypt_message(msginfo, mimeinfo, fp);
- if (msginfo->plaintext_file &&
- !msginfo->decryption_failed) {
- fclose(fp);
- continue;
- }
- }
-
- break;
- }
-#else /* !USE_GPGME */
- if ((fp = procmsg_open_message(msginfo)) == NULL) return;
- mimeinfo = procmime_scan_mime_header(fp, MIME_TEXT);
-#endif /* USE_GPGME */
-
- fclose(fp);
- if (!mimeinfo) return;
- if (mimeinfo->mime_type == MIME_TEXT)
- return;
-
- if ((fp = procmsg_open_message(msginfo)) == NULL) return;
-
- g_return_if_fail(mimeinfo != NULL);
- g_return_if_fail(mimeinfo->mime_type != MIME_TEXT);
-
- if (mimeinfo->mime_type == MIME_MULTIPART) {
- g_return_if_fail(mimeinfo->boundary != NULL);
- g_return_if_fail(mimeinfo->sub == NULL);
- }
- g_return_if_fail(fp != NULL);
-
- boundary = mimeinfo->boundary;
-
- if (boundary) {
- boundary_len = strlen(boundary);
-
- /* look for first boundary */
- while ((p = fgets(buf, sizeof(buf), fp)) != NULL)
- if (IS_BOUNDARY(buf, boundary, boundary_len)) break;
- if (!p) {
- fclose(fp);
- return;
- }
- }
-
- if ((fpos = ftell(fp)) < 0) {
- perror("ftell");
- fclose(fp);
- return;
- }
-
- for (npart = 0;; npart++) {
- MimeInfo *partinfo;
- gboolean eom = FALSE;
-
- prev_fpos = fpos;
-
- partinfo = procmime_scan_mime_header(fp, MIME_TEXT);
- if (!partinfo) break;
-
- if (npart != 0)
- procmime_mimeinfo_insert(mimeinfo, partinfo);
- else
- procmime_mimeinfo_free(partinfo);
-
- /* look for next boundary */
- buf[0] = '\0';
- while ((p = fgets(buf, sizeof(buf), fp)) != NULL) {
- if (IS_BOUNDARY(buf, boundary, boundary_len)) {
- if (buf[2 + boundary_len] == '-' &&
- buf[2 + boundary_len + 1] == '-')
- eom = TRUE;
- break;
- }
- }
- if (p == NULL)
- eom = TRUE; /* broken MIME message */
- fpos = ftell(fp);
-
- partinfo->size = fpos - prev_fpos - strlen(buf);
-
- if (eom) break;
- }
-
- source = procmsg_get_message_file_path(msginfo);
-
- g_return_if_fail(mimeinfo != NULL);
-
- if (!mimeinfo->main && mimeinfo->parent)
- {
- filename = mime_extract_file(source, mimeinfo);
-
- compose_attach_append_with_type(compose, filename,
- mimeinfo->content_type,
- mimeinfo->mime_type);
-
- g_free(filename);
- }
-
- if (mimeinfo->sub && mimeinfo->sub->children)
- {
- filename = mime_extract_file(source, mimeinfo->sub);
-
- compose_attach_append_with_type(compose, filename,
- mimeinfo->content_type,
- mimeinfo->sub->mime_type);
-
- g_free(filename);
- }
-
- if (mimeinfo->children) {
- MimeInfo *child;
-
- child = mimeinfo->children;
- while (child) {
- filename = mime_extract_file(source, child);
-
- compose_attach_append_with_type(compose, filename,
- child->content_type,
- child->mime_type);
-
- g_free(filename);
-
- child = child->next;
- }
- }
-
- fclose(fp);
-
- procmime_mimeinfo_free_all(mimeinfo);
-}