Files
server/usr/share/psa-pear/pear/php/Horde/Dav/File.php
2026-01-07 20:52:11 +01:00

268 lines
6.6 KiB
PHP

<?php
/**
* Copyright 2013-2015 Horde LLC (http://www.horde.org/)
*
* See the enclosed file LICENSE for license information (BSD). If you
* did not receive this file, see http://www.horde.org/licenses/bsd.
*
* @author Jan Schneider <jan@horde.org>
* @category Horde
* @license http://www.horde.org/licenses/bsd BSD
* @package Dav
*/
use \Sabre\DAV;
/**
* A file object.
*
* @author Jan Schneider <jan@horde.org>
* @category Horde
* @license http://www.horde.org/licenses/bsd BSD
* @package Dav
*/
class Horde_Dav_File extends Sabre\DAV\File implements DAV\IProperties
{
/**
* A registry object.
*
* @var Horde_Registry
*/
protected $_registry;
/**
* The path to the current file.
*
* @var string
*/
protected $_path;
/**
* File details.
*
* @var array
*/
protected $_item;
/**
* File size.
*
* This will only be set if the actual file data is requested, to avoid the
* overhead of building the file content only to retrieve the file size.
*
* @var integer
*/
protected $_size;
/**
* Mapping of WebDAV property names to Horde API's browse() properties.
*
* @var array
*/
protected static $_propertyMap = array(
'{DAV:}getcontentlength' => 'contentlength',
'{DAV:}getcontenttype' => 'contentype',
'{DAV:}getetag' => 'etag',
'{DAV:}owner' => 'owner',
'{http://sabredav.org/ns}read-only' => 'read-only',
);
/**
* Constructor.
*
* @param Horde_Registry $registry A registry object.
* @param string $path The path to this file.
* @param array $item File details.
*/
public function __construct(Horde_Registry $registry, $path = null,
array $item = array())
{
$this->_registry = $registry;
$this->_path = $path;
$this->_item = $item;
}
/**
* Deletes the current node.
*/
public function delete()
{
list($base) = explode('/', $this->_path);
try {
$this->_registry->callByPackage(
$base,
'path_delete',
array($this->_path)
);
} catch (Horde_Exception_NotFound $e) {
throw new DAV\Exception\NotFound($this->_path . ' not found');
} catch (Horde_Exception $e) {
throw new DAV\Exception($e);
}
}
/**
* Returns the name of the node.
*
* This is used to generate the url.
*
* @return string
*/
public function getName()
{
list($dir, $base) = DAV\URLUtil::splitPath($this->_path);
return $base;
}
/**
* Returns the last modification time, as a unix timestamp
*
* @return int
*/
public function getLastModified()
{
if (!empty($this->_item['modified'])) {
return $this->_item['modified'];
}
if (!empty($this->_item['created'])) {
return $this->_item['created'];
}
return parent::getLastModified();
}
/**
* Updates the data
*
* data is a readable stream resource.
*
* @param resource $data
* @return void
*/
public function put($data)
{
list($base) = explode('/', $this->_path);
try {
rewind($data);
$this->_registry->callByPackage(
$base,
'put',
array(
$this->_path,
stream_get_contents($data),
$this->getContentType() ?: 'application/octet-stream'
)
);
} catch (Horde_Exception_NotFound $e) {
throw new DAV\Exception\NotFound($this->_path . ' not found');
} catch (Horde_Exception $e) {
throw new DAV\Exception($e);
}
}
/**
* Returns the data
*
* This method may either return a string or a readable stream resource
*
* @return mixed
*/
public function get()
{
list($base) = explode('/', $this->_path);
try {
$items = $this->_registry->callByPackage(
$base, 'browse', array($this->_path)
);
} catch (Horde_Exception_NotFound $e) {
throw new DAV\Exception\NotFound($this->_path . ' not found');
} catch (Horde_Exception $e) {
throw new DAV\Exception($e);
}
if (!$items) {
throw new DAV\Exception\NotFound($this->_path . ' not found');
}
$item = reset($items);
$this->_size = strlen($item);
return $item;
}
/**
* Returns the size of the file, in bytes.
*
* @return int
*/
public function getSize()
{
return isset($this->_size)
? $this->_size
: (isset($this->_item['contentlength'])
? $this->_item['contentlength']
: null);
}
/**
* Returns the ETag for a file.
*
* @return string|null
*/
public function getETag()
{
return empty($this->_item['etag']) ? null : $this->_item['etag'];
}
/**
* Returns the mime-type for a file
*
* If null is returned, we'll assume application/octet-stream
*
* @return string|null
*/
public function getContentType()
{
return isset($this->_item['contenttype'])
? $this->_item['contenttype']
: null;
}
/**
* Updates properties on this node.
*
* @param array $mutations
* @return bool|array
*/
public function updateProperties($mutations)
{
return false;
}
/**
* Returns a list of properties for this nodes.
*
* @param array $properties
* @return void
*/
public function getProperties($properties)
{
$response = array();
foreach (self::$_propertyMap as $property => $apiProperty) {
if (isset($this->_item[$apiProperty])) {
$response[$property] = $this->_item[$apiProperty];
}
}
if (isset($this->_item['modified'])) {
$response['{DAV:}getlastmodified'] = new DAV\Property\GetLastModified(
$this->_item['modified']
);
}
if (isset($this->_item['displayname'])) {
$response['{DAV:}displayname'] = $this->_item['displayname'];
} elseif (isset($this->_item['name'])) {
$response['{DAV:}displayname'] = $this->_item['name'];
}
return $response;
}
}