diff options
-rw-r--r-- | pith/ical.c | 21 | ||||
-rw-r--r-- | pith/icaltype.h | 1 | ||||
-rw-r--r-- | pith/mailview.c | 40 | ||||
-rw-r--r-- | pith/pine.hlp | 2 |
4 files changed, 47 insertions, 17 deletions
diff --git a/pith/ical.c b/pith/ical.c index b3fe67e2..75212514 100644 --- a/pith/ical.c +++ b/pith/ical.c @@ -37,6 +37,7 @@ ICLINE_S *ical_cline_cpy(ICLINE_S *); ICAL_PARAMETER_S *ical_parameter_cpy(ICAL_PARAMETER_S *param); char *ical_get_value(char **); +char *ical_decode(char *, unsigned short); /* pase component */ void *ical_parse_vcalendar(char **); @@ -231,6 +232,19 @@ ICAL_PROP_S alarm_prop[] = { /* Finally, here begins the code. */ +char * +ical_decode(char *text, unsigned short encoding) +{ + char *t; + unsigned long callen; + if(encoding == ENCQUOTEDPRINTABLE){ + t = rfc822_qprint ((unsigned char *) text,strlen(text),&callen); + strncpy(text, t, strlen(t)); + } + return text; +} + + /* Return code: 0 - if no errors -1 - if an error occured @@ -1965,6 +1979,7 @@ ical_vevent_summary(VCALENDAR_S *vcal) VEVENT_S *vevent; GEN_ICLINE_S *gicl; ICLINE_S *icl; + char *k; if(vcal == NULL) return NULL; @@ -2170,7 +2185,7 @@ ical_vevent_summary(VCALENDAR_S *vcal) role && *role ? role : "", role && *role ? " " : "", partstat ? partstat : _("[Unknown Reply]"), - partstat ? " " : "", + " ", cn && *cn ? cn : "", cn && *cn ? " " : "", mailto ? mailto : _("Unknown address")); @@ -2228,13 +2243,13 @@ ical_vevent_summary(VCALENDAR_S *vcal) } if(*t == ','){ *u = '\0'; - rv->description[i++] = cpystr(s); + rv->description[i++] = cpystr(ical_decode(s, vcal->encoding)); s = u = t+1; } else *u++ = *t; } *u = '\0'; - rv->description[i++] = cpystr(s); + rv->description[i++] = cpystr(ical_decode(s, vcal->encoding)); rv->description[i] = NULL; fs_give((void **)&v); } /* end of if(description) */ diff --git a/pith/icaltype.h b/pith/icaltype.h index 0474464f..8060a412 100644 --- a/pith/icaltype.h +++ b/pith/icaltype.h @@ -248,6 +248,7 @@ typedef struct vcalendar_s { GEN_ICLINE_S *uk_prop;/* in case there is an unknown property */ void **comp; /* an array with the components of a calendar */ ICAL_S *uk_comp; /* in case there is an unknown component */ + unsigned short encoding; /* save the original encoding. */ } VCALENDAR_S; diff --git a/pith/mailview.c b/pith/mailview.c index dcdd183d..984b560f 100644 --- a/pith/mailview.c +++ b/pith/mailview.c @@ -464,13 +464,13 @@ format_calendar_vevent(VCALENDAR_S *vcal, ATTACH_S *a, HANDLE_S **handlesp, int snprintf(tmp_20k_buf, SIZEOF_20KBUF, "%*.*s%s", m1, m1, "", repeat_char(dwid, '-')); gf_puts(tmp_20k_buf, pc); - gf_puts(NEWLINE, pc); +// gf_puts(NEWLINE, pc); } int format_calendar(long int msgno, BODY *body, HANDLE_S **handlesp, int flgs, int width, gf_io_t pc) { - char *b64text, *caltext; + char *rawtext, *caltext; unsigned long callen; VCALENDAR_S *vcal = NULL; ATTACH_S *a; @@ -490,20 +490,34 @@ format_calendar(long int msgno, BODY *body, HANDLE_S **handlesp, int flgs, int w continue; } if(b->sparep == NULL){ - b64text = mail_fetch_body(ps_global->mail_stream, msgno, a->number, &callen, 0); - if(b64text == NULL){ - gf_puts(_("Error fetching calendar text"), pc); - gf_puts(NEWLINE, pc); - continue; + rawtext = mail_fetch_body(ps_global->mail_stream, msgno, a->number, &callen, 0); + if(rawtext == NULL){ + gf_puts(_("Error fetching calendar text"), pc); + gf_puts(NEWLINE, pc); + continue; } - b64text[callen] = '\0'; /* chop off cookie */ - caltext = rfc822_base64(b64text, strlen(b64text), &callen); - if(caltext == NULL){ - gf_puts(_("Error in calendar base64 encoding"), pc); - gf_puts(NEWLINE, pc); - continue; + rawtext[callen] = '\0'; /* chop off cookie */ + switch(b->encoding){ + case ENCBASE64: + caltext = rfc822_base64(rawtext, strlen(rawtext), &callen); + if(caltext == NULL){ + gf_puts(_("Error in calendar base64 encoding"), pc); + gf_puts(NEWLINE, pc); + continue; + } + break; + + case ENCQUOTEDPRINTABLE: + caltext = rfc822_qprint ((unsigned char *) rawtext,strlen(rawtext),&callen); + if(caltext == NULL){ + gf_puts(_("Error in calendar quoted printable encoding"), pc); + gf_puts(NEWLINE, pc); + continue; + } + break; } vcal = ical_parse_text(caltext); + if(vcal != NULL) vcal->encoding = b->encoding; b->sparep = create_body_sparep(iCalType, (void *) vcal); } else if(get_body_sparep_type(b->sparep) == iCalType) diff --git a/pith/pine.hlp b/pith/pine.hlp index ef58c44d..79cb3c9f 100644 --- a/pith/pine.hlp +++ b/pith/pine.hlp @@ -140,7 +140,7 @@ with help text for the config screen and the composer that didn't have any reasonable place to be called from. Dummy change to get revision in pine.hlp ============= h_revision ================= -Alpine Commit 243 2017-12-22 22:31:03 +Alpine Commit 244 2017-12-24 19:13:32 ============= h_news ================= <HTML> <HEAD> |