forked from friendica/friendica-addons
194 lines
5.1 KiB
PHP
194 lines
5.1 KiB
PHP
|
<?php
|
||
|
|
||
|
/**
|
||
|
* Abstract tree object
|
||
|
*
|
||
|
* @package Sabre
|
||
|
* @subpackage DAV
|
||
|
* @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved.
|
||
|
* @author Evert Pot (http://www.rooftopsolutions.nl/)
|
||
|
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
|
||
|
*/
|
||
|
abstract class Sabre_DAV_Tree {
|
||
|
|
||
|
/**
|
||
|
* This function must return an INode object for a path
|
||
|
* If a Path doesn't exist, thrown a Exception_NotFound
|
||
|
*
|
||
|
* @param string $path
|
||
|
* @throws Sabre_DAV_Exception_NotFound
|
||
|
* @return Sabre_DAV_INode
|
||
|
*/
|
||
|
abstract function getNodeForPath($path);
|
||
|
|
||
|
/**
|
||
|
* This function allows you to check if a node exists.
|
||
|
*
|
||
|
* Implementors of this class should override this method to make
|
||
|
* it cheaper.
|
||
|
*
|
||
|
* @param string $path
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function nodeExists($path) {
|
||
|
|
||
|
try {
|
||
|
|
||
|
$this->getNodeForPath($path);
|
||
|
return true;
|
||
|
|
||
|
} catch (Sabre_DAV_Exception_NotFound $e) {
|
||
|
|
||
|
return false;
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Copies a file from path to another
|
||
|
*
|
||
|
* @param string $sourcePath The source location
|
||
|
* @param string $destinationPath The full destination path
|
||
|
* @return void
|
||
|
*/
|
||
|
public function copy($sourcePath, $destinationPath) {
|
||
|
|
||
|
$sourceNode = $this->getNodeForPath($sourcePath);
|
||
|
|
||
|
// grab the dirname and basename components
|
||
|
list($destinationDir, $destinationName) = Sabre_DAV_URLUtil::splitPath($destinationPath);
|
||
|
|
||
|
$destinationParent = $this->getNodeForPath($destinationDir);
|
||
|
$this->copyNode($sourceNode,$destinationParent,$destinationName);
|
||
|
|
||
|
$this->markDirty($destinationDir);
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Moves a file from one location to another
|
||
|
*
|
||
|
* @param string $sourcePath The path to the file which should be moved
|
||
|
* @param string $destinationPath The full destination path, so not just the destination parent node
|
||
|
* @return int
|
||
|
*/
|
||
|
public function move($sourcePath, $destinationPath) {
|
||
|
|
||
|
list($sourceDir, $sourceName) = Sabre_DAV_URLUtil::splitPath($sourcePath);
|
||
|
list($destinationDir, $destinationName) = Sabre_DAV_URLUtil::splitPath($destinationPath);
|
||
|
|
||
|
if ($sourceDir===$destinationDir) {
|
||
|
$renameable = $this->getNodeForPath($sourcePath);
|
||
|
$renameable->setName($destinationName);
|
||
|
} else {
|
||
|
$this->copy($sourcePath,$destinationPath);
|
||
|
$this->getNodeForPath($sourcePath)->delete();
|
||
|
}
|
||
|
$this->markDirty($sourceDir);
|
||
|
$this->markDirty($destinationDir);
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Deletes a node from the tree
|
||
|
*
|
||
|
* @param string $path
|
||
|
* @return void
|
||
|
*/
|
||
|
public function delete($path) {
|
||
|
|
||
|
$node = $this->getNodeForPath($path);
|
||
|
$node->delete();
|
||
|
|
||
|
list($parent) = Sabre_DAV_URLUtil::splitPath($path);
|
||
|
$this->markDirty($parent);
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns a list of childnodes for a given path.
|
||
|
*
|
||
|
* @param string $path
|
||
|
* @return array
|
||
|
*/
|
||
|
public function getChildren($path) {
|
||
|
|
||
|
$node = $this->getNodeForPath($path);
|
||
|
return $node->getChildren();
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This method is called with every tree update
|
||
|
*
|
||
|
* Examples of tree updates are:
|
||
|
* * node deletions
|
||
|
* * node creations
|
||
|
* * copy
|
||
|
* * move
|
||
|
* * renaming nodes
|
||
|
*
|
||
|
* If Tree classes implement a form of caching, this will allow
|
||
|
* them to make sure caches will be expired.
|
||
|
*
|
||
|
* If a path is passed, it is assumed that the entire subtree is dirty
|
||
|
*
|
||
|
* @param string $path
|
||
|
* @return void
|
||
|
*/
|
||
|
public function markDirty($path) {
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* copyNode
|
||
|
*
|
||
|
* @param Sabre_DAV_INode $source
|
||
|
* @param Sabre_DAV_ICollection $destinationParent
|
||
|
* @param string $destinationName
|
||
|
* @return void
|
||
|
*/
|
||
|
protected function copyNode(Sabre_DAV_INode $source,Sabre_DAV_ICollection $destinationParent,$destinationName = null) {
|
||
|
|
||
|
if (!$destinationName) $destinationName = $source->getName();
|
||
|
|
||
|
if ($source instanceof Sabre_DAV_IFile) {
|
||
|
|
||
|
$data = $source->get();
|
||
|
|
||
|
// If the body was a string, we need to convert it to a stream
|
||
|
if (is_string($data)) {
|
||
|
$stream = fopen('php://temp','r+');
|
||
|
fwrite($stream,$data);
|
||
|
rewind($stream);
|
||
|
$data = $stream;
|
||
|
}
|
||
|
$destinationParent->createFile($destinationName,$data);
|
||
|
$destination = $destinationParent->getChild($destinationName);
|
||
|
|
||
|
} elseif ($source instanceof Sabre_DAV_ICollection) {
|
||
|
|
||
|
$destinationParent->createDirectory($destinationName);
|
||
|
|
||
|
$destination = $destinationParent->getChild($destinationName);
|
||
|
foreach($source->getChildren() as $child) {
|
||
|
|
||
|
$this->copyNode($child,$destination);
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
if ($source instanceof Sabre_DAV_IProperties && $destination instanceof Sabre_DAV_IProperties) {
|
||
|
|
||
|
$props = $source->getProperties(array());
|
||
|
$destination->updateProperties($props);
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|