11784 support ownclouds X-OC-MTime header
[tine20] / tine20 / Tinebase / Frontend / WebDAV / File.php
1 <?php
2 /**
3  * Tine 2.0
4  * 
5  * @package     Tinebase
6  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
7  * @copyright   Copyright (c) 2010-2012 Metaways Infosystems GmbH (http://www.metaways.de)
8  * @author      Lars Kneschke <l.kneschke@metaways.de>
9  * 
10  */
11
12 /**
13  * class to handle webdav requests for Tinebase
14  * 
15  * @package     Tinebase
16  */
17 class Tinebase_Frontend_WebDAV_File extends Tinebase_Frontend_WebDAV_Node implements Sabre\DAV\IFile
18 {
19     public function get() 
20     {
21         $handle = Tinebase_FileSystem::getInstance()->fopen($this->_path, 'r');
22          
23         return $handle;
24     }
25
26     public function getSize() 
27     {
28         return $this->_node->size;
29     }
30     
31     /**
32      * Returns the mime-type for a file
33      *
34      * If null is returned, we'll assume application/octet-stream
35      */ 
36     public function getContentType() 
37     {
38         return $this->_node->contenttype;
39     }
40     
41     /**
42      * Returns the ETag for a file
43      *
44      * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change.
45      * The ETag is an arbritrary string, but MUST be surrounded by double-quotes.
46      */
47     public function getETag() 
48     {
49         return '"' . $this->_node->hash . '"';
50     }
51     
52     /**
53      * Deleted the current node
54      *
55      * @throws Sabre\DAV\Exception\Forbidden
56      * @return void 
57      */
58     public function delete() 
59     {
60         if (!Tinebase_Core::getUser()->hasGrant($this->_getContainer(), Tinebase_Model_Grants::GRANT_DELETE)) {
61             throw new Sabre\DAV\Exception\Forbidden('Forbidden to edit file: ' . $this->_path);
62         }
63         
64         Tinebase_FileSystem::getInstance()->unlink($this->_path);
65     }
66     
67     public function put($data)
68     {
69         if (!Tinebase_Core::getUser()->hasGrant($this->_getContainer(), Tinebase_Model_Grants::GRANT_EDIT)) {
70             throw new Sabre\DAV\Exception\Forbidden('Forbidden to edit file: ' . $this->_path);
71         }
72         
73         $handle = Tinebase_FileSystem::getInstance()->fopen($this->_path, 'w');
74         
75         if (!is_resource($handle)) {
76             throw new Sabre\DAV\Exception\Forbidden('Permission denied to create file:' . $this->_path );
77         }
78         
79         if (is_resource($data)) {
80             stream_copy_to_stream($data, $handle);
81         }
82
83         // save file object
84         Tinebase_FileSystem::getInstance()->fclose($handle);
85
86         // save node
87         Tinebase_FileSystem::getInstance()->update($this->_node);
88
89         return $this->getETag();
90     }
91 }