aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/lib/SabreDAV/lib/OldSabre/DAV/Tree/Filesystem.php
blob: 9d1a638d3ba8816a88459fdd3d1fb7c66663fb67 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<?php

namespace OldSabre\DAV\Tree;

use OldSabre\DAV;

/**
 * FileSystem Tree
 *
 * This class is an alternative to the standard ObjectTree. This tree can only
 * use OldSabre\DAV\FS\Directory and File classes, but as a result it allows for a few
 * optimizations that otherwise wouldn't be possible.
 *
 * Specifically copying and moving are much, much faster.
 *
 * @copyright Copyright (C) 2007-2015 fruux GmbH (https://fruux.com/).
 * @author Evert Pot (http://evertpot.com/)
 * @license http://sabre.io/license/ Modified BSD License
 */
class Filesystem extends DAV\Tree {

    /**
     * Base url on the filesystem.
     *
     * @var string
     */
    protected $basePath;

    /**
     * Creates this tree
     *
     * Supply the path you'd like to share.
     *
     * @param string $basePath
     */
    public function __construct($basePath) {

        $this->basePath = $basePath;

    }

    /**
     * Returns a new node for the given path
     *
     * @param string $path
     * @return DAV\FS\Node
     */
    public function getNodeForPath($path) {

        $realPath = $this->getRealPath($path);
        if (!file_exists($realPath)) { 
            throw new DAV\Exception\NotFound('File at location ' . $realPath . ' not found');
        }
        if (is_dir($realPath)) {
            return new DAV\FS\Directory($realPath);
        } else {
            return new DAV\FS\File($realPath);
        }

    }

    /**
     * Returns the real filesystem path for a webdav url.
     *
     * @param string $publicPath
     * @return string
     */
    protected function getRealPath($publicPath) {

        return rtrim($this->basePath,'/') . '/' . trim($publicPath,'/');

    }

    /**
     * Copies a file or directory.
     *
     * This method must work recursively and delete the destination
     * if it exists
     *
     * @param string $source
     * @param string $destination
     * @return void
     */
    public function copy($source,$destination) {

        $source = $this->getRealPath($source);
        $destination = $this->getRealPath($destination);
        $this->realCopy($source,$destination);

    }

    /**
     * Used by self::copy
     *
     * @param string $source
     * @param string $destination
     * @return void
     */
    protected function realCopy($source,$destination) {

        if (is_file($source)) {
            copy($source,$destination);
        } else {
            mkdir($destination);
            foreach(scandir($source) as $subnode) {

                if ($subnode=='.' || $subnode=='..') continue;
                $this->realCopy($source.'/'.$subnode,$destination.'/'.$subnode);

            }
        }

    }

    /**
     * Moves a file or directory recursively.
     *
     * If the destination exists, delete it first.
     *
     * @param string $source
     * @param string $destination
     * @return void
     */
    public function move($source,$destination) {

        $source = $this->getRealPath($source);
        $destination = $this->getRealPath($destination);
        rename($source,$destination);

    }

}

© 2014-2024 Faster IT GmbH | imprint | privacy policy