diff options
-rw-r--r-- | alpine/mailpart.c | 286 | ||||
-rw-r--r-- | alpine/mailpart.h | 3 | ||||
-rw-r--r-- | alpine/mailview.c | 6 | ||||
-rw-r--r-- | alpine/send.c | 7 | ||||
-rw-r--r-- | imap/src/osdep/unix/ssl_unix.c | 4 | ||||
-rw-r--r-- | pith/handle.h | 8 | ||||
-rw-r--r-- | pith/ical.c | 345 | ||||
-rw-r--r-- | pith/icaltype.h | 4 | ||||
-rw-r--r-- | pith/mailview.c | 319 | ||||
-rw-r--r-- | pith/send.c | 14 |
10 files changed, 532 insertions, 464 deletions
diff --git a/alpine/mailpart.c b/alpine/mailpart.c index 392c76c4..68c69b9e 100644 --- a/alpine/mailpart.c +++ b/alpine/mailpart.c @@ -2886,21 +2886,21 @@ display_vcard_att(long int msgno, ATTACH_S *a, int flags) } void -display_vcalendar_att(long int msgno, ATTACH_S *a, int flags) +display_vevent_summary(long int msgno, ATTACH_S *a, int flags, int depth) { BODY *b; VCALENDAR_S *vcal = NULL; char *b64text, *caltext; unsigned long callen; + VEVENT_SUMMARY_S *vesy, *vsummary; /* vevent summary */ STORE_S *in_store, *out_store = NULL; HANDLE_S *handles = NULL; URL_HILITE_S uh; gf_io_t gc, pc; char *errstr = NULL, tmp[MAILTMPLEN], *p; - int cmd, i; - VEVENT_SUMMARY_S *vesy; /* vevent summary */ - - b = mail_body (ps_global->mail_stream, msgno, a->number); + int cmd, i, k; + + b = mail_body(ps_global->mail_stream, msgno, a->number); if(b->sparep == NULL){ b64text = mail_fetch_body(ps_global->mail_stream, msgno, a->number, &callen, 0); b64text[callen] = '\0'; /* chop off cookie */ @@ -2911,9 +2911,9 @@ display_vcalendar_att(long int msgno, ATTACH_S *a, int flags) else if(get_body_sparep_type(b->sparep) == iCalType) vcal = (VCALENDAR_S *) get_body_sparep_data(b->sparep); - vesy = ical_vevent_summary(vcal); + vsummary = ical_vevent_summary(vcal); - if(vesy == NULL){ + if(vsummary == NULL){ q_status_message(SM_ORDER | SM_DING, 3, 3, _("Error parsing event")); return; @@ -2921,180 +2921,204 @@ display_vcalendar_att(long int msgno, ATTACH_S *a, int flags) if(!(in_store = so_get(CharStar, NULL, EDIT_ACCESS))){ q_status_message(SM_ORDER | SM_DING, 3, 3, - _("Error allocating space for Calendar")); + _("Error allocating space to process Calendar")); return; } - if(vesy->cancel){ - so_puts(in_store, _("This event was cancelled")); - so_puts(in_store, "\015\012"); + if((out_store = so_get(CharStar, NULL, EDIT_ACCESS)) == NULL){ + q_status_message(SM_ORDER | SM_DING, 3, 3, + _("Error allocating space to write Calendar")); + return; } - if(vesy->priority){ - utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%d %s", - _("Priority: "), vesy->priority, - vesy->priority == 5 ? _("(Normal)") + gf_set_so_readc(&gc, in_store); + gf_set_so_writec(&pc, out_store); + + for(vesy = vsummary, k = 0; vesy; vesy = vesy->next, k++){ + if(depth >= 0 && k != depth) + continue; + + if(vesy->cancel){ + so_puts(in_store, _("This event was cancelled")); + so_puts(in_store, "\015\012"); + } + + if(vesy->priority){ + utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%d %s", + _("Priority: "), vesy->priority, + vesy->priority == 5 ? _("(Normal)") : (vesy->priority < 5 ? _("(High)") : _("(Low)"))); - so_puts(in_store, tmp_20k_buf); - so_puts(in_store, "\015\012"); - } - - if(vesy->summary){ - utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s", - _("Summary: "), vesy->summary); - so_puts(in_store, tmp_20k_buf); - so_puts(in_store, "\015\012"); - } + so_puts(in_store, tmp_20k_buf); + so_puts(in_store, "\015\012"); + } - if(vesy->sender){ - utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s", - _("Sender: "), vesy->sender); - so_puts(in_store, tmp_20k_buf); - so_puts(in_store, "\015\012"); - } + if(vesy->summary){ + utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s", + _("Summary: "), vesy->summary); + so_puts(in_store, tmp_20k_buf); + so_puts(in_store, "\015\012"); + } - if(vesy->organizer){ - utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s", - _("Organizer: "), vesy->organizer); - so_puts(in_store, tmp_20k_buf); - so_puts(in_store, "\015\012"); - } + if(vesy->sender){ + utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s", + _("Sender: "), vesy->sender); + so_puts(in_store, tmp_20k_buf); + so_puts(in_store, "\015\012"); + } - if(vesy->location){ - ical_remove_escapes(&vesy->location); - utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s", - _("Location: "), vesy->location); - so_puts(in_store, tmp_20k_buf); - so_puts(in_store, "\015\012"); - } + if(vesy->organizer){ + utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s", + _("Organizer: "), vesy->organizer); + so_puts(in_store, tmp_20k_buf); + so_puts(in_store, "\015\012"); + } - if(vesy->evstart){ - utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s", - _("Start Date: "), vesy->evstart); - so_puts(in_store, tmp_20k_buf); - so_puts(in_store, "\015\012"); - } + if(vesy->location){ + ical_remove_escapes(&vesy->location); + utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s", + _("Location: "), vesy->location); + so_puts(in_store, tmp_20k_buf); + so_puts(in_store, "\015\012"); + } - if(vesy->duration){ - for(i = 0; vesy->duration[i] != NULL; i++){ + if(vesy->evstart){ utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s", - _("Duration: "), vesy->duration[i]); + _("Start Date: "), vesy->evstart); so_puts(in_store, tmp_20k_buf); so_puts(in_store, "\015\012"); - } - } else if(vesy->evend){ - utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s", - _("End Date: "), vesy->evend); - so_puts(in_store, tmp_20k_buf); - so_puts(in_store, "\015\012"); - } + } + + if(vesy->duration){ + for(i = 0; vesy->duration[i] != NULL; i++){ + utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s", + _("Duration: "), vesy->duration[i]); + so_puts(in_store, tmp_20k_buf); + so_puts(in_store, "\015\012"); + } + } else if(vesy->evend){ + utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s", + _("End Date: "), vesy->evend); + so_puts(in_store, tmp_20k_buf); + so_puts(in_store, "\015\012"); + } - if(vesy->dtstamp){ - utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s", - vcal->method ? _("Created on: ") : _("Last Revised on; "), - vesy->dtstamp); - so_puts(in_store, tmp_20k_buf); - so_puts(in_store, "\015\012"); - } + if(vesy->dtstamp){ + utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s", + vcal->method ? _("Created on: ") : _("Last Revised on; "), + vesy->dtstamp); + so_puts(in_store, tmp_20k_buf); + so_puts(in_store, "\015\012"); + } - if(vesy->description){ - char c; - int j, empty; + if(vesy->description){ + char c; + int j, empty; - so_puts(in_store, "\015\012"); + so_puts(in_store, "\015\012"); - for(i = 0; vesy->description[i] != NULL; i++){ - so_puts(in_store, _("Description: ")); - /* Check if empty description */ - empty = 1; - for(j =0; empty == 1 && vesy->description[i][j] != '\0'; j++){ - c = vesy->description[i][j]; - if(c != '\n' && c != ' ' && c != '\t') - empty = 0; - } - if(empty){ - so_puts(in_store, _("[ No description provided ]")); - so_puts(in_store, "\015\012"); - } - else { - for(j =0; vesy->description[i][j] != '\0'; j++){ - c = vesy->description[i][j]; - if(c == '\n'){ - so_puts(in_store, "\015\012"); - continue; + for(i = 0; vesy->description[i] != NULL; i++){ + so_puts(in_store, _("Description: ")); + /* Check if empty description */ + empty = 1; + for(j =0; empty == 1 && vesy->description[i][j] != '\0'; j++){ + c = vesy->description[i][j]; + if(c != '\n' && c != ' ' && c != '\t') + empty = 0; + } + if(empty){ + so_puts(in_store, _("[ No description provided ]")); + so_puts(in_store, "\015\012"); + } + else { + for(j =0; vesy->description[i][j] != '\0'; j++){ + c = vesy->description[i][j]; + if(c == '\n'){ + so_puts(in_store, "\015\012"); + continue; + } + so_writec(c, in_store); } - so_writec(c, in_store); - } - } - so_puts(in_store, "\015\012"); - } - } + } + so_puts(in_store, "\015\012"); + } + } - if(vesy->attendee){ - so_puts(in_store, "\015\012"); - so_puts(in_store, _("List of Attendees:")); - so_puts(in_store, "\015\012"); - for(i = 0; vesy->attendee[i] != NULL; i++){ - so_puts(in_store, vesy->attendee[i]); + if(vesy->attendee){ so_puts(in_store, "\015\012"); - } - } + so_puts(in_store, _("List of Attendees:")); + so_puts(in_store, "\015\012"); + for(i = 0; vesy->attendee[i] != NULL; i++){ + so_puts(in_store, vesy->attendee[i]); + so_puts(in_store, "\015\012"); + } + so_puts(in_store, "\015\012"); + } - so_puts(in_store, "\015\012\015\012"); + utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, + _("This event was tagged as a %s entry by the sender"), vesy->class); + so_puts(in_store, tmp_20k_buf); + so_puts(in_store, "\015\012\015\012"); + + if(depth < 0 && vesy->next){ + for(i = 0; i < ps_global->ttyo->screen_cols && i < 40; i++) + tmp_20k_buf[i] = '-'; + tmp_20k_buf[i]= '\0'; + so_puts(in_store, tmp_20k_buf); + so_puts(in_store, "\015\012"); + } + } /* end "for" loop */ do{ - if((out_store = so_get(CharStar, NULL, EDIT_ACCESS)) != NULL){ - so_seek(in_store, 0L, 0); + so_seek(in_store, 0L, 0); - init_handles(&handles); - gf_filter_init(); + init_handles(&handles); + gf_filter_init(); - if(F_ON(F_VIEW_SEL_URL, ps_global) + if(F_ON(F_VIEW_SEL_URL, ps_global) || F_ON(F_VIEW_SEL_URL_HOST, ps_global) || F_ON(F_SCAN_ADDR, ps_global)) gf_link_filter(gf_line_test, gf_line_test_opt(url_hilite, gf_url_hilite_opt(&uh,&handles,0))); - gf_link_filter(gf_wrap, + gf_link_filter(gf_wrap, gf_wrap_filter_opt(ps_global->ttyo->screen_cols - 4, ps_global->ttyo->screen_cols, NULL, 0, GFW_HANDLES)); - gf_link_filter(gf_nvtnl_local, NULL); + gf_link_filter(gf_nvtnl_local, NULL); - gf_set_so_readc(&gc, in_store); - gf_set_so_writec(&pc, out_store); + gf_set_so_readc(&gc, in_store); + gf_set_so_writec(&pc, out_store); - errstr = gf_pipe(gc, pc); + errstr = gf_pipe(gc, pc); - gf_clear_so_readc(in_store); - - if(!errstr){ - utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, - _("This event was tagged as a %s entry by the sender"), vesy->class); - errstr = format_editorial(tmp_20k_buf, ps_global->ttyo->screen_cols, 0, NULL, pc); - } + gf_clear_so_readc(in_store); - gf_clear_so_writec(out_store); + gf_clear_so_writec(out_store); - if(!errstr) - cmd = scroll_attachment(_("CALENDAR EVENT ATTACHMENT"), out_store, + if(!errstr) + cmd = scroll_attachment(_("CALENDAR EVENT ATTACHMENT"), out_store, CharStar, handles, a, flags | DA_RESIZE); - free_handles(&handles); - so_give(&out_store); - } - else - errstr = _("Error allocating space"); + free_handles(&handles); + so_give(&out_store); } while(!errstr && (cmd == MC_RESIZE || cmd == MC_FULLHDR)); if(errstr) q_status_message1(SM_ORDER | SM_DING, 3, 3, _("Can't format entry : %s"), errstr); - so_give(&in_store); + free_vevent_summary(&vsummary); + ps_global->mangled_screen = 1; +} + + +void +display_vcalendar_att(long int msgno, ATTACH_S *a, int flags) +{ + display_vevent_summary(msgno, a, flags, -1); } diff --git a/alpine/mailpart.h b/alpine/mailpart.h index 86906229..ee9e6382 100644 --- a/alpine/mailpart.h +++ b/alpine/mailpart.h @@ -21,7 +21,7 @@ #include "../pith/mailpart.h" #include "context.h" #include "../pith/state.h" - +#include "../pith/icaltype.h" #define DA_SAVE 0x01 /* flags used by display_attachment */ #define DA_FROM_VIEW 0x02 /* see mailpart.c */ @@ -34,6 +34,7 @@ void attachment_screen(struct pine *); void write_attachment(int, long, ATTACH_S *, char *); int write_attachment_to_file(MAILSTREAM *, long, ATTACH_S *, int, char *); int display_attachment(long, ATTACH_S *, int); +void display_vevent_summary(long, ATTACH_S *, int, int); int dispatch_attachment(ATTACH_S *); #ifdef _WINDOWS void display_att_window(ATTACH_S *); diff --git a/alpine/mailview.c b/alpine/mailview.c index 5a63e90a..b9e9650d 100644 --- a/alpine/mailview.c +++ b/alpine/mailview.c @@ -978,6 +978,12 @@ scroll_handle_launch(HANDLE_S *handle, int force) case Folder : break; + case iCal: + display_vevent_summary(mn_m2raw(ps_global->msgmap, mn_get_cur(ps_global->msgmap)), + handle->h.ical.attach, + DA_FROM_VIEW | DA_DIDPROMPT, handle->h.ical.depth); + break; + case Function : (*handle->h.func.f)(handle->h.func.args.stream, handle->h.func.args.msgmap, diff --git a/alpine/send.c b/alpine/send.c index 496824f4..4768a7e5 100644 --- a/alpine/send.c +++ b/alpine/send.c @@ -2168,9 +2168,12 @@ pine_send(ENVELOPE *outgoing, struct mail_bodystruct **body, *he = he_template[index]; pf->name = cpystr(pf_template[index].name); - if(index == N_SENDER && F_ON(F_USE_SENDER_NOT_X, ps_global)) + if(index == N_SENDER && F_ON(F_USE_SENDER_NOT_X, ps_global)){ /* slide string over so it is Sender instead of X-X-Sender */ - memmove(pf->name, pf->name+4, strlen(pf->name)-4+1); + for(p = pf->name+4; *p != '\0'; p++) + *(p-4) = *p; + *(p-4) = '\0'; + } pf->type = pf_template[index].type; pf->canedit = pf_template[index].canedit; pf->rcptto = pf_template[index].rcptto; diff --git a/imap/src/osdep/unix/ssl_unix.c b/imap/src/osdep/unix/ssl_unix.c index ea2df896..4c4d6ef8 100644 --- a/imap/src/osdep/unix/ssl_unix.c +++ b/imap/src/osdep/unix/ssl_unix.c @@ -404,14 +404,12 @@ static char *ssl_validate_cert (X509 *cert,char *host) "Server name does not match certificate"; /* if mismatch, see if in extensions */ if (ret && (ext = X509_get_ext_d2i (cert,NID_subject_alt_name,NIL,NIL)) && - (n = sk_GENERAL_NAME_num (ext))){ + (n = sk_GENERAL_NAME_num (ext))) /* older versions of OpenSSL use "ia5" instead of dNSName */ for (i = 0; ret && (i < n); i++) if ((name = sk_GENERAL_NAME_value (ext,i)) && (name->type = GEN_DNS) && (s = name->d.ia5->data) && ssl_compare_hostnames (host,s)) ret = NIL; - sk_GENERAL_NAME_pop_free(ext, GENERAL_NAME_free); - } } else ret = "Unable to locate common name in certificate"; return ret; diff --git a/pith/handle.h b/pith/handle.h index 265c4cc3..53878e45 100644 --- a/pith/handle.h +++ b/pith/handle.h @@ -22,7 +22,7 @@ #include "../pith/msgno.h" #include "../pith/atttype.h" #include "../pith/util.h" - +#include "../pith/icaltype.h" typedef struct screen_position_list { Pos where; @@ -35,7 +35,7 @@ typedef struct screen_position_list { */ typedef struct handle_s { int key; /* tag number embedded in text */ - enum {URL, Attach, Folder, Function, IMG} type; + enum {URL, iCal, Attach, Folder, Function, IMG} type; unsigned force_display:1; /* Don't ask before launching */ unsigned using_is_used:1; /* bit below is being used */ unsigned is_used:1; /* if not, remove it from list */ @@ -54,6 +54,10 @@ typedef struct handle_s { } img; /* stuff to describe img */ ATTACH_S *attach; /* Attachment struct for this handle */ struct { + ATTACH_S *attach; /* full Calendar entry */ + int depth; /* which event to display */ + } ical; + struct { int index; /* folder's place in context's list */ CONTEXT_S *context; /* description of folders */ } f; /* stuff to describe Folder handle */ diff --git a/pith/ical.c b/pith/ical.c index dee78f58..59e8c42c 100644 --- a/pith/ical.c +++ b/pith/ical.c @@ -381,6 +381,7 @@ ical_free_vevent(void **veventpv) ical_free_prop(&(*veventp)->prop, event_prop, EvUnknown); if((*veventp)->uk_prop) ical_free_gencline((void **) &(*veventp)->uk_prop); if((*veventp)->valarm) ical_free_valarm((void **) &(*veventp)->valarm); + if((*veventp)->next) ical_free_vevent((void **) &(*veventp)->next); fs_give(veventpv); } @@ -518,6 +519,10 @@ char *ical_unfold_line(char *line) j += 3; /* get past white space */ continue; } + case '\n': if(ical_wspace(line[j+1])){ + j += 2; /* get past white space */ + continue; + } default : line[i++] = line[j++]; } line[i] = '\0'; @@ -834,8 +839,17 @@ ical_parse_vcalendar(char **text) if(vcal->comp[ical_comp[i].pos] == NULL) vcal->comp[ical_comp[i].pos] = v; - else - (ical_comp[i].give)(&v); + else{ + if((vcal->method && vcal->method->value + && strucmp(vcal->method->value, "PUBLISH")) + || struncmp(ical_comp[i].comp, "VEVENT", 6)) + (ical_comp[i].give)(&v); + else{ + VEVENT_S *vevent = (VEVENT_S *) vcal->comp[VEvent]; + for(; vevent && vevent->next; vevent = vevent->next); + vevent->next = v; + } + } } else { v = (void *) ical_parse_unknown_comp(&s, 0); if(vcal->uk_comp == NULL) @@ -2154,7 +2168,7 @@ ical_get_tzid(ICAL_PARAMETER_S *param) VEVENT_SUMMARY_S * ical_vevent_summary(VCALENDAR_S *vcal) { - VEVENT_SUMMARY_S *rv; + VEVENT_SUMMARY_S *rv, *vsummary= NULL; ICLINE_S *method; VEVENT_S *vevent; GEN_ICLINE_S *gicl; @@ -2164,29 +2178,33 @@ ical_vevent_summary(VCALENDAR_S *vcal) if(vcal == NULL) return NULL; method = vcal->method; - vevent = (VEVENT_S *) vcal->comp[VEvent]; + vevent = (VEVENT_S *) vcal->comp[VEvent]; if(vevent == NULL || vevent->prop == NULL) return NULL; - rv = fs_get(sizeof(VEVENT_SUMMARY_S)); - memset((void *) rv, 0, sizeof(VEVENT_SUMMARY_S)); + for(vevent = (VEVENT_S *) vcal->comp[VEvent]; + vevent != NULL && vevent->prop != NULL; + vevent = vevent->next, rv = rv->next){ + + rv = fs_get(sizeof(VEVENT_SUMMARY_S)); + memset((void *) rv, 0, sizeof(VEVENT_SUMMARY_S)); - if(method != NULL && !strucmp(method->value, "CANCEL")) - rv->cancel++; + if(method != NULL && !strucmp(method->value, "CANCEL")) + rv->cancel++; - if((icl = (ICLINE_S *) vevent->prop[EvPriority]) != NULL) - rv->priority = atoi(icl->value); + if((icl = (ICLINE_S *) vevent->prop[EvPriority]) != NULL) + rv->priority = atoi(icl->value); - if((icl = (ICLINE_S *) vevent->prop[EvSummary]) != NULL) - rv->summary = cpystr(icl->value ? icl->value : _("No Summary")); + if((icl = (ICLINE_S *) vevent->prop[EvSummary]) != NULL) + rv->summary = cpystr(icl->value ? icl->value : _("No Summary")); - if((icl = (ICLINE_S *) vevent->prop[EvClass]) != NULL) - rv->class = cpystr(icl->value ? icl->value : _("PUBLIC")); - else - rv->class = cpystr(_("PUBLIC")); + if((icl = (ICLINE_S *) vevent->prop[EvClass]) != NULL) + rv->class = cpystr(icl->value ? icl->value : _("PUBLIC")); + else + rv->class = cpystr(_("PUBLIC")); - if((icl = (ICLINE_S *) vevent->prop[EvOrganizer]) != NULL){ + if((icl = (ICLINE_S *) vevent->prop[EvOrganizer]) != NULL){ char *cn, *sender, *address; ICAL_PARAMETER_S *param; @@ -2212,22 +2230,22 @@ ical_vevent_summary(VCALENDAR_S *vcal) address ? address : _("Unknown address")); rv->organizer = cpystr(tmp_20k_buf); } - } /* end of if(organizer) */ - - if((icl = (ICLINE_S *) vevent->prop[EvLocation]) != NULL) - rv->location = cpystr(icl->value ? icl->value : _("Location undisclosed")); - - if((icl = (ICLINE_S *) vevent->prop[EvDtstart]) != NULL){ - struct tm ic_date; - char tmp[200], *tzid; - int icd; /* ical date return value */ - - memset((void *)&ic_date, 0, sizeof(struct tm)); - icd = ical_parse_date(icl->value, &ic_date); - tzid = ical_get_tzid(icl->param); - if(icd >= 0){ - ic_date.tm_wday = ical_day_of_week(ic_date); - switch(icd){ + } /* end of if(organizer) */ + + if((icl = (ICLINE_S *) vevent->prop[EvLocation]) != NULL) + rv->location = cpystr(icl->value ? icl->value : _("Location undisclosed")); + + if((icl = (ICLINE_S *) vevent->prop[EvDtstart]) != NULL){ + struct tm ic_date; + char tmp[200], *tzid; + int icd; /* ical date return value */ + + memset((void *)&ic_date, 0, sizeof(struct tm)); + icd = ical_parse_date(icl->value, &ic_date); + tzid = ical_get_tzid(icl->param); + if(icd >= 0){ + ic_date.tm_wday = ical_day_of_week(ic_date); + switch(icd){ case 0: /* DATE-TIME */ ical_date_time(tmp, sizeof(tmp), &ic_date); break; @@ -2239,129 +2257,129 @@ ical_vevent_summary(VCALENDAR_S *vcal) break; default: alpine_panic("Unhandled ical date format"); break; - } - } - else{ - strncpy(tmp, _("Error while parsing event date"), sizeof(tmp)); - tmp[sizeof(tmp) - 1] = '\0'; - } + } + } + else{ + strncpy(tmp, _("Error while parsing event date"), sizeof(tmp)); + tmp[sizeof(tmp) - 1] = '\0'; + } - if(icl->value == NULL) - rv->evstart = cpystr(_("Unknown Start Date")); - else{ - size_t len = strlen(tmp) + 1; + if(icl->value == NULL) + rv->evstart = cpystr(_("Unknown Start Date")); + else{ + size_t len = strlen(tmp) + 1; - if(tzid != NULL) - len += strlen(tzid) + 3; /* 3 = strlen(" ()") */ + if(tzid != NULL) + len += strlen(tzid) + 3; /* 3 = strlen(" ()") */ - rv->evstart = fs_get(len*sizeof(char)); - snprintf(rv->evstart, len, "%s%s%s%s", tmp, + rv->evstart = fs_get(len*sizeof(char)); + snprintf(rv->evstart, len, "%s%s%s%s", tmp, tzid != NULL ? " (" : "", tzid != NULL ? tzid : "", tzid != NULL ? ")" : ""); - rv->evstart[len-1] = '\0'; - } - if(tzid) - fs_give((void **)&tzid); - } /* end of if dtstart */ - - if((icl = (ICLINE_S *) vevent->prop[EvDuration]) != NULL){ - int i, done = 0; - ICAL_DURATION_S ic_d, icd2; - if(ical_parse_duration(icl->value, &ic_d) == 0){ - char tmp[MAILTMPLEN+1]; - - for(i = 1, icd2 = ic_d; icd2.next != NULL; icd2 = *icd2.next, i++); - rv->duration = fs_get((i+1)*sizeof(char *)); - i = 0; - - do { - tmp[0] = '\0'; - - if(ic_d.weeks > 0) - utf8_snprintf(tmp+strlen(tmp), MAILTMPLEN - strlen(tmp), + rv->evstart[len-1] = '\0'; + } + if(tzid) + fs_give((void **)&tzid); + } /* end of if dtstart */ + + if((icl = (ICLINE_S *) vevent->prop[EvDuration]) != NULL){ + int i, done = 0; + ICAL_DURATION_S ic_d, icd2; + if(ical_parse_duration(icl->value, &ic_d) == 0){ + char tmp[MAILTMPLEN+1]; + + for(i = 1, icd2 = ic_d; icd2.next != NULL; icd2 = *icd2.next, i++); + rv->duration = fs_get((i+1)*sizeof(char *)); + i = 0; + + do { + tmp[0] = '\0'; + + if(ic_d.weeks > 0) + utf8_snprintf(tmp+strlen(tmp), MAILTMPLEN - strlen(tmp), "%d %s ", ic_d.weeks, ic_d.weeks == 1 ? _("week") : _("weeks")); - if(ic_d.days > 0) - utf8_snprintf(tmp+strlen(tmp), MAILTMPLEN - strlen(tmp), + if(ic_d.days > 0) + utf8_snprintf(tmp+strlen(tmp), MAILTMPLEN - strlen(tmp), "%d %s ", ic_d.days, ic_d.days == 1 ? _("day") : _("days")); - if(ic_d.hours > 0) - utf8_snprintf(tmp+strlen(tmp), MAILTMPLEN - strlen(tmp), + if(ic_d.hours > 0) + utf8_snprintf(tmp+strlen(tmp), MAILTMPLEN - strlen(tmp), "%d %s ", ic_d.hours, ic_d.hours == 1 ? _("hour") : _("hours")); - if(ic_d.minutes > 0) - utf8_snprintf(tmp+strlen(tmp), MAILTMPLEN - strlen(tmp), + if(ic_d.minutes > 0) + utf8_snprintf(tmp+strlen(tmp), MAILTMPLEN - strlen(tmp), "%d %s ", ic_d.minutes, ic_d.minutes == 1 ? _("minute") : _("minutes")); - if(ic_d.seconds > 0) - utf8_snprintf(tmp+strlen(tmp), MAILTMPLEN - strlen(tmp), + if(ic_d.seconds > 0) + utf8_snprintf(tmp+strlen(tmp), MAILTMPLEN - strlen(tmp), "%d %s ", ic_d.seconds, ic_d.seconds == 1 ? _("second") : _("seconds")); - tmp[MAILTMPLEN] = '\0'; - rv->duration[i++] = cpystr(tmp); - - if(ic_d.next != NULL) - ic_d = *ic_d.next; - else - done++; - } while (done == 0); - rv->duration[i] = NULL; - } - } /* end of DURATION */ - else if((icl = (ICLINE_S *) vevent->prop[EvDtend]) != NULL){ - struct tm ic_date; - char tmp[200], *tzid; - int icd; - - memset((void *)&ic_date, 0, sizeof(struct tm)); - icd = ical_parse_date(icl->value, &ic_date); - tzid = ical_get_tzid(icl->param); - if(icd >= 0){ - ic_date.tm_wday = ical_day_of_week(ic_date); - switch(icd){ - case 0: /* DATE-TIME */ - ical_date_time(tmp, sizeof(tmp), &ic_date); - break; - case 1: /* DATE */ - our_strftime(tmp, sizeof(tmp), "%a %x", &ic_date); - break; - case 2: /* DATE-TIME in GMT, Bug: add adjust to time zone */ - our_strftime(tmp, sizeof(tmp), "%a %x %I:%M %p", &ic_date); - break; - default: alpine_panic("Unhandled ical date format"); - break; - } - } - else{ - strncpy(tmp, _("Error while parsing event date"), sizeof(tmp)); - tmp[sizeof(tmp) - 1] = '\0'; - } + tmp[MAILTMPLEN] = '\0'; + rv->duration[i++] = cpystr(tmp); + + if(ic_d.next != NULL) + ic_d = *ic_d.next; + else + done++; + } while (done == 0); + rv->duration[i] = NULL; + } + } /* end of DURATION */ + else if((icl = (ICLINE_S *) vevent->prop[EvDtend]) != NULL){ + struct tm ic_date; + char tmp[200], *tzid; + int icd; + + memset((void *)&ic_date, 0, sizeof(struct tm)); + icd = ical_parse_date(icl->value, &ic_date); + tzid = ical_get_tzid(icl->param); + if(icd >= 0){ + ic_date.tm_wday = ical_day_of_week(ic_date); + switch(icd){ + case 0: /* DATE-TIME */ + ical_date_time(tmp, sizeof(tmp), &ic_date); + break; + case 1: /* DATE */ + our_strftime(tmp, sizeof(tmp), "%a %x", &ic_date); + break; + case 2: /* DATE-TIME in GMT, Bug: add adjust to time zone */ + our_strftime(tmp, sizeof(tmp), "%a %x %I:%M %p", &ic_date); + break; + default: alpine_panic("Unhandled ical date format"); + break; + } + } + else{ + strncpy(tmp, _("Error while parsing event date"), sizeof(tmp)); + tmp[sizeof(tmp) - 1] = '\0'; + } - if(icl->value == NULL) - rv->evend = cpystr(_("Unknown End Date")); - else{ - size_t len = strlen(tmp) + 1; + if(icl->value == NULL) + rv->evend = cpystr(_("Unknown End Date")); + else{ + size_t len = strlen(tmp) + 1; - if(tzid != NULL) - len += strlen(tzid) + 3; /* 3 = strlen(" ()") */ + if(tzid != NULL) + len += strlen(tzid) + 3; /* 3 = strlen(" ()") */ - rv->evend = fs_get(len*sizeof(char)); - snprintf(rv->evend, len, "%s%s%s%s", tmp, + rv->evend = fs_get(len*sizeof(char)); + snprintf(rv->evend, len, "%s%s%s%s", tmp, tzid != NULL ? " (" : "", tzid != NULL ? tzid : "", tzid != NULL ? ")" : ""); - rv->evend[len-1] = '\0'; - } - if(tzid) - fs_give((void **)&tzid); - } /* end of if dtend */ - - if((icl = (ICLINE_S *) vevent->prop[EvDtstamp]) != NULL){ - struct tm ic_date; - char tmp[200], *tzid; - int icd; - - memset((void *)&ic_date, 0, sizeof(struct tm)); - icd = ical_parse_date(icl->value, &ic_date); - tzid = ical_get_tzid(icl->param); - if(icd >= 0){ + rv->evend[len-1] = '\0'; + } + if(tzid) + fs_give((void **)&tzid); + } /* end of if dtend */ + + if((icl = (ICLINE_S *) vevent->prop[EvDtstamp]) != NULL){ + struct tm ic_date; + char tmp[200], *tzid; + int icd; + + memset((void *)&ic_date, 0, sizeof(struct tm)); + icd = ical_parse_date(icl->value, &ic_date); + tzid = ical_get_tzid(icl->param); + if(icd >= 0){ ic_date.tm_wday = ical_day_of_week(ic_date); switch(icd){ case 0: /* DATE-TIME */ @@ -2376,29 +2394,29 @@ ical_vevent_summary(VCALENDAR_S *vcal) default: alpine_panic("Unhandled ical date format"); break; } - } - else{ + } + else{ strncpy(tmp, _("Error while parsing event date"), sizeof(tmp)); tmp[sizeof(tmp) - 1] = '\0'; - } - if(icl->value == NULL) - rv->dtstamp = cpystr(_("Unknown when event was scheduled")); - else{ - size_t len = strlen(tmp) + 1; + } + if(icl->value == NULL) + rv->dtstamp = cpystr(_("Unknown when event was scheduled")); + else{ + size_t len = strlen(tmp) + 1; - if(tzid != NULL) + if(tzid != NULL) len += strlen(tzid) + 3; /* 3 = strlen(" ()") */ - rv->dtstamp = fs_get(len*sizeof(char)); - snprintf(rv->dtstamp, len, "%s%s%s%s", tmp, + rv->dtstamp = fs_get(len*sizeof(char)); + snprintf(rv->dtstamp, len, "%s%s%s%s", tmp, tzid != NULL ? " (" : "", tzid != NULL ? tzid : "", tzid != NULL ? ")" : ""); - rv->dtstamp[len-1] = '\0'; - } - } /* end of if dtstamp */ + rv->dtstamp[len-1] = '\0'; + } + } /* end of if dtstamp */ - if((gicl = (GEN_ICLINE_S *) vevent->prop[EvAttendee]) != NULL){ + if((gicl = (GEN_ICLINE_S *) vevent->prop[EvAttendee]) != NULL){ int nattendees, i; for(nattendees = 0; gicl != NULL; gicl = gicl->next, nattendees++); @@ -2459,15 +2477,15 @@ ical_vevent_summary(VCALENDAR_S *vcal) rv->attendee[i] = cpystr(tmp_20k_buf); } rv->attendee[i] = NULL; - } /* end of ATTENDEES */ + } /* end of ATTENDEES */ - if((icl = (ICLINE_S *) vevent->prop[EvDescription]) != NULL){ + if((icl = (ICLINE_S *) vevent->prop[EvDescription]) != NULL){ char *s, *t, *u, *v; int i, escaped; if(icl->value == NULL){ free_vevent_summary(&rv); - return NULL; + return vsummary; } v = cpystr(icl->value); /* process a copy of icl->value */ @@ -2478,7 +2496,7 @@ ical_vevent_summary(VCALENDAR_S *vcal) if(!(*s == '\\' || *s == ',' || *s == 'n' || *s == 'N' || *s == ';')){ free_vevent_summary(&rv); fs_give((void **)&v); - return NULL; + return vsummary; } escaped = 0; continue; @@ -2519,9 +2537,17 @@ ical_vevent_summary(VCALENDAR_S *vcal) rv->description[i++] = cpystr(ical_decode(s, vcal->encoding)); rv->description[i] = NULL; fs_give((void **)&v); - } /* end of if(description) */ - - return rv; + } /* end of if(description) */ + /* last instruction of the loop */ + if(vsummary == NULL) + vsummary = rv; + else{ + VEVENT_SUMMARY_S *vesy; + for(vesy = vsummary; vesy && vesy->next; vesy = vesy->next); + vesy->next = rv; + } + } /* end of "for" loop */ + return vsummary; } void @@ -2553,6 +2579,7 @@ free_vevent_summary(VEVENT_SUMMARY_S **vesy) fs_give((void **) &(*vesy)->description[i]); fs_give((void **) &(*vesy)->description); } + if((*vesy)->next) free_vevent_summary(&(*vesy)->next); fs_give((void **) vesy); } diff --git a/pith/icaltype.h b/pith/icaltype.h index d0670037..0ccea92d 100644 --- a/pith/icaltype.h +++ b/pith/icaltype.h @@ -129,7 +129,8 @@ typedef struct vevent_s { #endif /* if 0 */ void **prop; /* the properties of an event component */ GEN_ICLINE_S *uk_prop; /* unknown values */ - VALARM_S *valarm; /* possible valarm */ + VALARM_S *valarm; /* possible valarm */ + struct vevent_s *next; /* calendar of method publish has many events */ } VEVENT_S; typedef struct vtodo_s { @@ -443,6 +444,7 @@ typedef struct vevent_summary_s { char **duration; char **attendee; unsigned char **description; + struct vevent_summary_s *next; } VEVENT_SUMMARY_S; typedef enum {VCalendar = 0, VTimeZone, VEvent, VTodo, VJournal, diff --git a/pith/mailview.c b/pith/mailview.c index 39fcfff6..c438371c 100644 --- a/pith/mailview.c +++ b/pith/mailview.c @@ -224,90 +224,90 @@ void format_calendar_vevent(VCALENDAR_S *vcal, ATTACH_S *a, HANDLE_S **handlesp, int flgs, int width, gf_io_t pc, int cflags) { int avail, m1, m2, hwid, i, partwid, padwid; - int s1, s2, dwid; + int s1, s2, dwid, minkey; int *margin; char padding[1024]; - VEVENT_SUMMARY_S *vesy; /* vevent summary */ + VEVENT_SUMMARY_S *vesy, *vesummary; /* vevent summary */ - vesy = ical_vevent_summary(vcal); + vesummary = vesy = ical_vevent_summary(vcal); if(vesy == NULL) return; if((cflags & FC_SUMMARY) && (cflags & FC_FULL)) cflags |= ~FC_FULL; - avail = width; - margin = (cflags & FC_FULL) ? NULL + minkey = -1; /* initialize to something negative */ + + for(; vesy != NULL ; vesy = vesy->next){ + avail = width; + margin = (cflags & FC_FULL) ? NULL : (flgs & FM_NOINDENT) ? NULL : format_view_margin(); - m1 = MAX(MIN(margin ? margin[0] : 0, avail), 0); - avail -= m1; + m1 = MAX(MIN(margin ? margin[0] : 0, avail), 0); + avail -= m1; - m2 = MAX(MIN(margin ? margin[1] : 0, avail), 0); - avail -= m2; + m2 = MAX(MIN(margin ? margin[1] : 0, avail), 0); + avail -= m2; - hwid = MAX(avail, 0); - padwid = 0; + hwid = MAX(avail, 0); + padwid = 0; - if(ps_global->atmts[1].description == NULL){ -// && (!ps_global->atmts[0].body -// || (ps_global->atmts[0].body->type == TYPETEXT))){ - avail = width - m1 -2; + if(ps_global->atmts[1].description == NULL){ + avail = width - m1 -2; - dwid = MAX(MIN(40, avail), 0); + dwid = MAX(MIN(40, avail), 0); - snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%*.*s%s", m1, m1, "", + snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%*.*s%s", m1, m1, "", repeat_char(dwid, '-')); - if(!gf_puts(tmp_20k_buf, pc) || !gf_puts(NEWLINE, pc)) + if(!gf_puts(tmp_20k_buf, pc) || !gf_puts(NEWLINE, pc)) return; - } + } - if(cflags & FC_SUMMARY){ - i = utf8_width(_("Calendar Entry:")); - partwid = MIN(i, hwid); - if(m1 > 0){ + if(cflags & FC_SUMMARY){ + i = utf8_width(_("Calendar Entry:")); + partwid = MIN(i, hwid); + if(m1 > 0){ snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%*.*s", m1, m1, ""); if(!gf_puts(tmp_20k_buf, pc)) return; - } + } - utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%-*.*w%*.*s", + utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%-*.*w%*.*s", partwid, partwid, _("Calendar Entry:"), padwid, padwid, ""); if(!gf_puts(tmp_20k_buf, pc) || !gf_puts(NEWLINE, pc)) return; - } - else - partwid = 0; - - if(m1 > 0){ - snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%*.*s", m1, m1, ""); - if(!gf_puts(tmp_20k_buf, pc)) - return; - } + } + else + partwid = 0; - avail = width - m1 - m2; + if(m1 > 0){ + snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%*.*s", m1, m1, ""); + if(!gf_puts(tmp_20k_buf, pc)) + return; + } - s1 = MAX(MIN(1, avail), 0); - avail -= s1; + avail = width - m1 - m2; - dwid = MAX(MIN(1, avail), 0); - avail -= dwid; + s1 = MAX(MIN(1, avail), 0); + avail -= s1; - s2 = MAX(MIN(1, avail), 0); - avail -= s2; + dwid = MAX(MIN(1, avail), 0); + avail -= dwid; + s2 = MAX(MIN(1, avail), 0); + avail -= s2; - if(cflags & FC_SUMMARY) - utf8_snprintf(padding, sizeof(padding), "%*.*s%*.*w%*.*s", + if(cflags & FC_SUMMARY) + utf8_snprintf(padding, sizeof(padding), "%*.*s%*.*w%*.*s", s1, s1, "", dwid, dwid, "", s2, s2, ""); - else - padding[0] = '\0'; + else + padding[0] = '\0'; - if(vesy->cancel){ + if(vesy->cancel){ utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s", padding, _("This event was cancelled!")); if((*pc)(TAG_EMBED) && (*pc)(TAG_BOLDON)){ @@ -316,60 +316,60 @@ format_calendar_vevent(VCALENDAR_S *vcal, ATTACH_S *a, HANDLE_S **handlesp, int (*pc)(TAG_EMBED); (*pc)(TAG_BOLDOFF); } - } + } - if(vesy->organizer){ - if(vesy->sender != NULL){ - utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s%s", + if(vesy->organizer){ + if(vesy->sender != NULL){ + utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s%s", padding, _("Sent-by: "), vesy->sender); - gf_puts(tmp_20k_buf, pc); - gf_puts(NEWLINE, pc); - } - - utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s%s", - padding, _("Organizer: "), vesy->organizer); - gf_puts(tmp_20k_buf, pc); - gf_puts(NEWLINE, pc); - } /* end of if(organizer) */ - - if(vesy->location){ - ical_remove_escapes(&vesy->location); - utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s%s", + gf_puts(tmp_20k_buf, pc); + gf_puts(NEWLINE, pc); + } + + utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s%s", + padding, _("Organizer: "), vesy->organizer); + gf_puts(tmp_20k_buf, pc); + gf_puts(NEWLINE, pc); + } /* end of if(organizer) */ + + if(vesy->location){ + ical_remove_escapes(&vesy->location); + utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s%s", padding, _("Location: "), vesy->location); - gf_puts(tmp_20k_buf, pc); - gf_puts(NEWLINE, pc); - } /* end of if location */ + gf_puts(tmp_20k_buf, pc); + gf_puts(NEWLINE, pc); + } /* end of if location */ - if(vesy->evstart){ - utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s%s", + if(vesy->evstart){ + utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s%s", padding, _("Start Date: "), vesy->evstart); - gf_puts(tmp_20k_buf, pc); - gf_puts(NEWLINE, pc); - } /* end of if dtstart */ + gf_puts(tmp_20k_buf, pc); + gf_puts(NEWLINE, pc); + } /* end of if dtstart */ - if(vesy->duration){ - int i; + if(vesy->duration){ + int i; - for(i = 0; vesy->duration[i] != NULL; i++){ + for(i = 0; vesy->duration[i] != NULL; i++){ utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s%s", padding, _("Duration: "), vesy->duration[i]); gf_puts(tmp_20k_buf, pc); gf_puts(NEWLINE, pc); - } - } /* end of DURATION */ - else if(vesy->evend){ + } + } /* end of DURATION */ + else if(vesy->evend){ utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s%s", padding, _("End Date: "), vesy->evend); gf_puts(tmp_20k_buf, pc); gf_puts(NEWLINE, pc); - } else { /* end of if dtend */ + } else { /* end of if dtend */ utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%s%s", padding, _("No duration nor end time found for this event")); gf_puts(tmp_20k_buf, pc); gf_puts(NEWLINE, pc); - } /* end of else for if (duration) and if (dtend) */ + } /* end of else for if (duration) and if (dtend) */ - if(vesy->attendee){ + if(vesy->attendee){ #define MAX_DISPLAYED 3 int i; @@ -383,109 +383,114 @@ format_calendar_vevent(VCALENDAR_S *vcal, ATTACH_S *a, HANDLE_S **handlesp, int gf_puts(tmp_20k_buf, pc); gf_puts(NEWLINE, pc); } - if(cflags & FC_SUMMARY){ - COLOR_PAIR *lastc = NULL; - char numbuf[50]; - int thisdescwid; - COLOR_PAIR *hdrcolor = NULL; + } /* end of ATTENDEES */ - if((flgs & FM_DISPLAY) - && !(flgs & FM_NOCOLOR) - && pico_usingcolor() - && ps_global->VAR_HEADER_GENERAL_FORE_COLOR - && ps_global->VAR_HEADER_GENERAL_BACK_COLOR - && ps_global->VAR_NORM_FORE_COLOR - && ps_global->VAR_NORM_BACK_COLOR - && (colorcmp(ps_global->VAR_HEADER_GENERAL_FORE_COLOR, + + if(cflags & FC_SUMMARY){ + COLOR_PAIR *lastc = NULL; + char numbuf[50]; + int thisdescwid; + COLOR_PAIR *hdrcolor = NULL; + + if((flgs & FM_DISPLAY) + && !(flgs & FM_NOCOLOR) + && pico_usingcolor() + && ps_global->VAR_HEADER_GENERAL_FORE_COLOR + && ps_global->VAR_HEADER_GENERAL_BACK_COLOR + && ps_global->VAR_NORM_FORE_COLOR + && ps_global->VAR_NORM_BACK_COLOR + && (colorcmp(ps_global->VAR_HEADER_GENERAL_FORE_COLOR, ps_global->VAR_NORM_FORE_COLOR) || colorcmp(ps_global->VAR_HEADER_GENERAL_BACK_COLOR, - ps_global->VAR_NORM_BACK_COLOR))){ + ps_global->VAR_NORM_BACK_COLOR))){ - if((hdrcolor = new_color_pair(ps_global->VAR_HEADER_GENERAL_FORE_COLOR, + if((hdrcolor = new_color_pair(ps_global->VAR_HEADER_GENERAL_FORE_COLOR, ps_global->VAR_HEADER_GENERAL_BACK_COLOR)) != NULL){ - if(!pico_is_good_colorpair(hdrcolor)) - free_color_pair(&hdrcolor); - } + if(!pico_is_good_colorpair(hdrcolor)) + free_color_pair(&hdrcolor); } + } - if(!(!hdrcolor || embed_color(hdrcolor, pc))) - return; - - gf_puts(padding, pc); - utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "[%s]", _("More Details")); - - if(handlesp){ - char buf[16], color[64]; - int l; - HANDLE_S *h; - - h = new_handle(handlesp); - h->type = Attach; - h->h.attach = a; - - snprintf(buf, sizeof(buf), "%d", h->key); - buf[sizeof(buf)-1] = '\0'; - - if(!(flgs & FM_NOCOLOR) - && handle_start_color(color, sizeof(color), &l, 1)){ - lastc = get_cur_embedded_color(); - if(!gf_nputs(color, (long) l, pc)) - return; - } - else if(F_OFF(F_SLCTBL_ITEM_NOBOLD, ps_global) + if(!(!hdrcolor || embed_color(hdrcolor, pc))) + return; + + gf_puts(padding, pc); + utf8_snprintf(tmp_20k_buf, SIZEOF_20KBUF, "[%s]", _("More Details")); + + if(handlesp){ + char buf[16], color[64]; + int l; + HANDLE_S *h; + + h = new_handle(handlesp); + if(minkey < 0) minkey = h->key; + h->type = iCal; + h->h.ical.attach = a; + h->h.ical.depth = h->key - minkey; + + snprintf(buf, sizeof(buf), "%d", h->key); + buf[sizeof(buf)-1] = '\0'; + + if(!(flgs & FM_NOCOLOR) + && handle_start_color(color, sizeof(color), &l, 1)){ + lastc = get_cur_embedded_color(); + if(!gf_nputs(color, (long) l, pc)) + return; + } + else if(F_OFF(F_SLCTBL_ITEM_NOBOLD, ps_global) && (!((*pc)(TAG_EMBED) && (*pc)(TAG_BOLDON)))) return; - if(!((*pc)(TAG_EMBED) && (*pc)(TAG_HANDLE) + if(!((*pc)(TAG_EMBED) && (*pc)(TAG_HANDLE) && (*pc)(strlen(buf)) && gf_puts(buf, pc))) return; - } else - tmp_20k_buf[0] = '\0'; - - if(!format_env_puts(tmp_20k_buf, pc)) - return; - - if(handlesp){ - if(lastc){ - if(F_OFF(F_SLCTBL_ITEM_NOBOLD, ps_global)){ - if(!((*pc)(TAG_EMBED) && (*pc)(TAG_BOLDOFF))) - return; - } + } else + tmp_20k_buf[0] = '\0'; - if(!embed_color(lastc, pc)) - return; + if(!format_env_puts(tmp_20k_buf, pc)) + return; - free_color_pair(&lastc); - } - else if(!((*pc)(TAG_EMBED) && (*pc)(TAG_BOLDOFF))) - return; + if(handlesp){ + if(lastc){ + if(F_OFF(F_SLCTBL_ITEM_NOBOLD, ps_global)){ + if(!((*pc)(TAG_EMBED) && (*pc)(TAG_BOLDOFF))) + return; + } - if(!((*pc)(TAG_EMBED) && (*pc)(TAG_INVOFF))) - return; - } + if(!embed_color(lastc, pc)) + return; - if(padwid > 0){ - snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%*.*s", padwid, padwid, ""); - if(!gf_puts(tmp_20k_buf, pc)) + free_color_pair(&lastc); + } + else if(!((*pc)(TAG_EMBED) && (*pc)(TAG_BOLDOFF))) return; - } - if(!gf_puts(NEWLINE, pc)) + if(!((*pc)(TAG_EMBED) && (*pc)(TAG_INVOFF))) return; } - } /* end of ATTENDEES */ - free_vevent_summary(&vesy); + if(padwid > 0){ + snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%*.*s", padwid, padwid, ""); + if(!gf_puts(tmp_20k_buf, pc)) + return; + } - avail = width - m1 -2; + if(!gf_puts(NEWLINE, pc)) + return; + } + avail = width - m1 -2; - dwid = MAX(MIN(40, avail), 0); - avail -= dwid; + dwid = MAX(MIN(40, avail), 0); + avail -= dwid; - snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%*.*s%s", m1, m1, "", + snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%*.*s%s", m1, m1, "", repeat_char(dwid, '-')); - gf_puts(tmp_20k_buf, pc); + gf_puts(tmp_20k_buf, pc); + if(vesy->next) + gf_puts(NEWLINE, pc); + } + free_vevent_summary(&vesummary); } int diff --git a/pith/send.c b/pith/send.c index 8be908c2..460f6a24 100644 --- a/pith/send.c +++ b/pith/send.c @@ -1226,10 +1226,12 @@ pine_new_env(ENVELOPE *outgoing, char **fccp, char ***tobufpp, PINEFIELD *custom for(i=0; i < stdcnt; i++, pf++){ pf->name = cpystr(pf_template[i].name); - if(i == N_SENDER && F_ON(F_USE_SENDER_NOT_X, ps_global)) + if(i == N_SENDER && F_ON(F_USE_SENDER_NOT_X, ps_global)){ /* slide string over so it is Sender instead of X-X-Sender */ - for(p=pf->name; *(p+1); p++) - *p = *(p+4); + for(p=pf->name+4; *p != '\0'; p++) + *(p-4) = *p; + *(p-4) = '\0'; + } pf->type = pf_template[i].type; pf->canedit = pf_template[i].canedit; @@ -4279,7 +4281,6 @@ pine_rfc822_output_body(struct mail_bodystruct *body, soutr_t f, void *s) int add_trailing_crlf; LOC_2022_JP ljp; gf_io_t gc; - void *table = NULL; dprint((4, "-- pine_rfc822_output_body: %d\n", body ? body->type : 0)); @@ -4364,7 +4365,7 @@ pine_rfc822_output_body(struct mail_bodystruct *body, soutr_t f, void *s) gf_line_test_opt(translate_utf8_to_2022_jp,&ljp)); } else{ - table = utf8_rmap(charset); + void *table = utf8_rmap(charset); if(table){ gf_link_filter(gf_convert_utf8_charset, @@ -4411,9 +4412,6 @@ pine_rfc822_output_body(struct mail_bodystruct *body, soutr_t f, void *s) display_message('x'); } - if(table) - fs_give((void **)&table); - gf_clear_so_readc(bodyso); if(encode_error || !l_flush_net(TRUE)) |