/** * Prepare propfind response for the given nodes * * @param string[] $requestedProps requested properties * @param Node[] nodes nodes for which to fetch and prepare responses * @return Response[] */ public function prepareResponses($requestedProps, $nodes) { $responses = []; foreach ($nodes as $node) { $propFind = new PropFind($node->getPath(), $requestedProps); $this->server->getPropertiesByNode($propFind, $node); // copied from Sabre Server's getPropertiesForPath $result = $propFind->getResultForMultiStatus(); $result['href'] = $propFind->getPath(); $resourceType = $this->server->getResourceTypeForNode($node); if (in_array('{DAV:}collection', $resourceType) || in_array('{DAV:}principal', $resourceType)) { $result['href'] .= '/'; } $responses[] = new Response(rtrim($this->server->getBaseUri(), '/') . $node->getPath(), $result, 200); } return $responses; }
/** * This method is called when properties are retrieved. * * Here we add all the default properties. * * @param PropFind $propFind * @param INode $node * @return void */ function propFind(PropFind $propFind, INode $node) { $propFind->handle('{DAV:}getlastmodified', function() use ($node) { $lm = $node->getLastModified(); if ($lm) { return new Xml\Property\GetLastModified($lm); } }); if ($node instanceof IFile) { $propFind->handle('{DAV:}getcontentlength', [$node, 'getSize']); $propFind->handle('{DAV:}getetag', [$node, 'getETag']); $propFind->handle('{DAV:}getcontenttype', [$node, 'getContentType']); } if ($node instanceof IQuota) { $quotaInfo = null; $propFind->handle('{DAV:}quota-used-bytes', function() use (&$quotaInfo, $node) { $quotaInfo = $node->getQuotaInfo(); return $quotaInfo[0]; }); $propFind->handle('{DAV:}quota-available-bytes', function() use (&$quotaInfo, $node) { if (!$quotaInfo) { $quotaInfo = $node->getQuotaInfo(); } return $quotaInfo[1]; }); } $propFind->handle('{DAV:}supported-report-set', function() use ($propFind) { $reports = []; foreach ($this->server->getPlugins() as $plugin) { $reports = array_merge($reports, $plugin->getSupportedReportSet($propFind->getPath())); } return new Xml\Property\SupportedReportSet($reports); }); $propFind->handle('{DAV:}resourcetype', function() use ($node) { return new Xml\Property\ResourceType($this->server->getResourceTypeForNode($node)); }); $propFind->handle('{DAV:}supported-method-set', function() use ($propFind) { return new Xml\Property\SupportedMethodSet( $this->server->getAllowedMethods($propFind->getPath()) ); }); }