X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/dc4d0c4bf247cfc88e1f3f9463fa2264d3d226b5..1c03fa9d8e85b15167dce2d7007132fe87698bc8:/uip/mhical.c?ds=inline diff --git a/uip/mhical.c b/uip/mhical.c index 561935bf..078ad37e 100644 --- a/uip/mhical.c +++ b/uip/mhical.c @@ -6,9 +6,19 @@ */ #include "h/mh.h" +#include "sbr/fmt_new.h" +#include "sbr/getarguments.h" +#include "sbr/concat.h" +#include "sbr/smatch.h" +#include "sbr/ambigsw.h" +#include "sbr/path.h" +#include "sbr/print_version.h" +#include "sbr/print_help.h" +#include "sbr/error.h" #include "h/icalendar.h" +#include "sbr/datetime.h" #include "sbr/icalparse.h" -#include +#include "h/fmt_scan.h" #include "h/addrsbr.h" #include "h/mts.h" #include "h/done.h" @@ -24,7 +34,7 @@ typedef enum act { ACT_CANCEL } act; -static void convert_to_reply (contentline *, act); +static int convert_to_reply (contentline *, act, char *); static void convert_to_cancellation (contentline *); static void convert_common (contentline *, act); static void dump_unfolded (FILE *, contentline *); @@ -41,6 +51,7 @@ static char *fold (char *, int); X("format string", 5, FMTSW) \ X("infile", 0, INFILESW) \ X("outfile", 0, OUTFILESW) \ + X("attendee", 0, ATTENDEESW) \ X("contenttype", 0, CONTENTTYPESW) \ X("nocontenttype", 0, NCONTENTTYPESW) \ X("unfold", 0, UNFOLDSW) \ @@ -71,6 +82,7 @@ main (int argc, char *argv[]) act action = ACT_NONE; char *infile = NULL, *outfile = NULL; FILE *inputfile = NULL, *outputfile = NULL; + char *attendee = NULL; bool contenttype = false; bool unfold = false; vevent *v, *nextvevent; @@ -151,6 +163,12 @@ main (int argc, char *argv[]) outfile = *cp == '-' ? mh_xstrdup(cp) : path (cp, TFILE); continue; + case ATTENDEESW: + if (! (cp = *argp++) || (*cp == '-' && cp[1])) + die("missing argument to %s", argp[-2]); + attendee = cp; + continue; + case CONTENTTYPESW: contenttype = true; continue; @@ -215,9 +233,12 @@ main (int argc, char *argv[]) if (action == ACT_CANCEL) { convert_to_cancellation (v->contentlines); } else { - convert_to_reply (v->contentlines, action); + parser_status += + convert_to_reply (v->contentlines, action, attendee); + } + if (parser_status == 0) { + output (outputfile, v->contentlines, contenttype); } - output (outputfile, v->contentlines, contenttype); } free_contentlines (v->contentlines); @@ -240,13 +261,15 @@ main (int argc, char *argv[]) free (outfile); } - return parser_status; + return parser_status > 0 ? 1 : 0; } /* * - Change METHOD from REQUEST to REPLY. * - Change PRODID. - * - Remove all ATTENDEE lines for other users (based on ismymbox ()). + * - Remove all ATTENDEE lines for other users (based on ismymbox()). + * If more than one address matches ismymbox(), the attendee argument, + * from the -attendee switch, must be used to select one. * - For the user's ATTENDEE line: * - Remove ROLE and RSVP parameters. * - Change PARTSTAT value to indicate reply action, e.g., ACCEPTED, @@ -254,14 +277,13 @@ main (int argc, char *argv[]) * - Insert action at beginning of SUMMARY value. * - Remove all X- lines. * - Update DTSTAMP with current timestamp. - * - Remove all DESCRIPTION lines. * - Excise VALARM sections. */ -static void -convert_to_reply (contentline *clines, act action) +static int +convert_to_reply (contentline *clines, act action, char *attendee) { char *partstat = NULL; - bool found_my_attendee_line = false; + unsigned int found_my_attendee_line = 0; contentline *node; convert_common (clines, action); @@ -304,8 +326,9 @@ convert_to_reply (contentline *clines, act action) /* Need to flush getname after use. */ while (getname ("")) { continue; } - if (ismymbox (mn)) { - found_my_attendee_line = true; + if (ismymbox (mn) && + (attendee == NULL || ! strcasecmp(mn->m_text, attendee))) { + ++found_my_attendee_line; for (p = node->params; p && p->param_name; p = p->next) { value_list *v; @@ -327,7 +350,7 @@ convert_to_reply (contentline *clines, act action) } } - if (! found_my_attendee_line) { + if (found_my_attendee_line == 0) { /* Generate and attach an ATTENDEE line for me. */ contentline *node; @@ -342,16 +365,13 @@ convert_to_reply (contentline *clines, act action) add_param_value (new_node, mh_xstrdup (getfullname ())); new_node->value = concat ("MAILTO:", getlocalmbox (), NULL); } + } else if (found_my_attendee_line > 1) { + inform("Multiple attendees match your address, " + "re-run with -attendee switch"); + return 1; } - /* Call find_contentline () with node as argument to find multiple - matching contentlines. */ - for (node = clines; - (node = find_contentline (node, "DESCRIPTION", 0)); - node = node->next) { - /* ACCEPT, at least, replies don't seem to have DESCRIPTIONS. */ - remove_contentline (node); - } + return 0; } /* @@ -400,7 +420,7 @@ convert_common (contentline *clines, act action) if ((node = find_contentline (clines, "PRODID", 0))) { free (node->value); - node->value = mh_xstrdup ("nmh mhical v0.1"); + node->value = mh_xstrdup ("nmh mhical v0.5"); } if ((node = find_contentline (clines, "VERSION", 0))) { @@ -411,8 +431,8 @@ convert_common (contentline *clines, act action) if (strcmp (node->value, "2.0")) { inform("supports the Version 2.0 specified by RFC 5545 " - "but iCalendar object has Version %s, continuing...", - node->value); + "but iCalendar object has Version %s, continuing...", + node->value); node->value = mh_xstrdup ("2.0"); } }