From 769cbe9a4cc5b105cc0277057b21e4661bd9c890 Mon Sep 17 00:00:00 2001
From: Robin Appelman <icewind@owncloud.com>
Date: Sun, 17 Jun 2012 02:54:23 +0200
Subject: [PATCH] improve filecache support for smb

---
 apps/files_external/lib/smb.php | 44 ++++++++++++++++++++++++++++++++-
 1 file changed, 43 insertions(+), 1 deletion(-)

diff --git a/apps/files_external/lib/smb.php b/apps/files_external/lib/smb.php
index 9112655194..e05d69f784 100644
--- a/apps/files_external/lib/smb.php
+++ b/apps/files_external/lib/smb.php
@@ -47,6 +47,48 @@ class OC_FileStorage_SMB extends OC_FileStorage_StreamWrapper{
 			$path=substr($path,0,-1);
 		}
 		return 'smb://'.$this->user.':'.$this->password.'@'.$this->host.$this->share.$this->root.$path;
-		
+	}
+
+	public function stat($path){
+		if(!$path and $this->root=='/'){//mtime doesn't work for shares
+			$mtime=$this->shareMTime();
+			$stat=stat($this->constructUrl($path));
+			$stat['mtime']=$mtime;
+			return $stat;
+		}else{
+			return stat($this->constructUrl($path));
+		}
+	}
+
+	/**
+	 * check if a file or folder has been updated since $time
+	 * @param int $time
+	 * @return bool
+	 */
+	public function hasUpdated($path,$time){
+		if(!$path and $this->root=='/'){
+			//mtime doesn't work for shares, but giving the nature of the backend, doing a full update is still just fast enough
+			return true;
+		}else{
+			$actualTime=$this->filemtime($path);
+			return $actualTime>$time;
+		}
+	}
+
+	/**
+	 * get the best guess for the modification time of the share
+	 */
+	private function shareMTime(){
+		$dh=$this->opendir('');
+		$lastCtime=0;
+		while($file=readdir($dh)){
+			if($file!='.' and $file!='..'){
+				$ctime=$this->filemtime($file);
+				if($ctime>$lastCtime){
+					$lastCtime=$ctime;
+				}
+			}
+		}
+		return $lastCtime;
 	}
 }
-- 
GitLab