From 98609364db51c887faacca875cf8f58b659642e4 Mon Sep 17 00:00:00 2001 From: Andrew McMillan Date: Wed, 17 Mar 2010 18:00:54 +1300 Subject: [PATCH] Switch freebusy report to AwlQuery and iCalComponent. --- inc/caldav-REPORT-freebusy.php | 35 +++-- .../830-Spec-FREEBUSY-1.result | 57 ++++---- .../regression-suite/830-Spec-FREEBUSY-1.test | 2 +- .../834-Spec-FREEBUSY-1.result | 123 +++++++++--------- .../regression-suite/834-Spec-FREEBUSY-1.test | 2 +- 5 files changed, 114 insertions(+), 105 deletions(-) diff --git a/inc/caldav-REPORT-freebusy.php b/inc/caldav-REPORT-freebusy.php index 5470b2aa..1d0719ca 100644 --- a/inc/caldav-REPORT-freebusy.php +++ b/inc/caldav-REPORT-freebusy.php @@ -12,13 +12,14 @@ $fbq_end = $fbq_content[0]->GetAttribute('end'); if ( ! ( isset($fbq_start) || isset($fbq_end) ) ) { $request->DoResponse( 400, 'All valid freebusy requests MUST contain a time-range filter' ); } -$where = " WHERE caldav_data.dav_name ~ ? "; -$where .= "AND rrule_event_overlaps( dtstart, dtend, rrule, ".qpg($fbq_start).", ".qpg($fbq_end)." ) "; +$params = array( ':path_match' => '^'.$request->path.$request->DepthRegexTail(), ':start' => $fbq_start, ':end' => $fbq_end ); +$where = ' WHERE caldav_data.dav_name ~ :path_match '; +$where .= 'AND rrule_event_overlaps( dtstart, dtend, rrule, :start, :end) '; $where .= "AND caldav_data.caldav_type IN ( 'VEVENT', 'VFREEBUSY' ) "; $where .= "AND (calendar_item.transp != 'TRANSPARENT' OR calendar_item.transp IS NULL) "; $where .= "AND (calendar_item.status != 'CANCELLED' OR calendar_item.status IS NULL) "; -if ( ! $request->AllowedTo('all') ) { +if ( $request->Privileges() != privilege_to_bits('all') ) { $where .= "AND (calendar_item.class != 'PRIVATE' OR calendar_item.class IS NULL) "; } @@ -29,8 +30,8 @@ $sql .= "to_char(calendar_item.dtstart at time zone 'GMT',".iCalendar::SqlDateFo $sql .= "to_char(calendar_item.dtend at time zone 'GMT',".iCalendar::SqlDateFormat().") AS finish "; $sql .= "FROM caldav_data INNER JOIN calendar_item USING(dav_id,user_no,dav_name)".$where; if ( isset($c->strict_result_ordering) && $c->strict_result_ordering ) $sql .= " ORDER BY dav_id"; -$qry = new PgQuery( $sql, "^".$request->path.$request->DepthRegexTail() ); -if ( $qry->Exec("REPORT",__LINE__,__FILE__) && $qry->rows > 0 ) { +$qry = new AwlQuery( $sql, $params ); +if ( $qry->Exec("REPORT",__LINE__,__FILE__) && $qry->rows() > 0 ) { while( $calendar_object = $qry->Fetch() ) { if ( $calendar_object->transp != "TRANSPARENT" ) { switch ( $calendar_object->status ) { @@ -51,8 +52,12 @@ if ( $qry->Exec("REPORT",__LINE__,__FILE__) && $qry->rows > 0 ) { } } } -$freebusy = iCalendar::iCalHeader(); -$freebusy .= sprintf("BEGIN:VFREEBUSY\nDTSTAMP:%s\nDTSTART:%s\nDTEND:%s\n", date('Ymd\THis\Z'), $fbq_start, $fbq_end); + +$freebusy = new iCalComponent(); +$freebusy->SetType('VFREEBUSY'); +$freebusy->AddProperty('DTSTAMP', date('Ymd\THis\Z')); +$freebusy->AddProperty('DTSTART', $fbq_start); +$freebusy->AddProperty('DTEND', $fbq_end); foreach( $busy_tentative AS $k => $v ) { $start = new iCalDate($v->start); @@ -64,11 +69,11 @@ foreach( $busy_tentative AS $k => $v ) { if ( $date->GreaterThan($fbq_end) ) break; $todate = clone($date); $todate->AddDuration($duration); - $freebusy .= sprintf("FREEBUSY;FBTYPE=BUSY-TENTATIVE:%s/%s\n", $date->Render('Ymd\THis'), $todate->Render('Ymd\THis') ); + $freebusy->AddProperty( 'FREEBUSY', $date->Render('Ymd\THis').'/'.$todate->Render('Ymd\THis'), array('FBTYPE' => 'BUSY-TENTATIVE') ); } } else { - $freebusy .= sprintf("FREEBUSY;FBTYPE=BUSY-TENTATIVE:%s/%s\n", $start->Render('Ymd\THis'), $v->finish ); + $freebusy->AddProperty( 'FREEBUSY', $start->Render('Ymd\THis').'/'.$v->finish, array('FBTYPE' => 'BUSY-TENTATIVE') ); } } @@ -82,16 +87,18 @@ foreach( $busy AS $k => $v ) { if ( $date->GreaterThan($fbq_end) ) break; $todate = clone($date); $todate->AddDuration($duration); - $freebusy .= sprintf("FREEBUSY:%s/%s\n", $date->Render('Ymd\THis'), $todate->Render('Ymd\THis') ); + $freebusy->AddProperty( 'FREEBUSY', $date->Render('Ymd\THis').'/'.$todate->Render('Ymd\THis') ); } } else { - $freebusy .= sprintf("FREEBUSY:%s/%s\n", $start->Render('Ymd\THis'), $v->finish ); + $freebusy->AddProperty( 'FREEBUSY', $start->Render('Ymd\THis').'/'.$v->finish ); } } -$freebusy .= "END:VFREEBUSY\n"; -$freebusy .= iCalendar::iCalFooter(); -$request->DoResponse( 200, $freebusy, 'text/calendar' ); +$result = new iCalComponent(); +$result->VCalendar(); +$result->AddComponent($freebusy); + +$request->DoResponse( 200, $result->Render(), 'text/calendar' ); // Won't return from that diff --git a/testing/tests/regression-suite/830-Spec-FREEBUSY-1.result b/testing/tests/regression-suite/830-Spec-FREEBUSY-1.result index 472b472d..2782c922 100644 --- a/testing/tests/regression-suite/830-Spec-FREEBUSY-1.result +++ b/testing/tests/regression-suite/830-Spec-FREEBUSY-1.result @@ -1,38 +1,39 @@ HTTP/1.1 200 OK Date: Dow, 01 Jan 2000 00:00:00 GMT DAV: 1, 2, access-control, calendar-access, calendar-schedule, extended-mkcol, calendar-proxy -Content-Length: 1162 +Content-Length: 1210 Content-Type: text/calendar BEGIN:VCALENDAR PRODID:-//davical.org//NONSGML AWL Calendar//EN VERSION:2.0 -BEGIN:VFREEBUSY +CALSCALE:GREGORIAN +BEGIN:VFREEBUSY DTSTAMP:yyyymmddThhmmssZ -DTSTART:20061004T140000Z -DTEND:20070105T220000Z -FREEBUSY;FBTYPE=BUSY-TENTATIVE:20061223T060000/20061223T080000 -FREEBUSY:20061101T233000/20061102T003000 -FREEBUSY:20061031T210000/20061031T220000 -FREEBUSY:20061102T210000/20061102T220000 -FREEBUSY:20061109T210000/20061109T220000 -FREEBUSY:20061116T210000/20061116T220000 -FREEBUSY:20061123T210000/20061123T220000 -FREEBUSY:20061130T210000/20061130T220000 -FREEBUSY:20061207T210000/20061207T220000 -FREEBUSY:20061214T210000/20061214T220000 -FREEBUSY:20061221T210000/20061221T220000 -FREEBUSY:20061228T210000/20061228T220000 -FREEBUSY:20070104T210000/20070104T220000 -FREEBUSY:20061223T030000/20061223T050000 -FREEBUSY:20061223T000000/20061223T020000 -FREEBUSY:20061103T030000/20061103T044500 -FREEBUSY:20061117T030000/20061117T044500 -FREEBUSY:20061201T030000/20061201T044500 -FREEBUSY:20061215T030000/20061215T044500 -FREEBUSY:20061229T030000/20061229T044500 -FREEBUSY:20061102T183000/20061102T203000 -FREEBUSY:20061202T183000/20061202T203000 -FREEBUSY:20070102T183000/20070102T203000 -END:VFREEBUSY +DTSTART:20061004T140000Z +DTEND:20070105T220000Z +FREEBUSY;FBTYPE=BUSY-TENTATIVE:20061223T060000/20061223T080000 +FREEBUSY:20061101T233000/20061102T003000 +FREEBUSY:20061031T210000/20061031T220000 +FREEBUSY:20061102T210000/20061102T220000 +FREEBUSY:20061109T210000/20061109T220000 +FREEBUSY:20061116T210000/20061116T220000 +FREEBUSY:20061123T210000/20061123T220000 +FREEBUSY:20061130T210000/20061130T220000 +FREEBUSY:20061207T210000/20061207T220000 +FREEBUSY:20061214T210000/20061214T220000 +FREEBUSY:20061221T210000/20061221T220000 +FREEBUSY:20061228T210000/20061228T220000 +FREEBUSY:20070104T210000/20070104T220000 +FREEBUSY:20061223T030000/20061223T050000 +FREEBUSY:20061223T000000/20061223T020000 +FREEBUSY:20061103T030000/20061103T044500 +FREEBUSY:20061117T030000/20061117T044500 +FREEBUSY:20061201T030000/20061201T044500 +FREEBUSY:20061215T030000/20061215T044500 +FREEBUSY:20061229T030000/20061229T044500 +FREEBUSY:20061102T183000/20061102T203000 +FREEBUSY:20061202T183000/20061202T203000 +FREEBUSY:20070102T183000/20070102T203000 +END:VFREEBUSY END:VCALENDAR diff --git a/testing/tests/regression-suite/830-Spec-FREEBUSY-1.test b/testing/tests/regression-suite/830-Spec-FREEBUSY-1.test index cf5b16aa..3937c6a1 100644 --- a/testing/tests/regression-suite/830-Spec-FREEBUSY-1.test +++ b/testing/tests/regression-suite/830-Spec-FREEBUSY-1.test @@ -17,4 +17,4 @@ BEGINDATA ENDDATA -REPLACE=/^DTSTAMP:\d{8}T\d{6}Z$/DTSTAMP:yyyymmddThhmmssZ/ +REPLACE=/^DTSTAMP:\d{8}T\d{6}Z\r?$/DTSTAMP:yyyymmddThhmmssZ/ diff --git a/testing/tests/regression-suite/834-Spec-FREEBUSY-1.result b/testing/tests/regression-suite/834-Spec-FREEBUSY-1.result index 13d2e3ee..356c948a 100644 --- a/testing/tests/regression-suite/834-Spec-FREEBUSY-1.result +++ b/testing/tests/regression-suite/834-Spec-FREEBUSY-1.result @@ -1,71 +1,72 @@ HTTP/1.1 200 OK Date: Dow, 01 Jan 2000 00:00:00 GMT DAV: 1, 2, access-control, calendar-access, calendar-schedule, extended-mkcol, calendar-proxy -Content-Length: 2515 +Content-Length: 2596 Content-Type: text/calendar BEGIN:VCALENDAR PRODID:-//davical.org//NONSGML AWL Calendar//EN VERSION:2.0 -BEGIN:VFREEBUSY +CALSCALE:GREGORIAN +BEGIN:VFREEBUSY DTSTAMP:yyyymmddThhmmssZ -DTSTART:20061001T000000Z -DTEND:20070630T235959Z -FREEBUSY;FBTYPE=BUSY-TENTATIVE:20061223T060000/20061223T080000 -FREEBUSY:20061101T233000/20061102T003000 -FREEBUSY:20061031T210000/20061031T220000 -FREEBUSY:20061102T210000/20061102T220000 -FREEBUSY:20061109T210000/20061109T220000 -FREEBUSY:20061116T210000/20061116T220000 -FREEBUSY:20061123T210000/20061123T220000 -FREEBUSY:20061130T210000/20061130T220000 -FREEBUSY:20061207T210000/20061207T220000 -FREEBUSY:20061214T210000/20061214T220000 -FREEBUSY:20061221T210000/20061221T220000 -FREEBUSY:20061228T210000/20061228T220000 -FREEBUSY:20070104T210000/20070104T220000 -FREEBUSY:20070111T210000/20070111T220000 -FREEBUSY:20070118T210000/20070118T220000 -FREEBUSY:20070125T210000/20070125T220000 -FREEBUSY:20070201T210000/20070201T220000 -FREEBUSY:20070208T210000/20070208T220000 -FREEBUSY:20070215T210000/20070215T220000 -FREEBUSY:20070222T210000/20070222T220000 -FREEBUSY:20070301T210000/20070301T220000 -FREEBUSY:20070308T210000/20070308T220000 -FREEBUSY:20070315T210000/20070315T220000 -FREEBUSY:20070322T210000/20070322T220000 -FREEBUSY:20070329T210000/20070329T220000 -FREEBUSY:20070405T210000/20070405T220000 -FREEBUSY:20070412T210000/20070412T220000 -FREEBUSY:20070419T210000/20070419T220000 -FREEBUSY:20070426T210000/20070426T220000 -FREEBUSY:20061223T030000/20061223T050000 -FREEBUSY:20061103T030000/20061103T044500 -FREEBUSY:20061117T030000/20061117T044500 -FREEBUSY:20061201T030000/20061201T044500 -FREEBUSY:20061215T030000/20061215T044500 -FREEBUSY:20061229T030000/20061229T044500 -FREEBUSY:20070112T030000/20070112T044500 -FREEBUSY:20070126T030000/20070126T044500 -FREEBUSY:20070209T030000/20070209T044500 -FREEBUSY:20070223T030000/20070223T044500 -FREEBUSY:20070309T030000/20070309T044500 -FREEBUSY:20070323T030000/20070323T044500 -FREEBUSY:20070406T030000/20070406T044500 -FREEBUSY:20070420T030000/20070420T044500 -FREEBUSY:20070504T030000/20070504T044500 -FREEBUSY:20070518T030000/20070518T044500 -FREEBUSY:20070601T030000/20070601T044500 -FREEBUSY:20070615T030000/20070615T044500 -FREEBUSY:20070629T030000/20070629T044500 -FREEBUSY:20061102T183000/20061102T203000 -FREEBUSY:20061202T183000/20061202T203000 -FREEBUSY:20070102T183000/20070102T203000 -FREEBUSY:20070202T183000/20070202T203000 -FREEBUSY:20070302T183000/20070302T203000 -FREEBUSY:20070402T183000/20070402T203000 -FREEBUSY:20070502T183000/20070502T203000 -FREEBUSY:20070602T183000/20070602T203000 -END:VFREEBUSY +DTSTART:20061001T000000Z +DTEND:20070630T235959Z +FREEBUSY;FBTYPE=BUSY-TENTATIVE:20061223T060000/20061223T080000 +FREEBUSY:20061101T233000/20061102T003000 +FREEBUSY:20061031T210000/20061031T220000 +FREEBUSY:20061102T210000/20061102T220000 +FREEBUSY:20061109T210000/20061109T220000 +FREEBUSY:20061116T210000/20061116T220000 +FREEBUSY:20061123T210000/20061123T220000 +FREEBUSY:20061130T210000/20061130T220000 +FREEBUSY:20061207T210000/20061207T220000 +FREEBUSY:20061214T210000/20061214T220000 +FREEBUSY:20061221T210000/20061221T220000 +FREEBUSY:20061228T210000/20061228T220000 +FREEBUSY:20070104T210000/20070104T220000 +FREEBUSY:20070111T210000/20070111T220000 +FREEBUSY:20070118T210000/20070118T220000 +FREEBUSY:20070125T210000/20070125T220000 +FREEBUSY:20070201T210000/20070201T220000 +FREEBUSY:20070208T210000/20070208T220000 +FREEBUSY:20070215T210000/20070215T220000 +FREEBUSY:20070222T210000/20070222T220000 +FREEBUSY:20070301T210000/20070301T220000 +FREEBUSY:20070308T210000/20070308T220000 +FREEBUSY:20070315T210000/20070315T220000 +FREEBUSY:20070322T210000/20070322T220000 +FREEBUSY:20070329T210000/20070329T220000 +FREEBUSY:20070405T210000/20070405T220000 +FREEBUSY:20070412T210000/20070412T220000 +FREEBUSY:20070419T210000/20070419T220000 +FREEBUSY:20070426T210000/20070426T220000 +FREEBUSY:20061223T030000/20061223T050000 +FREEBUSY:20061103T030000/20061103T044500 +FREEBUSY:20061117T030000/20061117T044500 +FREEBUSY:20061201T030000/20061201T044500 +FREEBUSY:20061215T030000/20061215T044500 +FREEBUSY:20061229T030000/20061229T044500 +FREEBUSY:20070112T030000/20070112T044500 +FREEBUSY:20070126T030000/20070126T044500 +FREEBUSY:20070209T030000/20070209T044500 +FREEBUSY:20070223T030000/20070223T044500 +FREEBUSY:20070309T030000/20070309T044500 +FREEBUSY:20070323T030000/20070323T044500 +FREEBUSY:20070406T030000/20070406T044500 +FREEBUSY:20070420T030000/20070420T044500 +FREEBUSY:20070504T030000/20070504T044500 +FREEBUSY:20070518T030000/20070518T044500 +FREEBUSY:20070601T030000/20070601T044500 +FREEBUSY:20070615T030000/20070615T044500 +FREEBUSY:20070629T030000/20070629T044500 +FREEBUSY:20061102T183000/20061102T203000 +FREEBUSY:20061202T183000/20061202T203000 +FREEBUSY:20070102T183000/20070102T203000 +FREEBUSY:20070202T183000/20070202T203000 +FREEBUSY:20070302T183000/20070302T203000 +FREEBUSY:20070402T183000/20070402T203000 +FREEBUSY:20070502T183000/20070502T203000 +FREEBUSY:20070602T183000/20070602T203000 +END:VFREEBUSY END:VCALENDAR diff --git a/testing/tests/regression-suite/834-Spec-FREEBUSY-1.test b/testing/tests/regression-suite/834-Spec-FREEBUSY-1.test index 33d0aaba..a5f6d27e 100644 --- a/testing/tests/regression-suite/834-Spec-FREEBUSY-1.test +++ b/testing/tests/regression-suite/834-Spec-FREEBUSY-1.test @@ -19,4 +19,4 @@ BEGINDATA ENDDATA -REPLACE=/^DTSTAMP:\d{8}T\d{6}Z$/DTSTAMP:yyyymmddThhmmssZ/ +REPLACE=/^DTSTAMP:\d{8}T\d{6}Z\r?$/DTSTAMP:yyyymmddThhmmssZ/