X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fcalendar.c;h=48a0f1fc793461630d2a70e8d70a03643e94f9c4;hb=c1bfa993f32198515f9994cde602f7bcd4da35d8;hp=8b95638048bdc28f2018eabec15305b468285678;hpb=e13a7c613ab8d38b0b1d5d9423aeda3f0fa9dc54;p=citadel.git diff --git a/webcit/calendar.c b/webcit/calendar.c index 8b9563804..48a0f1fc7 100644 --- a/webcit/calendar.c +++ b/webcit/calendar.c @@ -125,7 +125,7 @@ void cal_process_object(StrBuf *Target, } else { tt = icaltime_as_timet(t); - webcit_fmt_date(buf, tt, DATEFMT_FULL); + webcit_fmt_date(buf, 256, tt, DATEFMT_FULL); StrBufAppendPrintf(Target, "
"); StrBufAppendPrintf(Target, _("Starting date/time:")); StrBufAppendPrintf(Target, "
%s
", buf); @@ -136,7 +136,7 @@ void cal_process_object(StrBuf *Target, if (p != NULL) { t = icalproperty_get_dtend(p); tt = icaltime_as_timet(t); - webcit_fmt_date(buf, tt, DATEFMT_FULL); + webcit_fmt_date(buf, 256, tt, DATEFMT_FULL); StrBufAppendPrintf(Target, "
"); StrBufAppendPrintf(Target, _("Ending date/time:")); StrBufAppendPrintf(Target, "
%s
", buf); @@ -991,6 +991,45 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum, char* from +void process_ical_object(long msgnum, int unread, + char *from, + char *FlatIcal, + icalcomponent_kind which_kind, + IcalCallbackFunc CallBack, + struct calview *calv + ) +{ + icalcomponent *cal, *c; + + cal = icalcomponent_new_from_string(FlatIcal); + if (cal != NULL) { + + /* A which_kind of (-1) means just load the whole thing */ + if (which_kind == (-1)) { + CallBack(cal, msgnum, from, unread, calv); + } + + /* Otherwise recurse and hunt */ + else { + + /* Simple components of desired type */ + if (icalcomponent_isa(cal) == which_kind) { + CallBack(cal, msgnum, from, unread, calv); + } + + /* Subcomponents of desired type */ + for (c = icalcomponent_get_first_component(cal, which_kind); + (c != 0); + c = icalcomponent_get_next_component(cal, which_kind)) { + CallBack(c, msgnum, from, unread, calv); + } + + } + + icalcomponent_free(cal); + } +} + /* * Code common to all icalendar display handlers. Given a message number and a MIME * type, we load the message and hunt for that MIME type. If found, we load @@ -998,15 +1037,16 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum, char* from * the requested object type, and feed it to the specified handler. */ void load_ical_object(long msgnum, int unread, - icalcomponent_kind which_kind, - void (*callback)(icalcomponent *, long, char*, int, struct calview *), - struct calview *calv + icalcomponent_kind which_kind, + IcalCallbackFunc CallBack, + struct calview *calv, + int RenderAsync ) { StrBuf *Buf; + StrBuf *Data; const char *bptr; - size_t BufLen; - char buf[1024]; + int Done = 0; char from[128] = ""; char mime_partnum[256]; char mime_filename[256]; @@ -1015,78 +1055,89 @@ void load_ical_object(long msgnum, int unread, int mime_length; char relevant_partnum[256]; char *relevant_source = NULL; - icalcomponent *cal, *c; int phase = 0; /* 0 = citadel headers, 1 = mime headers, 2 = body */ char msg4_content_type[256] = ""; char msg4_content_encoding[256] = ""; int msg4_content_length = 0; - int msg4_content_alloc = 0; - int body_bytes = 0; relevant_partnum[0] = '\0'; - sprintf(buf, "MSG4 %ld", msgnum); /* we need the mime headers */ - serv_puts(buf); - serv_getln(buf, sizeof buf); - if (buf[0] != '1') return; - + serv_printf("MSG4 %ld", msgnum); /* we need the mime headers */ Buf = NewStrBuf(); - while (BufLen = StrBuf_ServGetlnBuffered(Buf), strcmp(ChrPtr(Buf), "000")) { + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) != 1) { + FreeStrBuf (&Buf); + return; + } + while (!Done && (StrBuf_ServGetln(Buf)>=0)) { + if ( (StrLength(Buf)==3) && + !strcmp(ChrPtr(Buf), "000")) { + Done = 1; + break; + } bptr = ChrPtr(Buf); - if ((phase == 0) && (!strncasecmp(bptr, "part=", 5))) { - extract_token(mime_filename, &bptr[5], 1, '|', sizeof mime_filename); - extract_token(mime_partnum, &bptr[5], 2, '|', sizeof mime_partnum); - extract_token(mime_disposition, &bptr[5], 3, '|', sizeof mime_disposition); - extract_token(mime_content_type, &bptr[5], 4, '|', sizeof mime_content_type); - mime_length = extract_int(&bptr[5], 5); - - if ( (!strcasecmp(mime_content_type, "text/calendar")) - || (!strcasecmp(mime_content_type, "application/ics")) - || (!strcasecmp(mime_content_type, "text/vtodo")) - ) { - strcpy(relevant_partnum, mime_partnum); + switch (phase) { + case 0: + if (!strncasecmp(bptr, "part=", 5)) { + extract_token(mime_filename, &bptr[5], 1, '|', sizeof mime_filename); + extract_token(mime_partnum, &bptr[5], 2, '|', sizeof mime_partnum); + extract_token(mime_disposition, &bptr[5], 3, '|', sizeof mime_disposition); + extract_token(mime_content_type, &bptr[5], 4, '|', sizeof mime_content_type); + mime_length = extract_int(&bptr[5], 5); + + if ( (!strcasecmp(mime_content_type, "text/calendar")) + || (!strcasecmp(mime_content_type, "application/ics")) + || (!strcasecmp(mime_content_type, "text/vtodo")) + ) { + strcpy(relevant_partnum, mime_partnum); + } } - } - else if ((phase == 0) && (!strncasecmp(bptr, "from=", 4))) { - extract_token(from, bptr, 1, '=', sizeof(from)); - } - else if ((phase == 0) && (!strncasecmp(bptr, "text", 4))) { - phase = 1; - } - else if ((phase == 1) && (IsEmptyStr(bptr))) { - phase = 2; - - if ( - (msg4_content_length > 0) - && (!strcasecmp(msg4_content_encoding, "7bit")) - && ( (!strcasecmp(mime_content_type, "text/calendar")) + else if (!strncasecmp(bptr, "from=", 4)) { + extract_token(from, bptr, 1, '=', sizeof(from)); + } + else if ((phase == 0) && (!strncasecmp(bptr, "text", 4))) { + phase = 1; + } + break; + case 1: + if (!IsEmptyStr(bptr)) { + if (!strncasecmp(bptr, "Content-type: ", 14)) { + safestrncpy(msg4_content_type, &bptr[14], sizeof msg4_content_type); + striplt(msg4_content_type); + } + else if (!strncasecmp(bptr, "Content-transfer-encoding: ", 27)) { + safestrncpy(msg4_content_encoding, &bptr[27], sizeof msg4_content_encoding); + striplt(msg4_content_type); + } + else if ((!strncasecmp(bptr, "Content-length: ", 16))) { + msg4_content_length = atoi(&bptr[16]); + } + break; + } + else { + phase++; + + if ((msg4_content_length > 0) + && ( !strcasecmp(msg4_content_encoding, "7bit")) + && ((!strcasecmp(mime_content_type, "text/calendar")) || (!strcasecmp(mime_content_type, "application/ics")) || (!strcasecmp(mime_content_type, "text/vtodo")) - ) - ) { - if (relevant_source != NULL) free(relevant_source); - msg4_content_alloc = msg4_content_length * 2; - relevant_source = malloc(msg4_content_alloc); - relevant_source[0] = 0; - body_bytes = 0; + ) + ) + { + } } - - } - else if ((phase == 1) && (!strncasecmp(bptr, "Content-type: ", 14))) { - safestrncpy(msg4_content_type, &bptr[14], sizeof msg4_content_type); - striplt(msg4_content_type); - } - else if ((phase == 1) && (!strncasecmp(bptr, "Content-transfer-encoding: ", 27))) { - safestrncpy(msg4_content_encoding, &bptr[27], sizeof msg4_content_encoding); - striplt(msg4_content_type); - } - else if ((phase == 1) && (!strncasecmp(bptr, "Content-length: ", 16))) { - msg4_content_length = atoi(&bptr[16]); - } - else if (relevant_source != NULL) { - safestrncpy(&relevant_source[body_bytes], bptr, msg4_content_alloc-body_bytes); - body_bytes += BufLen; - safestrncpy(&relevant_source[body_bytes], "\r\n", msg4_content_alloc-body_bytes); - body_bytes += 2; + case 2: + Data = NewStrBufPlain(NULL, msg4_content_length * 2); + if (msg4_content_length > 0) { + StrBuf_ServGetBLOBBuffered(Data, msg4_content_length); + phase ++; + } + else { + StrBufAppendBuf(Data, Buf, 0); + StrBufAppendBufPlain(Data, "\r\n", 1, 0); + } + case 3: + StrBufAppendBuf(Data, Buf, 0); } } FreeStrBuf(&Buf); @@ -1094,39 +1145,19 @@ void load_ical_object(long msgnum, int unread, /* If MSG4 didn't give us the part we wanted, but we know that we can find it * as one of the other MIME parts, attempt to load it now. */ - if ((relevant_source == NULL) && (!IsEmptyStr(relevant_partnum))) { - relevant_source = load_mimepart(msgnum, relevant_partnum); + if ((Data == NULL) && (!IsEmptyStr(relevant_partnum))) { + Data = load_mimepart(msgnum, relevant_partnum); } - if (relevant_source != NULL) { - cal = icalcomponent_new_from_string(relevant_source); - if (cal != NULL) { - - /* A which_kind of (-1) means just load the whole thing */ - if (which_kind == (-1)) { - callback(cal, msgnum, from, unread, calv); - } - - /* Otherwise recurse and hunt */ - else { - - /* Simple components of desired type */ - if (icalcomponent_isa(cal) == which_kind) { - callback(cal, msgnum, from, unread, calv); - } - - /* Subcomponents of desired type */ - for (c = icalcomponent_get_first_component(cal, which_kind); - (c != 0); - c = icalcomponent_get_next_component(cal, which_kind)) { - callback(c, msgnum, from, unread, calv); - } - - } - - icalcomponent_free(cal); - } - free(relevant_source); + if (Data != NULL) { + relevant_source = (char*) ChrPtr(Data); + process_ical_object(msgnum, unread, + from, + relevant_source, + which_kind, + CallBack, + calv); + FreeStrBuf (&Data); } icalmemory_free_ring(); @@ -1136,14 +1167,14 @@ void load_ical_object(long msgnum, int unread, * Display a calendar item */ void load_calendar_item(message_summary *Msg, int unread, struct calview *c) { - load_ical_object(Msg->msgnum, unread, (-1), display_individual_cal, c); + load_ical_object(Msg->msgnum, unread, (-1), display_individual_cal, c, 1); } /* * Display task view */ void display_task(message_summary *Msg, int unread) { - load_ical_object(Msg->msgnum, unread, ICAL_VTODO_COMPONENT, display_individual_cal, NULL); + load_ical_object(Msg->msgnum, unread, ICAL_VTODO_COMPONENT, display_individual_cal, NULL, 0); } /* @@ -1161,9 +1192,9 @@ void display_edit_task(void) { if (msgnum > 0L) { /* existing task */ load_ical_object(msgnum, 0, - ICAL_VTODO_COMPONENT, - display_edit_individual_task, - NULL + ICAL_VTODO_COMPONENT, + display_edit_individual_task, + NULL, 0 ); } else { @@ -1179,7 +1210,7 @@ void save_task(void) { long msgnum = 0L; msgnum = lbstr("msgnum"); if (msgnum > 0L) { - load_ical_object(msgnum, 0, ICAL_VTODO_COMPONENT, save_individual_task, NULL); + load_ical_object(msgnum, 0, ICAL_VTODO_COMPONENT, save_individual_task, NULL, 0); } else { save_individual_task(NULL, 0L, "", 0, NULL); @@ -1195,7 +1226,7 @@ void display_edit_event(void) { msgnum = lbstr("msgnum"); if (msgnum > 0L) { /* existing event */ - load_ical_object(msgnum, 0, ICAL_VEVENT_COMPONENT, display_edit_individual_event, NULL); + load_ical_object(msgnum, 0, ICAL_VEVENT_COMPONENT, display_edit_individual_event, NULL, 0); } else { /* new event */ @@ -1212,7 +1243,7 @@ void save_event(void) { msgnum = lbstr("msgnum"); if (msgnum > 0L) { - load_ical_object(msgnum, 0, (-1), save_individual_event, NULL); + load_ical_object(msgnum, 0, (-1), save_individual_event, NULL, 0); } else { save_individual_event(NULL, 0L, "", 0, NULL);