diff options
author | Alain Magloire <alainm@gnu.org> | 2001-01-19 05:03:13 +0000 |
---|---|---|
committer | Alain Magloire <alainm@gnu.org> | 2001-01-19 05:03:13 +0000 |
commit | 27205809701bdc477b0dc89fe3d46f0d099bc8bf (patch) | |
tree | b65f9d696c733bef5906fb51b978375db3b44940 /frm/frm.c | |
parent | 4be5bd8ff8ae2869346327aa8d5e8bdea15c2d16 (diff) | |
download | mailutils-27205809701bdc477b0dc89fe3d46f0d099bc8bf.tar.gz mailutils-27205809701bdc477b0dc89fe3d46f0d099bc8bf.tar.bz2 |
Instead of writing the documentation, found a diversion "frm" is a clone
to the "frm" that comes with elm package. It was written in less then 15
minutes, cool.
Diffstat (limited to 'frm/frm.c')
-rw-r--r-- | frm/frm.c | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/frm/frm.c b/frm/frm.c new file mode 100644 index 000000000..a47b61dd1 --- /dev/null +++ b/frm/frm.c @@ -0,0 +1,328 @@ +/* GNU mailutils - a suite of utilities for electronic mail + Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <sys/types.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include "getopt.h" + +#include <mailutils/mailbox.h> +#include <mailutils/header.h> +#include <mailutils/registrar.h> +#include <mailutils/observer.h> +#include <mailutils/address.h> + +static int action (observer_t, size_t); +static int counter; + +static struct option long_options[] = +{ + {"help", no_argument, 0, 'h'}, + {"to", no_argument, 0, 'l'}, + {"number", no_argument, 0, 'n'}, + {"Quiet", no_argument, 0, 'Q'}, + {"query", no_argument, 0, 'q'}, + {"status", required_argument, 0, 's'}, + {"align", no_argument, 0, 't'}, + {"version", no_argument, 0, 'v'}, + {0, 0, 0, 0} +}; + +const char *short_options ="hlnQqs:tv"; + +static int show_to; +static int show_from = 1; +static int show_subject = 1; +static int show_number; +static int show_summary; +static int be_quiet; +static int be_silent; +static int align = 1; +static int show_query; +static int have_new_mail; + +#define IS_READ 0x001 +#define IS_OLD 0x010 +#define IS_NEW 0x100 +static int select_attribute; + +static int counter; + + +/* Retrieve the Personal Name from the header To: or From: */ +static int +get_personal (header_t hdr, char *field, char *personal, size_t buflen) +{ + char hfield[512]; + int status; + + /* Empty string. */ + *hfield = '\0'; + + status = header_get_value (hdr, field, hfield, sizeof (hfield), NULL); + if (status == 0) + { + address_t address = NULL; + size_t len = 0; + address_create (&address, hfield); + address_get_personal (address, 1, personal, buflen, &len); + address_destroy (&address); + if (len == 0) + strncpy (personal, hfield, buflen)[buflen - 1] = '\0'; + } + return status; +} + +/* Observable Action this is being call at every message discover. */ +/* FIXME: The format of the display is poorly done, please correct. */ +static int +action (observer_t o, size_t type) +{ + switch (type) + { + case MU_EVT_MESSAGE_ADD: + { + mailbox_t mbox = observer_get_owner (o); + message_t msg = NULL; + header_t hdr = NULL; + attribute_t attr = NULL; + char hsubject[512]; + + counter++; + + mailbox_get_message (mbox, counter, &msg); + + message_get_attribute (msg, &attr); + message_get_header (msg, &hdr); + + if (select_attribute + && (select_attribute & IS_READ) + && (!attribute_is_read (attr))) + { + break; + } + else if (select_attribute + && (select_attribute & IS_NEW) + && (!attribute_is_recent (attr))) + { + break; + } + else if (select_attribute + && (select_attribute & IS_OLD) + && (!attribute_is_seen (attr))) + { + break; + } + + if (attribute_is_recent (attr)) + have_new_mail = 1; + + if (be_quiet) + break; + + + if (show_number) + printf ("%d: ", counter); + + if (show_to) + { + char hto[16]; + int status = get_personal (hdr, MU_HEADER_TO, hto, sizeof (hto)); + if (status == 0) + printf ("(%s) ", hto); + else + printf ("(------)"); + } + + if (show_from) + { + char hfrom[32]; + int status = get_personal (hdr, MU_HEADER_FROM, hfrom, + sizeof (hfrom)); + if (status == 0) + printf ("%s\t", hfrom); + else + printf ("-----\t"); + } + + if (show_subject) + { + char hsubject[64]; + int status = header_get_value (hdr, MU_HEADER_SUBJECT, hsubject, + sizeof (hsubject), NULL); + printf("%s\n", hsubject); + } + break; + } + + case MU_EVT_MAILBOX_PROGRESS: + /* Noop. */ + break; + } + return 0; +} + +void +usage (const char *argv) +{ + printf ("GNU Mailutils.\n"); + printf ("Usage: %s [OPTIONS]\n\n", argv); + printf (" -h, --help display this help and exit\n"); + printf (" -l, --to include the To: information\n"); + printf (" -n, --number display the message numberd\n"); + printf (" -Q, --Quiet very quiet\n"); + printf (" -q, --query print a message if unread mail\n"); + printf (" -s, --status=[nor] select message with the specific \ + attribute\n"); + printf (" [n]ew, [r]ead, [u]nread.\n"); + printf (" -t, --align Try to align\n"); + printf (" -v, --version display version information and exit\n"); + printf ("\nReport bugs to bug-mailutils@gnu.org\n"); + exit (0); +} + +/* This a close of the elm program call "frm". It is a good example on + how to use the observable(callback) of libmailutils. "frm" has to + be very interactive so it is not possible to call mailbox_messages_count() + and wait for the scanning to finish before displaying. As soon as the scan + find a new message we want to know about it, this is done by registering + an observable type MU_MAILBOX_NEW_MSG. The rest is simple displaying + formating code. */ + +int +main(int argc, char **argv) +{ + char *mailbox_name = NULL; + int c; + + while ((c = getopt_long (argc, argv, short_options, long_options, NULL)) + != -1) + { + switch (c) + { + case 'h': + usage (argv[0]); + break; + + case 'l': + show_to = 1; + break; + + case 'n': + show_number = 1; + break; + + case 'Q': + /* Very silent. */ + be_quiet += 2; + break; + + case 'q': + be_quiet = show_query = 1; + break; + + case 'S': + show_summary = 1; + break; + + case 's': + if (optarg) + switch (*optarg) + { + case 'r': + select_attribute |= IS_READ; + break; + + case 'o': + select_attribute |= IS_OLD; + break; + + case 'n': + select_attribute |= IS_NEW; + break; + + } + break; + + case 't': + align = 1; + break; + + case 'v': + printf ("Mailutils 0.0.0: frm\n"); + exit (0); + break; + + default: + break; + } + } + + /* have an argument */ + if (optind < argc) + mailbox_name = argv[optind]; + + /* register the formats. */ + { + list_t bookie; + registrar_get_list (&bookie); + list_append (bookie, mbox_record); + list_append (bookie, path_record); + list_append (bookie, pop_record); + list_append (bookie, imap_record); + } + + /* Construct the mailbox_t, attach a notification and destroy */ + { + mailbox_t mbox; + observer_t observer; + observable_t observable; + int status; + + if ((status = mailbox_create_default (&mbox, mailbox_name) != 0) + || (status = mailbox_open (mbox, MU_STREAM_READ) != 0)) + { + fprintf (stderr, "could not open mailbox\n"); + exit (1); + } + + observer_create (&observer, mbox); + observer_set_action (observer, action, mbox); + mailbox_get_observable (mbox, &observable); + observable_attach (observable, MU_EVT_MESSAGE_ADD, observer); + + mailbox_scan (mbox, 1, NULL); + + observable_detach (observable, observer); + observer_destroy (&observer, mbox); + + mailbox_close(mbox); + mailbox_destroy(&mbox); + } + + if (show_summary && be_quiet < 1) + printf ("You have %d messages\n", counter); + if (show_query && have_new_mail) + printf ("You have new mail\n"); + return 0; +} |