* do typedef the visit struct, remove all those 'struct' statements from all over...
[citadel.git] / citadel / modules / calendar / serv_calendar.c
index 094ab130809a73167e56a0990a5e4414d8926706..e1e02ae544b0caf6c73704ec66cb2675e51d1422 100644 (file)
@@ -5,34 +5,34 @@
  * room on a Citadel server.  It handles iCalendar objects using the
  * iTIP protocol.  See RFCs 2445 and 2446.
  *
+ *
+ * Copyright (c) 1987-2009 by the citadel.org team
+ *
+ *  This program is free 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
  */
 
 #define PRODID "-//Citadel//NONSGML Citadel Calendar//EN"
 
-#include "sysdep.h"
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <limits.h>
-#include <stdio.h>
-#include <string.h>
-#ifdef HAVE_STRINGS_H
-#include <strings.h>
-#endif
+#include "ctdl_module.h"
+
 #include <libical/ical.h>
-#include <libcitadel.h>
-#include "citadel.h"
-#include "server.h"
-#include "citserver.h"
-#include "support.h"
-#include "config.h"
-#include "user_ops.h"
-#include "room_ops.h"
+
 #include "msgbase.h"
 #include "internet_addressing.h"
 #include "serv_calendar.h"
 #include "euidindex.h"
-#include "ctdl_module.h"
 #include "ical_dezonify.h"
 
 
@@ -600,8 +600,8 @@ int ical_update_my_calendar_with_reply(icalcomponent *cal) {
 
        strcpy(hold_rm, CC->room.QRname);       /* save current room */
 
-       if (getroom(&CC->room, USERCALENDARROOM) != 0) {
-               getroom(&CC->room, hold_rm);
+       if (CtdlGetRoom(&CC->room, USERCALENDARROOM) != 0) {
+               CtdlGetRoom(&CC->room, hold_rm);
                CtdlLogPrintf(CTDL_CRIT, "cannot get user calendar room\n");
                return(2);
        }
@@ -612,9 +612,9 @@ int ical_update_my_calendar_with_reply(icalcomponent *cal) {
         * Citadel always sets the message EUID to the iCalendar UID of
         * the event, this will work.
         */
-       msgnum_being_replaced = locate_message_by_euid(uid, &CC->room);
+       msgnum_being_replaced = CtdlLocateMessageByEuid(uid, &CC->room);
 
-       getroom(&CC->room, hold_rm);    /* return to saved room */
+       CtdlGetRoom(&CC->room, hold_rm);        /* return to saved room */
 
        CtdlLogPrintf(CTDL_DEBUG, "msgnum_being_replaced == %ld\n", msgnum_being_replaced);
        if (msgnum_being_replaced == 0) {
@@ -655,7 +655,7 @@ int ical_update_my_calendar_with_reply(icalcomponent *cal) {
        icalcomponent_free(original_event);     /* Don't need this anymore. */
        if (serialized_event == NULL) return(2);
 
-       MailboxName(roomname, sizeof roomname, &CC->user, USERCALENDARROOM);
+       CtdlMailboxName(roomname, sizeof roomname, &CC->user, USERCALENDARROOM);
 
        message_text = malloc(strlen(serialized_event) + SIZ);
        if (message_text != NULL) {
@@ -1172,8 +1172,8 @@ void ical_hunt_for_conflicts(icalcomponent *cal) {
 
        strcpy(hold_rm, CC->room.QRname);       /* save current room */
 
-       if (getroom(&CC->room, USERCALENDARROOM) != 0) {
-               getroom(&CC->room, hold_rm);
+       if (CtdlGetRoom(&CC->room, USERCALENDARROOM) != 0) {
+               CtdlGetRoom(&CC->room, hold_rm);
                cprintf("%d You do not have a calendar.\n", ERROR + ROOM_NOT_FOUND);
                return;
        }
@@ -1188,7 +1188,7 @@ void ical_hunt_for_conflicts(icalcomponent *cal) {
        );
 
        cprintf("000\n");
-       getroom(&CC->room, hold_rm);    /* return to saved room */
+       CtdlGetRoom(&CC->room, hold_rm);        /* return to saved room */
 
 }
 
@@ -1426,7 +1426,7 @@ void ical_freebusy(char *who) {
        int config_lines = 0;
 
        /* First try an exact match. */
-       found_user = getuser(&usbuf, who);
+       found_user = CtdlGetUser(&usbuf, who);
 
        /* If not found, try it as an unqualified email address. */
        if (found_user != 0) {
@@ -1435,7 +1435,7 @@ void ical_freebusy(char *who) {
                CtdlLogPrintf(CTDL_DEBUG, "Trying <%s>\n", buf);
                if (recp != NULL) {
                        if (recp->num_local == 1) {
-                               found_user = getuser(&usbuf, recp->recp_local);
+                               found_user = CtdlGetUser(&usbuf, recp->recp_local);
                        }
                        free_recipients(recp);
                }
@@ -1450,7 +1450,7 @@ void ical_freebusy(char *who) {
                recp = validate_recipients(buf, NULL, 0);
                if (recp != NULL) {
                        if (recp->num_local == 1) {
-                               found_user = getuser(&usbuf, recp->recp_local);
+                               found_user = CtdlGetUser(&usbuf, recp->recp_local);
                        }
                        free_recipients(recp);
                }
@@ -1473,7 +1473,7 @@ void ical_freebusy(char *who) {
                                recp = validate_recipients(buf, NULL, 0);
                                if (recp != NULL) {
                                        if (recp->num_local == 1) {
-                                               found_user = getuser(&usbuf, recp->recp_local);
+                                               found_user = CtdlGetUser(&usbuf, recp->recp_local);
                                        }
                                        free_recipients(recp);
                                }
@@ -1486,14 +1486,14 @@ void ical_freebusy(char *who) {
                return;
        }
 
-       MailboxName(calendar_room_name, sizeof calendar_room_name,
+       CtdlMailboxName(calendar_room_name, sizeof calendar_room_name,
                &usbuf, USERCALENDARROOM);
 
        strcpy(hold_rm, CC->room.QRname);       /* save current room */
 
-       if (getroom(&CC->room, calendar_room_name) != 0) {
+       if (CtdlGetRoom(&CC->room, calendar_room_name) != 0) {
                cprintf("%d Cannot open calendar\n", ERROR + ROOM_NOT_FOUND);
-               getroom(&CC->room, hold_rm);
+               CtdlGetRoom(&CC->room, hold_rm);
                return;
        }
 
@@ -1503,7 +1503,7 @@ void ical_freebusy(char *who) {
        if (fb == NULL) {
                cprintf("%d Internal error: cannot allocate memory.\n",
                        ERROR + INTERNAL_ERROR);
-               getroom(&CC->room, hold_rm);
+               CtdlGetRoom(&CC->room, hold_rm);
                return;
        }
 
@@ -1545,7 +1545,7 @@ void ical_freebusy(char *who) {
                icalcomponent_free(fb);
                cprintf("%d Internal error: cannot allocate memory.\n",
                        ERROR + INTERNAL_ERROR);
-               getroom(&CC->room, hold_rm);
+               CtdlGetRoom(&CC->room, hold_rm);
                return;
        }
 
@@ -1566,7 +1566,7 @@ void ical_freebusy(char *who) {
        cprintf("\n000\n");
 
        /* Go back to the room from which we came... */
-       getroom(&CC->room, hold_rm);
+       CtdlGetRoom(&CC->room, hold_rm);
 }
 
 
@@ -1706,7 +1706,7 @@ void ical_putics_grabtzids(icalparameter *param, void *data)
        HashList *keys = (HashList *) data;
        
        if ( (keys) && (tzid) && (!IsEmptyStr(tzid)) ) {
-               Put(keys, tzid, strlen(tzid), strdup(tzid), generic_free_handler);
+               Put(keys, tzid, strlen(tzid), strdup(tzid), NULL);
        }
 }
 
@@ -1741,7 +1741,7 @@ void ical_putics(void)
        }
 
        cprintf("%d Transmit data now\n", SEND_LISTING);
-       calstream = CtdlReadMessageBody("000", config.c_maxmsglen, NULL, 0, 0);
+       calstream = CtdlReadMessageBody(HKEY("000"), config.c_maxmsglen, NULL, 0, 0);
        if (calstream == NULL) {
                return;
        }
@@ -1904,22 +1904,22 @@ void cmd_ical(char *argbuf)
 /*
  * We don't know if the calendar room exists so we just create it at login
  */
-void ical_create_room(void)
+void ical_CtdlCreateRoom(void)
 {
        struct ctdlroom qr;
-       struct visit vbuf;
+       visit vbuf;
 
        /* Create the calendar room if it doesn't already exist */
-       create_room(USERCALENDARROOM, 4, "", 0, 1, 0, VIEW_CALENDAR);
+       CtdlCreateRoom(USERCALENDARROOM, 4, "", 0, 1, 0, VIEW_CALENDAR);
 
        /* Set expiration policy to manual; otherwise objects will be lost! */
-       if (lgetroom(&qr, USERCALENDARROOM)) {
+       if (CtdlGetRoomLock(&qr, USERCALENDARROOM)) {
                CtdlLogPrintf(CTDL_CRIT, "Couldn't get the user calendar room!\n");
                return;
        }
        qr.QRep.expire_mode = EXPIRE_MANUAL;
        qr.QRdefaultview = VIEW_CALENDAR;       /* 3 = calendar view */
-       lputroom(&qr);
+       CtdlPutRoomLock(&qr);
 
        /* Set the view to a calendar view */
        CtdlGetRelationship(&vbuf, &CC->user, &qr);
@@ -1927,16 +1927,16 @@ void ical_create_room(void)
        CtdlSetRelationship(&vbuf, &CC->user, &qr);
 
        /* Create the tasks list room if it doesn't already exist */
-       create_room(USERTASKSROOM, 4, "", 0, 1, 0, VIEW_TASKS);
+       CtdlCreateRoom(USERTASKSROOM, 4, "", 0, 1, 0, VIEW_TASKS);
 
        /* Set expiration policy to manual; otherwise objects will be lost! */
-       if (lgetroom(&qr, USERTASKSROOM)) {
+       if (CtdlGetRoomLock(&qr, USERTASKSROOM)) {
                CtdlLogPrintf(CTDL_CRIT, "Couldn't get the user calendar room!\n");
                return;
        }
        qr.QRep.expire_mode = EXPIRE_MANUAL;
        qr.QRdefaultview = VIEW_TASKS;
-       lputroom(&qr);
+       CtdlPutRoomLock(&qr);
 
        /* Set the view to a task list view */
        CtdlGetRelationship(&vbuf, &CC->user, &qr);
@@ -1944,16 +1944,16 @@ void ical_create_room(void)
        CtdlSetRelationship(&vbuf, &CC->user, &qr);
 
        /* Create the notes room if it doesn't already exist */
-       create_room(USERNOTESROOM, 4, "", 0, 1, 0, VIEW_NOTES);
+       CtdlCreateRoom(USERNOTESROOM, 4, "", 0, 1, 0, VIEW_NOTES);
 
        /* Set expiration policy to manual; otherwise objects will be lost! */
-       if (lgetroom(&qr, USERNOTESROOM)) {
+       if (CtdlGetRoomLock(&qr, USERNOTESROOM)) {
                CtdlLogPrintf(CTDL_CRIT, "Couldn't get the user calendar room!\n");
                return;
        }
        qr.QRep.expire_mode = EXPIRE_MANUAL;
        qr.QRdefaultview = VIEW_NOTES;
-       lputroom(&qr);
+       CtdlPutRoomLock(&qr);
 
        /* Set the view to a notes view */
        CtdlGetRelationship(&vbuf, &CC->user, &qr);
@@ -1993,6 +1993,8 @@ void ical_send_out_invitations(icalcomponent *top_level_cal, icalcomponent *cal)
        const icaltimezone *z;
        int num_zones_attached = 0;
        int zone_already_attached;
+       icalparameter *tzidp = NULL;
+       const char *tzidc = NULL;
 
        if (cal == NULL) {
                CtdlLogPrintf(CTDL_ERR, "ERROR: trying to reply to NULL event?\n");
@@ -2097,6 +2099,15 @@ void ical_send_out_invitations(icalcomponent *top_level_cal, icalcomponent *cal)
                ) {
                        t = icalproperty_get_dtstart(p);        // it's safe to use dtstart for all of them
 
+                       /* Determine the tzid in order for some of the conditions below to work */
+                       tzidp = icalproperty_get_first_parameter(p, ICAL_TZID_PARAMETER);
+                       if (tzidp) {
+                               tzidc = icalparameter_get_tzid(tzidp);
+                       }
+                       else {
+                               tzidc = NULL;
+                       }
+
                        /* First see if there's a timezone attached to the data structure itself */
                        if (icaltime_is_utc(t)) {
                                z = icaltimezone_get_utc_timezone();
@@ -2106,21 +2117,13 @@ void ical_send_out_invitations(icalcomponent *top_level_cal, icalcomponent *cal)
                        }
 
                        /* If not, try to determine the tzid from the parameter using attached zones */
-                       if (!z) {
-                               z = icalcomponent_get_timezone(top_level_cal,
-                                       icalparameter_get_tzid(
-                                               icalproperty_get_first_parameter(p, ICAL_TZID_PARAMETER)
-                                       )
-                               );
+                       if ((!z) && (tzidc)) {
+                               z = icalcomponent_get_timezone(top_level_cal, tzidc);
                        }
 
                        /* Still no good?  Try our internal database */
-                       if (!z) {
-                               z = icaltimezone_get_builtin_timezone_from_tzid(
-                                       icalparameter_get_tzid(
-                                               icalproperty_get_first_parameter(p, ICAL_TZID_PARAMETER)
-                                       )
-                               );
+                       if ((!z) && (tzidc)) {
+                               z = icaltimezone_get_builtin_timezone_from_tzid(tzidc);
                        }
 
                        if (z) {
@@ -2171,16 +2174,20 @@ void ical_send_out_invitations(icalcomponent *top_level_cal, icalcomponent *cal)
                        serialized_request
                );
 
-               msg = CtdlMakeMessage(&CC->user,
-                       "",                     /* No single recipient here */
-                       "",                     /* No single recipient here */
-                       CC->room.QRname, 0, FMT_RFC822,
-                       "",
-                       "",
+               msg = CtdlMakeMessage(
+                       &CC->user,
+                       NULL,                   /* No single recipient here */
+                       NULL,                   /* No single recipient here */
+                       CC->room.QRname,
+                       0,
+                       FMT_RFC822,
+                       NULL,
+                       NULL,
                        summary_string,         /* Use summary for subject */
                        NULL,
                        request_message_text,
-                       NULL);
+                       NULL
+               );
        
                if (msg != NULL) {
                        valid = validate_recipients(attendees_string, NULL, 0);
@@ -2451,7 +2458,7 @@ int ical_obj_aftersave(struct CtdlMessage *msg)
         */
 
        /* First determine if this is our room */
-       MailboxName(roomname, sizeof roomname, &CC->user, USERCALENDARROOM);
+       CtdlMailboxName(roomname, sizeof roomname, &CC->user, USERCALENDARROOM);
        if (strcasecmp(roomname, CC->room.QRname)) {
                return(0);      /* Not the Calendar room -- don't do anything. */
        }
@@ -2582,7 +2589,7 @@ CTDL_MODULE_INIT(calendar)
                /* Initialize our hook functions */
                CtdlRegisterMessageHook(ical_obj_beforesave, EVT_BEFORESAVE);
                CtdlRegisterMessageHook(ical_obj_aftersave, EVT_AFTERSAVE);
-               CtdlRegisterSessionHook(ical_create_room, EVT_LOGIN);
+               CtdlRegisterSessionHook(ical_CtdlCreateRoom, EVT_LOGIN);
                CtdlRegisterProtoHook(cmd_ical, "ICAL", "Citadel iCal commands");
                CtdlRegisterSessionHook(ical_session_startup, EVT_START);
                CtdlRegisterSessionHook(ical_session_shutdown, EVT_STOP);