]> code.citadel.org Git - citadel.git/blobdiff - webcit/calendar.c
* collect sender / read / unread information for calendar items
[citadel.git] / webcit / calendar.c
index 6db5de7284f29b382db4a09062021edf73af33e7..3a78ac3d880e8b910afd5748c36ee5681bc048a6 100644 (file)
@@ -103,7 +103,9 @@ void cal_process_object(icalcomponent *cal,
                the_method = icalproperty_get_method(method);
                char *title;
 
-               wprintf("<h2><span>");
+               wprintf("<div id=\"%s_title\">", divname);
+               wprintf("<img src=\"static/calarea_48x.gif\">");
+               wprintf("<span>");
                switch(the_method) {
                    case ICAL_METHOD_REQUEST:
                        title = _("Meeting invitation");
@@ -120,12 +122,8 @@ void cal_process_object(icalcomponent *cal,
                }
                wprintf("</span>");
 
-               wprintf("<div id=\"%s_title\">", divname);
-               wprintf("<img src=\"static/calarea_48x.gif\">"
-                       "&nbsp;&nbsp;%s",
-                       title
-               );
-               wprintf("</h2>");
+               wprintf("&nbsp;&nbsp;%s",title);
+               wprintf("</div>");
        }
 
        wprintf("<dl>");
@@ -172,7 +170,7 @@ void cal_process_object(icalcomponent *cal,
                        }
                        else {
                                tt = icaltime_as_timet(t);
-                               fmt_date(buf, tt, 0);
+                               webcit_fmt_date(buf, tt, 0);
                                wprintf("<dt>");
                                wprintf(_("Starting date/time:"));
                                wprintf("</dt><dd>%s</dd>", buf);
@@ -183,7 +181,7 @@ void cal_process_object(icalcomponent *cal,
                if (p != NULL) {
                        t = icalproperty_get_dtend(p);
                        tt = icaltime_as_timet(t);
-                       fmt_date(buf, tt, 0);
+                       webcit_fmt_date(buf, tt, 0);
                        wprintf("<dt>");
                        wprintf(_("Ending date/time:"));
                        wprintf("</dt><dd>%s</dd>", buf);
@@ -256,8 +254,9 @@ void cal_process_object(icalcomponent *cal,
                                                _("CONFLICT:")
                                        )
                                );
+                               wprintf("</dt><dd>");
                                escputs(conflict_message);
-                               wprintf("</dt>\n");
+                               wprintf("</dd>\n");
                        }
                }
                lprintf(9, "...done.\n");
@@ -265,14 +264,15 @@ void cal_process_object(icalcomponent *cal,
                wprintf("</dl>");
 
                /** Display the Accept/Decline buttons */
-               wprintf("<div id=\"%s_question\">"
+               wprintf("<p id=\"%s_question\">"
                        "%s "
+                       "&nbsp;&nbsp;&nbsp;<span class=\"button_link\"> "
                        "<a href=\"javascript:RespondToInvitation('%s_question','%s_title','%ld','%s','Accept');\">%s</a>"
-                       " | "
+                       "</span>&nbsp;&nbsp;&nbsp;<span class=\"button_link\">"
                        "<a href=\"javascript:RespondToInvitation('%s_question','%s_title','%ld','%s','Tentative');\">%s</a>"
-                       " | "
+                       "</span>&nbsp;&nbsp;&nbsp;<span class=\"button_link\">"
                        "<a href=\"javascript:RespondToInvitation('%s_question','%s_title','%ld','%s','Decline');\">%s</a>"
-                       "</div>\n",
+                       "</span></p>\n",
                        divname,
                        _("How would you like to respond to this invitation?"),
                        divname, divname, msgnum, cal_partnum, _("Accept"),
@@ -293,12 +293,13 @@ void cal_process_object(icalcomponent *cal,
                 ***********/
 
                /** Display the update buttons */
-               wprintf("<div id=\"%s_question\">"
-                       "%s"
+               wprintf("<p id=\"%s_question\" >"
+                       "%s "
+                       "&nbsp;&nbsp;&nbsp;<span class=\"button_link\"> "
                        "<a href=\"javascript:HandleRSVP('%s_question','%s_title','%ld','%s','Update');\">%s</a>"
-                       " | "
+                       "</span>&nbsp;&nbsp;&nbsp;<span class=\"button_link\">"
                        "<a href=\"javascript:HandleRSVP('%s_question','%s_title','%ld','%s','Ignore');\">%s</a>"
-                       "</div>\n",
+                       "</span></p>\n",
                        divname,
                        _("Click <i>Update</i> to accept this reply and update your calendar."),
                        divname, divname, msgnum, cal_partnum, _("Update"),
@@ -309,7 +310,7 @@ void cal_process_object(icalcomponent *cal,
 
        /** Trailing HTML for the display of this object */
        if (recursion_level == 0) {
-               wprintf("</div>\n");
+               wprintf("<p>&nbsp;</p></div>\n");
        }
 }
 
@@ -360,8 +361,7 @@ void respond_to_request(void) {
        serv_getln(buf, sizeof buf);
 
        if (buf[0] == '2') {
-               wprintf("<table border=0 cellpadding=0><tr><td>");
-               wprintf("<td><img align=\"center\" src=\"static/calarea_48x.gif\"></td><td><b><i>");
+               wprintf("<img src=\"static/calarea_48x.gif\"><span>");
                if (!strcasecmp(bstr("sc"), "accept")) {
                        wprintf(_("You have accepted this meeting invitation.  "
                                "It has been entered into your calendar.")
@@ -377,10 +377,11 @@ void respond_to_request(void) {
                }
                wprintf(" ");
                wprintf(_("A reply has been sent to the meeting organizer."));
-               wprintf("</i></b></td></tr></table>");
+               wprintf("</span>");
        } else {
-               wprintf("<img align=\"center\" src=\"static/error.gif\">&nbsp;<b><i>");
+               wprintf("<img align=\"center\" src=\"static/error.gif\"><span>");
                wprintf("%s\n", &buf[4]);
+               wprintf("</span>");
        }
 
        end_ajax_response();
@@ -404,8 +405,7 @@ void handle_rsvp(void) {
        serv_getln(buf, sizeof buf);
 
        if (buf[0] == '2') {
-               wprintf("<table border=0 cellpadding=0><tr><td>");
-               wprintf("<td><img align=\"center\" src=\"static/calarea_48x.gif\"></td><td><b><i>");
+               wprintf("<img src=\"static/calarea_48x.gif\"><span>");
                if (!strcasecmp(bstr("sc"), "update")) {
                        wprintf(_("Your calendar has been updated to reflect this RSVP."));
                } else if (!strcasecmp(bstr("sc"), "ignore")) {
@@ -413,9 +413,10 @@ void handle_rsvp(void) {
                                "Your calendar has <b>not</b> been updated.")
                        );
                }
-               wprintf("</i></b></td></tr></table>");
+               wprintf("</span>");
        } else {
-               wprintf("<img src=\"static/error.gif\" align=center> %s\n", &buf[4]);
+               wprintf("<img src=\"static/error.gif\"><span> %s\n", &buf[4]);
+               wprintf("</span>");
        }
 
        end_ajax_response();
@@ -445,15 +446,18 @@ void handle_rsvp(void) {
  * \param cal Our calendar to process
  * \param msgnum number of the mesage in our db
  */
-void display_individual_cal(icalcomponent *cal, long msgnum) {
-
-       WC->num_cal += 1;
-
-       WC->disp_cal = realloc(WC->disp_cal,
-                       (sizeof(struct disp_cal) * WC->num_cal) );
-       WC->disp_cal[WC->num_cal - 1].cal = icalcomponent_new_clone(cal);
-
-       WC->disp_cal[WC->num_cal - 1].cal_msgnum = msgnum;
+void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unread)
+{
+       struct wcsession *WCC = WC;     /* stack this for faster access (WC is a function) */
+
+       WCC->num_cal += 1;
+       WCC->disp_cal = realloc(WC->disp_cal, (sizeof(struct disp_cal) * WCC->num_cal) );
+       WCC->disp_cal[WCC->num_cal - 1].cal = icalcomponent_new_clone(cal);
+       WCC->disp_cal[WCC->num_cal - 1].unread = unread;
+       WCC->disp_cal[WCC->num_cal - 1].from = malloc (strlen(from) + 1);
+       strcpy (WCC->disp_cal[WCC->num_cal - 1].from, from);
+       ical_dezonify(WCC->disp_cal[WCC->num_cal - 1].cal);
+       WCC->disp_cal[WCC->num_cal - 1].cal_msgnum = msgnum;
 }
 
 
@@ -464,7 +468,7 @@ void display_individual_cal(icalcomponent *cal, long msgnum) {
  * \param supplied_vtodo the todo item we want to edit
  * \param msgnum number of the mesage in our db
  */
-void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum) {
+void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum, char *from, int unread) {
        icalcomponent *vtodo;
        icalproperty *p;
        struct icaltimetype t;
@@ -488,7 +492,9 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum) {
                        display_edit_individual_task(
                                icalcomponent_get_first_component(
                                        vtodo, ICAL_VTODO_COMPONENT
-                               ), msgnum
+                                       ), 
+                               msgnum,
+                               from, unread
                        );
                        return;
                }
@@ -499,15 +505,14 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum) {
        }
 
        output_headers(1, 1, 2, 0, 0, 0);
-       wprintf("<div id=\"banner\">\n"
-               "<TABLE class=\"calendar_banner\"><TR>"
-               "<TD><img src=\"static/taskmanag_48x.gif\"></TD>"
-               "<td><SPAN CLASS=\"titlebar\">");
+       wprintf("<div id=\"banner\">\n");
+       wprintf("<img src=\"static/taskmanag_48x.gif\">");
+       wprintf("<h1>");
        wprintf(_("Edit task"));
-       wprintf("</SPAN>"
-               "</TD></TR></TABLE>\n"
-               "</div>\n<div id=\"content\">\n"
-       );
+       wprintf("</h1>");
+       wprintf("</div>\n");
+
+       wprintf("<div id=\"content\" class=\"service\">\n");
 
        wprintf("<div class=\"fix_scrollbar_bug\">"
                "<table class=\"calendar_background\"><tr><td>");
@@ -594,7 +599,7 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum) {
  * \param supplied_vtodo the task to save
  * \param msgnum number of the mesage in our db
  */
-void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) {
+void save_individual_task(icalcomponent *supplied_vtodo, long msgnum, char* from, int unread) {
        char buf[SIZ];
        int delete_existing = 0;
        icalproperty *prop;
@@ -617,8 +622,8 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) {
                if (icalcomponent_isa(vtodo) == ICAL_VCALENDAR_COMPONENT) {
                        save_individual_task(
                                icalcomponent_get_first_component(
-                                       vtodo, ICAL_VTODO_COMPONENT
-                               ), msgnum
+                                       vtodo, ICAL_VTODO_COMPONENT), 
+                               msgnum, from, unread
                        );
                        return;
                }
@@ -637,9 +642,15 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) {
                        icalcomponent_remove_property(vtodo, prop);
                        icalproperty_free(prop);
                }
-               icalcomponent_add_property(vtodo,
-                       icalproperty_new_summary(bstr("summary")));
-               
+               if (!IsEmptyStr(bstr("summary"))) {
+       
+                       icalcomponent_add_property(vtodo,
+                                       icalproperty_new_summary(bstr("summary")));
+               } else {
+                       icalcomponent_add_property(vtodo,
+                                       icalproperty_new_summary("Untitled Task"));
+               }
+       
                while (prop = icalcomponent_get_first_property(vtodo,
                      ICAL_DESCRIPTION_PROPERTY), prop != NULL) {
                        icalcomponent_remove_property(vtodo, prop);
@@ -757,12 +768,12 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) {
  * \param callback a funcion \todo
  *
  */
-void display_using_handler(long msgnum,
-                       char *mimetype,
-                       icalcomponent_kind which_kind,
-                       void (*callback)(icalcomponent *, long)
+void display_using_handler(long msgnum, int unread,
+                          icalcomponent_kind which_kind,
+                          void (*callback)(icalcomponent *, long, char*, int)
        ) {
        char buf[1024];
+       char from[128] = "";
        char mime_partnum[256];
        char mime_filename[256];
        char mime_content_type[256];
@@ -772,7 +783,8 @@ void display_using_handler(long msgnum,
        char *relevant_source = NULL;
        icalcomponent *cal, *c;
 
-       sprintf(buf, "MSG0 %ld|0", msgnum);     /* unfortunately we need the mime headers */
+       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;
@@ -785,10 +797,15 @@ void display_using_handler(long msgnum,
                        extract_token(mime_content_type, &buf[5], 4, '|', sizeof mime_content_type);
                        mime_length = extract_int(&buf[5], 5);
 
-                       if (!strcasecmp(mime_content_type, "text/calendar")) {
+                       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 (!strncasecmp(buf, "from=", 4)) {
+                       extract_token(from, buf, 1, '=', sizeof(from));
                }
        }
 
@@ -803,7 +820,7 @@ void display_using_handler(long msgnum,
 
                                /** Simple components of desired type */
                                if (icalcomponent_isa(cal) == which_kind) {
-                                       callback(cal, msgnum);
+                                       callback(cal, msgnum, from, unread);
                                }
 
                                /** Subcomponents of desired type */
@@ -812,22 +829,22 @@ void display_using_handler(long msgnum,
                                    (c != 0);
                                    c = icalcomponent_get_next_component(cal,
                                    which_kind)) {
-                                       callback(c, msgnum);
+                                       callback(c, msgnum, from, unread);
                                }
                                icalcomponent_free(cal);
                        }
                        free(relevant_source);
                }
        }
-
+       icalmemory_free_ring();
 }
 
 /**
  * \brief display whole calendar
  * \param msgnum number of the mesage in our db
  */
-void display_calendar(long msgnum) {
-       display_using_handler(msgnum, "text/calendar",
+void display_calendar(long msgnum, int unread) {
+       display_using_handler(msgnum, unread,
                                ICAL_VEVENT_COMPONENT,
                                display_individual_cal);
 }
@@ -836,8 +853,8 @@ void display_calendar(long msgnum) {
  * \brief display whole taksview
  * \param msgnum number of the mesage in our db
  */
-void display_task(long msgnum) {
-       display_using_handler(msgnum, "text/calendar",
+void display_task(long msgnum, int unread) {
+       display_using_handler(msgnum, unread,
                                ICAL_VTODO_COMPONENT,
                                display_individual_cal);
 }
@@ -856,13 +873,13 @@ void display_edit_task(void) {
        msgnum = atol(bstr("msgnum"));
        if (msgnum > 0L) {
                /** existing task */
-               display_using_handler(msgnum, "text/calendar",
+               display_using_handler(msgnum, 0,
                                ICAL_VTODO_COMPONENT,
                                display_edit_individual_task);
        }
        else {
                /** new task */
-               display_edit_individual_task(NULL, 0L);
+               display_edit_individual_task(NULL, 0L, "", 0);
        }
 }
 
@@ -874,12 +891,12 @@ void save_task(void) {
 
        msgnum = atol(bstr("msgnum"));
        if (msgnum > 0L) {
-               display_using_handler(msgnum, "text/calendar",
+               display_using_handler(msgnum, 0,
                                ICAL_VTODO_COMPONENT,
                                save_individual_task);
        }
        else {
-               save_individual_task(NULL, 0L);
+               save_individual_task(NULL, 0L, "", 0);
        }
 }
 
@@ -892,13 +909,13 @@ void display_edit_event(void) {
        msgnum = atol(bstr("msgnum"));
        if (msgnum > 0L) {
                /* existing event */
-               display_using_handler(msgnum, "text/calendar",
+               display_using_handler(msgnum, 0,
                                ICAL_VEVENT_COMPONENT,
                                display_edit_individual_event);
        }
        else {
                /* new event */
-               display_edit_individual_event(NULL, 0L);
+               display_edit_individual_event(NULL, 0L, "", 0);
        }
 }
 
@@ -911,12 +928,12 @@ void save_event(void) {
        msgnum = atol(bstr("msgnum"));
 
        if (msgnum > 0L) {
-               display_using_handler(msgnum, "text/calendar",
+               display_using_handler(msgnum, 0,
                                ICAL_VEVENT_COMPONENT,
                                save_individual_event);
        }
        else {
-               save_individual_event(NULL, 0L);
+               save_individual_event(NULL, 0L, "", 0);
        }
 }
 
@@ -969,5 +986,3 @@ void do_freebusy(char *req) {
 
 #endif /* WEBCIT_WITH_CALENDAR_SERVICE */
 
-
-/*@}*/