* serv_getln now is a wrapper around existing functionality. a new temporary var...
[citadel.git] / webcit / calendar.c
index 8808618c06f2b4448c19e929acb275a5d2cd20ef..48a0f1fc793461630d2a70e8d70a03643e94f9c4 100644 (file)
@@ -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);