From d78a2a9f78dc2a65bffa8f3fc4299c4540c4d5be Mon Sep 17 00:00:00 2001
From: Robin Appelman <icewind@owncloud.com>
Date: Mon, 30 Jun 2014 15:46:37 +0200
Subject: [PATCH] Add StorageNotAvailableException

---
 lib/private/files/storage/dav.php             | 44 ++++++++++++-------
 .../files/storagenotavailableexception.php    | 19 ++++++++
 2 files changed, 46 insertions(+), 17 deletions(-)
 create mode 100644 lib/public/files/storagenotavailableexception.php

diff --git a/lib/private/files/storage/dav.php b/lib/private/files/storage/dav.php
index 8b97f75020..726688fe44 100644
--- a/lib/private/files/storage/dav.php
+++ b/lib/private/files/storage/dav.php
@@ -8,6 +8,9 @@
 
 namespace OC\Files\Storage;
 
+use OCP\Files\StorageNotAvailableException;
+use Sabre\DAV\Exception;
+
 class DAV extends \OC\Files\Storage\Common {
 	protected $password;
 	protected $user;
@@ -463,29 +466,36 @@ class DAV extends \OC\Files\Storage\Common {
 	 *
 	 * @param string $path
 	 * @param int $time
+	 * @throws \OCP\Files\StorageNotAvailableException
 	 * @return bool
 	 */
 	public function hasUpdated($path, $time) {
 		$this->init();
-		$response = $this->client->propfind($this->encodePath($path), array(
-			'{DAV:}getlastmodified',
-			'{DAV:}getetag',
-			'{http://owncloud.org/ns}permissions'
-		));
-		if (isset($response['{DAV:}getetag'])) {
-			$cachedData = $this->getCache()->get($path);
-			$etag = trim($response['{DAV:}getetag'], '"');
-			if ($cachedData['etag'] !== $etag) {
-				return true;
-			} else if (isset($response['{http://owncloud.org/ns}permissions'])) {
-				$permissions = $this->parsePermissions($response['{http://owncloud.org/ns}permissions']);
-				return $permissions !== $cachedData['permissions'];
+		try {
+			$response = $this->client->propfind($this->encodePath($path), array(
+				'{DAV:}getlastmodified',
+				'{DAV:}getetag',
+				'{http://owncloud.org/ns}permissions'
+			));
+			if (isset($response['{DAV:}getetag'])) {
+				$cachedData = $this->getCache()->get($path);
+				$etag = trim($response['{DAV:}getetag'], '"');
+				if ($cachedData['etag'] !== $etag) {
+					return true;
+				} else if (isset($response['{http://owncloud.org/ns}permissions'])) {
+					$permissions = $this->parsePermissions($response['{http://owncloud.org/ns}permissions']);
+					return $permissions !== $cachedData['permissions'];
+				} else {
+					return false;
+				}
 			} else {
-				return false;
+				$remoteMtime = strtotime($response['{DAV:}getlastmodified']);
+				return $remoteMtime > $time;
 			}
-		} else {
-			$remoteMtime = strtotime($response['{DAV:}getlastmodified']);
-			return $remoteMtime > $time;
+		} catch (Exception\NotFound $e) {
+			return false;
+		} catch (Exception $e) {
+			throw new StorageNotAvailableException();
 		}
 	}
 }
diff --git a/lib/public/files/storagenotavailableexception.php b/lib/public/files/storagenotavailableexception.php
new file mode 100644
index 0000000000..fcc0c9cacf
--- /dev/null
+++ b/lib/public/files/storagenotavailableexception.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+/**
+ * Public interface of ownCloud for apps to use.
+ * Files/AlreadyExistsException class
+ */
+
+// use OCP namespace for all classes that are considered public.
+// This means that they should be used by apps instead of the internal ownCloud classes
+namespace OCP\Files;
+
+class StorageNotAvailableException extends \Exception {
+}
-- 
GitLab