From 2d85ef0e045380691b1dcf136b4b61b46104c2c6 Mon Sep 17 00:00:00 2001
From: Bart Visscher <bartv@thisnet.nl>
Date: Fri, 27 Jul 2012 11:59:52 +0200
Subject: [PATCH] Chunked upload: Refactor to static class

---
 lib/connector/sabre/directory.php | 23 +++-----------
 lib/filechunking.php              | 53 +++++++++++++++++++++++++++++++
 2 files changed, 58 insertions(+), 18 deletions(-)
 create mode 100644 lib/filechunking.php

diff --git a/lib/connector/sabre/directory.php b/lib/connector/sabre/directory.php
index bed75015ae..b88d0f3286 100644
--- a/lib/connector/sabre/directory.php
+++ b/lib/connector/sabre/directory.php
@@ -49,25 +49,12 @@ class OC_Connector_Sabre_Directory extends OC_Connector_Sabre_Node implements Sa
 	 */
 	public function createFile($name, $data = null) {
 		if (isset($_SERVER['HTTP_OC_CHUNKED'])) {
-			$cache = new OC_Cache_File();
-			$cache->set($name, $data);
-			preg_match('/(?P<name>.*)-chunking-(?P<transferid>\d+)-(?P<chunkcount>\d+)-(?P<index>\d+)/', $name, $matches);
-			$prefix = $matches['name'].'-chunking-'.$matches['transferid'].'-'.$matches['chunkcount'].'-';
-			$parts = 0;
-			for($i=0; $i < $matches['chunkcount']; $i++) {
-				if ($cache->hasKey($prefix.$i)) {
-					$parts ++;
-				}
-			}
-			if ($parts == $matches['chunkcount']) {
-				$newPath = $this->path . '/' . $matches['name'];
+			OC_FileChunking::store($name, $data);
+			$info = OC_FileChunking::decodeName($name);
+			if (OC_FileChunking::isComplete($info)) {
+				$newPath = $this->path . '/' . $info['name'];
 				$f = OC_Filesystem::fopen($newPath, 'w');
-				for($i=0; $i < $matches['chunkcount']; $i++) {
-					$chunk = $cache->get($prefix.$i);
-					$cache->remove($prefix.$i);
-					fwrite($f,$chunk);
-				}
-				fclose($f);
+				OC_FileChunking::assemble($info, $f);
 				return OC_Connector_Sabre_Node::getETagPropertyForPath($newPath);
 			}
 		} else {
diff --git a/lib/filechunking.php b/lib/filechunking.php
new file mode 100644
index 0000000000..4e4918d49d
--- /dev/null
+++ b/lib/filechunking.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+
+class OC_FileChunking {
+	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) {
+		return $name.'-chunking-'.$transferid.'-'.$chunkcount.'-';
+	}
+
+	static public function store($name, $data) {
+		$cache = new OC_Cache_File();
+		$cache->set($name, $data);
+	}
+
+	static public function isComplete($info) {
+		$prefix = OC_FileChunking::getPrefix($info['name'],
+				$info['transferid'],
+				$info['chunkcount']
+			);
+		$parts = 0;
+		$cache = new OC_Cache_File();
+		for($i=0; $i < $info['chunkcount']; $i++) {
+			if ($cache->hasKey($prefix.$i)) {
+				$parts ++;
+			}
+		}
+		return $parts == $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++) {
+			$chunk = $cache->get($prefix.$i);
+			$cache->remove($prefix.$i);
+			fwrite($f,$chunk);
+		}
+		fclose($f);
+	}
+}
-- 
GitLab