+/* search the first text part of (multipart) MIME message,
+ decode, convert it and output to outfp. */
+FILE *procmime_get_first_text_content(MsgInfo *msginfo)
+{
+ FILE *infp, *outfp = NULL;
+ MimeInfo *mimeinfo, *partinfo;
+
+ g_return_val_if_fail(msginfo != NULL, NULL);
+
+ mimeinfo = procmime_scan_message(msginfo);
+ if (!mimeinfo) return NULL;
+
+ if ((infp = procmsg_open_message(msginfo)) == NULL) {
+ procmime_mimeinfo_free_all(mimeinfo);
+ return NULL;
+ }
+
+ partinfo = mimeinfo;
+ while (partinfo && partinfo->mime_type != MIME_TEXT)
+ partinfo = procmime_mimeinfo_next(partinfo);
+ if (!partinfo) {
+ partinfo = mimeinfo;
+ while (partinfo && partinfo->mime_type != MIME_TEXT_HTML &&
+ partinfo->mime_type != MIME_TEXT_ENRICHED)
+ partinfo = procmime_mimeinfo_next(partinfo);
+ }
+
+
+ if (partinfo)
+ outfp = procmime_get_text_content(partinfo, infp);
+
+ fclose(infp);
+ procmime_mimeinfo_free_all(mimeinfo);
+
+ return outfp;
+}
+
+gboolean procmime_find_string_part(MimeInfo *mimeinfo, const gchar *filename,
+ const gchar *str, gboolean case_sens)
+{
+
+ FILE *infp, *outfp;
+ gchar buf[BUFFSIZE];
+ gchar *(* StrFindFunc) (const gchar *haystack, const gchar *needle);
+
+ g_return_val_if_fail(mimeinfo != NULL, FALSE);
+ g_return_val_if_fail(mimeinfo->mime_type == MIME_TEXT ||
+ mimeinfo->mime_type == MIME_TEXT_HTML ||
+ mimeinfo->mime_type == MIME_TEXT_ENRICHED, FALSE);
+ g_return_val_if_fail(str != NULL, FALSE);
+
+ if ((infp = fopen(filename, "rb")) == NULL) {
+ FILE_OP_ERROR(filename, "fopen");
+ return FALSE;
+ }
+
+ outfp = procmime_get_text_content(mimeinfo, infp);
+ fclose(infp);
+
+ if (!outfp)
+ return FALSE;
+
+ if (case_sens)
+ StrFindFunc = strstr;
+ else
+ StrFindFunc = strcasestr;
+
+ while (fgets(buf, sizeof(buf), outfp) != NULL) {
+ if (StrFindFunc(buf, str) != NULL) {
+ fclose(outfp);
+ return TRUE;
+ }
+ }
+
+ fclose(outfp);
+
+ return FALSE;
+}
+
+gboolean procmime_find_string(MsgInfo *msginfo, const gchar *str,
+ gboolean case_sens)
+{
+ MimeInfo *mimeinfo;
+ MimeInfo *partinfo;
+ gchar *filename;
+ gboolean found = FALSE;
+
+ g_return_val_if_fail(msginfo != NULL, FALSE);
+ g_return_val_if_fail(str != NULL, FALSE);
+
+ filename = procmsg_get_message_file(msginfo);
+ if (!filename) return FALSE;
+ mimeinfo = procmime_scan_message(msginfo);
+
+ for (partinfo = mimeinfo; partinfo != NULL;
+ partinfo = procmime_mimeinfo_next(partinfo)) {
+ if (partinfo->mime_type == MIME_TEXT ||
+ partinfo->mime_type == MIME_TEXT_HTML ||
+ partinfo->mime_type == MIME_TEXT_ENRICHED) {
+ if (procmime_find_string_part
+ (partinfo, filename, str, case_sens) == TRUE) {
+ found = TRUE;
+ break;
+ }
+ }
+ }
+
+ procmime_mimeinfo_free_all(mimeinfo);
+ g_free(filename);
+
+ return found;
+}
+