1: <?php
2:
3: 4: 5: 6: 7:
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:
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:
41: 42: 43:
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:
75: if($content[0]=='/' && $content!='/caldav.php'.str_replace( '%2F', '/', rawurlencode($url)))
76: $paths[] = $content;
77: }
78:
79: $property->SetContent( expand_properties($paths, $subtrees[$pname], $reply, false) );
80: }
81: }
82:
83:
84:
85: }
86: $responses[] = $part_response;
87: }
88: }
89:
90: return $responses;
91: }
92:
93:
94: 95: 96:
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 );
102: