Passed
Push — master ( 6fbf8f...2b4b5d )
by Georg
35:25 queued 18:20
created
lib/private/Files/Node/Root.php 2 patches
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -372,12 +372,12 @@
 block discarded – undo
372 372
 			\OC\Files\Filesystem::initMountPoints($userId);
373 373
 
374 374
 			try {
375
-				$folder = $this->get('/' . $userId . '/files');
375
+				$folder = $this->get('/'.$userId.'/files');
376 376
 			} catch (NotFoundException $e) {
377
-				if (!$this->nodeExists('/' . $userId)) {
378
-					$this->newFolder('/' . $userId);
377
+				if (!$this->nodeExists('/'.$userId)) {
378
+					$this->newFolder('/'.$userId);
379 379
 				}
380
-				$folder = $this->newFolder('/' . $userId . '/files');
380
+				$folder = $this->newFolder('/'.$userId.'/files');
381 381
 			}
382 382
 
383 383
 			$this->userFolderCache->set($userId, $folder);
Please login to merge, or discard this patch.
Indentation   +336 added lines, -336 removed lines patch added patch discarded remove patch
@@ -63,340 +63,340 @@
 block discarded – undo
63 63
  * @package OC\Files\Node
64 64
  */
65 65
 class Root extends Folder implements IRootFolder {
66
-	/** @var Manager */
67
-	private $mountManager;
68
-	/** @var PublicEmitter */
69
-	private $emitter;
70
-	/** @var null|\OC\User\User */
71
-	private $user;
72
-	/** @var CappedMemoryCache */
73
-	private $userFolderCache;
74
-	/** @var IUserMountCache */
75
-	private $userMountCache;
76
-	/** @var ILogger */
77
-	private $logger;
78
-	/** @var IUserManager */
79
-	private $userManager;
80
-
81
-	/**
82
-	 * @param \OC\Files\Mount\Manager $manager
83
-	 * @param \OC\Files\View $view
84
-	 * @param \OC\User\User|null $user
85
-	 * @param IUserMountCache $userMountCache
86
-	 * @param ILogger $logger
87
-	 * @param IUserManager $userManager
88
-	 */
89
-	public function __construct($manager,
90
-								$view,
91
-								$user,
92
-								IUserMountCache $userMountCache,
93
-								ILogger $logger,
94
-								IUserManager $userManager) {
95
-		parent::__construct($this, $view, '');
96
-		$this->mountManager = $manager;
97
-		$this->user = $user;
98
-		$this->emitter = new PublicEmitter();
99
-		$this->userFolderCache = new CappedMemoryCache();
100
-		$this->userMountCache = $userMountCache;
101
-		$this->logger = $logger;
102
-		$this->userManager = $userManager;
103
-	}
104
-
105
-	/**
106
-	 * Get the user for which the filesystem is setup
107
-	 *
108
-	 * @return \OC\User\User
109
-	 */
110
-	public function getUser() {
111
-		return $this->user;
112
-	}
113
-
114
-	/**
115
-	 * @param string $scope
116
-	 * @param string $method
117
-	 * @param callable $callback
118
-	 */
119
-	public function listen($scope, $method, callable $callback) {
120
-		$this->emitter->listen($scope, $method, $callback);
121
-	}
122
-
123
-	/**
124
-	 * @param string $scope optional
125
-	 * @param string $method optional
126
-	 * @param callable $callback optional
127
-	 */
128
-	public function removeListener($scope = null, $method = null, callable $callback = null) {
129
-		$this->emitter->removeListener($scope, $method, $callback);
130
-	}
131
-
132
-	/**
133
-	 * @param string $scope
134
-	 * @param string $method
135
-	 * @param Node[] $arguments
136
-	 */
137
-	public function emit($scope, $method, $arguments = []) {
138
-		$this->emitter->emit($scope, $method, $arguments);
139
-	}
140
-
141
-	/**
142
-	 * @param \OC\Files\Storage\Storage $storage
143
-	 * @param string $mountPoint
144
-	 * @param array $arguments
145
-	 */
146
-	public function mount($storage, $mountPoint, $arguments = []) {
147
-		$mount = new MountPoint($storage, $mountPoint, $arguments);
148
-		$this->mountManager->addMount($mount);
149
-	}
150
-
151
-	/**
152
-	 * @param string $mountPoint
153
-	 * @return \OC\Files\Mount\MountPoint
154
-	 */
155
-	public function getMount($mountPoint) {
156
-		return $this->mountManager->find($mountPoint);
157
-	}
158
-
159
-	/**
160
-	 * @param string $mountPoint
161
-	 * @return \OC\Files\Mount\MountPoint[]
162
-	 */
163
-	public function getMountsIn($mountPoint) {
164
-		return $this->mountManager->findIn($mountPoint);
165
-	}
166
-
167
-	/**
168
-	 * @param string $storageId
169
-	 * @return \OC\Files\Mount\MountPoint[]
170
-	 */
171
-	public function getMountByStorageId($storageId) {
172
-		return $this->mountManager->findByStorageId($storageId);
173
-	}
174
-
175
-	/**
176
-	 * @param int $numericId
177
-	 * @return MountPoint[]
178
-	 */
179
-	public function getMountByNumericStorageId($numericId) {
180
-		return $this->mountManager->findByNumericId($numericId);
181
-	}
182
-
183
-	/**
184
-	 * @param \OC\Files\Mount\MountPoint $mount
185
-	 */
186
-	public function unMount($mount) {
187
-		$this->mountManager->remove($mount);
188
-	}
189
-
190
-	/**
191
-	 * @param string $path
192
-	 * @throws \OCP\Files\NotFoundException
193
-	 * @throws \OCP\Files\NotPermittedException
194
-	 * @return string
195
-	 */
196
-	public function get($path) {
197
-		$path = $this->normalizePath($path);
198
-		if ($this->isValidPath($path)) {
199
-			$fullPath = $this->getFullPath($path);
200
-			$fileInfo = $this->view->getFileInfo($fullPath);
201
-			if ($fileInfo) {
202
-				return $this->createNode($fullPath, $fileInfo);
203
-			} else {
204
-				throw new NotFoundException($path);
205
-			}
206
-		} else {
207
-			throw new NotPermittedException();
208
-		}
209
-	}
210
-
211
-	//most operations can't be done on the root
212
-
213
-	/**
214
-	 * @param string $targetPath
215
-	 * @throws \OCP\Files\NotPermittedException
216
-	 * @return \OC\Files\Node\Node
217
-	 */
218
-	public function rename($targetPath) {
219
-		throw new NotPermittedException();
220
-	}
221
-
222
-	public function delete() {
223
-		throw new NotPermittedException();
224
-	}
225
-
226
-	/**
227
-	 * @param string $targetPath
228
-	 * @throws \OCP\Files\NotPermittedException
229
-	 * @return \OC\Files\Node\Node
230
-	 */
231
-	public function copy($targetPath) {
232
-		throw new NotPermittedException();
233
-	}
234
-
235
-	/**
236
-	 * @param int $mtime
237
-	 * @throws \OCP\Files\NotPermittedException
238
-	 */
239
-	public function touch($mtime = null) {
240
-		throw new NotPermittedException();
241
-	}
242
-
243
-	/**
244
-	 * @return \OC\Files\Storage\Storage
245
-	 * @throws \OCP\Files\NotFoundException
246
-	 */
247
-	public function getStorage() {
248
-		throw new NotFoundException();
249
-	}
250
-
251
-	/**
252
-	 * @return string
253
-	 */
254
-	public function getPath() {
255
-		return '/';
256
-	}
257
-
258
-	/**
259
-	 * @return string
260
-	 */
261
-	public function getInternalPath() {
262
-		return '';
263
-	}
264
-
265
-	/**
266
-	 * @return int
267
-	 */
268
-	public function getId() {
269
-		return null;
270
-	}
271
-
272
-	/**
273
-	 * @return array
274
-	 */
275
-	public function stat() {
276
-		return null;
277
-	}
278
-
279
-	/**
280
-	 * @return int
281
-	 */
282
-	public function getMTime() {
283
-		return null;
284
-	}
285
-
286
-	/**
287
-	 * @param bool $includeMounts
288
-	 * @return int
289
-	 */
290
-	public function getSize($includeMounts = true) {
291
-		return null;
292
-	}
293
-
294
-	/**
295
-	 * @return string
296
-	 */
297
-	public function getEtag() {
298
-		return null;
299
-	}
300
-
301
-	/**
302
-	 * @return int
303
-	 */
304
-	public function getPermissions() {
305
-		return \OCP\Constants::PERMISSION_CREATE;
306
-	}
307
-
308
-	/**
309
-	 * @return bool
310
-	 */
311
-	public function isReadable() {
312
-		return false;
313
-	}
314
-
315
-	/**
316
-	 * @return bool
317
-	 */
318
-	public function isUpdateable() {
319
-		return false;
320
-	}
321
-
322
-	/**
323
-	 * @return bool
324
-	 */
325
-	public function isDeletable() {
326
-		return false;
327
-	}
328
-
329
-	/**
330
-	 * @return bool
331
-	 */
332
-	public function isShareable() {
333
-		return false;
334
-	}
335
-
336
-	/**
337
-	 * @return Node
338
-	 * @throws \OCP\Files\NotFoundException
339
-	 */
340
-	public function getParent() {
341
-		throw new NotFoundException();
342
-	}
343
-
344
-	/**
345
-	 * @return string
346
-	 */
347
-	public function getName() {
348
-		return '';
349
-	}
350
-
351
-	/**
352
-	 * Returns a view to user's files folder
353
-	 *
354
-	 * @param string $userId user ID
355
-	 * @return \OCP\Files\Folder
356
-	 * @throws NoUserException
357
-	 * @throws NotPermittedException
358
-	 */
359
-	public function getUserFolder($userId) {
360
-		$userObject = $this->userManager->get($userId);
361
-
362
-		if (is_null($userObject)) {
363
-			$this->logger->error(
364
-				sprintf(
365
-					'Backends provided no user object for %s',
366
-					$userId
367
-				),
368
-				[
369
-					'app' => 'files',
370
-				]
371
-			);
372
-			throw new NoUserException('Backends provided no user object');
373
-		}
374
-
375
-		$userId = $userObject->getUID();
376
-
377
-		if (!$this->userFolderCache->hasKey($userId)) {
378
-			\OC\Files\Filesystem::initMountPoints($userId);
379
-
380
-			try {
381
-				$folder = $this->get('/' . $userId . '/files');
382
-			} catch (NotFoundException $e) {
383
-				if (!$this->nodeExists('/' . $userId)) {
384
-					$this->newFolder('/' . $userId);
385
-				}
386
-				$folder = $this->newFolder('/' . $userId . '/files');
387
-			}
388
-
389
-			$this->userFolderCache->set($userId, $folder);
390
-		}
391
-
392
-		return $this->userFolderCache->get($userId);
393
-	}
394
-
395
-	public function clearCache() {
396
-		$this->userFolderCache = new CappedMemoryCache();
397
-	}
398
-
399
-	public function getUserMountCache() {
400
-		return $this->userMountCache;
401
-	}
66
+    /** @var Manager */
67
+    private $mountManager;
68
+    /** @var PublicEmitter */
69
+    private $emitter;
70
+    /** @var null|\OC\User\User */
71
+    private $user;
72
+    /** @var CappedMemoryCache */
73
+    private $userFolderCache;
74
+    /** @var IUserMountCache */
75
+    private $userMountCache;
76
+    /** @var ILogger */
77
+    private $logger;
78
+    /** @var IUserManager */
79
+    private $userManager;
80
+
81
+    /**
82
+     * @param \OC\Files\Mount\Manager $manager
83
+     * @param \OC\Files\View $view
84
+     * @param \OC\User\User|null $user
85
+     * @param IUserMountCache $userMountCache
86
+     * @param ILogger $logger
87
+     * @param IUserManager $userManager
88
+     */
89
+    public function __construct($manager,
90
+                                $view,
91
+                                $user,
92
+                                IUserMountCache $userMountCache,
93
+                                ILogger $logger,
94
+                                IUserManager $userManager) {
95
+        parent::__construct($this, $view, '');
96
+        $this->mountManager = $manager;
97
+        $this->user = $user;
98
+        $this->emitter = new PublicEmitter();
99
+        $this->userFolderCache = new CappedMemoryCache();
100
+        $this->userMountCache = $userMountCache;
101
+        $this->logger = $logger;
102
+        $this->userManager = $userManager;
103
+    }
104
+
105
+    /**
106
+     * Get the user for which the filesystem is setup
107
+     *
108
+     * @return \OC\User\User
109
+     */
110
+    public function getUser() {
111
+        return $this->user;
112
+    }
113
+
114
+    /**
115
+     * @param string $scope
116
+     * @param string $method
117
+     * @param callable $callback
118
+     */
119
+    public function listen($scope, $method, callable $callback) {
120
+        $this->emitter->listen($scope, $method, $callback);
121
+    }
122
+
123
+    /**
124
+     * @param string $scope optional
125
+     * @param string $method optional
126
+     * @param callable $callback optional
127
+     */
128
+    public function removeListener($scope = null, $method = null, callable $callback = null) {
129
+        $this->emitter->removeListener($scope, $method, $callback);
130
+    }
131
+
132
+    /**
133
+     * @param string $scope
134
+     * @param string $method
135
+     * @param Node[] $arguments
136
+     */
137
+    public function emit($scope, $method, $arguments = []) {
138
+        $this->emitter->emit($scope, $method, $arguments);
139
+    }
140
+
141
+    /**
142
+     * @param \OC\Files\Storage\Storage $storage
143
+     * @param string $mountPoint
144
+     * @param array $arguments
145
+     */
146
+    public function mount($storage, $mountPoint, $arguments = []) {
147
+        $mount = new MountPoint($storage, $mountPoint, $arguments);
148
+        $this->mountManager->addMount($mount);
149
+    }
150
+
151
+    /**
152
+     * @param string $mountPoint
153
+     * @return \OC\Files\Mount\MountPoint
154
+     */
155
+    public function getMount($mountPoint) {
156
+        return $this->mountManager->find($mountPoint);
157
+    }
158
+
159
+    /**
160
+     * @param string $mountPoint
161
+     * @return \OC\Files\Mount\MountPoint[]
162
+     */
163
+    public function getMountsIn($mountPoint) {
164
+        return $this->mountManager->findIn($mountPoint);
165
+    }
166
+
167
+    /**
168
+     * @param string $storageId
169
+     * @return \OC\Files\Mount\MountPoint[]
170
+     */
171
+    public function getMountByStorageId($storageId) {
172
+        return $this->mountManager->findByStorageId($storageId);
173
+    }
174
+
175
+    /**
176
+     * @param int $numericId
177
+     * @return MountPoint[]
178
+     */
179
+    public function getMountByNumericStorageId($numericId) {
180
+        return $this->mountManager->findByNumericId($numericId);
181
+    }
182
+
183
+    /**
184
+     * @param \OC\Files\Mount\MountPoint $mount
185
+     */
186
+    public function unMount($mount) {
187
+        $this->mountManager->remove($mount);
188
+    }
189
+
190
+    /**
191
+     * @param string $path
192
+     * @throws \OCP\Files\NotFoundException
193
+     * @throws \OCP\Files\NotPermittedException
194
+     * @return string
195
+     */
196
+    public function get($path) {
197
+        $path = $this->normalizePath($path);
198
+        if ($this->isValidPath($path)) {
199
+            $fullPath = $this->getFullPath($path);
200
+            $fileInfo = $this->view->getFileInfo($fullPath);
201
+            if ($fileInfo) {
202
+                return $this->createNode($fullPath, $fileInfo);
203
+            } else {
204
+                throw new NotFoundException($path);
205
+            }
206
+        } else {
207
+            throw new NotPermittedException();
208
+        }
209
+    }
210
+
211
+    //most operations can't be done on the root
212
+
213
+    /**
214
+     * @param string $targetPath
215
+     * @throws \OCP\Files\NotPermittedException
216
+     * @return \OC\Files\Node\Node
217
+     */
218
+    public function rename($targetPath) {
219
+        throw new NotPermittedException();
220
+    }
221
+
222
+    public function delete() {
223
+        throw new NotPermittedException();
224
+    }
225
+
226
+    /**
227
+     * @param string $targetPath
228
+     * @throws \OCP\Files\NotPermittedException
229
+     * @return \OC\Files\Node\Node
230
+     */
231
+    public function copy($targetPath) {
232
+        throw new NotPermittedException();
233
+    }
234
+
235
+    /**
236
+     * @param int $mtime
237
+     * @throws \OCP\Files\NotPermittedException
238
+     */
239
+    public function touch($mtime = null) {
240
+        throw new NotPermittedException();
241
+    }
242
+
243
+    /**
244
+     * @return \OC\Files\Storage\Storage
245
+     * @throws \OCP\Files\NotFoundException
246
+     */
247
+    public function getStorage() {
248
+        throw new NotFoundException();
249
+    }
250
+
251
+    /**
252
+     * @return string
253
+     */
254
+    public function getPath() {
255
+        return '/';
256
+    }
257
+
258
+    /**
259
+     * @return string
260
+     */
261
+    public function getInternalPath() {
262
+        return '';
263
+    }
264
+
265
+    /**
266
+     * @return int
267
+     */
268
+    public function getId() {
269
+        return null;
270
+    }
271
+
272
+    /**
273
+     * @return array
274
+     */
275
+    public function stat() {
276
+        return null;
277
+    }
278
+
279
+    /**
280
+     * @return int
281
+     */
282
+    public function getMTime() {
283
+        return null;
284
+    }
285
+
286
+    /**
287
+     * @param bool $includeMounts
288
+     * @return int
289
+     */
290
+    public function getSize($includeMounts = true) {
291
+        return null;
292
+    }
293
+
294
+    /**
295
+     * @return string
296
+     */
297
+    public function getEtag() {
298
+        return null;
299
+    }
300
+
301
+    /**
302
+     * @return int
303
+     */
304
+    public function getPermissions() {
305
+        return \OCP\Constants::PERMISSION_CREATE;
306
+    }
307
+
308
+    /**
309
+     * @return bool
310
+     */
311
+    public function isReadable() {
312
+        return false;
313
+    }
314
+
315
+    /**
316
+     * @return bool
317
+     */
318
+    public function isUpdateable() {
319
+        return false;
320
+    }
321
+
322
+    /**
323
+     * @return bool
324
+     */
325
+    public function isDeletable() {
326
+        return false;
327
+    }
328
+
329
+    /**
330
+     * @return bool
331
+     */
332
+    public function isShareable() {
333
+        return false;
334
+    }
335
+
336
+    /**
337
+     * @return Node
338
+     * @throws \OCP\Files\NotFoundException
339
+     */
340
+    public function getParent() {
341
+        throw new NotFoundException();
342
+    }
343
+
344
+    /**
345
+     * @return string
346
+     */
347
+    public function getName() {
348
+        return '';
349
+    }
350
+
351
+    /**
352
+     * Returns a view to user's files folder
353
+     *
354
+     * @param string $userId user ID
355
+     * @return \OCP\Files\Folder
356
+     * @throws NoUserException
357
+     * @throws NotPermittedException
358
+     */
359
+    public function getUserFolder($userId) {
360
+        $userObject = $this->userManager->get($userId);
361
+
362
+        if (is_null($userObject)) {
363
+            $this->logger->error(
364
+                sprintf(
365
+                    'Backends provided no user object for %s',
366
+                    $userId
367
+                ),
368
+                [
369
+                    'app' => 'files',
370
+                ]
371
+            );
372
+            throw new NoUserException('Backends provided no user object');
373
+        }
374
+
375
+        $userId = $userObject->getUID();
376
+
377
+        if (!$this->userFolderCache->hasKey($userId)) {
378
+            \OC\Files\Filesystem::initMountPoints($userId);
379
+
380
+            try {
381
+                $folder = $this->get('/' . $userId . '/files');
382
+            } catch (NotFoundException $e) {
383
+                if (!$this->nodeExists('/' . $userId)) {
384
+                    $this->newFolder('/' . $userId);
385
+                }
386
+                $folder = $this->newFolder('/' . $userId . '/files');
387
+            }
388
+
389
+            $this->userFolderCache->set($userId, $folder);
390
+        }
391
+
392
+        return $this->userFolderCache->get($userId);
393
+    }
394
+
395
+    public function clearCache() {
396
+        $this->userFolderCache = new CappedMemoryCache();
397
+    }
398
+
399
+    public function getUserMountCache() {
400
+        return $this->userMountCache;
401
+    }
402 402
 }
Please login to merge, or discard this patch.
lib/private/Files/Mount/ObjectHomeMountProvider.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -64,7 +64,7 @@
 block discarded – undo
64 64
 			return null;
65 65
 		}
66 66
 
67
-		return new MountPoint('\OC\Files\ObjectStore\HomeObjectStoreStorage', '/' . $user->getUID(), $config['arguments'], $loader);
67
+		return new MountPoint('\OC\Files\ObjectStore\HomeObjectStoreStorage', '/'.$user->getUID(), $config['arguments'], $loader);
68 68
 	}
69 69
 
70 70
 	/**
Please login to merge, or discard this patch.
Indentation   +96 added lines, -96 removed lines patch added patch discarded remove patch
@@ -35,107 +35,107 @@
 block discarded – undo
35 35
  * Mount provider for object store home storages
36 36
  */
37 37
 class ObjectHomeMountProvider implements IHomeMountProvider {
38
-	/**
39
-	 * @var IConfig
40
-	 */
41
-	private $config;
42
-
43
-	/**
44
-	 * ObjectStoreHomeMountProvider constructor.
45
-	 *
46
-	 * @param IConfig $config
47
-	 */
48
-	public function __construct(IConfig $config) {
49
-		$this->config = $config;
50
-	}
51
-
52
-	/**
53
-	 * Get the cache mount for a user
54
-	 *
55
-	 * @param IUser $user
56
-	 * @param IStorageFactory $loader
57
-	 * @return \OCP\Files\Mount\IMountPoint
58
-	 */
59
-	public function getHomeMountForUser(IUser $user, IStorageFactory $loader) {
60
-		$config = $this->getMultiBucketObjectStoreConfig($user);
61
-		if ($config === null) {
62
-			$config = $this->getSingleBucketObjectStoreConfig($user);
63
-		}
64
-
65
-		if ($config === null) {
66
-			return null;
67
-		}
68
-
69
-		return new MountPoint('\OC\Files\ObjectStore\HomeObjectStoreStorage', '/' . $user->getUID(), $config['arguments'], $loader);
70
-	}
71
-
72
-	/**
73
-	 * @param IUser $user
74
-	 * @return array|null
75
-	 */
76
-	private function getSingleBucketObjectStoreConfig(IUser $user) {
77
-		$config = $this->config->getSystemValue('objectstore');
78
-		if (!is_array($config)) {
79
-			return null;
80
-		}
81
-
82
-		// sanity checks
83
-		if (empty($config['class'])) {
84
-			\OCP\Util::writeLog('files', 'No class given for objectstore', ILogger::ERROR);
85
-		}
86
-		if (!isset($config['arguments'])) {
87
-			$config['arguments'] = [];
88
-		}
89
-		// instantiate object store implementation
90
-		$config['arguments']['objectstore'] = new $config['class']($config['arguments']);
91
-
92
-		$config['arguments']['user'] = $user;
93
-
94
-		return $config;
95
-	}
96
-
97
-	/**
98
-	 * @param IUser $user
99
-	 * @return array|null
100
-	 */
101
-	private function getMultiBucketObjectStoreConfig(IUser $user) {
102
-		$config = $this->config->getSystemValue('objectstore_multibucket');
103
-		if (!is_array($config)) {
104
-			return null;
105
-		}
106
-
107
-		// sanity checks
108
-		if (empty($config['class'])) {
109
-			\OCP\Util::writeLog('files', 'No class given for objectstore', ILogger::ERROR);
110
-		}
111
-		if (!isset($config['arguments'])) {
112
-			$config['arguments'] = [];
113
-		}
114
-
115
-		$bucket = $this->config->getUserValue($user->getUID(), 'homeobjectstore', 'bucket', null);
116
-
117
-		if ($bucket === null) {
118
-			/*
38
+    /**
39
+     * @var IConfig
40
+     */
41
+    private $config;
42
+
43
+    /**
44
+     * ObjectStoreHomeMountProvider constructor.
45
+     *
46
+     * @param IConfig $config
47
+     */
48
+    public function __construct(IConfig $config) {
49
+        $this->config = $config;
50
+    }
51
+
52
+    /**
53
+     * Get the cache mount for a user
54
+     *
55
+     * @param IUser $user
56
+     * @param IStorageFactory $loader
57
+     * @return \OCP\Files\Mount\IMountPoint
58
+     */
59
+    public function getHomeMountForUser(IUser $user, IStorageFactory $loader) {
60
+        $config = $this->getMultiBucketObjectStoreConfig($user);
61
+        if ($config === null) {
62
+            $config = $this->getSingleBucketObjectStoreConfig($user);
63
+        }
64
+
65
+        if ($config === null) {
66
+            return null;
67
+        }
68
+
69
+        return new MountPoint('\OC\Files\ObjectStore\HomeObjectStoreStorage', '/' . $user->getUID(), $config['arguments'], $loader);
70
+    }
71
+
72
+    /**
73
+     * @param IUser $user
74
+     * @return array|null
75
+     */
76
+    private function getSingleBucketObjectStoreConfig(IUser $user) {
77
+        $config = $this->config->getSystemValue('objectstore');
78
+        if (!is_array($config)) {
79
+            return null;
80
+        }
81
+
82
+        // sanity checks
83
+        if (empty($config['class'])) {
84
+            \OCP\Util::writeLog('files', 'No class given for objectstore', ILogger::ERROR);
85
+        }
86
+        if (!isset($config['arguments'])) {
87
+            $config['arguments'] = [];
88
+        }
89
+        // instantiate object store implementation
90
+        $config['arguments']['objectstore'] = new $config['class']($config['arguments']);
91
+
92
+        $config['arguments']['user'] = $user;
93
+
94
+        return $config;
95
+    }
96
+
97
+    /**
98
+     * @param IUser $user
99
+     * @return array|null
100
+     */
101
+    private function getMultiBucketObjectStoreConfig(IUser $user) {
102
+        $config = $this->config->getSystemValue('objectstore_multibucket');
103
+        if (!is_array($config)) {
104
+            return null;
105
+        }
106
+
107
+        // sanity checks
108
+        if (empty($config['class'])) {
109
+            \OCP\Util::writeLog('files', 'No class given for objectstore', ILogger::ERROR);
110
+        }
111
+        if (!isset($config['arguments'])) {
112
+            $config['arguments'] = [];
113
+        }
114
+
115
+        $bucket = $this->config->getUserValue($user->getUID(), 'homeobjectstore', 'bucket', null);
116
+
117
+        if ($bucket === null) {
118
+            /*
119 119
 			 * Use any provided bucket argument as prefix
120 120
 			 * and add the mapping from username => bucket
121 121
 			 */
122
-			if (!isset($config['arguments']['bucket'])) {
123
-				$config['arguments']['bucket'] = '';
124
-			}
125
-			$mapper = new \OC\Files\ObjectStore\Mapper($user);
126
-			$numBuckets = isset($config['arguments']['num_buckets']) ? $config['arguments']['num_buckets'] : 64;
127
-			$config['arguments']['bucket'] .= $mapper->getBucket($numBuckets);
122
+            if (!isset($config['arguments']['bucket'])) {
123
+                $config['arguments']['bucket'] = '';
124
+            }
125
+            $mapper = new \OC\Files\ObjectStore\Mapper($user);
126
+            $numBuckets = isset($config['arguments']['num_buckets']) ? $config['arguments']['num_buckets'] : 64;
127
+            $config['arguments']['bucket'] .= $mapper->getBucket($numBuckets);
128 128
 
129
-			$this->config->setUserValue($user->getUID(), 'homeobjectstore', 'bucket', $config['arguments']['bucket']);
130
-		} else {
131
-			$config['arguments']['bucket'] = $bucket;
132
-		}
129
+            $this->config->setUserValue($user->getUID(), 'homeobjectstore', 'bucket', $config['arguments']['bucket']);
130
+        } else {
131
+            $config['arguments']['bucket'] = $bucket;
132
+        }
133 133
 
134
-		// instantiate object store implementation
135
-		$config['arguments']['objectstore'] = new $config['class']($config['arguments']);
134
+        // instantiate object store implementation
135
+        $config['arguments']['objectstore'] = new $config['class']($config['arguments']);
136 136
 
137
-		$config['arguments']['user'] = $user;
137
+        $config['arguments']['user'] = $user;
138 138
 
139
-		return $config;
140
-	}
139
+        return $config;
140
+    }
141 141
 }
Please login to merge, or discard this patch.
lib/private/Files/Mount/LocalHomeMountProvider.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -39,6 +39,6 @@
 block discarded – undo
39 39
 	 */
40 40
 	public function getHomeMountForUser(IUser $user, IStorageFactory $loader) {
41 41
 		$arguments = ['user' => $user];
42
-		return new MountPoint('\OC\Files\Storage\Home', '/' . $user->getUID(), $arguments, $loader);
42
+		return new MountPoint('\OC\Files\Storage\Home', '/'.$user->getUID(), $arguments, $loader);
43 43
 	}
44 44
 }
Please login to merge, or discard this patch.
Indentation   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -30,15 +30,15 @@
 block discarded – undo
30 30
  * Mount provider for regular posix home folders
31 31
  */
32 32
 class LocalHomeMountProvider implements IHomeMountProvider {
33
-	/**
34
-	 * Get the cache mount for a user
35
-	 *
36
-	 * @param IUser $user
37
-	 * @param IStorageFactory $loader
38
-	 * @return \OCP\Files\Mount\IMountPoint|null
39
-	 */
40
-	public function getHomeMountForUser(IUser $user, IStorageFactory $loader) {
41
-		$arguments = ['user' => $user];
42
-		return new MountPoint('\OC\Files\Storage\Home', '/' . $user->getUID(), $arguments, $loader);
43
-	}
33
+    /**
34
+     * Get the cache mount for a user
35
+     *
36
+     * @param IUser $user
37
+     * @param IStorageFactory $loader
38
+     * @return \OCP\Files\Mount\IMountPoint|null
39
+     */
40
+    public function getHomeMountForUser(IUser $user, IStorageFactory $loader) {
41
+        $arguments = ['user' => $user];
42
+        return new MountPoint('\OC\Files\Storage\Home', '/' . $user->getUID(), $arguments, $loader);
43
+    }
44 44
 }
Please login to merge, or discard this patch.
lib/private/Files/Mount/MoveableMount.php 1 patch
Indentation   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -27,19 +27,19 @@
 block discarded – undo
27 27
  * Defines the mount point to be (re)moved by the user
28 28
  */
29 29
 interface MoveableMount {
30
-	/**
31
-	 * Move the mount point to $target
32
-	 *
33
-	 * @param string $target the target mount point
34
-	 * @return bool
35
-	 */
36
-	public function moveMount($target);
30
+    /**
31
+     * Move the mount point to $target
32
+     *
33
+     * @param string $target the target mount point
34
+     * @return bool
35
+     */
36
+    public function moveMount($target);
37 37
 
38
-	/**
39
-	 * Remove the mount points
40
-	 *
41
-	 * @return mixed
42
-	 * @return bool
43
-	 */
44
-	public function removeMount();
38
+    /**
39
+     * Remove the mount points
40
+     *
41
+     * @return mixed
42
+     * @return bool
43
+     */
44
+    public function removeMount();
45 45
 }
Please login to merge, or discard this patch.
lib/private/Files/Config/LazyStorageMountInfo.php 1 patch
Indentation   +50 added lines, -50 removed lines patch added patch discarded remove patch
@@ -29,60 +29,60 @@
 block discarded – undo
29 29
 use OCP\IUser;
30 30
 
31 31
 class LazyStorageMountInfo extends CachedMountInfo {
32
-	/** @var IMountPoint */
33
-	private $mount;
32
+    /** @var IMountPoint */
33
+    private $mount;
34 34
 
35
-	/**
36
-	 * CachedMountInfo constructor.
37
-	 *
38
-	 * @param IUser $user
39
-	 * @param IMountPoint $mount
40
-	 */
41
-	public function __construct(IUser $user, IMountPoint $mount) {
42
-		$this->user = $user;
43
-		$this->mount = $mount;
44
-	}
35
+    /**
36
+     * CachedMountInfo constructor.
37
+     *
38
+     * @param IUser $user
39
+     * @param IMountPoint $mount
40
+     */
41
+    public function __construct(IUser $user, IMountPoint $mount) {
42
+        $this->user = $user;
43
+        $this->mount = $mount;
44
+    }
45 45
 
46
-	/**
47
-	 * @return int the numeric storage id of the mount
48
-	 */
49
-	public function getStorageId() {
50
-		if (!$this->storageId) {
51
-			$this->storageId = $this->mount->getNumericStorageId();
52
-		}
53
-		return parent::getStorageId();
54
-	}
46
+    /**
47
+     * @return int the numeric storage id of the mount
48
+     */
49
+    public function getStorageId() {
50
+        if (!$this->storageId) {
51
+            $this->storageId = $this->mount->getNumericStorageId();
52
+        }
53
+        return parent::getStorageId();
54
+    }
55 55
 
56
-	/**
57
-	 * @return int the fileid of the root of the mount
58
-	 */
59
-	public function getRootId() {
60
-		if (!$this->rootId) {
61
-			$this->rootId = $this->mount->getStorageRootId();
62
-		}
63
-		return parent::getRootId();
64
-	}
56
+    /**
57
+     * @return int the fileid of the root of the mount
58
+     */
59
+    public function getRootId() {
60
+        if (!$this->rootId) {
61
+            $this->rootId = $this->mount->getStorageRootId();
62
+        }
63
+        return parent::getRootId();
64
+    }
65 65
 
66
-	/**
67
-	 * @return string the mount point of the mount for the user
68
-	 */
69
-	public function getMountPoint() {
70
-		if (!$this->mountPoint) {
71
-			$this->mountPoint = $this->mount->getMountPoint();
72
-		}
73
-		return parent::getMountPoint();
74
-	}
66
+    /**
67
+     * @return string the mount point of the mount for the user
68
+     */
69
+    public function getMountPoint() {
70
+        if (!$this->mountPoint) {
71
+            $this->mountPoint = $this->mount->getMountPoint();
72
+        }
73
+        return parent::getMountPoint();
74
+    }
75 75
 
76
-	public function getMountId() {
77
-		return $this->mount->getMountId();
78
-	}
76
+    public function getMountId() {
77
+        return $this->mount->getMountId();
78
+    }
79 79
 
80
-	/**
81
-	 * Get the internal path (within the storage) of the root of the mount
82
-	 *
83
-	 * @return string
84
-	 */
85
-	public function getRootInternalPath() {
86
-		return $this->mount->getInternalPath($this->mount->getMountPoint());
87
-	}
80
+    /**
81
+     * Get the internal path (within the storage) of the root of the mount
82
+     *
83
+     * @return string
84
+     */
85
+    public function getRootInternalPath() {
86
+        return $this->mount->getInternalPath($this->mount->getMountPoint());
87
+    }
88 88
 }
Please login to merge, or discard this patch.
lib/private/Files/Config/UserMountCacheListener.php 1 patch
Indentation   +15 added lines, -15 removed lines patch added patch discarded remove patch
@@ -29,21 +29,21 @@
 block discarded – undo
29 29
  * Listen to hooks and update the mount cache as needed
30 30
  */
31 31
 class UserMountCacheListener {
32
-	/**
33
-	 * @var IUserMountCache
34
-	 */
35
-	private $userMountCache;
32
+    /**
33
+     * @var IUserMountCache
34
+     */
35
+    private $userMountCache;
36 36
 
37
-	/**
38
-	 * UserMountCacheListener constructor.
39
-	 *
40
-	 * @param IUserMountCache $userMountCache
41
-	 */
42
-	public function __construct(IUserMountCache $userMountCache) {
43
-		$this->userMountCache = $userMountCache;
44
-	}
37
+    /**
38
+     * UserMountCacheListener constructor.
39
+     *
40
+     * @param IUserMountCache $userMountCache
41
+     */
42
+    public function __construct(IUserMountCache $userMountCache) {
43
+        $this->userMountCache = $userMountCache;
44
+    }
45 45
 
46
-	public function listen(Manager $manager) {
47
-		$manager->listen('\OC\User', 'postDelete', [$this->userMountCache, 'removeUserMounts']);
48
-	}
46
+    public function listen(Manager $manager) {
47
+        $manager->listen('\OC\User', 'postDelete', [$this->userMountCache, 'removeUserMounts']);
48
+    }
49 49
 }
Please login to merge, or discard this patch.
lib/private/Files/Config/CachedMountInfo.php 1 patch
Indentation   +110 added lines, -110 removed lines patch added patch discarded remove patch
@@ -28,114 +28,114 @@
 block discarded – undo
28 28
 use OCP\IUser;
29 29
 
30 30
 class CachedMountInfo implements ICachedMountInfo {
31
-	/**
32
-	 * @var IUser
33
-	 */
34
-	protected $user;
35
-
36
-	/**
37
-	 * @var int
38
-	 */
39
-	protected $storageId;
40
-
41
-	/**
42
-	 * @var int
43
-	 */
44
-	protected $rootId;
45
-
46
-	/**
47
-	 * @var string
48
-	 */
49
-	protected $mountPoint;
50
-
51
-	/**
52
-	 * @var int|null
53
-	 */
54
-	protected $mountId;
55
-
56
-	/**
57
-	 * @var string
58
-	 */
59
-	protected $rootInternalPath;
60
-
61
-	/**
62
-	 * CachedMountInfo constructor.
63
-	 *
64
-	 * @param IUser $user
65
-	 * @param int $storageId
66
-	 * @param int $rootId
67
-	 * @param string $mountPoint
68
-	 * @param int|null $mountId
69
-	 * @param string $rootInternalPath
70
-	 */
71
-	public function __construct(IUser $user, $storageId, $rootId, $mountPoint, $mountId = null, $rootInternalPath = '') {
72
-		$this->user = $user;
73
-		$this->storageId = $storageId;
74
-		$this->rootId = $rootId;
75
-		$this->mountPoint = $mountPoint;
76
-		$this->mountId = $mountId;
77
-		$this->rootInternalPath = $rootInternalPath;
78
-	}
79
-
80
-	/**
81
-	 * @return IUser
82
-	 */
83
-	public function getUser() {
84
-		return $this->user;
85
-	}
86
-
87
-	/**
88
-	 * @return int the numeric storage id of the mount
89
-	 */
90
-	public function getStorageId() {
91
-		return $this->storageId;
92
-	}
93
-
94
-	/**
95
-	 * @return int the fileid of the root of the mount
96
-	 */
97
-	public function getRootId() {
98
-		return $this->rootId;
99
-	}
100
-
101
-	/**
102
-	 * @return Node the root node of the mount
103
-	 */
104
-	public function getMountPointNode() {
105
-		// TODO injection etc
106
-		Filesystem::initMountPoints($this->getUser()->getUID());
107
-		$userNode = \OC::$server->getUserFolder($this->getUser()->getUID());
108
-		$nodes = $userNode->getParent()->getById($this->getRootId());
109
-		if (count($nodes) > 0) {
110
-			return $nodes[0];
111
-		} else {
112
-			return null;
113
-		}
114
-	}
115
-
116
-	/**
117
-	 * @return string the mount point of the mount for the user
118
-	 */
119
-	public function getMountPoint() {
120
-		return $this->mountPoint;
121
-	}
122
-
123
-	/**
124
-	 * Get the id of the configured mount
125
-	 *
126
-	 * @return int|null mount id or null if not applicable
127
-	 * @since 9.1.0
128
-	 */
129
-	public function getMountId() {
130
-		return $this->mountId;
131
-	}
132
-
133
-	/**
134
-	 * Get the internal path (within the storage) of the root of the mount
135
-	 *
136
-	 * @return string
137
-	 */
138
-	public function getRootInternalPath() {
139
-		return $this->rootInternalPath;
140
-	}
31
+    /**
32
+     * @var IUser
33
+     */
34
+    protected $user;
35
+
36
+    /**
37
+     * @var int
38
+     */
39
+    protected $storageId;
40
+
41
+    /**
42
+     * @var int
43
+     */
44
+    protected $rootId;
45
+
46
+    /**
47
+     * @var string
48
+     */
49
+    protected $mountPoint;
50
+
51
+    /**
52
+     * @var int|null
53
+     */
54
+    protected $mountId;
55
+
56
+    /**
57
+     * @var string
58
+     */
59
+    protected $rootInternalPath;
60
+
61
+    /**
62
+     * CachedMountInfo constructor.
63
+     *
64
+     * @param IUser $user
65
+     * @param int $storageId
66
+     * @param int $rootId
67
+     * @param string $mountPoint
68
+     * @param int|null $mountId
69
+     * @param string $rootInternalPath
70
+     */
71
+    public function __construct(IUser $user, $storageId, $rootId, $mountPoint, $mountId = null, $rootInternalPath = '') {
72
+        $this->user = $user;
73
+        $this->storageId = $storageId;
74
+        $this->rootId = $rootId;
75
+        $this->mountPoint = $mountPoint;
76
+        $this->mountId = $mountId;
77
+        $this->rootInternalPath = $rootInternalPath;
78
+    }
79
+
80
+    /**
81
+     * @return IUser
82
+     */
83
+    public function getUser() {
84
+        return $this->user;
85
+    }
86
+
87
+    /**
88
+     * @return int the numeric storage id of the mount
89
+     */
90
+    public function getStorageId() {
91
+        return $this->storageId;
92
+    }
93
+
94
+    /**
95
+     * @return int the fileid of the root of the mount
96
+     */
97
+    public function getRootId() {
98
+        return $this->rootId;
99
+    }
100
+
101
+    /**
102
+     * @return Node the root node of the mount
103
+     */
104
+    public function getMountPointNode() {
105
+        // TODO injection etc
106
+        Filesystem::initMountPoints($this->getUser()->getUID());
107
+        $userNode = \OC::$server->getUserFolder($this->getUser()->getUID());
108
+        $nodes = $userNode->getParent()->getById($this->getRootId());
109
+        if (count($nodes) > 0) {
110
+            return $nodes[0];
111
+        } else {
112
+            return null;
113
+        }
114
+    }
115
+
116
+    /**
117
+     * @return string the mount point of the mount for the user
118
+     */
119
+    public function getMountPoint() {
120
+        return $this->mountPoint;
121
+    }
122
+
123
+    /**
124
+     * Get the id of the configured mount
125
+     *
126
+     * @return int|null mount id or null if not applicable
127
+     * @since 9.1.0
128
+     */
129
+    public function getMountId() {
130
+        return $this->mountId;
131
+    }
132
+
133
+    /**
134
+     * Get the internal path (within the storage) of the root of the mount
135
+     *
136
+     * @return string
137
+     */
138
+    public function getRootInternalPath() {
139
+        return $this->rootInternalPath;
140
+    }
141 141
 }
Please login to merge, or discard this patch.
lib/private/Files/ObjectStore/Mapper.php 2 patches
Indentation   +19 added lines, -19 removed lines patch added patch discarded remove patch
@@ -31,25 +31,25 @@
 block discarded – undo
31 31
  * Map a user to a bucket.
32 32
  */
33 33
 class Mapper {
34
-	/** @var IUser */
35
-	private $user;
34
+    /** @var IUser */
35
+    private $user;
36 36
 
37
-	/**
38
-	 * Mapper constructor.
39
-	 *
40
-	 * @param IUser $user
41
-	 */
42
-	public function __construct(IUser $user) {
43
-		$this->user = $user;
44
-	}
37
+    /**
38
+     * Mapper constructor.
39
+     *
40
+     * @param IUser $user
41
+     */
42
+    public function __construct(IUser $user) {
43
+        $this->user = $user;
44
+    }
45 45
 
46
-	/**
47
-	 * @param int $numBuckets
48
-	 * @return string
49
-	 */
50
-	public function getBucket($numBuckets = 64) {
51
-		$hash = md5($this->user->getUID());
52
-		$num = hexdec(substr($hash, 0, 4));
53
-		return (string)($num % $numBuckets);
54
-	}
46
+    /**
47
+     * @param int $numBuckets
48
+     * @return string
49
+     */
50
+    public function getBucket($numBuckets = 64) {
51
+        $hash = md5($this->user->getUID());
52
+        $num = hexdec(substr($hash, 0, 4));
53
+        return (string)($num % $numBuckets);
54
+    }
55 55
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -50,6 +50,6 @@
 block discarded – undo
50 50
 	public function getBucket($numBuckets = 64) {
51 51
 		$hash = md5($this->user->getUID());
52 52
 		$num = hexdec(substr($hash, 0, 4));
53
-		return (string)($num % $numBuckets);
53
+		return (string) ($num % $numBuckets);
54 54
 	}
55 55
 }
Please login to merge, or discard this patch.
lib/private/Files/Storage/Wrapper/Encoding.php 2 patches
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -80,7 +80,7 @@  discard block
 block discarded – undo
80 80
 				// no point in continuing if the section was not found, use original path
81 81
 				return $fullPath;
82 82
 			}
83
-			$path = $convertedPath . '/';
83
+			$path = $convertedPath.'/';
84 84
 		}
85 85
 		$path = rtrim($path, '/');
86 86
 		return $path;
@@ -96,7 +96,7 @@  discard block
 block discarded – undo
96 96
 	 * @return string|null original or converted path, or null if none of the forms was found
97 97
 	 */
98 98
 	private function findPathToUseLastSection($basePath, $lastSection) {
99
-		$fullPath = $basePath . $lastSection;
99
+		$fullPath = $basePath.$lastSection;
100 100
 		if ($lastSection === '' || $this->isAscii($lastSection) || $this->storage->file_exists($fullPath)) {
101 101
 			$this->namesCache[$fullPath] = $fullPath;
102 102
 			return $fullPath;
@@ -108,7 +108,7 @@  discard block
 block discarded – undo
108 108
 		} else {
109 109
 			$otherFormPath = \Normalizer::normalize($lastSection, \Normalizer::FORM_C);
110 110
 		}
111
-		$otherFullPath = $basePath . $otherFormPath;
111
+		$otherFullPath = $basePath.$otherFormPath;
112 112
 		if ($this->storage->file_exists($otherFullPath)) {
113 113
 			$this->namesCache[$fullPath] = $otherFullPath;
114 114
 			return $otherFullPath;
Please login to merge, or discard this patch.
Indentation   +502 added lines, -502 removed lines patch added patch discarded remove patch
@@ -36,506 +36,506 @@
 block discarded – undo
36 36
  */
37 37
 class Encoding extends Wrapper {
38 38
 
39
-	/**
40
-	 * @var ICache
41
-	 */
42
-	private $namesCache;
43
-
44
-	/**
45
-	 * @param array $parameters
46
-	 */
47
-	public function __construct($parameters) {
48
-		$this->storage = $parameters['storage'];
49
-		$this->namesCache = new CappedMemoryCache();
50
-	}
51
-
52
-	/**
53
-	 * Returns whether the given string is only made of ASCII characters
54
-	 *
55
-	 * @param string $str string
56
-	 *
57
-	 * @return bool true if the string is all ASCII, false otherwise
58
-	 */
59
-	private function isAscii($str) {
60
-		return (bool) !preg_match('/[\\x80-\\xff]+/', $str);
61
-	}
62
-
63
-	/**
64
-	 * Checks whether the given path exists in NFC or NFD form after checking
65
-	 * each form for each path section and returns the correct form.
66
-	 * If no existing path found, returns the path as it was given.
67
-	 *
68
-	 * @param string $fullPath path to check
69
-	 *
70
-	 * @return string original or converted path
71
-	 */
72
-	private function findPathToUse($fullPath) {
73
-		$cachedPath = $this->namesCache[$fullPath];
74
-		if ($cachedPath !== null) {
75
-			return $cachedPath;
76
-		}
77
-
78
-		$sections = explode('/', $fullPath);
79
-		$path = '';
80
-		foreach ($sections as $section) {
81
-			$convertedPath = $this->findPathToUseLastSection($path, $section);
82
-			if ($convertedPath === null) {
83
-				// no point in continuing if the section was not found, use original path
84
-				return $fullPath;
85
-			}
86
-			$path = $convertedPath . '/';
87
-		}
88
-		$path = rtrim($path, '/');
89
-		return $path;
90
-	}
91
-
92
-	/**
93
-	 * Checks whether the last path section of the given path exists in NFC or NFD form
94
-	 * and returns the correct form. If no existing path found, returns null.
95
-	 *
96
-	 * @param string $basePath base path to check
97
-	 * @param string $lastSection last section of the path to check for NFD/NFC variations
98
-	 *
99
-	 * @return string|null original or converted path, or null if none of the forms was found
100
-	 */
101
-	private function findPathToUseLastSection($basePath, $lastSection) {
102
-		$fullPath = $basePath . $lastSection;
103
-		if ($lastSection === '' || $this->isAscii($lastSection) || $this->storage->file_exists($fullPath)) {
104
-			$this->namesCache[$fullPath] = $fullPath;
105
-			return $fullPath;
106
-		}
107
-
108
-		// swap encoding
109
-		if (\Normalizer::isNormalized($lastSection, \Normalizer::FORM_C)) {
110
-			$otherFormPath = \Normalizer::normalize($lastSection, \Normalizer::FORM_D);
111
-		} else {
112
-			$otherFormPath = \Normalizer::normalize($lastSection, \Normalizer::FORM_C);
113
-		}
114
-		$otherFullPath = $basePath . $otherFormPath;
115
-		if ($this->storage->file_exists($otherFullPath)) {
116
-			$this->namesCache[$fullPath] = $otherFullPath;
117
-			return $otherFullPath;
118
-		}
119
-
120
-		// return original path, file did not exist at all
121
-		$this->namesCache[$fullPath] = $fullPath;
122
-		return null;
123
-	}
124
-
125
-	/**
126
-	 * see http://php.net/manual/en/function.mkdir.php
127
-	 *
128
-	 * @param string $path
129
-	 * @return bool
130
-	 */
131
-	public function mkdir($path) {
132
-		// note: no conversion here, method should not be called with non-NFC names!
133
-		$result = $this->storage->mkdir($path);
134
-		if ($result) {
135
-			$this->namesCache[$path] = $path;
136
-		}
137
-		return $result;
138
-	}
139
-
140
-	/**
141
-	 * see http://php.net/manual/en/function.rmdir.php
142
-	 *
143
-	 * @param string $path
144
-	 * @return bool
145
-	 */
146
-	public function rmdir($path) {
147
-		$result = $this->storage->rmdir($this->findPathToUse($path));
148
-		if ($result) {
149
-			unset($this->namesCache[$path]);
150
-		}
151
-		return $result;
152
-	}
153
-
154
-	/**
155
-	 * see http://php.net/manual/en/function.opendir.php
156
-	 *
157
-	 * @param string $path
158
-	 * @return resource
159
-	 */
160
-	public function opendir($path) {
161
-		return $this->storage->opendir($this->findPathToUse($path));
162
-	}
163
-
164
-	/**
165
-	 * see http://php.net/manual/en/function.is_dir.php
166
-	 *
167
-	 * @param string $path
168
-	 * @return bool
169
-	 */
170
-	public function is_dir($path) {
171
-		return $this->storage->is_dir($this->findPathToUse($path));
172
-	}
173
-
174
-	/**
175
-	 * see http://php.net/manual/en/function.is_file.php
176
-	 *
177
-	 * @param string $path
178
-	 * @return bool
179
-	 */
180
-	public function is_file($path) {
181
-		return $this->storage->is_file($this->findPathToUse($path));
182
-	}
183
-
184
-	/**
185
-	 * see http://php.net/manual/en/function.stat.php
186
-	 * only the following keys are required in the result: size and mtime
187
-	 *
188
-	 * @param string $path
189
-	 * @return array
190
-	 */
191
-	public function stat($path) {
192
-		return $this->storage->stat($this->findPathToUse($path));
193
-	}
194
-
195
-	/**
196
-	 * see http://php.net/manual/en/function.filetype.php
197
-	 *
198
-	 * @param string $path
199
-	 * @return bool
200
-	 */
201
-	public function filetype($path) {
202
-		return $this->storage->filetype($this->findPathToUse($path));
203
-	}
204
-
205
-	/**
206
-	 * see http://php.net/manual/en/function.filesize.php
207
-	 * The result for filesize when called on a folder is required to be 0
208
-	 *
209
-	 * @param string $path
210
-	 * @return int
211
-	 */
212
-	public function filesize($path) {
213
-		return $this->storage->filesize($this->findPathToUse($path));
214
-	}
215
-
216
-	/**
217
-	 * check if a file can be created in $path
218
-	 *
219
-	 * @param string $path
220
-	 * @return bool
221
-	 */
222
-	public function isCreatable($path) {
223
-		return $this->storage->isCreatable($this->findPathToUse($path));
224
-	}
225
-
226
-	/**
227
-	 * check if a file can be read
228
-	 *
229
-	 * @param string $path
230
-	 * @return bool
231
-	 */
232
-	public function isReadable($path) {
233
-		return $this->storage->isReadable($this->findPathToUse($path));
234
-	}
235
-
236
-	/**
237
-	 * check if a file can be written to
238
-	 *
239
-	 * @param string $path
240
-	 * @return bool
241
-	 */
242
-	public function isUpdatable($path) {
243
-		return $this->storage->isUpdatable($this->findPathToUse($path));
244
-	}
245
-
246
-	/**
247
-	 * check if a file can be deleted
248
-	 *
249
-	 * @param string $path
250
-	 * @return bool
251
-	 */
252
-	public function isDeletable($path) {
253
-		return $this->storage->isDeletable($this->findPathToUse($path));
254
-	}
255
-
256
-	/**
257
-	 * check if a file can be shared
258
-	 *
259
-	 * @param string $path
260
-	 * @return bool
261
-	 */
262
-	public function isSharable($path) {
263
-		return $this->storage->isSharable($this->findPathToUse($path));
264
-	}
265
-
266
-	/**
267
-	 * get the full permissions of a path.
268
-	 * Should return a combination of the PERMISSION_ constants defined in lib/public/constants.php
269
-	 *
270
-	 * @param string $path
271
-	 * @return int
272
-	 */
273
-	public function getPermissions($path) {
274
-		return $this->storage->getPermissions($this->findPathToUse($path));
275
-	}
276
-
277
-	/**
278
-	 * see http://php.net/manual/en/function.file_exists.php
279
-	 *
280
-	 * @param string $path
281
-	 * @return bool
282
-	 */
283
-	public function file_exists($path) {
284
-		return $this->storage->file_exists($this->findPathToUse($path));
285
-	}
286
-
287
-	/**
288
-	 * see http://php.net/manual/en/function.filemtime.php
289
-	 *
290
-	 * @param string $path
291
-	 * @return int
292
-	 */
293
-	public function filemtime($path) {
294
-		return $this->storage->filemtime($this->findPathToUse($path));
295
-	}
296
-
297
-	/**
298
-	 * see http://php.net/manual/en/function.file_get_contents.php
299
-	 *
300
-	 * @param string $path
301
-	 * @return string
302
-	 */
303
-	public function file_get_contents($path) {
304
-		return $this->storage->file_get_contents($this->findPathToUse($path));
305
-	}
306
-
307
-	/**
308
-	 * see http://php.net/manual/en/function.file_put_contents.php
309
-	 *
310
-	 * @param string $path
311
-	 * @param string $data
312
-	 * @return bool
313
-	 */
314
-	public function file_put_contents($path, $data) {
315
-		return $this->storage->file_put_contents($this->findPathToUse($path), $data);
316
-	}
317
-
318
-	/**
319
-	 * see http://php.net/manual/en/function.unlink.php
320
-	 *
321
-	 * @param string $path
322
-	 * @return bool
323
-	 */
324
-	public function unlink($path) {
325
-		$result = $this->storage->unlink($this->findPathToUse($path));
326
-		if ($result) {
327
-			unset($this->namesCache[$path]);
328
-		}
329
-		return $result;
330
-	}
331
-
332
-	/**
333
-	 * see http://php.net/manual/en/function.rename.php
334
-	 *
335
-	 * @param string $path1
336
-	 * @param string $path2
337
-	 * @return bool
338
-	 */
339
-	public function rename($path1, $path2) {
340
-		// second name always NFC
341
-		return $this->storage->rename($this->findPathToUse($path1), $this->findPathToUse($path2));
342
-	}
343
-
344
-	/**
345
-	 * see http://php.net/manual/en/function.copy.php
346
-	 *
347
-	 * @param string $path1
348
-	 * @param string $path2
349
-	 * @return bool
350
-	 */
351
-	public function copy($path1, $path2) {
352
-		return $this->storage->copy($this->findPathToUse($path1), $this->findPathToUse($path2));
353
-	}
354
-
355
-	/**
356
-	 * see http://php.net/manual/en/function.fopen.php
357
-	 *
358
-	 * @param string $path
359
-	 * @param string $mode
360
-	 * @return resource
361
-	 */
362
-	public function fopen($path, $mode) {
363
-		$result = $this->storage->fopen($this->findPathToUse($path), $mode);
364
-		if ($result && $mode !== 'r' && $mode !== 'rb') {
365
-			unset($this->namesCache[$path]);
366
-		}
367
-		return $result;
368
-	}
369
-
370
-	/**
371
-	 * get the mimetype for a file or folder
372
-	 * The mimetype for a folder is required to be "httpd/unix-directory"
373
-	 *
374
-	 * @param string $path
375
-	 * @return string
376
-	 */
377
-	public function getMimeType($path) {
378
-		return $this->storage->getMimeType($this->findPathToUse($path));
379
-	}
380
-
381
-	/**
382
-	 * see http://php.net/manual/en/function.hash.php
383
-	 *
384
-	 * @param string $type
385
-	 * @param string $path
386
-	 * @param bool $raw
387
-	 * @return string
388
-	 */
389
-	public function hash($type, $path, $raw = false) {
390
-		return $this->storage->hash($type, $this->findPathToUse($path), $raw);
391
-	}
392
-
393
-	/**
394
-	 * see http://php.net/manual/en/function.free_space.php
395
-	 *
396
-	 * @param string $path
397
-	 * @return int
398
-	 */
399
-	public function free_space($path) {
400
-		return $this->storage->free_space($this->findPathToUse($path));
401
-	}
402
-
403
-	/**
404
-	 * search for occurrences of $query in file names
405
-	 *
406
-	 * @param string $query
407
-	 * @return array
408
-	 */
409
-	public function search($query) {
410
-		return $this->storage->search($query);
411
-	}
412
-
413
-	/**
414
-	 * see http://php.net/manual/en/function.touch.php
415
-	 * If the backend does not support the operation, false should be returned
416
-	 *
417
-	 * @param string $path
418
-	 * @param int $mtime
419
-	 * @return bool
420
-	 */
421
-	public function touch($path, $mtime = null) {
422
-		return $this->storage->touch($this->findPathToUse($path), $mtime);
423
-	}
424
-
425
-	/**
426
-	 * get the path to a local version of the file.
427
-	 * The local version of the file can be temporary and doesn't have to be persistent across requests
428
-	 *
429
-	 * @param string $path
430
-	 * @return string
431
-	 */
432
-	public function getLocalFile($path) {
433
-		return $this->storage->getLocalFile($this->findPathToUse($path));
434
-	}
435
-
436
-	/**
437
-	 * check if a file or folder has been updated since $time
438
-	 *
439
-	 * @param string $path
440
-	 * @param int $time
441
-	 * @return bool
442
-	 *
443
-	 * hasUpdated for folders should return at least true if a file inside the folder is add, removed or renamed.
444
-	 * returning true for other changes in the folder is optional
445
-	 */
446
-	public function hasUpdated($path, $time) {
447
-		return $this->storage->hasUpdated($this->findPathToUse($path), $time);
448
-	}
449
-
450
-	/**
451
-	 * get a cache instance for the storage
452
-	 *
453
-	 * @param string $path
454
-	 * @param \OC\Files\Storage\Storage (optional) the storage to pass to the cache
455
-	 * @return \OC\Files\Cache\Cache
456
-	 */
457
-	public function getCache($path = '', $storage = null) {
458
-		if (!$storage) {
459
-			$storage = $this;
460
-		}
461
-		return $this->storage->getCache($this->findPathToUse($path), $storage);
462
-	}
463
-
464
-	/**
465
-	 * get a scanner instance for the storage
466
-	 *
467
-	 * @param string $path
468
-	 * @param \OC\Files\Storage\Storage (optional) the storage to pass to the scanner
469
-	 * @return \OC\Files\Cache\Scanner
470
-	 */
471
-	public function getScanner($path = '', $storage = null) {
472
-		if (!$storage) {
473
-			$storage = $this;
474
-		}
475
-		return $this->storage->getScanner($this->findPathToUse($path), $storage);
476
-	}
477
-
478
-	/**
479
-	 * get the ETag for a file or folder
480
-	 *
481
-	 * @param string $path
482
-	 * @return string
483
-	 */
484
-	public function getETag($path) {
485
-		return $this->storage->getETag($this->findPathToUse($path));
486
-	}
487
-
488
-	/**
489
-	 * @param IStorage $sourceStorage
490
-	 * @param string $sourceInternalPath
491
-	 * @param string $targetInternalPath
492
-	 * @return bool
493
-	 */
494
-	public function copyFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
495
-		if ($sourceStorage === $this) {
496
-			return $this->copy($sourceInternalPath, $this->findPathToUse($targetInternalPath));
497
-		}
498
-
499
-		$result = $this->storage->copyFromStorage($sourceStorage, $sourceInternalPath, $this->findPathToUse($targetInternalPath));
500
-		if ($result) {
501
-			unset($this->namesCache[$targetInternalPath]);
502
-		}
503
-		return $result;
504
-	}
505
-
506
-	/**
507
-	 * @param IStorage $sourceStorage
508
-	 * @param string $sourceInternalPath
509
-	 * @param string $targetInternalPath
510
-	 * @return bool
511
-	 */
512
-	public function moveFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
513
-		if ($sourceStorage === $this) {
514
-			$result = $this->rename($sourceInternalPath, $this->findPathToUse($targetInternalPath));
515
-			if ($result) {
516
-				unset($this->namesCache[$sourceInternalPath]);
517
-				unset($this->namesCache[$targetInternalPath]);
518
-			}
519
-			return $result;
520
-		}
521
-
522
-		$result = $this->storage->moveFromStorage($sourceStorage, $sourceInternalPath, $this->findPathToUse($targetInternalPath));
523
-		if ($result) {
524
-			unset($this->namesCache[$sourceInternalPath]);
525
-			unset($this->namesCache[$targetInternalPath]);
526
-		}
527
-		return $result;
528
-	}
529
-
530
-	/**
531
-	 * @param string $path
532
-	 * @return array
533
-	 */
534
-	public function getMetaData($path) {
535
-		return $this->storage->getMetaData($this->findPathToUse($path));
536
-	}
537
-
538
-	public function getDirectoryContent($directory): \Traversable {
539
-		return $this->storage->getDirectoryContent($this->findPathToUse($directory));
540
-	}
39
+    /**
40
+     * @var ICache
41
+     */
42
+    private $namesCache;
43
+
44
+    /**
45
+     * @param array $parameters
46
+     */
47
+    public function __construct($parameters) {
48
+        $this->storage = $parameters['storage'];
49
+        $this->namesCache = new CappedMemoryCache();
50
+    }
51
+
52
+    /**
53
+     * Returns whether the given string is only made of ASCII characters
54
+     *
55
+     * @param string $str string
56
+     *
57
+     * @return bool true if the string is all ASCII, false otherwise
58
+     */
59
+    private function isAscii($str) {
60
+        return (bool) !preg_match('/[\\x80-\\xff]+/', $str);
61
+    }
62
+
63
+    /**
64
+     * Checks whether the given path exists in NFC or NFD form after checking
65
+     * each form for each path section and returns the correct form.
66
+     * If no existing path found, returns the path as it was given.
67
+     *
68
+     * @param string $fullPath path to check
69
+     *
70
+     * @return string original or converted path
71
+     */
72
+    private function findPathToUse($fullPath) {
73
+        $cachedPath = $this->namesCache[$fullPath];
74
+        if ($cachedPath !== null) {
75
+            return $cachedPath;
76
+        }
77
+
78
+        $sections = explode('/', $fullPath);
79
+        $path = '';
80
+        foreach ($sections as $section) {
81
+            $convertedPath = $this->findPathToUseLastSection($path, $section);
82
+            if ($convertedPath === null) {
83
+                // no point in continuing if the section was not found, use original path
84
+                return $fullPath;
85
+            }
86
+            $path = $convertedPath . '/';
87
+        }
88
+        $path = rtrim($path, '/');
89
+        return $path;
90
+    }
91
+
92
+    /**
93
+     * Checks whether the last path section of the given path exists in NFC or NFD form
94
+     * and returns the correct form. If no existing path found, returns null.
95
+     *
96
+     * @param string $basePath base path to check
97
+     * @param string $lastSection last section of the path to check for NFD/NFC variations
98
+     *
99
+     * @return string|null original or converted path, or null if none of the forms was found
100
+     */
101
+    private function findPathToUseLastSection($basePath, $lastSection) {
102
+        $fullPath = $basePath . $lastSection;
103
+        if ($lastSection === '' || $this->isAscii($lastSection) || $this->storage->file_exists($fullPath)) {
104
+            $this->namesCache[$fullPath] = $fullPath;
105
+            return $fullPath;
106
+        }
107
+
108
+        // swap encoding
109
+        if (\Normalizer::isNormalized($lastSection, \Normalizer::FORM_C)) {
110
+            $otherFormPath = \Normalizer::normalize($lastSection, \Normalizer::FORM_D);
111
+        } else {
112
+            $otherFormPath = \Normalizer::normalize($lastSection, \Normalizer::FORM_C);
113
+        }
114
+        $otherFullPath = $basePath . $otherFormPath;
115
+        if ($this->storage->file_exists($otherFullPath)) {
116
+            $this->namesCache[$fullPath] = $otherFullPath;
117
+            return $otherFullPath;
118
+        }
119
+
120
+        // return original path, file did not exist at all
121
+        $this->namesCache[$fullPath] = $fullPath;
122
+        return null;
123
+    }
124
+
125
+    /**
126
+     * see http://php.net/manual/en/function.mkdir.php
127
+     *
128
+     * @param string $path
129
+     * @return bool
130
+     */
131
+    public function mkdir($path) {
132
+        // note: no conversion here, method should not be called with non-NFC names!
133
+        $result = $this->storage->mkdir($path);
134
+        if ($result) {
135
+            $this->namesCache[$path] = $path;
136
+        }
137
+        return $result;
138
+    }
139
+
140
+    /**
141
+     * see http://php.net/manual/en/function.rmdir.php
142
+     *
143
+     * @param string $path
144
+     * @return bool
145
+     */
146
+    public function rmdir($path) {
147
+        $result = $this->storage->rmdir($this->findPathToUse($path));
148
+        if ($result) {
149
+            unset($this->namesCache[$path]);
150
+        }
151
+        return $result;
152
+    }
153
+
154
+    /**
155
+     * see http://php.net/manual/en/function.opendir.php
156
+     *
157
+     * @param string $path
158
+     * @return resource
159
+     */
160
+    public function opendir($path) {
161
+        return $this->storage->opendir($this->findPathToUse($path));
162
+    }
163
+
164
+    /**
165
+     * see http://php.net/manual/en/function.is_dir.php
166
+     *
167
+     * @param string $path
168
+     * @return bool
169
+     */
170
+    public function is_dir($path) {
171
+        return $this->storage->is_dir($this->findPathToUse($path));
172
+    }
173
+
174
+    /**
175
+     * see http://php.net/manual/en/function.is_file.php
176
+     *
177
+     * @param string $path
178
+     * @return bool
179
+     */
180
+    public function is_file($path) {
181
+        return $this->storage->is_file($this->findPathToUse($path));
182
+    }
183
+
184
+    /**
185
+     * see http://php.net/manual/en/function.stat.php
186
+     * only the following keys are required in the result: size and mtime
187
+     *
188
+     * @param string $path
189
+     * @return array
190
+     */
191
+    public function stat($path) {
192
+        return $this->storage->stat($this->findPathToUse($path));
193
+    }
194
+
195
+    /**
196
+     * see http://php.net/manual/en/function.filetype.php
197
+     *
198
+     * @param string $path
199
+     * @return bool
200
+     */
201
+    public function filetype($path) {
202
+        return $this->storage->filetype($this->findPathToUse($path));
203
+    }
204
+
205
+    /**
206
+     * see http://php.net/manual/en/function.filesize.php
207
+     * The result for filesize when called on a folder is required to be 0
208
+     *
209
+     * @param string $path
210
+     * @return int
211
+     */
212
+    public function filesize($path) {
213
+        return $this->storage->filesize($this->findPathToUse($path));
214
+    }
215
+
216
+    /**
217
+     * check if a file can be created in $path
218
+     *
219
+     * @param string $path
220
+     * @return bool
221
+     */
222
+    public function isCreatable($path) {
223
+        return $this->storage->isCreatable($this->findPathToUse($path));
224
+    }
225
+
226
+    /**
227
+     * check if a file can be read
228
+     *
229
+     * @param string $path
230
+     * @return bool
231
+     */
232
+    public function isReadable($path) {
233
+        return $this->storage->isReadable($this->findPathToUse($path));
234
+    }
235
+
236
+    /**
237
+     * check if a file can be written to
238
+     *
239
+     * @param string $path
240
+     * @return bool
241
+     */
242
+    public function isUpdatable($path) {
243
+        return $this->storage->isUpdatable($this->findPathToUse($path));
244
+    }
245
+
246
+    /**
247
+     * check if a file can be deleted
248
+     *
249
+     * @param string $path
250
+     * @return bool
251
+     */
252
+    public function isDeletable($path) {
253
+        return $this->storage->isDeletable($this->findPathToUse($path));
254
+    }
255
+
256
+    /**
257
+     * check if a file can be shared
258
+     *
259
+     * @param string $path
260
+     * @return bool
261
+     */
262
+    public function isSharable($path) {
263
+        return $this->storage->isSharable($this->findPathToUse($path));
264
+    }
265
+
266
+    /**
267
+     * get the full permissions of a path.
268
+     * Should return a combination of the PERMISSION_ constants defined in lib/public/constants.php
269
+     *
270
+     * @param string $path
271
+     * @return int
272
+     */
273
+    public function getPermissions($path) {
274
+        return $this->storage->getPermissions($this->findPathToUse($path));
275
+    }
276
+
277
+    /**
278
+     * see http://php.net/manual/en/function.file_exists.php
279
+     *
280
+     * @param string $path
281
+     * @return bool
282
+     */
283
+    public function file_exists($path) {
284
+        return $this->storage->file_exists($this->findPathToUse($path));
285
+    }
286
+
287
+    /**
288
+     * see http://php.net/manual/en/function.filemtime.php
289
+     *
290
+     * @param string $path
291
+     * @return int
292
+     */
293
+    public function filemtime($path) {
294
+        return $this->storage->filemtime($this->findPathToUse($path));
295
+    }
296
+
297
+    /**
298
+     * see http://php.net/manual/en/function.file_get_contents.php
299
+     *
300
+     * @param string $path
301
+     * @return string
302
+     */
303
+    public function file_get_contents($path) {
304
+        return $this->storage->file_get_contents($this->findPathToUse($path));
305
+    }
306
+
307
+    /**
308
+     * see http://php.net/manual/en/function.file_put_contents.php
309
+     *
310
+     * @param string $path
311
+     * @param string $data
312
+     * @return bool
313
+     */
314
+    public function file_put_contents($path, $data) {
315
+        return $this->storage->file_put_contents($this->findPathToUse($path), $data);
316
+    }
317
+
318
+    /**
319
+     * see http://php.net/manual/en/function.unlink.php
320
+     *
321
+     * @param string $path
322
+     * @return bool
323
+     */
324
+    public function unlink($path) {
325
+        $result = $this->storage->unlink($this->findPathToUse($path));
326
+        if ($result) {
327
+            unset($this->namesCache[$path]);
328
+        }
329
+        return $result;
330
+    }
331
+
332
+    /**
333
+     * see http://php.net/manual/en/function.rename.php
334
+     *
335
+     * @param string $path1
336
+     * @param string $path2
337
+     * @return bool
338
+     */
339
+    public function rename($path1, $path2) {
340
+        // second name always NFC
341
+        return $this->storage->rename($this->findPathToUse($path1), $this->findPathToUse($path2));
342
+    }
343
+
344
+    /**
345
+     * see http://php.net/manual/en/function.copy.php
346
+     *
347
+     * @param string $path1
348
+     * @param string $path2
349
+     * @return bool
350
+     */
351
+    public function copy($path1, $path2) {
352
+        return $this->storage->copy($this->findPathToUse($path1), $this->findPathToUse($path2));
353
+    }
354
+
355
+    /**
356
+     * see http://php.net/manual/en/function.fopen.php
357
+     *
358
+     * @param string $path
359
+     * @param string $mode
360
+     * @return resource
361
+     */
362
+    public function fopen($path, $mode) {
363
+        $result = $this->storage->fopen($this->findPathToUse($path), $mode);
364
+        if ($result && $mode !== 'r' && $mode !== 'rb') {
365
+            unset($this->namesCache[$path]);
366
+        }
367
+        return $result;
368
+    }
369
+
370
+    /**
371
+     * get the mimetype for a file or folder
372
+     * The mimetype for a folder is required to be "httpd/unix-directory"
373
+     *
374
+     * @param string $path
375
+     * @return string
376
+     */
377
+    public function getMimeType($path) {
378
+        return $this->storage->getMimeType($this->findPathToUse($path));
379
+    }
380
+
381
+    /**
382
+     * see http://php.net/manual/en/function.hash.php
383
+     *
384
+     * @param string $type
385
+     * @param string $path
386
+     * @param bool $raw
387
+     * @return string
388
+     */
389
+    public function hash($type, $path, $raw = false) {
390
+        return $this->storage->hash($type, $this->findPathToUse($path), $raw);
391
+    }
392
+
393
+    /**
394
+     * see http://php.net/manual/en/function.free_space.php
395
+     *
396
+     * @param string $path
397
+     * @return int
398
+     */
399
+    public function free_space($path) {
400
+        return $this->storage->free_space($this->findPathToUse($path));
401
+    }
402
+
403
+    /**
404
+     * search for occurrences of $query in file names
405
+     *
406
+     * @param string $query
407
+     * @return array
408
+     */
409
+    public function search($query) {
410
+        return $this->storage->search($query);
411
+    }
412
+
413
+    /**
414
+     * see http://php.net/manual/en/function.touch.php
415
+     * If the backend does not support the operation, false should be returned
416
+     *
417
+     * @param string $path
418
+     * @param int $mtime
419
+     * @return bool
420
+     */
421
+    public function touch($path, $mtime = null) {
422
+        return $this->storage->touch($this->findPathToUse($path), $mtime);
423
+    }
424
+
425
+    /**
426
+     * get the path to a local version of the file.
427
+     * The local version of the file can be temporary and doesn't have to be persistent across requests
428
+     *
429
+     * @param string $path
430
+     * @return string
431
+     */
432
+    public function getLocalFile($path) {
433
+        return $this->storage->getLocalFile($this->findPathToUse($path));
434
+    }
435
+
436
+    /**
437
+     * check if a file or folder has been updated since $time
438
+     *
439
+     * @param string $path
440
+     * @param int $time
441
+     * @return bool
442
+     *
443
+     * hasUpdated for folders should return at least true if a file inside the folder is add, removed or renamed.
444
+     * returning true for other changes in the folder is optional
445
+     */
446
+    public function hasUpdated($path, $time) {
447
+        return $this->storage->hasUpdated($this->findPathToUse($path), $time);
448
+    }
449
+
450
+    /**
451
+     * get a cache instance for the storage
452
+     *
453
+     * @param string $path
454
+     * @param \OC\Files\Storage\Storage (optional) the storage to pass to the cache
455
+     * @return \OC\Files\Cache\Cache
456
+     */
457
+    public function getCache($path = '', $storage = null) {
458
+        if (!$storage) {
459
+            $storage = $this;
460
+        }
461
+        return $this->storage->getCache($this->findPathToUse($path), $storage);
462
+    }
463
+
464
+    /**
465
+     * get a scanner instance for the storage
466
+     *
467
+     * @param string $path
468
+     * @param \OC\Files\Storage\Storage (optional) the storage to pass to the scanner
469
+     * @return \OC\Files\Cache\Scanner
470
+     */
471
+    public function getScanner($path = '', $storage = null) {
472
+        if (!$storage) {
473
+            $storage = $this;
474
+        }
475
+        return $this->storage->getScanner($this->findPathToUse($path), $storage);
476
+    }
477
+
478
+    /**
479
+     * get the ETag for a file or folder
480
+     *
481
+     * @param string $path
482
+     * @return string
483
+     */
484
+    public function getETag($path) {
485
+        return $this->storage->getETag($this->findPathToUse($path));
486
+    }
487
+
488
+    /**
489
+     * @param IStorage $sourceStorage
490
+     * @param string $sourceInternalPath
491
+     * @param string $targetInternalPath
492
+     * @return bool
493
+     */
494
+    public function copyFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
495
+        if ($sourceStorage === $this) {
496
+            return $this->copy($sourceInternalPath, $this->findPathToUse($targetInternalPath));
497
+        }
498
+
499
+        $result = $this->storage->copyFromStorage($sourceStorage, $sourceInternalPath, $this->findPathToUse($targetInternalPath));
500
+        if ($result) {
501
+            unset($this->namesCache[$targetInternalPath]);
502
+        }
503
+        return $result;
504
+    }
505
+
506
+    /**
507
+     * @param IStorage $sourceStorage
508
+     * @param string $sourceInternalPath
509
+     * @param string $targetInternalPath
510
+     * @return bool
511
+     */
512
+    public function moveFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
513
+        if ($sourceStorage === $this) {
514
+            $result = $this->rename($sourceInternalPath, $this->findPathToUse($targetInternalPath));
515
+            if ($result) {
516
+                unset($this->namesCache[$sourceInternalPath]);
517
+                unset($this->namesCache[$targetInternalPath]);
518
+            }
519
+            return $result;
520
+        }
521
+
522
+        $result = $this->storage->moveFromStorage($sourceStorage, $sourceInternalPath, $this->findPathToUse($targetInternalPath));
523
+        if ($result) {
524
+            unset($this->namesCache[$sourceInternalPath]);
525
+            unset($this->namesCache[$targetInternalPath]);
526
+        }
527
+        return $result;
528
+    }
529
+
530
+    /**
531
+     * @param string $path
532
+     * @return array
533
+     */
534
+    public function getMetaData($path) {
535
+        return $this->storage->getMetaData($this->findPathToUse($path));
536
+    }
537
+
538
+    public function getDirectoryContent($directory): \Traversable {
539
+        return $this->storage->getDirectoryContent($this->findPathToUse($directory));
540
+    }
541 541
 }
Please login to merge, or discard this patch.