From 1ea33ff36bf70ee2099f8d225f488dc220e3bcff Mon Sep 17 00:00:00 2001
From: Bart Visscher <bartv@thisnet.nl>
Date: Fri, 27 Jul 2012 12:14:18 +0200
Subject: [PATCH] Chunked upload: Refactor OC_FileChunking to object

---
 lib/connector/sabre/directory.php |  7 +++--
 lib/filechunking.php              | 49 +++++++++++++++++++------------
 2 files changed, 35 insertions(+), 21 deletions(-)

diff --git a/lib/connector/sabre/directory.php b/lib/connector/sabre/directory.php
index b88d0f3286..09c65f19b8 100644
--- a/lib/connector/sabre/directory.php
+++ b/lib/connector/sabre/directory.php
@@ -49,12 +49,13 @@ class OC_Connector_Sabre_Directory extends OC_Connector_Sabre_Node implements Sa
 	 */
 	public function createFile($name, $data = null) {
 		if (isset($_SERVER['HTTP_OC_CHUNKED'])) {
-			OC_FileChunking::store($name, $data);
 			$info = OC_FileChunking::decodeName($name);
-			if (OC_FileChunking::isComplete($info)) {
+			$chunk_handler = new OC_FileChunking($info);
+			$chunk_handler->store($info['index'], $data);
+			if ($chunk_handler->isComplete()) {
 				$newPath = $this->path . '/' . $info['name'];
 				$f = OC_Filesystem::fopen($newPath, 'w');
-				OC_FileChunking::assemble($info, $f);
+				$chunk_handler->assemble($f);
 				return OC_Connector_Sabre_Node::getETagPropertyForPath($newPath);
 			}
 		} else {
diff --git a/lib/filechunking.php b/lib/filechunking.php
index 4e4918d49d..9aead4c12f 100644
--- a/lib/filechunking.php
+++ b/lib/filechunking.php
@@ -8,42 +8,55 @@
 
 
 class OC_FileChunking {
+	protected $info;
+	protected $cache;
+
 	static public function decodeName($name) {
 		preg_match('/(?P<name>.*)-chunking-(?P<transferid>\d+)-(?P<chunkcount>\d+)-(?P<index>\d+)/', $name, $matches);
 		return $matches;
 	}
 
-	static public function getPrefix($name, $transferid, $chunkcount) {
+	public function __construct($info) {
+		$this->info = $info;
+	}
+
+	public function getPrefix() {
+		$name = $this->info['name'];
+		$transferid = $this->info['transferid'];
+		$chunkcount = $this->info['chunkcount'];
+
 		return $name.'-chunking-'.$transferid.'-'.$chunkcount.'-';
 	}
 
-	static public function store($name, $data) {
-		$cache = new OC_Cache_File();
+	protected function getCache() {
+		if (!isset($this->cache)) {
+			$this->cache = new OC_Cache_File();
+		}
+		return $this->cache;
+	}
+
+	public function store($index, $data) {
+		$cache = $this->getCache();
+		$name = $this->getPrefix().$index;
 		$cache->set($name, $data);
 	}
 
-	static public function isComplete($info) {
-		$prefix = OC_FileChunking::getPrefix($info['name'],
-				$info['transferid'],
-				$info['chunkcount']
-			);
+	public function isComplete() {
+		$prefix = $this->getPrefix();
 		$parts = 0;
-		$cache = new OC_Cache_File();
-		for($i=0; $i < $info['chunkcount']; $i++) {
+		$cache = $this->getCache();
+		for($i=0; $i < $this->info['chunkcount']; $i++) {
 			if ($cache->hasKey($prefix.$i)) {
 				$parts ++;
 			}
 		}
-		return $parts == $info['chunkcount'];
+		return $parts == $this->info['chunkcount'];
 	}
 
-	static public function assemble($info, $f) {
-		$cache = new OC_Cache_File();
-		$prefix = OC_FileChunking::getPrefix($info['name'],
-				$info['transferid'],
-				$info['chunkcount']
-			);
-		for($i=0; $i < $info['chunkcount']; $i++) {
+	public function assemble($f) {
+		$cache = $this->getCache();
+		$prefix = $this->getPrefix();
+		for($i=0; $i < $this->info['chunkcount']; $i++) {
 			$chunk = $cache->get($prefix.$i);
 			$cache->remove($prefix.$i);
 			fwrite($f,$chunk);
-- 
GitLab