X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fcalendar_tools.c;h=5fffee44c3b692e5358fa4c78629165fde99c176;hb=fb6f6fa4ec4e3277e30d84326d48e6850822d318;hp=21b8e063f8f5ece9bf71e069e96c8ce0904c45cf;hpb=2bf2faa6b02e497fa0358428b15e924171a6c555;p=citadel.git diff --git a/webcit/calendar_tools.c b/webcit/calendar_tools.c index 21b8e063f..5fffee44c 100644 --- a/webcit/calendar_tools.c +++ b/webcit/calendar_tools.c @@ -1,12 +1,21 @@ /* - * $Id$ - * * Miscellaneous functions which handle calendar components. + * + * Copyright (c) 1996-2012 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 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. */ #include "webcit.h" #include "webserver.h" #include "time.h" +#include "calendar.h" /* Hour strings */ char *hourname[] = { @@ -34,10 +43,10 @@ char *hourname[] = { */ void display_icaltimetype_as_webform(struct icaltimetype *t, char *prefix, int date_only) { + wcsession *WCC = WC; int i; time_t now; struct tm tm_now; - int this_year; time_t tt; struct tm tm; int all_day_event = 0; @@ -48,7 +57,6 @@ void display_icaltimetype_as_webform(struct icaltimetype *t, char *prefix, int d now = time(NULL); localtime_r(&now, &tm_now); - this_year = tm_now.tm_year + 1900; if (t == NULL) return; if (t->is_date) all_day_event = 1; @@ -60,14 +68,14 @@ void display_icaltimetype_as_webform(struct icaltimetype *t, char *prefix, int d localtime_r(&tt, &tm); } - wprintf("WBuf, prefix, -1, 0); + wc_printf("\" id=\""); + StrBufAppendBufPlain(WCC->WBuf, prefix, -1, 0); + wc_printf("\" size=\"10\" maxlength=\"10\" value=\""); wc_strftime(timebuf, 32, "%Y-%m-%d", &tm); - wprintf(timebuf); - wprintf("\">"); + StrBufAppendBufPlain(WCC->WBuf, timebuf, -1, 0); + wc_printf("\">"); StrBufAppendPrintf(WC->trailing_javascript, "attachDatePicker('"); StrBufAppendPrintf(WC->trailing_javascript, prefix); @@ -77,43 +85,46 @@ void display_icaltimetype_as_webform(struct icaltimetype *t, char *prefix, int d * This keeps the data model consistent. */ if (date_only) { - wprintf("
"); + wc_printf("
"); } - wprintf(_("Hour: ")); - wprintf("\n", prefix); for (i=0; i<=23; ++i) { if (time_format == WC_TIMEFORMAT_24) { - wprintf("\n", + wc_printf("\n", ((tm.tm_hour == i) ? "SELECTED" : ""), i, i ); } else { - wprintf("\n", + wc_printf("\n", ((tm.tm_hour == i) ? "SELECTED" : ""), i, hourname[i] ); } } - wprintf("\n"); + wc_printf("\n"); - wprintf(_("Minute: ")); - wprintf("\n", prefix); for (i=0; i<=59; ++i) { if ( (i % 5 == 0) || (tm.tm_min == i) ) { - wprintf("\n", + wc_printf("\n", ((tm.tm_min == i) ? "SELECTED" : ""), i, i ); } } - wprintf("\n"); + wc_printf("\n"); if (date_only) { - wprintf("
"); + wc_printf("
"); } } @@ -122,27 +133,27 @@ void display_icaltimetype_as_webform(struct icaltimetype *t, char *prefix, int d */ void icaltime_from_webform(struct icaltimetype *t, char *prefix) { char vname[32]; - struct tm tm; - struct icaltimetype t2; - /* Stuff tm with zero values */ - memset(&tm, 0, sizeof(struct tm)); + if (!t) return; + + /* Stuff with zero values */ + memset(t, 0, sizeof(struct icaltimetype)); - /* Get the year/month/date all in one shot */ - strptime((char*)BSTR(prefix), "%Y-%m-%d", &tm); + /* Get the year/month/date all in one shot -- it will be in ISO YYYY-MM-DD format */ + sscanf((char*)BSTR(prefix), "%04d-%02d-%02d", &t->year, &t->month, &t->day); /* hour */ sprintf(vname, "%s_hour", prefix); - tm.tm_hour = IBSTR(vname); + t->hour = IBSTR(vname); /* minute */ sprintf(vname, "%s_minute", prefix); - tm.tm_min = IBSTR(vname); + t->minute = IBSTR(vname); - /* now convert to icaltimetyepe */ - t2 = icaltime_from_timet_with_zone(mktime(&tm), 0, get_default_icaltimezone()); - t2.zone = get_default_icaltimezone(); - memcpy(t, &t2, sizeof(struct icaltimetype)); + /* time zone is set to the default zone for this server */ + t->is_utc = 0; + t->is_date = 0; + t->zone = get_default_icaltimezone(); } @@ -150,18 +161,17 @@ void icaltime_from_webform(struct icaltimetype *t, char *prefix) { * Get date (no time) from a web form and convert it into an icaltimetype struct. */ void icaltime_from_webform_dateonly(struct icaltimetype *t, char *prefix) { - struct tm tm; - time_t tm_t; - struct icaltimetype t2; - - /* Stuff tm with zero values */ - memset(&tm, 0, sizeof(struct tm)); - - /* Convert from string to icaltimetype */ - strptime((char *)BSTR(prefix), "%Y-%m-%d", &tm); - tm_t = mktime(&tm); - t2 = icaltime_from_timet(tm_t, 1); - memcpy(t, &t2, sizeof(struct icaltimetype)); + if (!t) return; + + /* Stuff with zero values */ + memset(t, 0, sizeof(struct icaltimetype)); + + /* Get the year/month/date all in one shot -- it will be in ISO YYYY-MM-DD format */ + sscanf((char*)BSTR(prefix), "%04d-%02d-%02d", &t->year, &t->month, &t->day); + + /* time zone is set to the default zone for this server */ + t->is_utc = 1; + t->is_date = 1; } @@ -218,10 +228,9 @@ void partstat_as_string(char *buf, icalproperty *attendee) { * Utility function to encapsulate a subcomponent into a full VCALENDAR. * * We also scan for any date/time properties that reference timezones, and attach - * those timezones along with the supplied subcomponent. (Yes, I used a fixed - * size array in order to avoid complexity. Increase the size if you think you - * need to, but if you're really referencing more than 5 time zones in a single - * calendar event, it probably means you're an idiot and deserve to lose.) + * those timezones along with the supplied subcomponent. (Increase the size of the array if you need to.) + * + * Note: if you change anything here, change it in Citadel server's ical_send_out_invitations() too. */ icalcomponent *ical_encapsulate_subcomponent(icalcomponent *subcomp) { icalcomponent *encaps; @@ -234,7 +243,7 @@ icalcomponent *ical_encapsulate_subcomponent(icalcomponent *subcomp) { int zone_already_attached; if (subcomp == NULL) { - lprintf(3, "ERROR: ical_encapsulate_subcomponent() called with NULL argument\n"); + syslog(3, "ERROR: ical_encapsulate_subcomponent() called with NULL argument\n"); return NULL; } @@ -242,7 +251,7 @@ icalcomponent *ical_encapsulate_subcomponent(icalcomponent *subcomp) { * If we're already looking at a full VCALENDAR component, this is probably an error. */ if (icalcomponent_isa(subcomp) == ICAL_VCALENDAR_COMPONENT) { - lprintf(3, "ERROR: component sent to ical_encapsulate_subcomponent() already top level\n"); + syslog(3, "ERROR: component sent to ical_encapsulate_subcomponent() already top level\n"); return subcomp; } @@ -265,18 +274,18 @@ icalcomponent *ical_encapsulate_subcomponent(icalcomponent *subcomp) { || (icalproperty_isa(p) == ICAL_MINDATE_PROPERTY) || (icalproperty_isa(p) == ICAL_RECURRENCEID_PROPERTY) ) { - t = icalproperty_get_dtstart(p); // it's safe to use dtstart for all of them + t = icalproperty_get_dtstart(p); /*/ it's safe to use dtstart for all of them */ if ((icaltime_is_valid_time(t)) && (z=icaltime_get_timezone(t), z)) { zone_already_attached = 0; for (i=0; i<5; ++i) { if (z == attached_zones[i]) { ++zone_already_attached; - lprintf(9, "zone already attached!!\n"); + syslog(9, "zone already attached!!\n"); } } if ((!zone_already_attached) && (num_zones_attached < 5)) { - lprintf(9, "attaching zone %d!\n", num_zones_attached); + syslog(9, "attaching zone %d!\n", num_zones_attached); attached_zones[num_zones_attached++] = z; } @@ -290,7 +299,7 @@ icalcomponent *ical_encapsulate_subcomponent(icalcomponent *subcomp) { /* Encapsulate the VEVENT component into a complete VCALENDAR */ encaps = icalcomponent_new(ICAL_VCALENDAR_COMPONENT); if (encaps == NULL) { - lprintf(3, "ERROR: ical_encapsulate_subcomponent() could not allocate component\n"); + syslog(3, "ERROR: ical_encapsulate_subcomponent() could not allocate component\n"); return NULL; }