static void format_message_json (const void *ctx, notmuch_message_t *message) { notmuch_tags_t *tags; int first = 1; void *ctx_quote = talloc_new (ctx); time_t date; const char *relative_date; date = notmuch_message_get_date (message); relative_date = notmuch_time_relative_date (ctx, date); printf ("\"id\": %s, \"match\": %s, \"excluded\": %s, \"filename\": %s, \"timestamp\": %ld, \"date_relative\": \"%s\", \"tags\": [", json_quote_str (ctx_quote, notmuch_message_get_message_id (message)), notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH) ? "true" : "false", notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_EXCLUDED) ? "true" : "false", json_quote_str (ctx_quote, notmuch_message_get_filename (message)), date, relative_date); for (tags = notmuch_message_get_tags (message); notmuch_tags_valid (tags); notmuch_tags_move_to_next (tags)) { printf("%s%s", first ? "" : ",", json_quote_str (ctx_quote, notmuch_tags_get (tags))); first = 0; } printf("], "); talloc_free (ctx_quote); }
static int msg_date(Tcl_Interp *interp, notmuch_message_t *msg, int argc, const char *argv[]) { if (argc != 0) { tcl_result_printf(interp, "expected: msg date"); return TCL_ERROR; } Tcl_SetObjResult(interp, Tcl_NewLongObj(notmuch_message_get_date(msg))); return TCL_OK; }
/* Print a message in "mboxrd" format as documented, for example, * here: * * http://qmail.org/qmail-manual-html/man5/mbox.html */ static notmuch_status_t format_part_mbox (const void *ctx, unused (sprinter_t *sp), mime_node_t *node, unused (int indent), unused (const notmuch_show_params_t *params)) { notmuch_message_t *message = node->envelope_file; const char *filename; FILE *file; const char *from; time_t date; struct tm date_gmtime; char date_asctime[26]; char *line = NULL; size_t line_size; ssize_t line_len; if (!message) INTERNAL_ERROR ("format_part_mbox requires a root part"); filename = notmuch_message_get_filename (message); file = fopen (filename, "r"); if (file == NULL) { fprintf (stderr, "Failed to open %s: %s\n", filename, strerror (errno)); return NOTMUCH_STATUS_FILE_ERROR; } from = notmuch_message_get_header (message, "from"); from = _extract_email_address (ctx, from); date = notmuch_message_get_date (message); gmtime_r (&date, &date_gmtime); asctime_r (&date_gmtime, date_asctime); printf ("From %s %s", from, date_asctime); while ((line_len = getline (&line, &line_size, file)) != -1 ) { if (_is_from_line (line)) putchar ('>'); printf ("%s", line); } printf ("\n"); fclose (file); return NOTMUCH_STATUS_SUCCESS; }
/* Get a nice, single-line summary of message. */ static const char * _get_one_line_summary (const void *ctx, notmuch_message_t *message) { const char *from; time_t date; const char *relative_date; const char *tags; from = notmuch_message_get_header (message, "from"); date = notmuch_message_get_date (message); relative_date = notmuch_time_relative_date (ctx, date); tags = _get_tags_as_string (ctx, message); return talloc_asprintf (ctx, "%s (%s) (%s)", from, relative_date, tags); }
/* Print a message in "mboxrd" format as documented, for example, * here: * * http://qmail.org/qmail-manual-html/man5/mbox.html */ static void format_message_mbox (const void *ctx, notmuch_message_t *message, unused (int indent)) { const char *filename; FILE *file; const char *from; time_t date; struct tm date_gmtime; char date_asctime[26]; char *line = NULL; size_t line_size; ssize_t line_len; filename = notmuch_message_get_filename (message); file = fopen (filename, "r"); if (file == NULL) { fprintf (stderr, "Failed to open %s: %s\n", filename, strerror (errno)); return; } from = notmuch_message_get_header (message, "from"); from = _extract_email_address (ctx, from); date = notmuch_message_get_date (message); gmtime_r (&date, &date_gmtime); asctime_r (&date_gmtime, date_asctime); printf ("From %s %s", from, date_asctime); while ((line_len = getline (&line, &line_size, file)) != -1 ) { if (_is_from_line (line)) putchar ('>'); printf ("%s", line); } printf ("\n"); fclose (file); }
/* Emit a sequence of key/value pairs for the metadata of message. * The caller should begin a map before calling this. */ static void format_message_sprinter (sprinter_t *sp, notmuch_message_t *message) { /* Any changes to the JSON or S-Expression format should be * reflected in the file devel/schemata. */ void *local = talloc_new (NULL); notmuch_tags_t *tags; time_t date; const char *relative_date; sp->map_key (sp, "id"); sp->string (sp, notmuch_message_get_message_id (message)); sp->map_key (sp, "match"); sp->boolean (sp, notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH)); sp->map_key (sp, "excluded"); sp->boolean (sp, notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_EXCLUDED)); sp->map_key (sp, "filename"); sp->string (sp, notmuch_message_get_filename (message)); sp->map_key (sp, "timestamp"); date = notmuch_message_get_date (message); sp->integer (sp, date); sp->map_key (sp, "date_relative"); relative_date = notmuch_time_relative_date (local, date); sp->string (sp, relative_date); sp->map_key (sp, "tags"); sp->begin_list (sp); for (tags = notmuch_message_get_tags (message); notmuch_tags_valid (tags); notmuch_tags_move_to_next (tags)) sp->string (sp, notmuch_tags_get (tags)); sp->end (sp); talloc_free (local); }