diff --git a/lib/CardDAV/IAddressBookObjectContainer.php b/lib/CardDAV/IAddressBookObjectContainer.php new file mode 100644 index 0000000000..43a854e6fa --- /dev/null +++ b/lib/CardDAV/IAddressBookObjectContainer.php @@ -0,0 +1,30 @@ +server->tree->getChildren($this->server->getRequestUri()); + $node = $this->server->tree->getNodeForPath($this->server->getRequestUri()); + if ($node instanceof IAddressBookObjectContainer) { + $candidateNodes = $node->addressBookQuery($report); + $validNodes = $this->server->tree->getMultipleNodes(array_map(function (string $path) { + return $this->server->getRequestUri() . '/' . $path; + }, $candidateNodes)); + } else { + $candidateNodes = $this->server->tree->getChildren($this->server->getRequestUri()); + $validNodes = []; + foreach ($candidateNodes as $node) { + if (!$node instanceof ICard) { + continue; + } + + $blob = $node->get(); + if (is_resource($blob)) { + $blob = stream_get_contents($blob); + } + + if (!$this->validateFilters($blob, $report->filters, $report->test)) { + continue; + } + + $validNodes[] = $node; + + if ($report->limit && $report->limit <= count($validNodes)) { + // We hit the maximum number of items, we can stop now. + break; + } + } + } } $contentType = $report->contentType; @@ -419,29 +449,6 @@ protected function addressbookQueryReport($report) $contentType ); - $validNodes = []; - foreach ($candidateNodes as $node) { - if (!$node instanceof ICard) { - continue; - } - - $blob = $node->get(); - if (is_resource($blob)) { - $blob = stream_get_contents($blob); - } - - if (!$this->validateFilters($blob, $report->filters, $report->test)) { - continue; - } - - $validNodes[] = $node; - - if ($report->limit && $report->limit <= count($validNodes)) { - // We hit the maximum number of items, we can stop now. - break; - } - } - $result = []; foreach ($validNodes as $validNode) { if (0 == $depth) {