Passed
Push — master ( 9a6d60...09efdf )
by Morris
12:40 queued 01:53
created
lib/private/Files/Storage/Common.php 3 patches
Braces   +3 added lines, -1 removed lines patch added patch discarded remove patch
@@ -289,7 +289,9 @@
 block discarded – undo
289 289
 		$dh = $this->opendir($dir);
290 290
 		if (is_resource($dh)) {
291 291
 			while (($item = readdir($dh)) !== false) {
292
-				if (\OC\Files\Filesystem::isIgnoredDir($item)) continue;
292
+				if (\OC\Files\Filesystem::isIgnoredDir($item)) {
293
+				    continue;
294
+				}
293 295
 				if (strstr(strtolower($item), strtolower($query)) !== false) {
294 296
 					$files[] = $dir . '/' . $item;
295 297
 				}
Please login to merge, or discard this patch.
Spacing   +17 added lines, -17 removed lines patch added patch discarded remove patch
@@ -219,7 +219,7 @@  discard block
 block discarded – undo
219 219
 			$this->mkdir($path2);
220 220
 			while ($file = readdir($dir)) {
221 221
 				if (!Filesystem::isIgnoredDir($file)) {
222
-					if (!$this->copy($path1 . '/' . $file, $path2 . '/' . $file)) {
222
+					if (!$this->copy($path1.'/'.$file, $path2.'/'.$file)) {
223 223
 						return false;
224 224
 					}
225 225
 				}
@@ -273,12 +273,12 @@  discard block
 block discarded – undo
273 273
 		if (is_resource($dh)) {
274 274
 			while (($file = readdir($dh)) !== false) {
275 275
 				if (!\OC\Files\Filesystem::isIgnoredDir($file)) {
276
-					if ($this->is_dir($path . '/' . $file)) {
277
-						mkdir($target . '/' . $file);
278
-						$this->addLocalFolder($path . '/' . $file, $target . '/' . $file);
276
+					if ($this->is_dir($path.'/'.$file)) {
277
+						mkdir($target.'/'.$file);
278
+						$this->addLocalFolder($path.'/'.$file, $target.'/'.$file);
279 279
 					} else {
280
-						$tmp = $this->toTmpFile($path . '/' . $file);
281
-						rename($tmp, $target . '/' . $file);
280
+						$tmp = $this->toTmpFile($path.'/'.$file);
281
+						rename($tmp, $target.'/'.$file);
282 282
 					}
283 283
 				}
284 284
 			}
@@ -297,10 +297,10 @@  discard block
 block discarded – undo
297 297
 			while (($item = readdir($dh)) !== false) {
298 298
 				if (\OC\Files\Filesystem::isIgnoredDir($item)) continue;
299 299
 				if (strstr(strtolower($item), strtolower($query)) !== false) {
300
-					$files[] = $dir . '/' . $item;
300
+					$files[] = $dir.'/'.$item;
301 301
 				}
302
-				if ($this->is_dir($dir . '/' . $item)) {
303
-					$files = array_merge($files, $this->searchInDir($query, $dir . '/' . $item));
302
+				if ($this->is_dir($dir.'/'.$item)) {
303
+					$files = array_merge($files, $this->searchInDir($query, $dir.'/'.$item));
304 304
 				}
305 305
 			}
306 306
 		}
@@ -351,7 +351,7 @@  discard block
 block discarded – undo
351 351
 		if (!isset($this->watcher)) {
352 352
 			$this->watcher = new Watcher($storage);
353 353
 			$globalPolicy = \OC::$server->getConfig()->getSystemValue('filesystem_check_changes', Watcher::CHECK_NEVER);
354
-			$this->watcher->setPolicy((int)$this->getMountOption('filesystem_check_changes', $globalPolicy));
354
+			$this->watcher->setPolicy((int) $this->getMountOption('filesystem_check_changes', $globalPolicy));
355 355
 		}
356 356
 		return $this->watcher;
357 357
 	}
@@ -425,7 +425,7 @@  discard block
 block discarded – undo
425 425
 	 */
426 426
 	public function cleanPath($path) {
427 427
 		if (strlen($path) == 0 or $path[0] != '/') {
428
-			$path = '/' . $path;
428
+			$path = '/'.$path;
429 429
 		}
430 430
 
431 431
 		$output = array();
@@ -453,7 +453,7 @@  discard block
 block discarded – undo
453 453
 			\OC::$server->getLogger()->info("External storage not available: stat() failed");
454 454
 			return false;
455 455
 		} catch (\Exception $e) {
456
-			\OC::$server->getLogger()->info("External storage not available: " . $e->getMessage());
456
+			\OC::$server->getLogger()->info("External storage not available: ".$e->getMessage());
457 457
 			\OC::$server->getLogger()->logException($e, ['level' => ILogger::DEBUG]);
458 458
 			return false;
459 459
 		}
@@ -604,7 +604,7 @@  discard block
 block discarded – undo
604 604
 			if (is_resource($dh)) {
605 605
 				while ($result and ($file = readdir($dh)) !== false) {
606 606
 					if (!Filesystem::isIgnoredDir($file)) {
607
-						$result &= $this->copyFromStorage($sourceStorage, $sourceInternalPath . '/' . $file, $targetInternalPath . '/' . $file);
607
+						$result &= $this->copyFromStorage($sourceStorage, $sourceInternalPath.'/'.$file, $targetInternalPath.'/'.$file);
608 608
 					}
609 609
 				}
610 610
 			}
@@ -630,7 +630,7 @@  discard block
 block discarded – undo
630 630
 				$this->getCache()->remove($targetInternalPath);
631 631
 			}
632 632
 		}
633
-		return (bool)$result;
633
+		return (bool) $result;
634 634
 	}
635 635
 
636 636
 	/**
@@ -710,7 +710,7 @@  discard block
 block discarded – undo
710 710
 			);
711 711
 		}
712 712
 		try {
713
-			$provider->acquireLock('files/' . md5($this->getId() . '::' . trim($path, '/')), $type);
713
+			$provider->acquireLock('files/'.md5($this->getId().'::'.trim($path, '/')), $type);
714 714
 		} catch (LockedException $e) {
715 715
 			if ($logger) {
716 716
 				$logger->logException($e);
@@ -742,7 +742,7 @@  discard block
 block discarded – undo
742 742
 			);
743 743
 		}
744 744
 		try {
745
-			$provider->releaseLock('files/' . md5($this->getId() . '::' . trim($path, '/')), $type);
745
+			$provider->releaseLock('files/'.md5($this->getId().'::'.trim($path, '/')), $type);
746 746
 		} catch (LockedException $e) {
747 747
 			if ($logger) {
748 748
 				$logger->logException($e);
@@ -774,7 +774,7 @@  discard block
 block discarded – undo
774 774
 			);
775 775
 		}
776 776
 		try {
777
-			$provider->changeLock('files/' . md5($this->getId() . '::' . trim($path, '/')), $type);
777
+			$provider->changeLock('files/'.md5($this->getId().'::'.trim($path, '/')), $type);
778 778
 		} catch (LockedException $e) {
779 779
 			\OC::$server->getLogger()->logException($e);
780 780
 			throw $e;
Please login to merge, or discard this patch.
Indentation   +753 added lines, -753 removed lines patch added patch discarded remove patch
@@ -72,761 +72,761 @@
 block discarded – undo
72 72
  */
73 73
 abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
74 74
 
75
-	use LocalTempFileTrait;
76
-
77
-	protected $cache;
78
-	protected $scanner;
79
-	protected $watcher;
80
-	protected $propagator;
81
-	protected $storageCache;
82
-	protected $updater;
83
-
84
-	protected $mountOptions = [];
85
-	protected $owner = null;
86
-
87
-	private $shouldLogLocks = null;
88
-	private $logger;
89
-
90
-	public function __construct($parameters) {
91
-	}
92
-
93
-	/**
94
-	 * Remove a file or folder
95
-	 *
96
-	 * @param string $path
97
-	 * @return bool
98
-	 */
99
-	protected function remove($path) {
100
-		if ($this->is_dir($path)) {
101
-			return $this->rmdir($path);
102
-		} else if ($this->is_file($path)) {
103
-			return $this->unlink($path);
104
-		} else {
105
-			return false;
106
-		}
107
-	}
108
-
109
-	public function is_dir($path) {
110
-		return $this->filetype($path) === 'dir';
111
-	}
112
-
113
-	public function is_file($path) {
114
-		return $this->filetype($path) === 'file';
115
-	}
116
-
117
-	public function filesize($path) {
118
-		if ($this->is_dir($path)) {
119
-			return 0; //by definition
120
-		} else {
121
-			$stat = $this->stat($path);
122
-			if (isset($stat['size'])) {
123
-				return $stat['size'];
124
-			} else {
125
-				return 0;
126
-			}
127
-		}
128
-	}
129
-
130
-	public function isReadable($path) {
131
-		// at least check whether it exists
132
-		// subclasses might want to implement this more thoroughly
133
-		return $this->file_exists($path);
134
-	}
135
-
136
-	public function isUpdatable($path) {
137
-		// at least check whether it exists
138
-		// subclasses might want to implement this more thoroughly
139
-		// a non-existing file/folder isn't updatable
140
-		return $this->file_exists($path);
141
-	}
142
-
143
-	public function isCreatable($path) {
144
-		if ($this->is_dir($path) && $this->isUpdatable($path)) {
145
-			return true;
146
-		}
147
-		return false;
148
-	}
149
-
150
-	public function isDeletable($path) {
151
-		if ($path === '' || $path === '/') {
152
-			return false;
153
-		}
154
-		$parent = dirname($path);
155
-		return $this->isUpdatable($parent) && $this->isUpdatable($path);
156
-	}
157
-
158
-	public function isSharable($path) {
159
-		return $this->isReadable($path);
160
-	}
161
-
162
-	public function getPermissions($path) {
163
-		$permissions = 0;
164
-		if ($this->isCreatable($path)) {
165
-			$permissions |= \OCP\Constants::PERMISSION_CREATE;
166
-		}
167
-		if ($this->isReadable($path)) {
168
-			$permissions |= \OCP\Constants::PERMISSION_READ;
169
-		}
170
-		if ($this->isUpdatable($path)) {
171
-			$permissions |= \OCP\Constants::PERMISSION_UPDATE;
172
-		}
173
-		if ($this->isDeletable($path)) {
174
-			$permissions |= \OCP\Constants::PERMISSION_DELETE;
175
-		}
176
-		if ($this->isSharable($path)) {
177
-			$permissions |= \OCP\Constants::PERMISSION_SHARE;
178
-		}
179
-		return $permissions;
180
-	}
181
-
182
-	public function filemtime($path) {
183
-		$stat = $this->stat($path);
184
-		if (isset($stat['mtime']) && $stat['mtime'] > 0) {
185
-			return $stat['mtime'];
186
-		} else {
187
-			return 0;
188
-		}
189
-	}
190
-
191
-	public function file_get_contents($path) {
192
-		$handle = $this->fopen($path, "r");
193
-		if (!$handle) {
194
-			return false;
195
-		}
196
-		$data = stream_get_contents($handle);
197
-		fclose($handle);
198
-		return $data;
199
-	}
200
-
201
-	public function file_put_contents($path, $data) {
202
-		$handle = $this->fopen($path, "w");
203
-		$this->removeCachedFile($path);
204
-		$count = fwrite($handle, $data);
205
-		fclose($handle);
206
-		return $count;
207
-	}
208
-
209
-	public function rename($path1, $path2) {
210
-		$this->remove($path2);
211
-
212
-		$this->removeCachedFile($path1);
213
-		return $this->copy($path1, $path2) and $this->remove($path1);
214
-	}
215
-
216
-	public function copy($path1, $path2) {
217
-		if ($this->is_dir($path1)) {
218
-			$this->remove($path2);
219
-			$dir = $this->opendir($path1);
220
-			$this->mkdir($path2);
221
-			while ($file = readdir($dir)) {
222
-				if (!Filesystem::isIgnoredDir($file)) {
223
-					if (!$this->copy($path1 . '/' . $file, $path2 . '/' . $file)) {
224
-						return false;
225
-					}
226
-				}
227
-			}
228
-			closedir($dir);
229
-			return true;
230
-		} else {
231
-			$source = $this->fopen($path1, 'r');
232
-			$target = $this->fopen($path2, 'w');
233
-			list(, $result) = \OC_Helper::streamCopy($source, $target);
234
-			if (!$result) {
235
-				\OC::$server->getLogger()->warning("Failed to write data while copying $path1 to $path2");
236
-			}
237
-			$this->removeCachedFile($path2);
238
-			return $result;
239
-		}
240
-	}
241
-
242
-	public function getMimeType($path) {
243
-		if ($this->is_dir($path)) {
244
-			return 'httpd/unix-directory';
245
-		} elseif ($this->file_exists($path)) {
246
-			return \OC::$server->getMimeTypeDetector()->detectPath($path);
247
-		} else {
248
-			return false;
249
-		}
250
-	}
251
-
252
-	public function hash($type, $path, $raw = false) {
253
-		$fh = $this->fopen($path, 'rb');
254
-		$ctx = hash_init($type);
255
-		hash_update_stream($ctx, $fh);
256
-		fclose($fh);
257
-		return hash_final($ctx, $raw);
258
-	}
259
-
260
-	public function search($query) {
261
-		return $this->searchInDir($query);
262
-	}
263
-
264
-	public function getLocalFile($path) {
265
-		return $this->getCachedFile($path);
266
-	}
267
-
268
-	/**
269
-	 * @param string $path
270
-	 * @param string $target
271
-	 */
272
-	private function addLocalFolder($path, $target) {
273
-		$dh = $this->opendir($path);
274
-		if (is_resource($dh)) {
275
-			while (($file = readdir($dh)) !== false) {
276
-				if (!\OC\Files\Filesystem::isIgnoredDir($file)) {
277
-					if ($this->is_dir($path . '/' . $file)) {
278
-						mkdir($target . '/' . $file);
279
-						$this->addLocalFolder($path . '/' . $file, $target . '/' . $file);
280
-					} else {
281
-						$tmp = $this->toTmpFile($path . '/' . $file);
282
-						rename($tmp, $target . '/' . $file);
283
-					}
284
-				}
285
-			}
286
-		}
287
-	}
288
-
289
-	/**
290
-	 * @param string $query
291
-	 * @param string $dir
292
-	 * @return array
293
-	 */
294
-	protected function searchInDir($query, $dir = '') {
295
-		$files = array();
296
-		$dh = $this->opendir($dir);
297
-		if (is_resource($dh)) {
298
-			while (($item = readdir($dh)) !== false) {
299
-				if (\OC\Files\Filesystem::isIgnoredDir($item)) continue;
300
-				if (strstr(strtolower($item), strtolower($query)) !== false) {
301
-					$files[] = $dir . '/' . $item;
302
-				}
303
-				if ($this->is_dir($dir . '/' . $item)) {
304
-					$files = array_merge($files, $this->searchInDir($query, $dir . '/' . $item));
305
-				}
306
-			}
307
-		}
308
-		closedir($dh);
309
-		return $files;
310
-	}
311
-
312
-	/**
313
-	 * check if a file or folder has been updated since $time
314
-	 *
315
-	 * The method is only used to check if the cache needs to be updated. Storage backends that don't support checking
316
-	 * the mtime should always return false here. As a result storage implementations that always return false expect
317
-	 * exclusive access to the backend and will not pick up files that have been added in a way that circumvents
318
-	 * ownClouds filesystem.
319
-	 *
320
-	 * @param string $path
321
-	 * @param int $time
322
-	 * @return bool
323
-	 */
324
-	public function hasUpdated($path, $time) {
325
-		return $this->filemtime($path) > $time;
326
-	}
327
-
328
-	public function getCache($path = '', $storage = null) {
329
-		if (!$storage) {
330
-			$storage = $this;
331
-		}
332
-		if (!isset($storage->cache)) {
333
-			$storage->cache = new Cache($storage);
334
-		}
335
-		return $storage->cache;
336
-	}
337
-
338
-	public function getScanner($path = '', $storage = null) {
339
-		if (!$storage) {
340
-			$storage = $this;
341
-		}
342
-		if (!isset($storage->scanner)) {
343
-			$storage->scanner = new Scanner($storage);
344
-		}
345
-		return $storage->scanner;
346
-	}
347
-
348
-	public function getWatcher($path = '', $storage = null) {
349
-		if (!$storage) {
350
-			$storage = $this;
351
-		}
352
-		if (!isset($this->watcher)) {
353
-			$this->watcher = new Watcher($storage);
354
-			$globalPolicy = \OC::$server->getConfig()->getSystemValue('filesystem_check_changes', Watcher::CHECK_NEVER);
355
-			$this->watcher->setPolicy((int)$this->getMountOption('filesystem_check_changes', $globalPolicy));
356
-		}
357
-		return $this->watcher;
358
-	}
359
-
360
-	/**
361
-	 * get a propagator instance for the cache
362
-	 *
363
-	 * @param \OC\Files\Storage\Storage (optional) the storage to pass to the watcher
364
-	 * @return \OC\Files\Cache\Propagator
365
-	 */
366
-	public function getPropagator($storage = null) {
367
-		if (!$storage) {
368
-			$storage = $this;
369
-		}
370
-		if (!isset($storage->propagator)) {
371
-			$storage->propagator = new Propagator($storage, \OC::$server->getDatabaseConnection());
372
-		}
373
-		return $storage->propagator;
374
-	}
375
-
376
-	public function getUpdater($storage = null) {
377
-		if (!$storage) {
378
-			$storage = $this;
379
-		}
380
-		if (!isset($storage->updater)) {
381
-			$storage->updater = new Updater($storage);
382
-		}
383
-		return $storage->updater;
384
-	}
385
-
386
-	public function getStorageCache($storage = null) {
387
-		if (!$storage) {
388
-			$storage = $this;
389
-		}
390
-		if (!isset($this->storageCache)) {
391
-			$this->storageCache = new \OC\Files\Cache\Storage($storage);
392
-		}
393
-		return $this->storageCache;
394
-	}
395
-
396
-	/**
397
-	 * get the owner of a path
398
-	 *
399
-	 * @param string $path The path to get the owner
400
-	 * @return string|false uid or false
401
-	 */
402
-	public function getOwner($path) {
403
-		if ($this->owner === null) {
404
-			$this->owner = \OC_User::getUser();
405
-		}
406
-
407
-		return $this->owner;
408
-	}
409
-
410
-	/**
411
-	 * get the ETag for a file or folder
412
-	 *
413
-	 * @param string $path
414
-	 * @return string
415
-	 */
416
-	public function getETag($path) {
417
-		return uniqid();
418
-	}
419
-
420
-	/**
421
-	 * clean a path, i.e. remove all redundant '.' and '..'
422
-	 * making sure that it can't point to higher than '/'
423
-	 *
424
-	 * @param string $path The path to clean
425
-	 * @return string cleaned path
426
-	 */
427
-	public function cleanPath($path) {
428
-		if (strlen($path) == 0 or $path[0] != '/') {
429
-			$path = '/' . $path;
430
-		}
431
-
432
-		$output = array();
433
-		foreach (explode('/', $path) as $chunk) {
434
-			if ($chunk == '..') {
435
-				array_pop($output);
436
-			} else if ($chunk == '.') {
437
-			} else {
438
-				$output[] = $chunk;
439
-			}
440
-		}
441
-		return implode('/', $output);
442
-	}
443
-
444
-	/**
445
-	 * Test a storage for availability
446
-	 *
447
-	 * @return bool
448
-	 */
449
-	public function test() {
450
-		try {
451
-			if ($this->stat('')) {
452
-				return true;
453
-			}
454
-			\OC::$server->getLogger()->info("External storage not available: stat() failed");
455
-			return false;
456
-		} catch (\Exception $e) {
457
-			\OC::$server->getLogger()->info("External storage not available: " . $e->getMessage());
458
-			\OC::$server->getLogger()->logException($e, ['level' => ILogger::DEBUG]);
459
-			return false;
460
-		}
461
-	}
462
-
463
-	/**
464
-	 * get the free space in the storage
465
-	 *
466
-	 * @param string $path
467
-	 * @return int|false
468
-	 */
469
-	public function free_space($path) {
470
-		return \OCP\Files\FileInfo::SPACE_UNKNOWN;
471
-	}
472
-
473
-	/**
474
-	 * {@inheritdoc}
475
-	 */
476
-	public function isLocal() {
477
-		// the common implementation returns a temporary file by
478
-		// default, which is not local
479
-		return false;
480
-	}
481
-
482
-	/**
483
-	 * Check if the storage is an instance of $class or is a wrapper for a storage that is an instance of $class
484
-	 *
485
-	 * @param string $class
486
-	 * @return bool
487
-	 */
488
-	public function instanceOfStorage($class) {
489
-		if (ltrim($class, '\\') === 'OC\Files\Storage\Shared') {
490
-			// FIXME Temporary fix to keep existing checks working
491
-			$class = '\OCA\Files_Sharing\SharedStorage';
492
-		}
493
-		return is_a($this, $class);
494
-	}
495
-
496
-	/**
497
-	 * A custom storage implementation can return an url for direct download of a give file.
498
-	 *
499
-	 * For now the returned array can hold the parameter url - in future more attributes might follow.
500
-	 *
501
-	 * @param string $path
502
-	 * @return array|false
503
-	 */
504
-	public function getDirectDownload($path) {
505
-		return [];
506
-	}
507
-
508
-	/**
509
-	 * @inheritdoc
510
-	 * @throws InvalidPathException
511
-	 */
512
-	public function verifyPath($path, $fileName) {
513
-
514
-		// verify empty and dot files
515
-		$trimmed = trim($fileName);
516
-		if ($trimmed === '') {
517
-			throw new EmptyFileNameException();
518
-		}
519
-
520
-		if (\OC\Files\Filesystem::isIgnoredDir($trimmed)) {
521
-			throw new InvalidDirectoryException();
522
-		}
523
-
524
-		if (!\OC::$server->getDatabaseConnection()->supports4ByteText()) {
525
-			// verify database - e.g. mysql only 3-byte chars
526
-			if (preg_match('%(?:
75
+    use LocalTempFileTrait;
76
+
77
+    protected $cache;
78
+    protected $scanner;
79
+    protected $watcher;
80
+    protected $propagator;
81
+    protected $storageCache;
82
+    protected $updater;
83
+
84
+    protected $mountOptions = [];
85
+    protected $owner = null;
86
+
87
+    private $shouldLogLocks = null;
88
+    private $logger;
89
+
90
+    public function __construct($parameters) {
91
+    }
92
+
93
+    /**
94
+     * Remove a file or folder
95
+     *
96
+     * @param string $path
97
+     * @return bool
98
+     */
99
+    protected function remove($path) {
100
+        if ($this->is_dir($path)) {
101
+            return $this->rmdir($path);
102
+        } else if ($this->is_file($path)) {
103
+            return $this->unlink($path);
104
+        } else {
105
+            return false;
106
+        }
107
+    }
108
+
109
+    public function is_dir($path) {
110
+        return $this->filetype($path) === 'dir';
111
+    }
112
+
113
+    public function is_file($path) {
114
+        return $this->filetype($path) === 'file';
115
+    }
116
+
117
+    public function filesize($path) {
118
+        if ($this->is_dir($path)) {
119
+            return 0; //by definition
120
+        } else {
121
+            $stat = $this->stat($path);
122
+            if (isset($stat['size'])) {
123
+                return $stat['size'];
124
+            } else {
125
+                return 0;
126
+            }
127
+        }
128
+    }
129
+
130
+    public function isReadable($path) {
131
+        // at least check whether it exists
132
+        // subclasses might want to implement this more thoroughly
133
+        return $this->file_exists($path);
134
+    }
135
+
136
+    public function isUpdatable($path) {
137
+        // at least check whether it exists
138
+        // subclasses might want to implement this more thoroughly
139
+        // a non-existing file/folder isn't updatable
140
+        return $this->file_exists($path);
141
+    }
142
+
143
+    public function isCreatable($path) {
144
+        if ($this->is_dir($path) && $this->isUpdatable($path)) {
145
+            return true;
146
+        }
147
+        return false;
148
+    }
149
+
150
+    public function isDeletable($path) {
151
+        if ($path === '' || $path === '/') {
152
+            return false;
153
+        }
154
+        $parent = dirname($path);
155
+        return $this->isUpdatable($parent) && $this->isUpdatable($path);
156
+    }
157
+
158
+    public function isSharable($path) {
159
+        return $this->isReadable($path);
160
+    }
161
+
162
+    public function getPermissions($path) {
163
+        $permissions = 0;
164
+        if ($this->isCreatable($path)) {
165
+            $permissions |= \OCP\Constants::PERMISSION_CREATE;
166
+        }
167
+        if ($this->isReadable($path)) {
168
+            $permissions |= \OCP\Constants::PERMISSION_READ;
169
+        }
170
+        if ($this->isUpdatable($path)) {
171
+            $permissions |= \OCP\Constants::PERMISSION_UPDATE;
172
+        }
173
+        if ($this->isDeletable($path)) {
174
+            $permissions |= \OCP\Constants::PERMISSION_DELETE;
175
+        }
176
+        if ($this->isSharable($path)) {
177
+            $permissions |= \OCP\Constants::PERMISSION_SHARE;
178
+        }
179
+        return $permissions;
180
+    }
181
+
182
+    public function filemtime($path) {
183
+        $stat = $this->stat($path);
184
+        if (isset($stat['mtime']) && $stat['mtime'] > 0) {
185
+            return $stat['mtime'];
186
+        } else {
187
+            return 0;
188
+        }
189
+    }
190
+
191
+    public function file_get_contents($path) {
192
+        $handle = $this->fopen($path, "r");
193
+        if (!$handle) {
194
+            return false;
195
+        }
196
+        $data = stream_get_contents($handle);
197
+        fclose($handle);
198
+        return $data;
199
+    }
200
+
201
+    public function file_put_contents($path, $data) {
202
+        $handle = $this->fopen($path, "w");
203
+        $this->removeCachedFile($path);
204
+        $count = fwrite($handle, $data);
205
+        fclose($handle);
206
+        return $count;
207
+    }
208
+
209
+    public function rename($path1, $path2) {
210
+        $this->remove($path2);
211
+
212
+        $this->removeCachedFile($path1);
213
+        return $this->copy($path1, $path2) and $this->remove($path1);
214
+    }
215
+
216
+    public function copy($path1, $path2) {
217
+        if ($this->is_dir($path1)) {
218
+            $this->remove($path2);
219
+            $dir = $this->opendir($path1);
220
+            $this->mkdir($path2);
221
+            while ($file = readdir($dir)) {
222
+                if (!Filesystem::isIgnoredDir($file)) {
223
+                    if (!$this->copy($path1 . '/' . $file, $path2 . '/' . $file)) {
224
+                        return false;
225
+                    }
226
+                }
227
+            }
228
+            closedir($dir);
229
+            return true;
230
+        } else {
231
+            $source = $this->fopen($path1, 'r');
232
+            $target = $this->fopen($path2, 'w');
233
+            list(, $result) = \OC_Helper::streamCopy($source, $target);
234
+            if (!$result) {
235
+                \OC::$server->getLogger()->warning("Failed to write data while copying $path1 to $path2");
236
+            }
237
+            $this->removeCachedFile($path2);
238
+            return $result;
239
+        }
240
+    }
241
+
242
+    public function getMimeType($path) {
243
+        if ($this->is_dir($path)) {
244
+            return 'httpd/unix-directory';
245
+        } elseif ($this->file_exists($path)) {
246
+            return \OC::$server->getMimeTypeDetector()->detectPath($path);
247
+        } else {
248
+            return false;
249
+        }
250
+    }
251
+
252
+    public function hash($type, $path, $raw = false) {
253
+        $fh = $this->fopen($path, 'rb');
254
+        $ctx = hash_init($type);
255
+        hash_update_stream($ctx, $fh);
256
+        fclose($fh);
257
+        return hash_final($ctx, $raw);
258
+    }
259
+
260
+    public function search($query) {
261
+        return $this->searchInDir($query);
262
+    }
263
+
264
+    public function getLocalFile($path) {
265
+        return $this->getCachedFile($path);
266
+    }
267
+
268
+    /**
269
+     * @param string $path
270
+     * @param string $target
271
+     */
272
+    private function addLocalFolder($path, $target) {
273
+        $dh = $this->opendir($path);
274
+        if (is_resource($dh)) {
275
+            while (($file = readdir($dh)) !== false) {
276
+                if (!\OC\Files\Filesystem::isIgnoredDir($file)) {
277
+                    if ($this->is_dir($path . '/' . $file)) {
278
+                        mkdir($target . '/' . $file);
279
+                        $this->addLocalFolder($path . '/' . $file, $target . '/' . $file);
280
+                    } else {
281
+                        $tmp = $this->toTmpFile($path . '/' . $file);
282
+                        rename($tmp, $target . '/' . $file);
283
+                    }
284
+                }
285
+            }
286
+        }
287
+    }
288
+
289
+    /**
290
+     * @param string $query
291
+     * @param string $dir
292
+     * @return array
293
+     */
294
+    protected function searchInDir($query, $dir = '') {
295
+        $files = array();
296
+        $dh = $this->opendir($dir);
297
+        if (is_resource($dh)) {
298
+            while (($item = readdir($dh)) !== false) {
299
+                if (\OC\Files\Filesystem::isIgnoredDir($item)) continue;
300
+                if (strstr(strtolower($item), strtolower($query)) !== false) {
301
+                    $files[] = $dir . '/' . $item;
302
+                }
303
+                if ($this->is_dir($dir . '/' . $item)) {
304
+                    $files = array_merge($files, $this->searchInDir($query, $dir . '/' . $item));
305
+                }
306
+            }
307
+        }
308
+        closedir($dh);
309
+        return $files;
310
+    }
311
+
312
+    /**
313
+     * check if a file or folder has been updated since $time
314
+     *
315
+     * The method is only used to check if the cache needs to be updated. Storage backends that don't support checking
316
+     * the mtime should always return false here. As a result storage implementations that always return false expect
317
+     * exclusive access to the backend and will not pick up files that have been added in a way that circumvents
318
+     * ownClouds filesystem.
319
+     *
320
+     * @param string $path
321
+     * @param int $time
322
+     * @return bool
323
+     */
324
+    public function hasUpdated($path, $time) {
325
+        return $this->filemtime($path) > $time;
326
+    }
327
+
328
+    public function getCache($path = '', $storage = null) {
329
+        if (!$storage) {
330
+            $storage = $this;
331
+        }
332
+        if (!isset($storage->cache)) {
333
+            $storage->cache = new Cache($storage);
334
+        }
335
+        return $storage->cache;
336
+    }
337
+
338
+    public function getScanner($path = '', $storage = null) {
339
+        if (!$storage) {
340
+            $storage = $this;
341
+        }
342
+        if (!isset($storage->scanner)) {
343
+            $storage->scanner = new Scanner($storage);
344
+        }
345
+        return $storage->scanner;
346
+    }
347
+
348
+    public function getWatcher($path = '', $storage = null) {
349
+        if (!$storage) {
350
+            $storage = $this;
351
+        }
352
+        if (!isset($this->watcher)) {
353
+            $this->watcher = new Watcher($storage);
354
+            $globalPolicy = \OC::$server->getConfig()->getSystemValue('filesystem_check_changes', Watcher::CHECK_NEVER);
355
+            $this->watcher->setPolicy((int)$this->getMountOption('filesystem_check_changes', $globalPolicy));
356
+        }
357
+        return $this->watcher;
358
+    }
359
+
360
+    /**
361
+     * get a propagator instance for the cache
362
+     *
363
+     * @param \OC\Files\Storage\Storage (optional) the storage to pass to the watcher
364
+     * @return \OC\Files\Cache\Propagator
365
+     */
366
+    public function getPropagator($storage = null) {
367
+        if (!$storage) {
368
+            $storage = $this;
369
+        }
370
+        if (!isset($storage->propagator)) {
371
+            $storage->propagator = new Propagator($storage, \OC::$server->getDatabaseConnection());
372
+        }
373
+        return $storage->propagator;
374
+    }
375
+
376
+    public function getUpdater($storage = null) {
377
+        if (!$storage) {
378
+            $storage = $this;
379
+        }
380
+        if (!isset($storage->updater)) {
381
+            $storage->updater = new Updater($storage);
382
+        }
383
+        return $storage->updater;
384
+    }
385
+
386
+    public function getStorageCache($storage = null) {
387
+        if (!$storage) {
388
+            $storage = $this;
389
+        }
390
+        if (!isset($this->storageCache)) {
391
+            $this->storageCache = new \OC\Files\Cache\Storage($storage);
392
+        }
393
+        return $this->storageCache;
394
+    }
395
+
396
+    /**
397
+     * get the owner of a path
398
+     *
399
+     * @param string $path The path to get the owner
400
+     * @return string|false uid or false
401
+     */
402
+    public function getOwner($path) {
403
+        if ($this->owner === null) {
404
+            $this->owner = \OC_User::getUser();
405
+        }
406
+
407
+        return $this->owner;
408
+    }
409
+
410
+    /**
411
+     * get the ETag for a file or folder
412
+     *
413
+     * @param string $path
414
+     * @return string
415
+     */
416
+    public function getETag($path) {
417
+        return uniqid();
418
+    }
419
+
420
+    /**
421
+     * clean a path, i.e. remove all redundant '.' and '..'
422
+     * making sure that it can't point to higher than '/'
423
+     *
424
+     * @param string $path The path to clean
425
+     * @return string cleaned path
426
+     */
427
+    public function cleanPath($path) {
428
+        if (strlen($path) == 0 or $path[0] != '/') {
429
+            $path = '/' . $path;
430
+        }
431
+
432
+        $output = array();
433
+        foreach (explode('/', $path) as $chunk) {
434
+            if ($chunk == '..') {
435
+                array_pop($output);
436
+            } else if ($chunk == '.') {
437
+            } else {
438
+                $output[] = $chunk;
439
+            }
440
+        }
441
+        return implode('/', $output);
442
+    }
443
+
444
+    /**
445
+     * Test a storage for availability
446
+     *
447
+     * @return bool
448
+     */
449
+    public function test() {
450
+        try {
451
+            if ($this->stat('')) {
452
+                return true;
453
+            }
454
+            \OC::$server->getLogger()->info("External storage not available: stat() failed");
455
+            return false;
456
+        } catch (\Exception $e) {
457
+            \OC::$server->getLogger()->info("External storage not available: " . $e->getMessage());
458
+            \OC::$server->getLogger()->logException($e, ['level' => ILogger::DEBUG]);
459
+            return false;
460
+        }
461
+    }
462
+
463
+    /**
464
+     * get the free space in the storage
465
+     *
466
+     * @param string $path
467
+     * @return int|false
468
+     */
469
+    public function free_space($path) {
470
+        return \OCP\Files\FileInfo::SPACE_UNKNOWN;
471
+    }
472
+
473
+    /**
474
+     * {@inheritdoc}
475
+     */
476
+    public function isLocal() {
477
+        // the common implementation returns a temporary file by
478
+        // default, which is not local
479
+        return false;
480
+    }
481
+
482
+    /**
483
+     * Check if the storage is an instance of $class or is a wrapper for a storage that is an instance of $class
484
+     *
485
+     * @param string $class
486
+     * @return bool
487
+     */
488
+    public function instanceOfStorage($class) {
489
+        if (ltrim($class, '\\') === 'OC\Files\Storage\Shared') {
490
+            // FIXME Temporary fix to keep existing checks working
491
+            $class = '\OCA\Files_Sharing\SharedStorage';
492
+        }
493
+        return is_a($this, $class);
494
+    }
495
+
496
+    /**
497
+     * A custom storage implementation can return an url for direct download of a give file.
498
+     *
499
+     * For now the returned array can hold the parameter url - in future more attributes might follow.
500
+     *
501
+     * @param string $path
502
+     * @return array|false
503
+     */
504
+    public function getDirectDownload($path) {
505
+        return [];
506
+    }
507
+
508
+    /**
509
+     * @inheritdoc
510
+     * @throws InvalidPathException
511
+     */
512
+    public function verifyPath($path, $fileName) {
513
+
514
+        // verify empty and dot files
515
+        $trimmed = trim($fileName);
516
+        if ($trimmed === '') {
517
+            throw new EmptyFileNameException();
518
+        }
519
+
520
+        if (\OC\Files\Filesystem::isIgnoredDir($trimmed)) {
521
+            throw new InvalidDirectoryException();
522
+        }
523
+
524
+        if (!\OC::$server->getDatabaseConnection()->supports4ByteText()) {
525
+            // verify database - e.g. mysql only 3-byte chars
526
+            if (preg_match('%(?:
527 527
       \xF0[\x90-\xBF][\x80-\xBF]{2}      # planes 1-3
528 528
     | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
529 529
     | \xF4[\x80-\x8F][\x80-\xBF]{2}      # plane 16
530 530
 )%xs', $fileName)) {
531
-				throw new InvalidCharacterInPathException();
532
-			}
533
-		}
534
-
535
-		if (isset($fileName[255])) {
536
-			throw new FileNameTooLongException();
537
-		}
538
-
539
-		// NOTE: $path will remain unverified for now
540
-		$this->verifyPosixPath($fileName);
541
-	}
542
-
543
-	/**
544
-	 * @param string $fileName
545
-	 * @throws InvalidPathException
546
-	 */
547
-	protected function verifyPosixPath($fileName) {
548
-		$fileName = trim($fileName);
549
-		$this->scanForInvalidCharacters($fileName, "\\/");
550
-		$reservedNames = ['*'];
551
-		if (in_array($fileName, $reservedNames)) {
552
-			throw new ReservedWordException();
553
-		}
554
-	}
555
-
556
-	/**
557
-	 * @param string $fileName
558
-	 * @param string $invalidChars
559
-	 * @throws InvalidPathException
560
-	 */
561
-	private function scanForInvalidCharacters($fileName, $invalidChars) {
562
-		foreach (str_split($invalidChars) as $char) {
563
-			if (strpos($fileName, $char) !== false) {
564
-				throw new InvalidCharacterInPathException();
565
-			}
566
-		}
567
-
568
-		$sanitizedFileName = filter_var($fileName, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW);
569
-		if ($sanitizedFileName !== $fileName) {
570
-			throw new InvalidCharacterInPathException();
571
-		}
572
-	}
573
-
574
-	/**
575
-	 * @param array $options
576
-	 */
577
-	public function setMountOptions(array $options) {
578
-		$this->mountOptions = $options;
579
-	}
580
-
581
-	/**
582
-	 * @param string $name
583
-	 * @param mixed $default
584
-	 * @return mixed
585
-	 */
586
-	public function getMountOption($name, $default = null) {
587
-		return isset($this->mountOptions[$name]) ? $this->mountOptions[$name] : $default;
588
-	}
589
-
590
-	/**
591
-	 * @param IStorage $sourceStorage
592
-	 * @param string $sourceInternalPath
593
-	 * @param string $targetInternalPath
594
-	 * @param bool $preserveMtime
595
-	 * @return bool
596
-	 */
597
-	public function copyFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath, $preserveMtime = false) {
598
-		if ($sourceStorage === $this) {
599
-			return $this->copy($sourceInternalPath, $targetInternalPath);
600
-		}
601
-
602
-		if ($sourceStorage->is_dir($sourceInternalPath)) {
603
-			$dh = $sourceStorage->opendir($sourceInternalPath);
604
-			$result = $this->mkdir($targetInternalPath);
605
-			if (is_resource($dh)) {
606
-				while ($result and ($file = readdir($dh)) !== false) {
607
-					if (!Filesystem::isIgnoredDir($file)) {
608
-						$result &= $this->copyFromStorage($sourceStorage, $sourceInternalPath . '/' . $file, $targetInternalPath . '/' . $file);
609
-					}
610
-				}
611
-			}
612
-		} else {
613
-			$source = $sourceStorage->fopen($sourceInternalPath, 'r');
614
-			// TODO: call fopen in a way that we execute again all storage wrappers
615
-			// to avoid that we bypass storage wrappers which perform important actions
616
-			// for this operation. Same is true for all other operations which
617
-			// are not the same as the original one.Once this is fixed we also
618
-			// need to adjust the encryption wrapper.
619
-			$target = $this->fopen($targetInternalPath, 'w');
620
-			list(, $result) = \OC_Helper::streamCopy($source, $target);
621
-			if ($result and $preserveMtime) {
622
-				$this->touch($targetInternalPath, $sourceStorage->filemtime($sourceInternalPath));
623
-			}
624
-			fclose($source);
625
-			fclose($target);
626
-
627
-			if (!$result) {
628
-				// delete partially written target file
629
-				$this->unlink($targetInternalPath);
630
-				// delete cache entry that was created by fopen
631
-				$this->getCache()->remove($targetInternalPath);
632
-			}
633
-		}
634
-		return (bool)$result;
635
-	}
636
-
637
-	/**
638
-	 * @param IStorage $sourceStorage
639
-	 * @param string $sourceInternalPath
640
-	 * @param string $targetInternalPath
641
-	 * @return bool
642
-	 */
643
-	public function moveFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
644
-		if ($sourceStorage === $this) {
645
-			return $this->rename($sourceInternalPath, $targetInternalPath);
646
-		}
647
-
648
-		if (!$sourceStorage->isDeletable($sourceInternalPath)) {
649
-			return false;
650
-		}
651
-
652
-		$result = $this->copyFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath, true);
653
-		if ($result) {
654
-			if ($sourceStorage->is_dir($sourceInternalPath)) {
655
-				$result &= $sourceStorage->rmdir($sourceInternalPath);
656
-			} else {
657
-				$result &= $sourceStorage->unlink($sourceInternalPath);
658
-			}
659
-		}
660
-		return $result;
661
-	}
662
-
663
-	/**
664
-	 * @inheritdoc
665
-	 */
666
-	public function getMetaData($path) {
667
-		$permissions = $this->getPermissions($path);
668
-		if (!$permissions & \OCP\Constants::PERMISSION_READ) {
669
-			//can't read, nothing we can do
670
-			return null;
671
-		}
672
-
673
-		$data = [];
674
-		$data['mimetype'] = $this->getMimeType($path);
675
-		$data['mtime'] = $this->filemtime($path);
676
-		if ($data['mtime'] === false) {
677
-			$data['mtime'] = time();
678
-		}
679
-		if ($data['mimetype'] == 'httpd/unix-directory') {
680
-			$data['size'] = -1; //unknown
681
-		} else {
682
-			$data['size'] = $this->filesize($path);
683
-		}
684
-		$data['etag'] = $this->getETag($path);
685
-		$data['storage_mtime'] = $data['mtime'];
686
-		$data['permissions'] = $permissions;
687
-
688
-		return $data;
689
-	}
690
-
691
-	/**
692
-	 * @param string $path
693
-	 * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
694
-	 * @param \OCP\Lock\ILockingProvider $provider
695
-	 * @throws \OCP\Lock\LockedException
696
-	 */
697
-	public function acquireLock($path, $type, ILockingProvider $provider) {
698
-		$logger = $this->getLockLogger();
699
-		if ($logger) {
700
-			$typeString = ($type === ILockingProvider::LOCK_SHARED) ? 'shared' : 'exclusive';
701
-			$logger->info(
702
-				sprintf(
703
-					'acquire %s lock on "%s" on storage "%s"',
704
-					$typeString,
705
-					$path,
706
-					$this->getId()
707
-				),
708
-				[
709
-					'app' => 'locking',
710
-				]
711
-			);
712
-		}
713
-		try {
714
-			$provider->acquireLock('files/' . md5($this->getId() . '::' . trim($path, '/')), $type);
715
-		} catch (LockedException $e) {
716
-			if ($logger) {
717
-				$logger->logException($e);
718
-			}
719
-			throw $e;
720
-		}
721
-	}
722
-
723
-	/**
724
-	 * @param string $path
725
-	 * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
726
-	 * @param \OCP\Lock\ILockingProvider $provider
727
-	 * @throws \OCP\Lock\LockedException
728
-	 */
729
-	public function releaseLock($path, $type, ILockingProvider $provider) {
730
-		$logger = $this->getLockLogger();
731
-		if ($logger) {
732
-			$typeString = ($type === ILockingProvider::LOCK_SHARED) ? 'shared' : 'exclusive';
733
-			$logger->info(
734
-				sprintf(
735
-					'release %s lock on "%s" on storage "%s"',
736
-					$typeString,
737
-					$path,
738
-					$this->getId()
739
-				),
740
-				[
741
-					'app' => 'locking',
742
-				]
743
-			);
744
-		}
745
-		try {
746
-			$provider->releaseLock('files/' . md5($this->getId() . '::' . trim($path, '/')), $type);
747
-		} catch (LockedException $e) {
748
-			if ($logger) {
749
-				$logger->logException($e);
750
-			}
751
-			throw $e;
752
-		}
753
-	}
754
-
755
-	/**
756
-	 * @param string $path
757
-	 * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
758
-	 * @param \OCP\Lock\ILockingProvider $provider
759
-	 * @throws \OCP\Lock\LockedException
760
-	 */
761
-	public function changeLock($path, $type, ILockingProvider $provider) {
762
-		$logger = $this->getLockLogger();
763
-		if ($logger) {
764
-			$typeString = ($type === ILockingProvider::LOCK_SHARED) ? 'shared' : 'exclusive';
765
-			$logger->info(
766
-				sprintf(
767
-					'change lock on "%s" to %s on storage "%s"',
768
-					$path,
769
-					$typeString,
770
-					$this->getId()
771
-				),
772
-				[
773
-					'app' => 'locking',
774
-				]
775
-			);
776
-		}
777
-		try {
778
-			$provider->changeLock('files/' . md5($this->getId() . '::' . trim($path, '/')), $type);
779
-		} catch (LockedException $e) {
780
-			\OC::$server->getLogger()->logException($e);
781
-			throw $e;
782
-		}
783
-	}
784
-
785
-	private function getLockLogger() {
786
-		if (is_null($this->shouldLogLocks)) {
787
-			$this->shouldLogLocks = \OC::$server->getConfig()->getSystemValue('filelocking.debug', false);
788
-			$this->logger = $this->shouldLogLocks ? \OC::$server->getLogger() : null;
789
-		}
790
-		return $this->logger;
791
-	}
792
-
793
-	/**
794
-	 * @return array [ available, last_checked ]
795
-	 */
796
-	public function getAvailability() {
797
-		return $this->getStorageCache()->getAvailability();
798
-	}
799
-
800
-	/**
801
-	 * @param bool $isAvailable
802
-	 */
803
-	public function setAvailability($isAvailable) {
804
-		$this->getStorageCache()->setAvailability($isAvailable);
805
-	}
806
-
807
-	/**
808
-	 * @return bool
809
-	 */
810
-	public function needsPartFile() {
811
-		return true;
812
-	}
813
-
814
-	/**
815
-	 * fallback implementation
816
-	 *
817
-	 * @param string $path
818
-	 * @param resource $stream
819
-	 * @param int $size
820
-	 * @return int
821
-	 */
822
-	public function writeStream(string $path, $stream, int $size = null): int {
823
-		$target = $this->fopen($path, 'w');
824
-		if (!$target) {
825
-			return 0;
826
-		}
827
-		list($count, $result) = \OC_Helper::streamCopy($stream, $target);
828
-		fclose($stream);
829
-		fclose($target);
830
-		return $count;
831
-	}
531
+                throw new InvalidCharacterInPathException();
532
+            }
533
+        }
534
+
535
+        if (isset($fileName[255])) {
536
+            throw new FileNameTooLongException();
537
+        }
538
+
539
+        // NOTE: $path will remain unverified for now
540
+        $this->verifyPosixPath($fileName);
541
+    }
542
+
543
+    /**
544
+     * @param string $fileName
545
+     * @throws InvalidPathException
546
+     */
547
+    protected function verifyPosixPath($fileName) {
548
+        $fileName = trim($fileName);
549
+        $this->scanForInvalidCharacters($fileName, "\\/");
550
+        $reservedNames = ['*'];
551
+        if (in_array($fileName, $reservedNames)) {
552
+            throw new ReservedWordException();
553
+        }
554
+    }
555
+
556
+    /**
557
+     * @param string $fileName
558
+     * @param string $invalidChars
559
+     * @throws InvalidPathException
560
+     */
561
+    private function scanForInvalidCharacters($fileName, $invalidChars) {
562
+        foreach (str_split($invalidChars) as $char) {
563
+            if (strpos($fileName, $char) !== false) {
564
+                throw new InvalidCharacterInPathException();
565
+            }
566
+        }
567
+
568
+        $sanitizedFileName = filter_var($fileName, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW);
569
+        if ($sanitizedFileName !== $fileName) {
570
+            throw new InvalidCharacterInPathException();
571
+        }
572
+    }
573
+
574
+    /**
575
+     * @param array $options
576
+     */
577
+    public function setMountOptions(array $options) {
578
+        $this->mountOptions = $options;
579
+    }
580
+
581
+    /**
582
+     * @param string $name
583
+     * @param mixed $default
584
+     * @return mixed
585
+     */
586
+    public function getMountOption($name, $default = null) {
587
+        return isset($this->mountOptions[$name]) ? $this->mountOptions[$name] : $default;
588
+    }
589
+
590
+    /**
591
+     * @param IStorage $sourceStorage
592
+     * @param string $sourceInternalPath
593
+     * @param string $targetInternalPath
594
+     * @param bool $preserveMtime
595
+     * @return bool
596
+     */
597
+    public function copyFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath, $preserveMtime = false) {
598
+        if ($sourceStorage === $this) {
599
+            return $this->copy($sourceInternalPath, $targetInternalPath);
600
+        }
601
+
602
+        if ($sourceStorage->is_dir($sourceInternalPath)) {
603
+            $dh = $sourceStorage->opendir($sourceInternalPath);
604
+            $result = $this->mkdir($targetInternalPath);
605
+            if (is_resource($dh)) {
606
+                while ($result and ($file = readdir($dh)) !== false) {
607
+                    if (!Filesystem::isIgnoredDir($file)) {
608
+                        $result &= $this->copyFromStorage($sourceStorage, $sourceInternalPath . '/' . $file, $targetInternalPath . '/' . $file);
609
+                    }
610
+                }
611
+            }
612
+        } else {
613
+            $source = $sourceStorage->fopen($sourceInternalPath, 'r');
614
+            // TODO: call fopen in a way that we execute again all storage wrappers
615
+            // to avoid that we bypass storage wrappers which perform important actions
616
+            // for this operation. Same is true for all other operations which
617
+            // are not the same as the original one.Once this is fixed we also
618
+            // need to adjust the encryption wrapper.
619
+            $target = $this->fopen($targetInternalPath, 'w');
620
+            list(, $result) = \OC_Helper::streamCopy($source, $target);
621
+            if ($result and $preserveMtime) {
622
+                $this->touch($targetInternalPath, $sourceStorage->filemtime($sourceInternalPath));
623
+            }
624
+            fclose($source);
625
+            fclose($target);
626
+
627
+            if (!$result) {
628
+                // delete partially written target file
629
+                $this->unlink($targetInternalPath);
630
+                // delete cache entry that was created by fopen
631
+                $this->getCache()->remove($targetInternalPath);
632
+            }
633
+        }
634
+        return (bool)$result;
635
+    }
636
+
637
+    /**
638
+     * @param IStorage $sourceStorage
639
+     * @param string $sourceInternalPath
640
+     * @param string $targetInternalPath
641
+     * @return bool
642
+     */
643
+    public function moveFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
644
+        if ($sourceStorage === $this) {
645
+            return $this->rename($sourceInternalPath, $targetInternalPath);
646
+        }
647
+
648
+        if (!$sourceStorage->isDeletable($sourceInternalPath)) {
649
+            return false;
650
+        }
651
+
652
+        $result = $this->copyFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath, true);
653
+        if ($result) {
654
+            if ($sourceStorage->is_dir($sourceInternalPath)) {
655
+                $result &= $sourceStorage->rmdir($sourceInternalPath);
656
+            } else {
657
+                $result &= $sourceStorage->unlink($sourceInternalPath);
658
+            }
659
+        }
660
+        return $result;
661
+    }
662
+
663
+    /**
664
+     * @inheritdoc
665
+     */
666
+    public function getMetaData($path) {
667
+        $permissions = $this->getPermissions($path);
668
+        if (!$permissions & \OCP\Constants::PERMISSION_READ) {
669
+            //can't read, nothing we can do
670
+            return null;
671
+        }
672
+
673
+        $data = [];
674
+        $data['mimetype'] = $this->getMimeType($path);
675
+        $data['mtime'] = $this->filemtime($path);
676
+        if ($data['mtime'] === false) {
677
+            $data['mtime'] = time();
678
+        }
679
+        if ($data['mimetype'] == 'httpd/unix-directory') {
680
+            $data['size'] = -1; //unknown
681
+        } else {
682
+            $data['size'] = $this->filesize($path);
683
+        }
684
+        $data['etag'] = $this->getETag($path);
685
+        $data['storage_mtime'] = $data['mtime'];
686
+        $data['permissions'] = $permissions;
687
+
688
+        return $data;
689
+    }
690
+
691
+    /**
692
+     * @param string $path
693
+     * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
694
+     * @param \OCP\Lock\ILockingProvider $provider
695
+     * @throws \OCP\Lock\LockedException
696
+     */
697
+    public function acquireLock($path, $type, ILockingProvider $provider) {
698
+        $logger = $this->getLockLogger();
699
+        if ($logger) {
700
+            $typeString = ($type === ILockingProvider::LOCK_SHARED) ? 'shared' : 'exclusive';
701
+            $logger->info(
702
+                sprintf(
703
+                    'acquire %s lock on "%s" on storage "%s"',
704
+                    $typeString,
705
+                    $path,
706
+                    $this->getId()
707
+                ),
708
+                [
709
+                    'app' => 'locking',
710
+                ]
711
+            );
712
+        }
713
+        try {
714
+            $provider->acquireLock('files/' . md5($this->getId() . '::' . trim($path, '/')), $type);
715
+        } catch (LockedException $e) {
716
+            if ($logger) {
717
+                $logger->logException($e);
718
+            }
719
+            throw $e;
720
+        }
721
+    }
722
+
723
+    /**
724
+     * @param string $path
725
+     * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
726
+     * @param \OCP\Lock\ILockingProvider $provider
727
+     * @throws \OCP\Lock\LockedException
728
+     */
729
+    public function releaseLock($path, $type, ILockingProvider $provider) {
730
+        $logger = $this->getLockLogger();
731
+        if ($logger) {
732
+            $typeString = ($type === ILockingProvider::LOCK_SHARED) ? 'shared' : 'exclusive';
733
+            $logger->info(
734
+                sprintf(
735
+                    'release %s lock on "%s" on storage "%s"',
736
+                    $typeString,
737
+                    $path,
738
+                    $this->getId()
739
+                ),
740
+                [
741
+                    'app' => 'locking',
742
+                ]
743
+            );
744
+        }
745
+        try {
746
+            $provider->releaseLock('files/' . md5($this->getId() . '::' . trim($path, '/')), $type);
747
+        } catch (LockedException $e) {
748
+            if ($logger) {
749
+                $logger->logException($e);
750
+            }
751
+            throw $e;
752
+        }
753
+    }
754
+
755
+    /**
756
+     * @param string $path
757
+     * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
758
+     * @param \OCP\Lock\ILockingProvider $provider
759
+     * @throws \OCP\Lock\LockedException
760
+     */
761
+    public function changeLock($path, $type, ILockingProvider $provider) {
762
+        $logger = $this->getLockLogger();
763
+        if ($logger) {
764
+            $typeString = ($type === ILockingProvider::LOCK_SHARED) ? 'shared' : 'exclusive';
765
+            $logger->info(
766
+                sprintf(
767
+                    'change lock on "%s" to %s on storage "%s"',
768
+                    $path,
769
+                    $typeString,
770
+                    $this->getId()
771
+                ),
772
+                [
773
+                    'app' => 'locking',
774
+                ]
775
+            );
776
+        }
777
+        try {
778
+            $provider->changeLock('files/' . md5($this->getId() . '::' . trim($path, '/')), $type);
779
+        } catch (LockedException $e) {
780
+            \OC::$server->getLogger()->logException($e);
781
+            throw $e;
782
+        }
783
+    }
784
+
785
+    private function getLockLogger() {
786
+        if (is_null($this->shouldLogLocks)) {
787
+            $this->shouldLogLocks = \OC::$server->getConfig()->getSystemValue('filelocking.debug', false);
788
+            $this->logger = $this->shouldLogLocks ? \OC::$server->getLogger() : null;
789
+        }
790
+        return $this->logger;
791
+    }
792
+
793
+    /**
794
+     * @return array [ available, last_checked ]
795
+     */
796
+    public function getAvailability() {
797
+        return $this->getStorageCache()->getAvailability();
798
+    }
799
+
800
+    /**
801
+     * @param bool $isAvailable
802
+     */
803
+    public function setAvailability($isAvailable) {
804
+        $this->getStorageCache()->setAvailability($isAvailable);
805
+    }
806
+
807
+    /**
808
+     * @return bool
809
+     */
810
+    public function needsPartFile() {
811
+        return true;
812
+    }
813
+
814
+    /**
815
+     * fallback implementation
816
+     *
817
+     * @param string $path
818
+     * @param resource $stream
819
+     * @param int $size
820
+     * @return int
821
+     */
822
+    public function writeStream(string $path, $stream, int $size = null): int {
823
+        $target = $this->fopen($path, 'w');
824
+        if (!$target) {
825
+            return 0;
826
+        }
827
+        list($count, $result) = \OC_Helper::streamCopy($stream, $target);
828
+        fclose($stream);
829
+        fclose($target);
830
+        return $count;
831
+    }
832 832
 }
Please login to merge, or discard this patch.
lib/private/Files/Storage/StorageFactory.php 2 patches
Indentation   +70 added lines, -70 removed lines patch added patch discarded remove patch
@@ -29,80 +29,80 @@
 block discarded – undo
29 29
 use OCP\Files\Storage\IStorageFactory;
30 30
 
31 31
 class StorageFactory implements IStorageFactory {
32
-	/**
33
-	 * @var array[] [$name=>['priority'=>$priority, 'wrapper'=>$callable] $storageWrappers
34
-	 */
35
-	private $storageWrappers = [];
32
+    /**
33
+     * @var array[] [$name=>['priority'=>$priority, 'wrapper'=>$callable] $storageWrappers
34
+     */
35
+    private $storageWrappers = [];
36 36
 
37
-	/**
38
-	 * allow modifier storage behaviour by adding wrappers around storages
39
-	 *
40
-	 * $callback should be a function of type (string $mountPoint, Storage $storage) => Storage
41
-	 *
42
-	 * @param string $wrapperName name of the wrapper
43
-	 * @param callable $callback callback
44
-	 * @param int $priority wrappers with the lower priority are applied last (meaning they get called first)
45
-	 * @param \OCP\Files\Mount\IMountPoint[] $existingMounts existing mount points to apply the wrapper to
46
-	 * @return bool true if the wrapper was added, false if there was already a wrapper with this
47
-	 * name registered
48
-	 */
49
-	public function addStorageWrapper($wrapperName, $callback, $priority = 50, $existingMounts = []) {
50
-		if (isset($this->storageWrappers[$wrapperName])) {
51
-			return false;
52
-		}
37
+    /**
38
+     * allow modifier storage behaviour by adding wrappers around storages
39
+     *
40
+     * $callback should be a function of type (string $mountPoint, Storage $storage) => Storage
41
+     *
42
+     * @param string $wrapperName name of the wrapper
43
+     * @param callable $callback callback
44
+     * @param int $priority wrappers with the lower priority are applied last (meaning they get called first)
45
+     * @param \OCP\Files\Mount\IMountPoint[] $existingMounts existing mount points to apply the wrapper to
46
+     * @return bool true if the wrapper was added, false if there was already a wrapper with this
47
+     * name registered
48
+     */
49
+    public function addStorageWrapper($wrapperName, $callback, $priority = 50, $existingMounts = []) {
50
+        if (isset($this->storageWrappers[$wrapperName])) {
51
+            return false;
52
+        }
53 53
 
54
-		// apply to existing mounts before registering it to prevent applying it double in MountPoint::createStorage
55
-		foreach ($existingMounts as $mount) {
56
-			$mount->wrapStorage($callback);
57
-		}
54
+        // apply to existing mounts before registering it to prevent applying it double in MountPoint::createStorage
55
+        foreach ($existingMounts as $mount) {
56
+            $mount->wrapStorage($callback);
57
+        }
58 58
 
59
-		$this->storageWrappers[$wrapperName] = ['wrapper' => $callback, 'priority' => $priority];
60
-		return true;
61
-	}
59
+        $this->storageWrappers[$wrapperName] = ['wrapper' => $callback, 'priority' => $priority];
60
+        return true;
61
+    }
62 62
 
63
-	/**
64
-	 * Remove a storage wrapper by name.
65
-	 * Note: internal method only to be used for cleanup
66
-	 *
67
-	 * @param string $wrapperName name of the wrapper
68
-	 * @internal
69
-	 */
70
-	public function removeStorageWrapper($wrapperName) {
71
-		unset($this->storageWrappers[$wrapperName]);
72
-	}
63
+    /**
64
+     * Remove a storage wrapper by name.
65
+     * Note: internal method only to be used for cleanup
66
+     *
67
+     * @param string $wrapperName name of the wrapper
68
+     * @internal
69
+     */
70
+    public function removeStorageWrapper($wrapperName) {
71
+        unset($this->storageWrappers[$wrapperName]);
72
+    }
73 73
 
74
-	/**
75
-	 * Create an instance of a storage and apply the registered storage wrappers
76
-	 *
77
-	 * @param \OCP\Files\Mount\IMountPoint $mountPoint
78
-	 * @param string $class
79
-	 * @param array $arguments
80
-	 * @return \OCP\Files\Storage
81
-	 */
82
-	public function getInstance(IMountPoint $mountPoint, $class, $arguments) {
83
-		return $this->wrap($mountPoint, new $class($arguments));
84
-	}
74
+    /**
75
+     * Create an instance of a storage and apply the registered storage wrappers
76
+     *
77
+     * @param \OCP\Files\Mount\IMountPoint $mountPoint
78
+     * @param string $class
79
+     * @param array $arguments
80
+     * @return \OCP\Files\Storage
81
+     */
82
+    public function getInstance(IMountPoint $mountPoint, $class, $arguments) {
83
+        return $this->wrap($mountPoint, new $class($arguments));
84
+    }
85 85
 
86
-	/**
87
-	 * @param \OCP\Files\Mount\IMountPoint $mountPoint
88
-	 * @param \OCP\Files\Storage $storage
89
-	 * @return \OCP\Files\Storage
90
-	 */
91
-	public function wrap(IMountPoint $mountPoint, $storage) {
92
-		$wrappers = array_values($this->storageWrappers);
93
-		usort($wrappers, function ($a, $b) {
94
-			return $b['priority'] - $a['priority'];
95
-		});
96
-		/** @var callable[] $wrappers */
97
-		$wrappers = array_map(function ($wrapper) {
98
-			return $wrapper['wrapper'];
99
-		}, $wrappers);
100
-		foreach ($wrappers as $wrapper) {
101
-			$storage = $wrapper($mountPoint->getMountPoint(), $storage, $mountPoint);
102
-			if (!($storage instanceof \OCP\Files\Storage)) {
103
-				throw new \Exception('Invalid result from storage wrapper');
104
-			}
105
-		}
106
-		return $storage;
107
-	}
86
+    /**
87
+     * @param \OCP\Files\Mount\IMountPoint $mountPoint
88
+     * @param \OCP\Files\Storage $storage
89
+     * @return \OCP\Files\Storage
90
+     */
91
+    public function wrap(IMountPoint $mountPoint, $storage) {
92
+        $wrappers = array_values($this->storageWrappers);
93
+        usort($wrappers, function ($a, $b) {
94
+            return $b['priority'] - $a['priority'];
95
+        });
96
+        /** @var callable[] $wrappers */
97
+        $wrappers = array_map(function ($wrapper) {
98
+            return $wrapper['wrapper'];
99
+        }, $wrappers);
100
+        foreach ($wrappers as $wrapper) {
101
+            $storage = $wrapper($mountPoint->getMountPoint(), $storage, $mountPoint);
102
+            if (!($storage instanceof \OCP\Files\Storage)) {
103
+                throw new \Exception('Invalid result from storage wrapper');
104
+            }
105
+        }
106
+        return $storage;
107
+    }
108 108
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -90,11 +90,11 @@
 block discarded – undo
90 90
 	 */
91 91
 	public function wrap(IMountPoint $mountPoint, $storage) {
92 92
 		$wrappers = array_values($this->storageWrappers);
93
-		usort($wrappers, function ($a, $b) {
93
+		usort($wrappers, function($a, $b) {
94 94
 			return $b['priority'] - $a['priority'];
95 95
 		});
96 96
 		/** @var callable[] $wrappers */
97
-		$wrappers = array_map(function ($wrapper) {
97
+		$wrappers = array_map(function($wrapper) {
98 98
 			return $wrapper['wrapper'];
99 99
 		}, $wrappers);
100 100
 		foreach ($wrappers as $wrapper) {
Please login to merge, or discard this patch.
lib/private/Files/Storage/PolyFill/CopyDirectory.php 2 patches
Indentation   +71 added lines, -71 removed lines patch added patch discarded remove patch
@@ -25,81 +25,81 @@
 block discarded – undo
25 25
 namespace OC\Files\Storage\PolyFill;
26 26
 
27 27
 trait CopyDirectory {
28
-	/**
29
-	 * Check if a path is a directory
30
-	 *
31
-	 * @param string $path
32
-	 * @return bool
33
-	 */
34
-	abstract public function is_dir($path);
28
+    /**
29
+     * Check if a path is a directory
30
+     *
31
+     * @param string $path
32
+     * @return bool
33
+     */
34
+    abstract public function is_dir($path);
35 35
 
36
-	/**
37
-	 * Check if a file or folder exists
38
-	 *
39
-	 * @param string $path
40
-	 * @return bool
41
-	 */
42
-	abstract public function file_exists($path);
36
+    /**
37
+     * Check if a file or folder exists
38
+     *
39
+     * @param string $path
40
+     * @return bool
41
+     */
42
+    abstract public function file_exists($path);
43 43
 
44
-	/**
45
-	 * Delete a file or folder
46
-	 *
47
-	 * @param string $path
48
-	 * @return bool
49
-	 */
50
-	abstract public function unlink($path);
44
+    /**
45
+     * Delete a file or folder
46
+     *
47
+     * @param string $path
48
+     * @return bool
49
+     */
50
+    abstract public function unlink($path);
51 51
 
52
-	/**
53
-	 * Open a directory handle for a folder
54
-	 *
55
-	 * @param string $path
56
-	 * @return resource | bool
57
-	 */
58
-	abstract public function opendir($path);
52
+    /**
53
+     * Open a directory handle for a folder
54
+     *
55
+     * @param string $path
56
+     * @return resource | bool
57
+     */
58
+    abstract public function opendir($path);
59 59
 
60
-	/**
61
-	 * Create a new folder
62
-	 *
63
-	 * @param string $path
64
-	 * @return bool
65
-	 */
66
-	abstract public function mkdir($path);
60
+    /**
61
+     * Create a new folder
62
+     *
63
+     * @param string $path
64
+     * @return bool
65
+     */
66
+    abstract public function mkdir($path);
67 67
 
68
-	public function copy($source, $target) {
69
-		if ($this->is_dir($source)) {
70
-			if ($this->file_exists($target)) {
71
-				$this->unlink($target);
72
-			}
73
-			$this->mkdir($target);
74
-			return $this->copyRecursive($source, $target);
75
-		} else {
76
-			return parent::copy($source, $target);
77
-		}
78
-	}
68
+    public function copy($source, $target) {
69
+        if ($this->is_dir($source)) {
70
+            if ($this->file_exists($target)) {
71
+                $this->unlink($target);
72
+            }
73
+            $this->mkdir($target);
74
+            return $this->copyRecursive($source, $target);
75
+        } else {
76
+            return parent::copy($source, $target);
77
+        }
78
+    }
79 79
 
80
-	/**
81
-	 * For adapters that don't support copying folders natively
82
-	 *
83
-	 * @param $source
84
-	 * @param $target
85
-	 * @return bool
86
-	 */
87
-	protected function copyRecursive($source, $target) {
88
-		$dh = $this->opendir($source);
89
-		$result = true;
90
-		while ($file = readdir($dh)) {
91
-			if (!\OC\Files\Filesystem::isIgnoredDir($file)) {
92
-				if ($this->is_dir($source . '/' . $file)) {
93
-					$this->mkdir($target . '/' . $file);
94
-					$result = $this->copyRecursive($source . '/' . $file, $target . '/' . $file);
95
-				} else {
96
-					$result = parent::copy($source . '/' . $file, $target . '/' . $file);
97
-				}
98
-				if (!$result) {
99
-					break;
100
-				}
101
-			}
102
-		}
103
-		return $result;
104
-	}
80
+    /**
81
+     * For adapters that don't support copying folders natively
82
+     *
83
+     * @param $source
84
+     * @param $target
85
+     * @return bool
86
+     */
87
+    protected function copyRecursive($source, $target) {
88
+        $dh = $this->opendir($source);
89
+        $result = true;
90
+        while ($file = readdir($dh)) {
91
+            if (!\OC\Files\Filesystem::isIgnoredDir($file)) {
92
+                if ($this->is_dir($source . '/' . $file)) {
93
+                    $this->mkdir($target . '/' . $file);
94
+                    $result = $this->copyRecursive($source . '/' . $file, $target . '/' . $file);
95
+                } else {
96
+                    $result = parent::copy($source . '/' . $file, $target . '/' . $file);
97
+                }
98
+                if (!$result) {
99
+                    break;
100
+                }
101
+            }
102
+        }
103
+        return $result;
104
+    }
105 105
 }
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -89,11 +89,11 @@
 block discarded – undo
89 89
 		$result = true;
90 90
 		while ($file = readdir($dh)) {
91 91
 			if (!\OC\Files\Filesystem::isIgnoredDir($file)) {
92
-				if ($this->is_dir($source . '/' . $file)) {
93
-					$this->mkdir($target . '/' . $file);
94
-					$result = $this->copyRecursive($source . '/' . $file, $target . '/' . $file);
92
+				if ($this->is_dir($source.'/'.$file)) {
93
+					$this->mkdir($target.'/'.$file);
94
+					$result = $this->copyRecursive($source.'/'.$file, $target.'/'.$file);
95 95
 				} else {
96
-					$result = parent::copy($source . '/' . $file, $target . '/' . $file);
96
+					$result = parent::copy($source.'/'.$file, $target.'/'.$file);
97 97
 				}
98 98
 				if (!$result) {
99 99
 					break;
Please login to merge, or discard this patch.
lib/private/Files/Storage/CommonTest.php 2 patches
Indentation   +47 added lines, -47 removed lines patch added patch discarded remove patch
@@ -33,53 +33,53 @@
 block discarded – undo
33 33
 namespace OC\Files\Storage;
34 34
 
35 35
 class CommonTest extends \OC\Files\Storage\Common{
36
-	/**
37
-	 * underlying local storage used for missing functions
38
-	 * @var \OC\Files\Storage\Local
39
-	 */
40
-	private $storage;
36
+    /**
37
+     * underlying local storage used for missing functions
38
+     * @var \OC\Files\Storage\Local
39
+     */
40
+    private $storage;
41 41
 
42
-	public function __construct($params) {
43
-		$this->storage=new \OC\Files\Storage\Local($params);
44
-	}
42
+    public function __construct($params) {
43
+        $this->storage=new \OC\Files\Storage\Local($params);
44
+    }
45 45
 
46
-	public function getId(){
47
-		return 'test::'.$this->storage->getId();
48
-	}
49
-	public function mkdir($path) {
50
-		return $this->storage->mkdir($path);
51
-	}
52
-	public function rmdir($path) {
53
-		return $this->storage->rmdir($path);
54
-	}
55
-	public function opendir($path) {
56
-		return $this->storage->opendir($path);
57
-	}
58
-	public function stat($path) {
59
-		return $this->storage->stat($path);
60
-	}
61
-	public function filetype($path) {
62
-		return @$this->storage->filetype($path);
63
-	}
64
-	public function isReadable($path) {
65
-		return $this->storage->isReadable($path);
66
-	}
67
-	public function isUpdatable($path) {
68
-		return $this->storage->isUpdatable($path);
69
-	}
70
-	public function file_exists($path) {
71
-		return $this->storage->file_exists($path);
72
-	}
73
-	public function unlink($path) {
74
-		return $this->storage->unlink($path);
75
-	}
76
-	public function fopen($path, $mode) {
77
-		return $this->storage->fopen($path, $mode);
78
-	}
79
-	public function free_space($path) {
80
-		return $this->storage->free_space($path);
81
-	}
82
-	public function touch($path, $mtime=null) {
83
-		return $this->storage->touch($path, $mtime);
84
-	}
46
+    public function getId(){
47
+        return 'test::'.$this->storage->getId();
48
+    }
49
+    public function mkdir($path) {
50
+        return $this->storage->mkdir($path);
51
+    }
52
+    public function rmdir($path) {
53
+        return $this->storage->rmdir($path);
54
+    }
55
+    public function opendir($path) {
56
+        return $this->storage->opendir($path);
57
+    }
58
+    public function stat($path) {
59
+        return $this->storage->stat($path);
60
+    }
61
+    public function filetype($path) {
62
+        return @$this->storage->filetype($path);
63
+    }
64
+    public function isReadable($path) {
65
+        return $this->storage->isReadable($path);
66
+    }
67
+    public function isUpdatable($path) {
68
+        return $this->storage->isUpdatable($path);
69
+    }
70
+    public function file_exists($path) {
71
+        return $this->storage->file_exists($path);
72
+    }
73
+    public function unlink($path) {
74
+        return $this->storage->unlink($path);
75
+    }
76
+    public function fopen($path, $mode) {
77
+        return $this->storage->fopen($path, $mode);
78
+    }
79
+    public function free_space($path) {
80
+        return $this->storage->free_space($path);
81
+    }
82
+    public function touch($path, $mtime=null) {
83
+        return $this->storage->touch($path, $mtime);
84
+    }
85 85
 }
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -32,7 +32,7 @@  discard block
 block discarded – undo
32 32
 
33 33
 namespace OC\Files\Storage;
34 34
 
35
-class CommonTest extends \OC\Files\Storage\Common{
35
+class CommonTest extends \OC\Files\Storage\Common {
36 36
 	/**
37 37
 	 * underlying local storage used for missing functions
38 38
 	 * @var \OC\Files\Storage\Local
@@ -40,10 +40,10 @@  discard block
 block discarded – undo
40 40
 	private $storage;
41 41
 
42 42
 	public function __construct($params) {
43
-		$this->storage=new \OC\Files\Storage\Local($params);
43
+		$this->storage = new \OC\Files\Storage\Local($params);
44 44
 	}
45 45
 
46
-	public function getId(){
46
+	public function getId() {
47 47
 		return 'test::'.$this->storage->getId();
48 48
 	}
49 49
 	public function mkdir($path) {
@@ -79,7 +79,7 @@  discard block
 block discarded – undo
79 79
 	public function free_space($path) {
80 80
 		return $this->storage->free_space($path);
81 81
 	}
82
-	public function touch($path, $mtime=null) {
82
+	public function touch($path, $mtime = null) {
83 83
 		return $this->storage->touch($path, $mtime);
84 84
 	}
85 85
 }
Please login to merge, or discard this patch.
lib/private/Files/Notify/RenameChange.php 1 patch
Indentation   +21 added lines, -21 removed lines patch added patch discarded remove patch
@@ -26,27 +26,27 @@
 block discarded – undo
26 26
 use OCP\Files\Notify\IRenameChange;
27 27
 
28 28
 class RenameChange extends Change implements IRenameChange {
29
-	/** @var string */
30
-	private $targetPath;
29
+    /** @var string */
30
+    private $targetPath;
31 31
 
32
-	/**
33
-	 * Change constructor.
34
-	 *
35
-	 * @param int $type
36
-	 * @param string $path
37
-	 * @param string $targetPath
38
-	 */
39
-	public function __construct($type, $path, $targetPath) {
40
-		parent::__construct($type, $path);
41
-		$this->targetPath = $targetPath;
42
-	}
32
+    /**
33
+     * Change constructor.
34
+     *
35
+     * @param int $type
36
+     * @param string $path
37
+     * @param string $targetPath
38
+     */
39
+    public function __construct($type, $path, $targetPath) {
40
+        parent::__construct($type, $path);
41
+        $this->targetPath = $targetPath;
42
+    }
43 43
 
44
-	/**
45
-	 * Get the new path of the renamed file relative to the storage root
46
-	 *
47
-	 * @return string
48
-	 */
49
-	public function getTargetPath() {
50
-		return $this->targetPath;
51
-	}
44
+    /**
45
+     * Get the new path of the renamed file relative to the storage root
46
+     *
47
+     * @return string
48
+     */
49
+    public function getTargetPath() {
50
+        return $this->targetPath;
51
+    }
52 52
 }
Please login to merge, or discard this patch.
lib/private/Files/Notify/Change.php 1 patch
Indentation   +32 added lines, -32 removed lines patch added patch discarded remove patch
@@ -26,40 +26,40 @@
 block discarded – undo
26 26
 use OCP\Files\Notify\IChange;
27 27
 
28 28
 class Change implements IChange {
29
-	/** @var int */
30
-	private $type;
29
+    /** @var int */
30
+    private $type;
31 31
 
32
-	/** @var string */
33
-	private $path;
32
+    /** @var string */
33
+    private $path;
34 34
 
35
-	/**
36
-	 * Change constructor.
37
-	 *
38
-	 * @param int $type
39
-	 * @param string $path
40
-	 */
41
-	public function __construct($type, $path) {
42
-		$this->type = $type;
43
-		$this->path = $path;
44
-	}
35
+    /**
36
+     * Change constructor.
37
+     *
38
+     * @param int $type
39
+     * @param string $path
40
+     */
41
+    public function __construct($type, $path) {
42
+        $this->type = $type;
43
+        $this->path = $path;
44
+    }
45 45
 
46
-	/**
47
-	 * Get the type of the change
48
-	 *
49
-	 * @return int IChange::ADDED, IChange::REMOVED, IChange::MODIFIED or IChange::RENAMED
50
-	 */
51
-	public function getType() {
52
-		return $this->type;
53
-	}
46
+    /**
47
+     * Get the type of the change
48
+     *
49
+     * @return int IChange::ADDED, IChange::REMOVED, IChange::MODIFIED or IChange::RENAMED
50
+     */
51
+    public function getType() {
52
+        return $this->type;
53
+    }
54 54
 
55
-	/**
56
-	 * Get the path of the file that was changed relative to the root of the storage
57
-	 *
58
-	 * Note, for rename changes this path is the old path for the file
59
-	 *
60
-	 * @return mixed
61
-	 */
62
-	public function getPath() {
63
-		return $this->path;
64
-	}
55
+    /**
56
+     * Get the path of the file that was changed relative to the root of the storage
57
+     *
58
+     * Note, for rename changes this path is the old path for the file
59
+     *
60
+     * @return mixed
61
+     */
62
+    public function getPath() {
63
+        return $this->path;
64
+    }
65 65
 }
Please login to merge, or discard this patch.
lib/private/Files/Cache/HomePropagator.php 1 patch
Indentation   +21 added lines, -21 removed lines patch added patch discarded remove patch
@@ -25,28 +25,28 @@
 block discarded – undo
25 25
 use OCP\IDBConnection;
26 26
 
27 27
 class HomePropagator extends Propagator {
28
-	private $ignoredBaseFolders;
28
+    private $ignoredBaseFolders;
29 29
 
30
-	/**
31
-	 * @param \OC\Files\Storage\Storage $storage
32
-	 */
33
-	public function __construct(\OC\Files\Storage\Storage $storage, IDBConnection $connection) {
34
-		parent::__construct($storage, $connection);
35
-		$this->ignoredBaseFolders = ['files_encryption'];
36
-	}
30
+    /**
31
+     * @param \OC\Files\Storage\Storage $storage
32
+     */
33
+    public function __construct(\OC\Files\Storage\Storage $storage, IDBConnection $connection) {
34
+        parent::__construct($storage, $connection);
35
+        $this->ignoredBaseFolders = ['files_encryption'];
36
+    }
37 37
 
38 38
 
39
-	/**
40
-	 * @param string $internalPath
41
-	 * @param int $time
42
-	 * @param int $sizeDifference number of bytes the file has grown
43
-	 */
44
-	public function propagateChange($internalPath, $time, $sizeDifference = 0) {
45
-		list($baseFolder) = explode('/', $internalPath, 2);
46
-		if (in_array($baseFolder, $this->ignoredBaseFolders)) {
47
-			return [];
48
-		} else {
49
-			parent::propagateChange($internalPath, $time, $sizeDifference);
50
-		}
51
-	}
39
+    /**
40
+     * @param string $internalPath
41
+     * @param int $time
42
+     * @param int $sizeDifference number of bytes the file has grown
43
+     */
44
+    public function propagateChange($internalPath, $time, $sizeDifference = 0) {
45
+        list($baseFolder) = explode('/', $internalPath, 2);
46
+        if (in_array($baseFolder, $this->ignoredBaseFolders)) {
47
+            return [];
48
+        } else {
49
+            parent::propagateChange($internalPath, $time, $sizeDifference);
50
+        }
51
+    }
52 52
 }
Please login to merge, or discard this patch.
lib/private/Files/Cache/Updater.php 1 patch
Indentation   +212 added lines, -212 removed lines patch added patch discarded remove patch
@@ -36,216 +36,216 @@
 block discarded – undo
36 36
  *
37 37
  */
38 38
 class Updater implements IUpdater {
39
-	/**
40
-	 * @var bool
41
-	 */
42
-	protected $enabled = true;
43
-
44
-	/**
45
-	 * @var \OC\Files\Storage\Storage
46
-	 */
47
-	protected $storage;
48
-
49
-	/**
50
-	 * @var \OC\Files\Cache\Propagator
51
-	 */
52
-	protected $propagator;
53
-
54
-	/**
55
-	 * @var Scanner
56
-	 */
57
-	protected $scanner;
58
-
59
-	/**
60
-	 * @var Cache
61
-	 */
62
-	protected $cache;
63
-
64
-	/**
65
-	 * @param \OC\Files\Storage\Storage $storage
66
-	 */
67
-	public function __construct(\OC\Files\Storage\Storage $storage) {
68
-		$this->storage = $storage;
69
-		$this->propagator = $storage->getPropagator();
70
-		$this->scanner = $storage->getScanner();
71
-		$this->cache = $storage->getCache();
72
-	}
73
-
74
-	/**
75
-	 * Disable updating the cache trough this updater
76
-	 */
77
-	public function disable() {
78
-		$this->enabled = false;
79
-	}
80
-
81
-	/**
82
-	 * Re-enable the updating of the cache trough this updater
83
-	 */
84
-	public function enable() {
85
-		$this->enabled = true;
86
-	}
87
-
88
-	/**
89
-	 * Get the propagator for etags and mtime for the view the updater works on
90
-	 *
91
-	 * @return Propagator
92
-	 */
93
-	public function getPropagator() {
94
-		return $this->propagator;
95
-	}
96
-
97
-	/**
98
-	 * Propagate etag and mtime changes for the parent folders of $path up to the root of the filesystem
99
-	 *
100
-	 * @param string $path the path of the file to propagate the changes for
101
-	 * @param int|null $time the timestamp to set as mtime for the parent folders, if left out the current time is used
102
-	 */
103
-	public function propagate($path, $time = null) {
104
-		if (Scanner::isPartialFile($path)) {
105
-			return;
106
-		}
107
-		$this->propagator->propagateChange($path, $time);
108
-	}
109
-
110
-	/**
111
-	 * Update the cache for $path and update the size, etag and mtime of the parent folders
112
-	 *
113
-	 * @param string $path
114
-	 * @param int $time
115
-	 */
116
-	public function update($path, $time = null) {
117
-		if (!$this->enabled or Scanner::isPartialFile($path)) {
118
-			return;
119
-		}
120
-		if (is_null($time)) {
121
-			$time = time();
122
-		}
123
-
124
-		$data = $this->scanner->scan($path, Scanner::SCAN_SHALLOW, -1, false);
125
-		if (
126
-			isset($data['oldSize']) && isset($data['size']) &&
127
-			!$data['encrypted'] // encryption is a pita and touches the cache itself
128
-		) {
129
-			$sizeDifference = $data['size'] - $data['oldSize'];
130
-		} else {
131
-			// scanner didn't provide size info, fallback to full size calculation
132
-			$sizeDifference = 0;
133
-			if ($this->cache instanceof Cache) {
134
-				$this->cache->correctFolderSize($path, $data);
135
-			}
136
-		}
137
-		$this->correctParentStorageMtime($path);
138
-		$this->propagator->propagateChange($path, $time, $sizeDifference);
139
-	}
140
-
141
-	/**
142
-	 * Remove $path from the cache and update the size, etag and mtime of the parent folders
143
-	 *
144
-	 * @param string $path
145
-	 */
146
-	public function remove($path) {
147
-		if (!$this->enabled or Scanner::isPartialFile($path)) {
148
-			return;
149
-		}
150
-
151
-		$parent = dirname($path);
152
-		if ($parent === '.') {
153
-			$parent = '';
154
-		}
155
-
156
-		$entry = $this->cache->get($path);
157
-
158
-		$this->cache->remove($path);
159
-
160
-		$this->correctParentStorageMtime($path);
161
-		if ($entry instanceof ICacheEntry) {
162
-			$this->propagator->propagateChange($path, time(), -$entry->getSize());
163
-		} else {
164
-			$this->propagator->propagateChange($path, time());
165
-			if ($this->cache instanceof Cache) {
166
-				$this->cache->correctFolderSize($parent);
167
-			}
168
-		}
169
-
170
-	}
171
-
172
-	/**
173
-	 * Rename a file or folder in the cache and update the size, etag and mtime of the parent folders
174
-	 *
175
-	 * @param IStorage $sourceStorage
176
-	 * @param string $source
177
-	 * @param string $target
178
-	 */
179
-	public function renameFromStorage(IStorage $sourceStorage, $source, $target) {
180
-		if (!$this->enabled or Scanner::isPartialFile($source) or Scanner::isPartialFile($target)) {
181
-			return;
182
-		}
183
-
184
-		$time = time();
185
-
186
-		$sourceCache = $sourceStorage->getCache();
187
-		$sourceUpdater = $sourceStorage->getUpdater();
188
-		$sourcePropagator = $sourceStorage->getPropagator();
189
-
190
-		if ($sourceCache->inCache($source)) {
191
-			if ($this->cache->inCache($target)) {
192
-				$this->cache->remove($target);
193
-			}
194
-
195
-			if ($sourceStorage === $this->storage) {
196
-				$this->cache->move($source, $target);
197
-			} else {
198
-				$this->cache->moveFromCache($sourceCache, $source, $target);
199
-			}
200
-		}
201
-
202
-		if (pathinfo($source, PATHINFO_EXTENSION) !== pathinfo($target, PATHINFO_EXTENSION)) {
203
-			// handle mime type change
204
-			$mimeType = $this->storage->getMimeType($target);
205
-			$fileId = $this->cache->getId($target);
206
-			$this->cache->update($fileId, ['mimetype' => $mimeType]);
207
-		}
208
-
209
-		if ($sourceCache instanceof Cache) {
210
-			$sourceCache->correctFolderSize($source);
211
-		}
212
-		if ($this->cache instanceof Cache) {
213
-			$this->cache->correctFolderSize($target);
214
-		}
215
-		if ($sourceUpdater instanceof Updater) {
216
-			$sourceUpdater->correctParentStorageMtime($source);
217
-		}
218
-		$this->correctParentStorageMtime($target);
219
-		$this->updateStorageMTimeOnly($target);
220
-		$sourcePropagator->propagateChange($source, $time);
221
-		$this->propagator->propagateChange($target, $time);
222
-	}
223
-
224
-	private function updateStorageMTimeOnly($internalPath) {
225
-		$fileId = $this->cache->getId($internalPath);
226
-		if ($fileId !== -1) {
227
-			$this->cache->update(
228
-				$fileId, [
229
-					'mtime' => null, // this magic tells it to not overwrite mtime
230
-					'storage_mtime' => $this->storage->filemtime($internalPath)
231
-				]
232
-			);
233
-		}
234
-	}
235
-
236
-	/**
237
-	 * update the storage_mtime of the direct parent in the cache to the mtime from the storage
238
-	 *
239
-	 * @param string $internalPath
240
-	 */
241
-	private function correctParentStorageMtime($internalPath) {
242
-		$parentId = $this->cache->getParentId($internalPath);
243
-		$parent = dirname($internalPath);
244
-		if ($parentId != -1) {
245
-			$mtime = $this->storage->filemtime($parent);
246
-			if ($mtime !== false) {
247
-				$this->cache->update($parentId, array('storage_mtime' => $mtime));
248
-			}
249
-		}
250
-	}
39
+    /**
40
+     * @var bool
41
+     */
42
+    protected $enabled = true;
43
+
44
+    /**
45
+     * @var \OC\Files\Storage\Storage
46
+     */
47
+    protected $storage;
48
+
49
+    /**
50
+     * @var \OC\Files\Cache\Propagator
51
+     */
52
+    protected $propagator;
53
+
54
+    /**
55
+     * @var Scanner
56
+     */
57
+    protected $scanner;
58
+
59
+    /**
60
+     * @var Cache
61
+     */
62
+    protected $cache;
63
+
64
+    /**
65
+     * @param \OC\Files\Storage\Storage $storage
66
+     */
67
+    public function __construct(\OC\Files\Storage\Storage $storage) {
68
+        $this->storage = $storage;
69
+        $this->propagator = $storage->getPropagator();
70
+        $this->scanner = $storage->getScanner();
71
+        $this->cache = $storage->getCache();
72
+    }
73
+
74
+    /**
75
+     * Disable updating the cache trough this updater
76
+     */
77
+    public function disable() {
78
+        $this->enabled = false;
79
+    }
80
+
81
+    /**
82
+     * Re-enable the updating of the cache trough this updater
83
+     */
84
+    public function enable() {
85
+        $this->enabled = true;
86
+    }
87
+
88
+    /**
89
+     * Get the propagator for etags and mtime for the view the updater works on
90
+     *
91
+     * @return Propagator
92
+     */
93
+    public function getPropagator() {
94
+        return $this->propagator;
95
+    }
96
+
97
+    /**
98
+     * Propagate etag and mtime changes for the parent folders of $path up to the root of the filesystem
99
+     *
100
+     * @param string $path the path of the file to propagate the changes for
101
+     * @param int|null $time the timestamp to set as mtime for the parent folders, if left out the current time is used
102
+     */
103
+    public function propagate($path, $time = null) {
104
+        if (Scanner::isPartialFile($path)) {
105
+            return;
106
+        }
107
+        $this->propagator->propagateChange($path, $time);
108
+    }
109
+
110
+    /**
111
+     * Update the cache for $path and update the size, etag and mtime of the parent folders
112
+     *
113
+     * @param string $path
114
+     * @param int $time
115
+     */
116
+    public function update($path, $time = null) {
117
+        if (!$this->enabled or Scanner::isPartialFile($path)) {
118
+            return;
119
+        }
120
+        if (is_null($time)) {
121
+            $time = time();
122
+        }
123
+
124
+        $data = $this->scanner->scan($path, Scanner::SCAN_SHALLOW, -1, false);
125
+        if (
126
+            isset($data['oldSize']) && isset($data['size']) &&
127
+            !$data['encrypted'] // encryption is a pita and touches the cache itself
128
+        ) {
129
+            $sizeDifference = $data['size'] - $data['oldSize'];
130
+        } else {
131
+            // scanner didn't provide size info, fallback to full size calculation
132
+            $sizeDifference = 0;
133
+            if ($this->cache instanceof Cache) {
134
+                $this->cache->correctFolderSize($path, $data);
135
+            }
136
+        }
137
+        $this->correctParentStorageMtime($path);
138
+        $this->propagator->propagateChange($path, $time, $sizeDifference);
139
+    }
140
+
141
+    /**
142
+     * Remove $path from the cache and update the size, etag and mtime of the parent folders
143
+     *
144
+     * @param string $path
145
+     */
146
+    public function remove($path) {
147
+        if (!$this->enabled or Scanner::isPartialFile($path)) {
148
+            return;
149
+        }
150
+
151
+        $parent = dirname($path);
152
+        if ($parent === '.') {
153
+            $parent = '';
154
+        }
155
+
156
+        $entry = $this->cache->get($path);
157
+
158
+        $this->cache->remove($path);
159
+
160
+        $this->correctParentStorageMtime($path);
161
+        if ($entry instanceof ICacheEntry) {
162
+            $this->propagator->propagateChange($path, time(), -$entry->getSize());
163
+        } else {
164
+            $this->propagator->propagateChange($path, time());
165
+            if ($this->cache instanceof Cache) {
166
+                $this->cache->correctFolderSize($parent);
167
+            }
168
+        }
169
+
170
+    }
171
+
172
+    /**
173
+     * Rename a file or folder in the cache and update the size, etag and mtime of the parent folders
174
+     *
175
+     * @param IStorage $sourceStorage
176
+     * @param string $source
177
+     * @param string $target
178
+     */
179
+    public function renameFromStorage(IStorage $sourceStorage, $source, $target) {
180
+        if (!$this->enabled or Scanner::isPartialFile($source) or Scanner::isPartialFile($target)) {
181
+            return;
182
+        }
183
+
184
+        $time = time();
185
+
186
+        $sourceCache = $sourceStorage->getCache();
187
+        $sourceUpdater = $sourceStorage->getUpdater();
188
+        $sourcePropagator = $sourceStorage->getPropagator();
189
+
190
+        if ($sourceCache->inCache($source)) {
191
+            if ($this->cache->inCache($target)) {
192
+                $this->cache->remove($target);
193
+            }
194
+
195
+            if ($sourceStorage === $this->storage) {
196
+                $this->cache->move($source, $target);
197
+            } else {
198
+                $this->cache->moveFromCache($sourceCache, $source, $target);
199
+            }
200
+        }
201
+
202
+        if (pathinfo($source, PATHINFO_EXTENSION) !== pathinfo($target, PATHINFO_EXTENSION)) {
203
+            // handle mime type change
204
+            $mimeType = $this->storage->getMimeType($target);
205
+            $fileId = $this->cache->getId($target);
206
+            $this->cache->update($fileId, ['mimetype' => $mimeType]);
207
+        }
208
+
209
+        if ($sourceCache instanceof Cache) {
210
+            $sourceCache->correctFolderSize($source);
211
+        }
212
+        if ($this->cache instanceof Cache) {
213
+            $this->cache->correctFolderSize($target);
214
+        }
215
+        if ($sourceUpdater instanceof Updater) {
216
+            $sourceUpdater->correctParentStorageMtime($source);
217
+        }
218
+        $this->correctParentStorageMtime($target);
219
+        $this->updateStorageMTimeOnly($target);
220
+        $sourcePropagator->propagateChange($source, $time);
221
+        $this->propagator->propagateChange($target, $time);
222
+    }
223
+
224
+    private function updateStorageMTimeOnly($internalPath) {
225
+        $fileId = $this->cache->getId($internalPath);
226
+        if ($fileId !== -1) {
227
+            $this->cache->update(
228
+                $fileId, [
229
+                    'mtime' => null, // this magic tells it to not overwrite mtime
230
+                    'storage_mtime' => $this->storage->filemtime($internalPath)
231
+                ]
232
+            );
233
+        }
234
+    }
235
+
236
+    /**
237
+     * update the storage_mtime of the direct parent in the cache to the mtime from the storage
238
+     *
239
+     * @param string $internalPath
240
+     */
241
+    private function correctParentStorageMtime($internalPath) {
242
+        $parentId = $this->cache->getParentId($internalPath);
243
+        $parent = dirname($internalPath);
244
+        if ($parentId != -1) {
245
+            $mtime = $this->storage->filemtime($parent);
246
+            if ($mtime !== false) {
247
+                $this->cache->update($parentId, array('storage_mtime' => $mtime));
248
+            }
249
+        }
250
+    }
251 251
 }
Please login to merge, or discard this patch.
lib/private/Files/Cache/CacheEntry.php 2 patches
Indentation   +62 added lines, -62 removed lines patch added patch discarded remove patch
@@ -28,88 +28,88 @@
 block discarded – undo
28 28
  * meta data for a file or folder
29 29
  */
30 30
 class CacheEntry implements ICacheEntry, \ArrayAccess {
31
-	/**
32
-	 * @var array
33
-	 */
34
-	private $data;
31
+    /**
32
+     * @var array
33
+     */
34
+    private $data;
35 35
 
36
-	public function __construct(array $data) {
37
-		$this->data = $data;
38
-	}
36
+    public function __construct(array $data) {
37
+        $this->data = $data;
38
+    }
39 39
 
40
-	public function offsetSet($offset, $value) {
41
-		$this->data[$offset] = $value;
42
-	}
40
+    public function offsetSet($offset, $value) {
41
+        $this->data[$offset] = $value;
42
+    }
43 43
 
44
-	public function offsetExists($offset) {
45
-		return isset($this->data[$offset]);
46
-	}
44
+    public function offsetExists($offset) {
45
+        return isset($this->data[$offset]);
46
+    }
47 47
 
48
-	public function offsetUnset($offset) {
49
-		unset($this->data[$offset]);
50
-	}
48
+    public function offsetUnset($offset) {
49
+        unset($this->data[$offset]);
50
+    }
51 51
 
52
-	public function offsetGet($offset) {
53
-		if (isset($this->data[$offset])) {
54
-			return $this->data[$offset];
55
-		} else {
56
-			return null;
57
-		}
58
-	}
52
+    public function offsetGet($offset) {
53
+        if (isset($this->data[$offset])) {
54
+            return $this->data[$offset];
55
+        } else {
56
+            return null;
57
+        }
58
+    }
59 59
 
60
-	public function getId() {
61
-		return (int)$this->data['fileid'];
62
-	}
60
+    public function getId() {
61
+        return (int)$this->data['fileid'];
62
+    }
63 63
 
64
-	public function getStorageId() {
65
-		return $this->data['storage'];
66
-	}
64
+    public function getStorageId() {
65
+        return $this->data['storage'];
66
+    }
67 67
 
68 68
 
69
-	public function getPath() {
70
-		return $this->data['path'];
71
-	}
69
+    public function getPath() {
70
+        return $this->data['path'];
71
+    }
72 72
 
73 73
 
74
-	public function getName() {
75
-		return $this->data['name'];
76
-	}
74
+    public function getName() {
75
+        return $this->data['name'];
76
+    }
77 77
 
78 78
 
79
-	public function getMimeType() {
80
-		return $this->data['mimetype'];
81
-	}
79
+    public function getMimeType() {
80
+        return $this->data['mimetype'];
81
+    }
82 82
 
83 83
 
84
-	public function getMimePart() {
85
-		return $this->data['mimepart'];
86
-	}
84
+    public function getMimePart() {
85
+        return $this->data['mimepart'];
86
+    }
87 87
 
88
-	public function getSize() {
89
-		return $this->data['size'];
90
-	}
88
+    public function getSize() {
89
+        return $this->data['size'];
90
+    }
91 91
 
92
-	public function getMTime() {
93
-		return $this->data['mtime'];
94
-	}
92
+    public function getMTime() {
93
+        return $this->data['mtime'];
94
+    }
95 95
 
96
-	public function getStorageMTime() {
97
-		return $this->data['storage_mtime'];
98
-	}
96
+    public function getStorageMTime() {
97
+        return $this->data['storage_mtime'];
98
+    }
99 99
 
100
-	public function getEtag() {
101
-		return $this->data['etag'];
102
-	}
100
+    public function getEtag() {
101
+        return $this->data['etag'];
102
+    }
103 103
 
104
-	public function getPermissions() {
105
-		return $this->data['permissions'];
106
-	}
104
+    public function getPermissions() {
105
+        return $this->data['permissions'];
106
+    }
107 107
 
108
-	public function isEncrypted() {
109
-		return isset($this->data['encrypted']) && $this->data['encrypted'];
110
-	}
108
+    public function isEncrypted() {
109
+        return isset($this->data['encrypted']) && $this->data['encrypted'];
110
+    }
111 111
 
112
-	public function getData() {
113
-		return $this->data;
114
-	}
112
+    public function getData() {
113
+        return $this->data;
114
+    }
115 115
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -58,7 +58,7 @@
 block discarded – undo
58 58
 	}
59 59
 
60 60
 	public function getId() {
61
-		return (int)$this->data['fileid'];
61
+		return (int) $this->data['fileid'];
62 62
 	}
63 63
 
64 64
 	public function getStorageId() {
Please login to merge, or discard this patch.