X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fcalendar%2Fserv_calendar.c;h=71c7fbc519fb52ad2efed92b3792f36e7a847f9b;hb=a7d7e3f128e15f282f2a96aba513823aa9603c22;hp=1acd28251aa688ad4b5fcb6e44fc1580e3ff000b;hpb=154ecc9117291889ed20b392e65725f883a2d962;p=citadel.git diff --git a/citadel/modules/calendar/serv_calendar.c b/citadel/modules/calendar/serv_calendar.c index 1acd28251..71c7fbc51 100644 --- a/citadel/modules/calendar/serv_calendar.c +++ b/citadel/modules/calendar/serv_calendar.c @@ -3,22 +3,15 @@ * room on a Citadel server. It handles iCalendar objects using the * iTIP protocol. See RFCs 2445 and 2446. * + * Copyright (c) 1987-2018 by the citadel.org team * - * Copyright (c) 1987-2011 by the citadel.org team + * This program is open source software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3. * - * This program is open source software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ #define PRODID "-//Citadel//NONSGML Citadel Calendar//EN" @@ -32,8 +25,8 @@ #include "serv_calendar.h" #include "room_ops.h" #include "euidindex.h" -#include "ical_dezonify.h" - +#include "default_timezone.h" +#include "config.h" struct ical_respond_data { @@ -51,7 +44,7 @@ icalcomponent *icalcomponent_new_citadel_vcalendar(void) { encaps = icalcomponent_new_vcalendar(); if (encaps == NULL) { - syslog(LOG_CRIT, "ERROR: could not allocate component!\n"); + syslog(LOG_ERR, "calendar: could not allocate component"); return NULL; } @@ -90,8 +83,6 @@ icalcomponent *ical_encapsulate_subcomponent(icalcomponent *subcomp) { } - - /* * Write a calendar object into the specified user's calendar room. * If the supplied user is NULL, this function writes the calendar object @@ -149,8 +140,7 @@ void ical_write_to_cal(struct ctdluser *u, icalcomponent *cal) { msg->cm_format_type = 4; CM_SetField(msg, eAuthor, CCC->user.fullname, strlen(CCC->user.fullname)); CM_SetField(msg, eOriginalRoom, CCC->room.QRname, strlen(CCC->room.QRname)); - CM_SetField(msg, eNodeName, config.c_nodename, strlen(config.c_nodename)); - CM_SetField(msg, eHumanNode, config.c_humannode, strlen(config.c_humannode)); + CM_SetField(msg, eHumanNode, CtdlGetConfigStr("c_humannode"), strlen(CtdlGetConfigStr("c_humannode"))); MsgBody = NewStrBufPlain(NULL, serlen + 100); StrBufAppendBufPlain(MsgBody, HKEY("Content-type: text/calendar\r\n\r\n"), 0); @@ -185,25 +175,25 @@ void ical_send_a_reply(icalcomponent *request, char *action) { icalproperty *summary = NULL; char summary_string[SIZ]; icalproperty *me_attend = NULL; - struct recptypes *recp = NULL; + recptypes *recp = NULL; icalparameter *partstat = NULL; char *serialized_reply = NULL; char *reply_message_text = NULL; const char *ch; struct CtdlMessage *msg = NULL; - struct recptypes *valid = NULL; + recptypes *valid = NULL; *organizer_string = '\0'; strcpy(summary_string, "Calendar item"); if (request == NULL) { - syslog(LOG_ERR, "ERROR: trying to reply to NULL event?\n"); + syslog(LOG_ERR, "calendar: trying to reply to NULL event"); return; } the_reply = icalcomponent_new_clone(request); if (the_reply == NULL) { - syslog(LOG_ERR, "ERROR: cannot clone request\n"); + syslog(LOG_ERR, "calendar: cannot clone request"); return; } @@ -241,7 +231,7 @@ void ical_send_a_reply(icalcomponent *request, char *action) { /* We found our own address in the attendee list. */ if (me_attend) { /* Change the partstat from NEEDS-ACTION to ACCEPT or DECLINE */ - icalproperty_remove_parameter(me_attend, ICAL_PARTSTAT_PARAMETER); + icalproperty_remove_parameter_by_kind(me_attend, ICAL_PARTSTAT_PARAMETER); if (!strcasecmp(action, "accept")) { partstat = icalparameter_new_partstat(ICAL_PARTSTAT_ACCEPTED); @@ -375,7 +365,7 @@ void ical_respond(long msgnum, char *partnum, char *action) { return; } - msg = CtdlFetchMessage(msgnum, 1); + msg = CtdlFetchMessage(msgnum, 1, 1); if (msg == NULL) { cprintf("%d Message %ld not found.\n", ERROR + ILLEGAL_VALUE, @@ -386,12 +376,11 @@ void ical_respond(long msgnum, char *partnum, char *action) { memset(&ird, 0, sizeof ird); strcpy(ird.desired_partnum, partnum); - mime_parser(msg->cm_fields[eMesageText], - NULL, - *ical_locate_part, /* callback function */ - NULL, NULL, - (void *) &ird, /* user data */ - 0 + mime_parser(CM_RANGE(msg, eMesageText), + *ical_locate_part, /* callback function */ + NULL, NULL, + (void *) &ird, /* user data */ + 0 ); /* We're done with the incoming message, because we now have a @@ -606,13 +595,13 @@ int ical_update_my_calendar_with_reply(icalcomponent *cal) { /* Figure out just what event it is we're dealing with */ strcpy(uid, "--==<< InVaLiD uId >>==--"); ical_learn_uid_of_reply(uid, cal); - syslog(LOG_DEBUG, "UID of event being replied to is <%s>\n", uid); + syslog(LOG_DEBUG, "calendar: UID of event being replied to is <%s>", uid); strcpy(hold_rm, CC->room.QRname); /* save current room */ if (CtdlGetRoom(&CC->room, USERCALENDARROOM) != 0) { CtdlGetRoom(&CC->room, hold_rm); - syslog(LOG_CRIT, "cannot get user calendar room\n"); + syslog(LOG_ERR, "calendar: cannot get user calendar room"); return(2); } @@ -626,7 +615,7 @@ int ical_update_my_calendar_with_reply(icalcomponent *cal) { CtdlGetRoom(&CC->room, hold_rm); /* return to saved room */ - syslog(LOG_DEBUG, "msgnum_being_replaced == %ld\n", msgnum_being_replaced); + syslog(LOG_DEBUG, "calendar: msgnum_being_replaced == %ld", msgnum_being_replaced); if (msgnum_being_replaced == 0) { return(1); /* no calendar event found */ } @@ -637,23 +626,22 @@ int ical_update_my_calendar_with_reply(icalcomponent *cal) { * us the ability to load the event into memory so we can diddle the * attendees. */ - msg = CtdlFetchMessage(msgnum_being_replaced, 1); + msg = CtdlFetchMessage(msgnum_being_replaced, 1, 1); if (msg == NULL) { return(2); /* internal error */ } oec.c = NULL; - mime_parser(msg->cm_fields[eMesageText], - NULL, - *ical_locate_original_event, /* callback function */ - NULL, NULL, - &oec, /* user data */ - 0 + mime_parser(CM_RANGE(msg, eMesageText), + *ical_locate_original_event, /* callback function */ + NULL, NULL, + &oec, /* user data */ + 0 ); CM_Free(msg); original_event = oec.c; if (original_event == NULL) { - syslog(LOG_ERR, "ERROR: Original_component is NULL.\n"); + syslog(LOG_ERR, "calendar: original_component is NULL"); return(2); } @@ -718,7 +706,7 @@ void ical_handle_rsvp(long msgnum, char *partnum, char *action) { return; } - msg = CtdlFetchMessage(msgnum, 1); + msg = CtdlFetchMessage(msgnum, 1, 1); if (msg == NULL) { cprintf("%d Message %ld not found.\n", ERROR + ILLEGAL_VALUE, @@ -729,13 +717,12 @@ void ical_handle_rsvp(long msgnum, char *partnum, char *action) { memset(&ird, 0, sizeof ird); strcpy(ird.desired_partnum, partnum); - mime_parser(msg->cm_fields[eMesageText], - NULL, - *ical_locate_part, /* callback function */ - NULL, NULL, - (void *) &ird, /* user data */ - 0 - ); + mime_parser(CM_RANGE(msg, eMesageText), + *ical_locate_part, /* callback function */ + NULL, NULL, + (void *) &ird, /* user data */ + 0 + ); /* We're done with the incoming message, because we now have a * calendar object in memory. @@ -857,7 +844,7 @@ int ical_ctdl_is_overlap( return(1); } - /* syslog(LOG_DEBUG, "Comparing t1start %d:%d t1end %d:%d t2start %d:%d t2end %d:%d \n", + /* syslog(LOG_DEBUG, "Comparing t1start %d:%d t1end %d:%d t2start %d:%d t2end %d:%d", t1start.hour, t1start.minute, t1end.hour, t1end.minute, t2start.hour, t2start.minute, t2end.hour, t2end.minute); */ @@ -866,11 +853,11 @@ int ical_ctdl_is_overlap( /* If event 1 ends before event 2 starts, we're in the clear. */ if (icaltime_compare(t1end, t2start) <= 0) return(0); - /* syslog(LOG_DEBUG, "first passed\n"); */ + /* syslog(LOG_DEBUG, "calendar: first passed"); */ /* If event 2 ends before event 1 starts, we're also ok. */ if (icaltime_compare(t2end, t1start) <= 0) return(0); - /* syslog(LOG_DEBUG, "second passed\n"); */ + /* syslog(LOG_DEBUG, "calendar: second passed"); */ /* Otherwise, they overlap. */ return(1); @@ -915,11 +902,11 @@ int ical_conflicts_phase6(struct icaltimetype t1start, existing_msgnum, conflict_event_uid, conflict_event_summary, - ( ((strlen(compare_uid)>0) + ( (!IsEmptyStr(compare_uid) &&(!strcasecmp(compare_uid, conflict_event_uid))) ? 1 : 0 - ) - ); + ) + ); conflict_reported = 1; } @@ -1157,16 +1144,15 @@ void ical_hunt_for_conflicts_backend(long msgnum, void *data) { proposed_event = (icalcomponent *)data; - msg = CtdlFetchMessage(msgnum, 1); + msg = CtdlFetchMessage(msgnum, 1, 1); if (msg == NULL) return; memset(&ird, 0, sizeof ird); strcpy(ird.desired_partnum, "_HUNT_"); - mime_parser(msg->cm_fields[eMesageText], - NULL, - *ical_locate_part, /* callback function */ - NULL, NULL, - (void *) &ird, /* user data */ - 0 + mime_parser(CM_RANGE(msg, eMesageText), + *ical_locate_part, /* callback function */ + NULL, NULL, + (void *) &ird, /* user data */ + 0 ); CM_Free(msg); @@ -1219,7 +1205,7 @@ void ical_conflicts(long msgnum, char *partnum) { struct CtdlMessage *msg = NULL; struct ical_respond_data ird; - msg = CtdlFetchMessage(msgnum, 1); + msg = CtdlFetchMessage(msgnum, 1, 1); if (msg == NULL) { cprintf("%d Message %ld not found\n", ERROR + ILLEGAL_VALUE, @@ -1230,13 +1216,12 @@ void ical_conflicts(long msgnum, char *partnum) { memset(&ird, 0, sizeof ird); strcpy(ird.desired_partnum, partnum); - mime_parser(msg->cm_fields[eMesageText], - NULL, - *ical_locate_part, /* callback function */ - NULL, NULL, - (void *) &ird, /* user data */ - 0 - ); + mime_parser(CM_RANGE(msg, eMesageText), + *ical_locate_part, /* callback function */ + NULL, NULL, + (void *) &ird, /* user data */ + 0 + ); CM_Free(msg); @@ -1381,7 +1366,6 @@ void ical_add_to_freebusy(icalcomponent *fb, icalcomponent *top_level_cal) { if (!icaltime_is_null_time(dtend)) { dtend = icaltime_add(dtstart, dur); dtend.zone = dtstart.zone; - dtend.is_utc = dtstart.is_utc; } ++num_recur; } @@ -1407,17 +1391,16 @@ void ical_freebusy_backend(long msgnum, void *data) { fb = (icalcomponent *)data; /* User-supplied data will be the VFREEBUSY component */ - msg = CtdlFetchMessage(msgnum, 1); + msg = CtdlFetchMessage(msgnum, 1, 1); if (msg == NULL) return; memset(&ird, 0, sizeof ird); strcpy(ird.desired_partnum, "_HUNT_"); - mime_parser(msg->cm_fields[eMesageText], - NULL, - *ical_locate_part, /* callback function */ - NULL, NULL, - (void *) &ird, /* user data */ - 0 - ); + mime_parser(CM_RANGE(msg, eMesageText), + *ical_locate_part, /* callback function */ + NULL, NULL, + (void *) &ird, /* user data */ + 0 + ); CM_Free(msg); if (ird.cal) { @@ -1439,7 +1422,7 @@ void ical_freebusy(char *who) { icalcomponent *encaps = NULL; icalcomponent *fb = NULL; int found_user = (-1); - struct recptypes *recp = NULL; + recptypes *recp = NULL; char buf[256]; char host[256]; char type[256]; @@ -1453,7 +1436,7 @@ void ical_freebusy(char *who) { if (found_user != 0) { strcpy(buf, who); recp = validate_recipients(buf, NULL, 0); - syslog(LOG_DEBUG, "Trying <%s>\n", buf); + syslog(LOG_DEBUG, "calendar: trying <%s>", buf); if (recp != NULL) { if (recp->num_local == 1) { found_user = CtdlGetUser(&usbuf, recp->recp_local); @@ -1466,8 +1449,8 @@ void ical_freebusy(char *who) { * primary FQDN of this Citadel node. */ if (found_user != 0) { - snprintf(buf, sizeof buf, "%s@%s", who, config.c_fqdn); - syslog(LOG_DEBUG, "Trying <%s>\n", buf); + snprintf(buf, sizeof buf, "%s@%s", who, CtdlGetConfigStr("c_fqdn")); + syslog(LOG_DEBUG, "calendar: trying <%s>", buf); recp = validate_recipients(buf, NULL, 0); if (recp != NULL) { if (recp->num_local == 1) { @@ -1490,7 +1473,7 @@ void ical_freebusy(char *who) { if ( (!strcasecmp(type, "localhost")) || (!strcasecmp(type, "directory")) ) { snprintf(buf, sizeof buf, "%s@%s", who, host); - syslog(LOG_DEBUG, "Trying <%s>\n", buf); + syslog(LOG_DEBUG, "calendar: trying <%s>", buf); recp = validate_recipients(buf, NULL, 0); if (recp != NULL) { if (recp->num_local == 1) { @@ -1519,11 +1502,10 @@ void ical_freebusy(char *who) { } /* Create a VFREEBUSY subcomponent */ - syslog(LOG_DEBUG, "Creating VFREEBUSY component\n"); + syslog(LOG_DEBUG, "calendar: creating VFREEBUSY component"); fb = icalcomponent_new_vfreebusy(); if (fb == NULL) { - cprintf("%d Internal error: cannot allocate memory.\n", - ERROR + INTERNAL_ERROR); + cprintf("%d Internal error: cannot allocate memory.\n", ERROR + INTERNAL_ERROR); CtdlGetRoom(&CC->room, hold_rm); return; } @@ -1532,13 +1514,13 @@ void ical_freebusy(char *who) { icalcomponent_set_method(fb, ICAL_METHOD_PUBLISH); /* Set the DTSTAMP to right now. */ - icalcomponent_set_dtstamp(fb, icaltime_from_timet(time(NULL), 0)); + icalcomponent_set_dtstamp(fb, icaltime_from_timet_with_zone(time(NULL), 0, icaltimezone_get_utc_timezone())); /* Add the user's email address as ORGANIZER */ sprintf(buf, "MAILTO:%s", who); if (strchr(buf, '@') == NULL) { strcat(buf, "@"); - strcat(buf, config.c_fqdn); + strcat(buf, CtdlGetConfigStr("c_fqdn")); } for (i=0; buf[i]; ++i) { if (buf[i]==' ') buf[i] = '_'; @@ -1546,21 +1528,21 @@ void ical_freebusy(char *who) { icalcomponent_add_property(fb, icalproperty_new_organizer(buf)); /* Add busy time from events */ - syslog(LOG_DEBUG, "Adding busy time from events\n"); + syslog(LOG_DEBUG, "calendar: adding busy time from events"); CtdlForEachMessage(MSGS_ALL, 0, NULL, NULL, NULL, ical_freebusy_backend, (void *)fb ); /* If values for DTSTART and DTEND are still not present, set them * to yesterday and tomorrow as default values. */ if (icalcomponent_get_first_property(fb, ICAL_DTSTART_PROPERTY) == NULL) { - icalcomponent_set_dtstart(fb, icaltime_from_timet(time(NULL)-86400L, 0)); + icalcomponent_set_dtstart(fb, icaltime_from_timet_with_zone(time(NULL)-86400L, 0, icaltimezone_get_utc_timezone())); } if (icalcomponent_get_first_property(fb, ICAL_DTEND_PROPERTY) == NULL) { - icalcomponent_set_dtend(fb, icaltime_from_timet(time(NULL)+86400L, 0)); + icalcomponent_set_dtend(fb, icaltime_from_timet_with_zone(time(NULL)+86400L, 0, icaltimezone_get_utc_timezone())); } /* Put the freebusy component into the calendar component */ - syslog(LOG_DEBUG, "Encapsulating\n"); + syslog(LOG_DEBUG, "calendar: encapsulating"); encaps = ical_encapsulate_subcomponent(fb); if (encaps == NULL) { icalcomponent_free(fb); @@ -1571,11 +1553,11 @@ void ical_freebusy(char *who) { } /* Set the method to PUBLISH */ - syslog(LOG_DEBUG, "Setting method\n"); + syslog(LOG_DEBUG, "calendar: setting method"); icalcomponent_set_method(encaps, ICAL_METHOD_PUBLISH); /* Serialize it */ - syslog(LOG_DEBUG, "Serializing\n"); + syslog(LOG_DEBUG, "calendar: serializing"); serialized_request = icalcomponent_as_ical_string_r(encaps); icalcomponent_free(encaps); /* Don't need this anymore. */ @@ -1608,16 +1590,15 @@ void ical_getics_backend(long msgnum, void *data) { /* Look for the calendar event... */ - msg = CtdlFetchMessage(msgnum, 1); + msg = CtdlFetchMessage(msgnum, 1, 1); if (msg == NULL) return; memset(&ird, 0, sizeof ird); strcpy(ird.desired_partnum, "_HUNT_"); - mime_parser(msg->cm_fields[eMesageText], - NULL, - *ical_locate_part, /* callback function */ - NULL, NULL, - (void *) &ird, /* user data */ - 0 + mime_parser(CM_RANGE(msg, eMesageText), + *ical_locate_part, /* callback function */ + NULL, NULL, + (void *) &ird, /* user data */ + 0 ); CM_Free(msg); @@ -1684,7 +1665,7 @@ void ical_getics(void) encaps = icalcomponent_new_vcalendar(); if (encaps == NULL) { - syslog(LOG_ALERT, "ERROR: could not allocate component!\n"); + syslog(LOG_ERR, "calendar: could not allocate component!"); cprintf("%d Could not allocate memory\n", ERROR+INTERNAL_ERROR); return; } @@ -1762,7 +1743,7 @@ void ical_putics(void) } cprintf("%d Transmit data now\n", SEND_LISTING); - calstream = CtdlReadMessageBody(HKEY("000"), config.c_maxmsglen, NULL, 0, 0); + calstream = CtdlReadMessageBody(HKEY("000"), CtdlGetConfigLong("c_maxmsglen"), NULL, 0); if (calstream == NULL) { return; } @@ -1810,7 +1791,7 @@ void ical_putics(void) HashPos = GetNewHashPos(tzidlist, 0); while (GetNextHashPos(tzidlist, HashPos, &len, &Key, &Value)) { - syslog(LOG_DEBUG, "Attaching timezone '%s'\n", (char*) Value); + syslog(LOG_DEBUG, "calendar: attaching timezone '%s'", (char*) Value); icaltimezone *t = NULL; /* First look for a timezone attached to the original calendar */ @@ -1935,7 +1916,7 @@ void ical_CtdlCreateRoom(void) /* Set expiration policy to manual; otherwise objects will be lost! */ if (CtdlGetRoomLock(&qr, USERCALENDARROOM)) { - syslog(LOG_CRIT, "Couldn't get the user calendar room!\n"); + syslog(LOG_ERR, "calendar: couldn't get the user calendar room"); return; } qr.QRep.expire_mode = EXPIRE_MANUAL; @@ -1952,7 +1933,7 @@ void ical_CtdlCreateRoom(void) /* Set expiration policy to manual; otherwise objects will be lost! */ if (CtdlGetRoomLock(&qr, USERTASKSROOM)) { - syslog(LOG_CRIT, "Couldn't get the user calendar room!\n"); + syslog(LOG_ERR, "calendar: couldn't get the user calendar room!"); return; } qr.QRep.expire_mode = EXPIRE_MANUAL; @@ -1969,7 +1950,7 @@ void ical_CtdlCreateRoom(void) /* Set expiration policy to manual; otherwise objects will be lost! */ if (CtdlGetRoomLock(&qr, USERNOTESROOM)) { - syslog(LOG_CRIT, "Couldn't get the user calendar room!\n"); + syslog(LOG_ERR, "calendar: couldn't get the user calendar room!"); return; } qr.QRep.expire_mode = EXPIRE_MANUAL; @@ -1999,7 +1980,7 @@ void ical_send_out_invitations(icalcomponent *top_level_cal, icalcomponent *cal) icalcomponent *encaps = NULL; char *request_message_text = NULL; struct CtdlMessage *msg = NULL; - struct recptypes *valid = NULL; + recptypes *valid = NULL; char attendees_string[SIZ]; int num_attendees = 0; char this_attendee[256]; @@ -2018,7 +1999,7 @@ void ical_send_out_invitations(icalcomponent *top_level_cal, icalcomponent *cal) const char *tzidc = NULL; if (cal == NULL) { - syslog(LOG_ERR, "ERROR: trying to reply to NULL event?\n"); + syslog(LOG_ERR, "calendar: trying to reply to NULL event?"); return; } @@ -2036,7 +2017,7 @@ void ical_send_out_invitations(icalcomponent *top_level_cal, icalcomponent *cal) /* Clone the event */ the_request = icalcomponent_new_clone(cal); if (the_request == NULL) { - syslog(LOG_ERR, "ERROR: cannot clone calendar object\n"); + syslog(LOG_ERR, "calendar: cannot clone calendar object"); return; } @@ -2070,7 +2051,7 @@ void ical_send_out_invitations(icalcomponent *top_level_cal, icalcomponent *cal) } } - syslog(LOG_DEBUG, "<%d> attendees: <%s>\n", num_attendees, attendees_string); + syslog(LOG_DEBUG, "calendar: <%d> attendees: <%s>", num_attendees, attendees_string); /* If there are no attendees, there are no invitations to send, so... * don't bother putting one together! Punch out, Maverick! @@ -2083,7 +2064,7 @@ void ical_send_out_invitations(icalcomponent *top_level_cal, icalcomponent *cal) /* Encapsulate the VEVENT component into a complete VCALENDAR */ encaps = icalcomponent_new_vcalendar(); if (encaps == NULL) { - syslog(LOG_ALERT, "ERROR: could not allocate component!\n"); + syslog(LOG_ERR, "calendar: could not allocate component!"); icalcomponent_free(the_request); return; } @@ -2235,7 +2216,7 @@ void ical_saving_vevent(icalcomponent *top_level_cal, icalcomponent *cal) { icalproperty *organizer = NULL; char organizer_string[SIZ]; - syslog(LOG_DEBUG, "ical_saving_vevent() has been called!\n"); + syslog(LOG_DEBUG, "calendar: ical_saving_vevent() has been called"); /* Don't send out invitations unless the client wants us to. */ if (CIT_ICAL->server_generated_invitations == 0) { @@ -2347,7 +2328,7 @@ void ical_obj_beforesave_backend(char *name, char *filename, char *partnum, pch = icalproperty_get_comment(p); if (!IsEmptyStr(pch)) { CM_SetField(msg, eExclusiveID, pch, strlen(pch)); - syslog(LOG_DEBUG, "Saving calendar UID <%s>\n", pch); + syslog(LOG_DEBUG, "calendar: saving calendar UID <%s>", pch); } } @@ -2393,7 +2374,7 @@ void ical_obj_beforesave_backend(char *name, char *filename, char *partnum, * If the message is being saved, we also set various message header fields * using data found in the iCalendar object. */ -int ical_obj_beforesave(struct CtdlMessage *msg) +int ical_obj_beforesave(struct CtdlMessage *msg, recptypes *recp) { /* First determine if this is a calendar or tasks room */ if ( (CC->room.QRdefaultview != VIEW_CALENDAR) @@ -2404,7 +2385,7 @@ int ical_obj_beforesave(struct CtdlMessage *msg) /* It must be an RFC822 message! */ if (msg->cm_format_type != 4) { - syslog(LOG_DEBUG, "Rejecting non-RFC822 message\n"); + syslog(LOG_DEBUG, "calendar: rejecting non-RFC822 message"); return(1); /* You tried to save a non-RFC822 message! */ } @@ -2413,13 +2394,12 @@ int ical_obj_beforesave(struct CtdlMessage *msg) } /* Do all of our lovely back-end parsing */ - mime_parser(msg->cm_fields[eMesageText], - NULL, - *ical_obj_beforesave_backend, - NULL, NULL, - (void *)msg, - 0 - ); + mime_parser(CM_RANGE(msg, eMesageText), + *ical_obj_beforesave_backend, + NULL, NULL, + (void *)msg, + 0 + ); return(0); } @@ -2461,7 +2441,7 @@ void ical_obj_aftersave_backend(char *name, char *filename, char *partnum, * (This will start back end tasks such as automatic generation of invitations, * if such actions are appropriate.) */ -int ical_obj_aftersave(struct CtdlMessage *msg) +int ical_obj_aftersave(struct CtdlMessage *msg, recptypes *recp) { char roomname[ROOMNAMELEN]; @@ -2482,13 +2462,12 @@ int ical_obj_aftersave(struct CtdlMessage *msg) if (CM_IsEmpty(msg, eMesageText)) return(1); /* Now recurse through it looking for our icalendar data */ - mime_parser(msg->cm_fields[eMesageText], - NULL, - *ical_obj_aftersave_backend, - NULL, NULL, - NULL, - 0 - ); + mime_parser(CM_RANGE(msg, eMesageText), + *ical_obj_aftersave_backend, + NULL, NULL, + NULL, + 0 + ); return(0); } @@ -2580,12 +2559,12 @@ void ical_fixed_output(char *ptr, int len) { } - void serv_calendar_destroy(void) { icaltimezone_free_builtin_timezones(); } + /* * Register this module with the Citadel server. */ @@ -2595,7 +2574,12 @@ CTDL_MODULE_INIT(calendar) { /* Tell libical to return errors instead of aborting if it gets bad data */ + +#ifdef LIBICAL_ICAL_EXPORT // cheap and sleazy way to detect libical >=2.0 + icalerror_set_errors_are_fatal(0); +#else icalerror_errors_are_fatal = 0; +#endif /* Use our own application prefix in tzid's generated from system tzdata */ icaltimezone_set_tzid_prefix("/citadel.org/"); @@ -2611,7 +2595,7 @@ CTDL_MODULE_INIT(calendar) CtdlRegisterFixedOutputHook("application/ics", ical_fixed_output); CtdlRegisterCleanupHook(serv_calendar_destroy); } - + /* return our module name for the log */ return "calendar"; }