1*a1a3b679SAndreas Boehler<?php 2*a1a3b679SAndreas Boehler 3*a1a3b679SAndreas Boehlernamespace Sabre\DAV\PartialUpdate; 4*a1a3b679SAndreas Boehleruse Sabre\DAV; 5*a1a3b679SAndreas Boehler 6*a1a3b679SAndreas Boehlerclass FileMock implements IPatchSupport { 7*a1a3b679SAndreas Boehler 8*a1a3b679SAndreas Boehler protected $data = ''; 9*a1a3b679SAndreas Boehler 10*a1a3b679SAndreas Boehler function put($str) { 11*a1a3b679SAndreas Boehler 12*a1a3b679SAndreas Boehler if (is_resource($str)) { 13*a1a3b679SAndreas Boehler $str = stream_get_contents($str); 14*a1a3b679SAndreas Boehler } 15*a1a3b679SAndreas Boehler $this->data = $str; 16*a1a3b679SAndreas Boehler 17*a1a3b679SAndreas Boehler } 18*a1a3b679SAndreas Boehler 19*a1a3b679SAndreas Boehler /** 20*a1a3b679SAndreas Boehler * Updates the file based on a range specification. 21*a1a3b679SAndreas Boehler * 22*a1a3b679SAndreas Boehler * The first argument is the data, which is either a readable stream 23*a1a3b679SAndreas Boehler * resource or a string. 24*a1a3b679SAndreas Boehler * 25*a1a3b679SAndreas Boehler * The second argument is the type of update we're doing. 26*a1a3b679SAndreas Boehler * This is either: 27*a1a3b679SAndreas Boehler * * 1. append 28*a1a3b679SAndreas Boehler * * 2. update based on a start byte 29*a1a3b679SAndreas Boehler * * 3. update based on an end byte 30*a1a3b679SAndreas Boehler *; 31*a1a3b679SAndreas Boehler * The third argument is the start or end byte. 32*a1a3b679SAndreas Boehler * 33*a1a3b679SAndreas Boehler * After a successful put operation, you may choose to return an ETag. The 34*a1a3b679SAndreas Boehler * etag must always be surrounded by double-quotes. These quotes must 35*a1a3b679SAndreas Boehler * appear in the actual string you're returning. 36*a1a3b679SAndreas Boehler * 37*a1a3b679SAndreas Boehler * Clients may use the ETag from a PUT request to later on make sure that 38*a1a3b679SAndreas Boehler * when they update the file, the contents haven't changed in the mean 39*a1a3b679SAndreas Boehler * time. 40*a1a3b679SAndreas Boehler * 41*a1a3b679SAndreas Boehler * @param resource|string $data 42*a1a3b679SAndreas Boehler * @param int $rangeType 43*a1a3b679SAndreas Boehler * @param int $offset 44*a1a3b679SAndreas Boehler * @return string|null 45*a1a3b679SAndreas Boehler */ 46*a1a3b679SAndreas Boehler function patch($data, $rangeType, $offset = null) { 47*a1a3b679SAndreas Boehler 48*a1a3b679SAndreas Boehler if (is_resource($data)) { 49*a1a3b679SAndreas Boehler $data = stream_get_contents($data); 50*a1a3b679SAndreas Boehler } 51*a1a3b679SAndreas Boehler 52*a1a3b679SAndreas Boehler switch($rangeType) { 53*a1a3b679SAndreas Boehler 54*a1a3b679SAndreas Boehler case 1 : 55*a1a3b679SAndreas Boehler $this->data.=$data; 56*a1a3b679SAndreas Boehler break; 57*a1a3b679SAndreas Boehler case 3 : 58*a1a3b679SAndreas Boehler // Turn the offset into an offset-offset. 59*a1a3b679SAndreas Boehler $offset = strlen($this->data) - $offset; 60*a1a3b679SAndreas Boehler // No break is intentional 61*a1a3b679SAndreas Boehler case 2 : 62*a1a3b679SAndreas Boehler $this->data = 63*a1a3b679SAndreas Boehler substr($this->data, 0, $offset) . 64*a1a3b679SAndreas Boehler $data . 65*a1a3b679SAndreas Boehler substr($this->data, $offset + strlen($data)); 66*a1a3b679SAndreas Boehler break; 67*a1a3b679SAndreas Boehler 68*a1a3b679SAndreas Boehler } 69*a1a3b679SAndreas Boehler 70*a1a3b679SAndreas Boehler } 71*a1a3b679SAndreas Boehler 72*a1a3b679SAndreas Boehler function get() { 73*a1a3b679SAndreas Boehler 74*a1a3b679SAndreas Boehler return $this->data; 75*a1a3b679SAndreas Boehler 76*a1a3b679SAndreas Boehler } 77*a1a3b679SAndreas Boehler 78*a1a3b679SAndreas Boehler function getContentType() { 79*a1a3b679SAndreas Boehler 80*a1a3b679SAndreas Boehler return 'text/plain'; 81*a1a3b679SAndreas Boehler 82*a1a3b679SAndreas Boehler } 83*a1a3b679SAndreas Boehler 84*a1a3b679SAndreas Boehler function getSize() { 85*a1a3b679SAndreas Boehler 86*a1a3b679SAndreas Boehler return strlen($this->data); 87*a1a3b679SAndreas Boehler 88*a1a3b679SAndreas Boehler } 89*a1a3b679SAndreas Boehler 90*a1a3b679SAndreas Boehler function getETag() { 91*a1a3b679SAndreas Boehler 92*a1a3b679SAndreas Boehler return '"' . $this->data . '"'; 93*a1a3b679SAndreas Boehler 94*a1a3b679SAndreas Boehler } 95*a1a3b679SAndreas Boehler 96*a1a3b679SAndreas Boehler function delete() { 97*a1a3b679SAndreas Boehler 98*a1a3b679SAndreas Boehler throw new DAV\Exception\MethodNotAllowed(); 99*a1a3b679SAndreas Boehler 100*a1a3b679SAndreas Boehler } 101*a1a3b679SAndreas Boehler 102*a1a3b679SAndreas Boehler function setName($name) { 103*a1a3b679SAndreas Boehler 104*a1a3b679SAndreas Boehler throw new DAV\Exception\MethodNotAllowed(); 105*a1a3b679SAndreas Boehler 106*a1a3b679SAndreas Boehler } 107*a1a3b679SAndreas Boehler 108*a1a3b679SAndreas Boehler function getName() { 109*a1a3b679SAndreas Boehler 110*a1a3b679SAndreas Boehler return 'partial'; 111*a1a3b679SAndreas Boehler 112*a1a3b679SAndreas Boehler } 113*a1a3b679SAndreas Boehler 114*a1a3b679SAndreas Boehler function getLastModified() { 115*a1a3b679SAndreas Boehler 116*a1a3b679SAndreas Boehler return null; 117*a1a3b679SAndreas Boehler 118*a1a3b679SAndreas Boehler } 119*a1a3b679SAndreas Boehler 120*a1a3b679SAndreas Boehler 121*a1a3b679SAndreas Boehler} 122