protected function addressbookQueryReport($report)
    {
        $depth = $this->server->getHTTPDepth(0);

        if (0 == $depth) {
            $candidateNodes = [
                $this->server->tree->getNodeForPath($this->server->getRequestUri()),
            ];
            if (!$candidateNodes[0] instanceof ICard) {
                throw new ReportNotSupported('The addressbook-query report is not supported on this url with Depth: 0');
            }
        } else {
            $candidateNodes = $this->server->tree->getChildren($this->server->getRequestUri());
        }

        $contentType = $report->contentType;
        if ($report->version) {
            $contentType .= '; version='.$report->version;
        }

        $vcardType = $this->negotiateVCard(
            $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) {
                $href = $this->server->getRequestUri();
            } else {
                $href = $this->server->getRequestUri().'/'.$validNode->getName();
            }

            list($props) = $this->server->getPropertiesForPath($href, $report->properties, 0);

            if (isset($props[200]['{'.self::NS_CARDDAV.'}address-data'])) {
                $props[200]['{'.self::NS_CARDDAV.'}address-data'] = $this->convertVCard(
                    $props[200]['{'.self::NS_CARDDAV.'}address-data'],
                    $vcardType,
                    $report->addressDataProperties
                );
            }
            $result[] = $props;
        }

        $prefer = $this->server->getHTTPPrefer();

        $this->server->httpResponse->setStatus(207);
        $this->server->httpResponse->setHeader('Content-Type', 'application/xml; charset=utf-8');
        $this->server->httpResponse->setHeader('Vary', 'Brief,Prefer');
        $this->server->httpResponse->setBody($this->server->generateMultiStatus($result, 'minimal' === $prefer['return']));
    }
protected function addressbookQueryReport($report)
    {
        $depth = $this->server->getHTTPDepth(0);

        if (0 == $depth) {
            $candidateNodes = [
                $this->server->tree->getNodeForPath($this->server->getRequestUri()),
            ];
            if (!$candidateNodes[0] instanceof ICard) {
                throw new ReportNotSupported('The addressbook-query report is not supported on this url with Depth: 0');
            }
        } else {
            $candidateNodes = $this->server->tree->getChildren($this->server->getRequestUri());
        }

        $contentType = $report->contentType;
        if ($report->version) {
            $contentType .= '; version='.$report->version;
        }

        $vcardType = $this->negotiateVCard(
            $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) {
                $href = $this->server->getRequestUri();
            } else {
                $href = $this->server->getRequestUri().'/'.$validNode->getName();
            }

            list($props) = $this->server->getPropertiesForPath($href, $report->properties, 0);

            if (isset($props[200]['{'.self::NS_CARDDAV.'}address-data'])) {
                $props[200]['{'.self::NS_CARDDAV.'}address-data'] = $this->convertVCard(
                    $props[200]['{'.self::NS_CARDDAV.'}address-data'],
                    $vcardType,
                    $report->addressDataProperties
                );
            }
            $result[] = $props;
        }

        $prefer = $this->server->getHTTPPrefer();

        $this->server->httpResponse->setStatus(207);
        $this->server->httpResponse->setHeader('Content-Type', 'application/xml; charset=utf-8');
        $this->server->httpResponse->setHeader('Vary', 'Brief,Prefer');
        $this->server->httpResponse->setBody($this->server->generateMultiStatus($result, 'minimal' === $prefer['return']));
    }
protected function addressbookQueryReport ( $ report ) { $ depth = $ this -> server -> getHTTPDepth ( 0 ) ; if ( 0 == $ depth ) { $ candidateNodes = [ $ this -> server -> tree -> getNodeForPath ( $ this -> server -> getRequestUri ( ) ) , ] ; if ( ! $ candidateNodes [ 0 ] instanceof ICard ) { throw new ReportNotSupported ( 'The addressbook-query report is not supported on this url with Depth: 0' ) ; } } else { $ candidateNodes = $ this -> server -> tree -> getChildren ( $ this -> server -> getRequestUri ( ) ) ; } $ contentType = $ report -> contentType ; if ( $ report -> version ) { $ contentType .= '; version=' . $ report -> version ; } $ vcardType = $ this -> negotiateVCard ( $ 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 ) { $ href = $ this -> server -> getRequestUri ( ) ; } else { $ href = $ this -> server -> getRequestUri ( ) . '/' . $ validNode -> getName ( ) ; } list ( $ props ) = $ this -> server -> getPropertiesForPath ( $ href , $ report -> properties , 0 ) ; if ( isset ( $ props [ 200 ] [ '{' . self :: NS_CARDDAV . '}address-data' ] ) ) { $ props [ 200 ] [ '{' . self :: NS_CARDDAV . '}address-data' ] = $ this -> convertVCard ( $ props [ 200 ] [ '{' . self :: NS_CARDDAV . '}address-data' ] , $ vcardType , $ report -> addressDataProperties ) ; } $ result [ ] = $ props ; } $ prefer = $ this -> server -> getHTTPPrefer ( ) ; $ this -> server -> httpResponse -> setStatus ( 207 ) ; $ this -> server -> httpResponse -> setHeader ( 'Content-Type' , 'application/xml; charset=utf-8' ) ; $ this -> server -> httpResponse -> setHeader ( 'Vary' , 'Brief,Prefer' ) ; $ this -> server -> httpResponse -> setBody ( $ this -> server -> generateMultiStatus ( $ result , 'minimal' === $ prefer [ 'return' ] ) ) ; }
This function handles the addressbook-query REPORT.

This report is used by the client to filter an addressbook based on a
complex query.

@param Xml\Request\AddressBookQueryReport $report
This function handles the addressbook - query REPORT .