DAViCal
caldav-REPORT-expand-property.php
1 <?php
2 
8 function get_href_containers( &$multistatus_response ) {
9  $propstat_set = $multistatus_response->GetElements('DAV::propstat');
10  $propstat_200 = null;
11  foreach( $propstat_set AS $k => $v ) {
12  $status = $v->GetElements('DAV::status');
13  if ( preg_match( '{^HTTP/\S+\s+200}', $status[0]->GetContent() ) ) {
14  $propstat_200 = $v;
15  break;
16  }
17  }
18  if ( isset($propstat_200) ) {
19  $props = $propstat_200->GetElements('DAV::prop');
20  $properties = array();
21  foreach( $props AS $k => $p ) {
22  $properties = array_merge($properties,$p->GetElements());
23  }
24  $href_containers = array();
25  foreach( $properties AS $k => $property ) {
26  if ( !is_object($property) ) continue;
27 // dbg_error_log('REPORT',' get_href_containers: Checking property "%s" for hrefs.', $property->GetNSTag() );
28  $hrefs = $property->GetElements('DAV::href');
29  if ( count($hrefs) > 0 ) {
30  $href_containers[] = $property;
31  }
32  }
33  if ( count($href_containers) > 0 ) {
34  return $href_containers;
35  }
36  }
37  return null;
38 }
39 
40 
44 function expand_properties( $urls, $ptree, &$reply, $recurse_again = true ) {
45  if ( !is_array($urls) ) $urls = array($urls);
46  if ( !is_array($ptree) ) $ptree = array($ptree);
47 
48  $responses = array();
49  foreach( $urls AS $m => $url ) {
50  $resource = new DAVResource($url);
51  $props = array();
52  $subtrees = array();
53  foreach( $ptree AS $n => $property ) {
54  if ( ! is_object($property) ) continue;
55  $pname = $property->GetAttribute('name');
56  $pns = $property->GetAttribute('namespace');
57  if ( empty($pns) ) $pns = $property->GetAttribute('xmlns');
58  if ( empty($pns) ) $pns = $reply->DefaultNamespace();
59  $pname = (empty($pns)?'':$pns .':'). $pname;
60  $props[] = $pname;
61  $subtrees[$pname] = $property->GetElements();
62  }
63  $part_response = $resource->RenderAsXML( $props, $reply );
64  if ( isset($part_response) ) {
65  if ( $recurse_again ) {
66  $href_containers = get_href_containers($part_response);
67  if ( isset($href_containers) ) {
68  foreach( $href_containers AS $h => $property ) {
69  $hrefs = $property->GetElements();
70  $pname = $property->GetNSTag();
71  $paths = array();
72  foreach( $hrefs AS $k => $v ) {
73  $content = $v->GetContent();
74  // prevent infinite recursion and recursion to the object itself (non-recursive getting request URL properties)
75  if($content[0]=='/' && $content!='/caldav.php'.str_replace( '%2F', '/', rawurlencode($url)))
76  $paths[] = $content;
77  }
78  // dbg_error_log('REPORT',' Found property "%s" contains hrefs "%s"', $pname, implode(', ',$paths) );
79  $property->SetContent( expand_properties($paths, $subtrees[$pname], $reply, false) );
80  }
81  }
82 // else {
83 // dbg_error_log('REPORT',' No href containers in response to "%s"', implode(', ', $props ) );
84 // }
85  }
86  $responses[] = $part_response;
87  }
88  }
89 
90  return $responses;
91 }
92 
93 
97 $property_tree = $xmltree->GetPath('/DAV::expand-property/DAV::property');
98 
99 $multistatus = new XMLElement( "multistatus", expand_properties( $request->path, $property_tree, $reply), $reply->GetXmlNsArray() );
100 
101 $request->XMLResponse( 207, $multistatus );