aboutsummaryrefslogtreecommitdiff
path: root/engine/classes/ElggDiskFilestore.php
diff options
context:
space:
mode:
Diffstat (limited to 'engine/classes/ElggDiskFilestore.php')
-rw-r--r--engine/classes/ElggDiskFilestore.php206
1 files changed, 126 insertions, 80 deletions
diff --git a/engine/classes/ElggDiskFilestore.php b/engine/classes/ElggDiskFilestore.php
index b0924fbe7..6e2354012 100644
--- a/engine/classes/ElggDiskFilestore.php
+++ b/engine/classes/ElggDiskFilestore.php
@@ -5,9 +5,9 @@
* @warning This should be used by a wrapper class
* like {@link ElggFile}.
*
- * @package Elgg.Core
+ * @package Elgg.Core
* @subpackage FileStore.Disk
- * @link http://docs.elgg.org/DataModel/FileStore/Disk
+ * @link http://docs.elgg.org/DataModel/FileStore/Disk
*/
class ElggDiskFilestore extends ElggFilestore {
/**
@@ -42,8 +42,9 @@ class ElggDiskFilestore extends ElggFilestore {
* @warning This will try to create the a directory if it doesn't exist,
* even in read-only mode.
*
- * @param ElggFile $file
- * @param string $mode read, write, or append.
+ * @param ElggFile $file The file to open
+ * @param string $mode read, write, or append.
+ *
* @throws InvalidParameterException
* @return resource File pointer resource
* @todo This really shouldn't try to create directories if not writing.
@@ -52,22 +53,23 @@ class ElggDiskFilestore extends ElggFilestore {
$fullname = $this->getFilenameOnFilestore($file);
// Split into path and name
- $ls = strrpos($fullname,"/");
- if ($ls===false) {
+ $ls = strrpos($fullname, "/");
+ if ($ls === false) {
$ls = 0;
}
$path = substr($fullname, 0, $ls);
$name = substr($fullname, $ls);
+ // @todo $name is unused, remove it or do we need to fix something?
// Try and create the directory
try {
- $this->make_directory_root($path);
+ $this->makeDirectoryRoot($path);
} catch (Exception $e) {
}
- if (($mode!='write') && (!file_exists($fullname))) {
+ if (($mode != 'write') && (!file_exists($fullname))) {
return false;
}
@@ -82,7 +84,8 @@ class ElggDiskFilestore extends ElggFilestore {
$mode = "a+b";
break;
default:
- throw new InvalidParameterException(sprintf(elgg_echo('InvalidParameterException:UnrecognisedFileMode'), $mode));
+ $msg = elgg_echo('InvalidParameterException:UnrecognisedFileMode', array($mode));
+ throw new InvalidParameterException($msg);
}
return fopen($fullname, $mode);
@@ -92,8 +95,9 @@ class ElggDiskFilestore extends ElggFilestore {
/**
* Write data to a file.
*
- * @param resource $f File pointer resource
- * @param mixed $data The data to write.
+ * @param resource $f File pointer resource
+ * @param mixed $data The data to write.
+ *
* @return bool
*/
public function write($f, $data) {
@@ -103,9 +107,10 @@ class ElggDiskFilestore extends ElggFilestore {
/**
* Read data from a file.
*
- * @param resource $f File pointer resource
- * @param int $length The number of bytes to read
- * @param inf $offset The number of bytes to start after
+ * @param resource $f File pointer resource
+ * @param int $length The number of bytes to read
+ * @param int $offset The number of bytes to start after
+ *
* @return mixed Contents of file or false on fail.
*/
public function read($f, $length, $offset = 0) {
@@ -120,6 +125,7 @@ class ElggDiskFilestore extends ElggFilestore {
* Close a file pointer
*
* @param resource $f A file pointer resource
+ *
* @return bool
*/
public function close($f) {
@@ -130,6 +136,7 @@ class ElggDiskFilestore extends ElggFilestore {
* Delete an ElggFile file.
*
* @param ElggFile $file File to delete
+ *
* @return bool
*/
public function delete(ElggFile $file) {
@@ -144,8 +151,10 @@ class ElggDiskFilestore extends ElggFilestore {
/**
* Seek to the specified position.
*
- * @param resource $f File resource
- * @param int $position Position in bytes
+ * @param resource $f File resource
+ * @param int $position Position in bytes
+ *
+ * @return bool
*/
public function seek($f, $position) {
return fseek($f, $position);
@@ -155,6 +164,8 @@ class ElggDiskFilestore extends ElggFilestore {
* Return the current location of the internal pointer
*
* @param resource $f File pointer resource
+ *
+ * @return int|false
*/
public function tell($f) {
return ftell($f);
@@ -162,7 +173,10 @@ class ElggDiskFilestore extends ElggFilestore {
/**
* Tests for end of file on a file pointer
+ *
* @param resource $f File pointer resource
+ *
+ * @return bool
*/
public function eof($f) {
return feof($f);
@@ -171,7 +185,8 @@ class ElggDiskFilestore extends ElggFilestore {
/**
* Returns the file size of an ElggFile file.
*
- * @param ElggFile $file
+ * @param ElggFile $file File object
+ *
* @return int The file size
*/
public function getFileSize(ElggFile $file) {
@@ -179,29 +194,41 @@ class ElggDiskFilestore extends ElggFilestore {
}
/**
- * Returns the filename as saved on disk for an ElggFile object
+ * Get the filename as saved on disk for an ElggFile object
+ *
+ * Returns an empty string if no filename set
+ *
+ * @param ElggFile $file File object
*
- * @param ElggFile $file
* @return string The full path of where the file is stored
+ * @throws InvalidParameterException
*/
public function getFilenameOnFilestore(ElggFile $file) {
- $owner = $file->getOwnerEntity();
- if (!$owner) {
- $owner = get_loggedin_user();
+ $owner_guid = $file->getOwnerGuid();
+ if (!$owner_guid) {
+ $owner_guid = elgg_get_logged_in_user_guid();
+ }
+
+ if (!$owner_guid) {
+ $msg = elgg_echo('InvalidParameterException:MissingOwner',
+ array($file->getFilename(), $file->guid));
+ throw new InvalidParameterException($msg);
}
- if ((!$owner) || (!$owner->username)) {
- throw new InvalidParameterException(sprintf(elgg_echo('InvalidParameterException:MissingOwner'), $file->getFilename(), $file->guid));
+ $filename = $file->getFilename();
+ if (!$filename) {
+ return '';
}
- return $this->dir_root . $this->make_file_matrix($owner->guid) . $file->getFilename();
+ return $this->dir_root . $this->makeFileMatrix($owner_guid) . $filename;
}
/**
* Returns the contents of the ElggFile file.
*
- * @param ElggFile $file
- * @return mixed
+ * @param ElggFile $file File object
+ *
+ * @return string
*/
public function grabFile(ElggFile $file) {
return file_get_contents($file->getFilenameOnFilestore());
@@ -210,57 +237,84 @@ class ElggDiskFilestore extends ElggFilestore {
/**
* Tests if an ElggFile file exists.
*
- * @param ElggFile $file
+ * @param ElggFile $file File object
+ *
* @return bool
*/
public function exists(ElggFile $file) {
+ if (!$file->getFilename()) {
+ return false;
+ }
return file_exists($this->getFilenameOnFilestore($file));
}
/**
* Returns the size of all data stored under a directory in the disk store.
*
- * @param string $prefix Optional/ The prefix to check under.
+ * @param string $prefix Optional/ The prefix to check under.
* @param string $container_guid The guid of the entity whose data you want to check.
+ *
* @return int|false
*/
public function getSize($prefix = '', $container_guid) {
if ($container_guid) {
- return get_dir_size($this->dir_root . $this->make_file_matrix($container_guid) . $prefix);
+ return get_dir_size($this->dir_root . $this->makeFileMatrix($container_guid) . $prefix);
} else {
return false;
}
}
+ // @codingStandardsIgnoreStart
/**
* Create a directory $dirroot
*
* @param string $dirroot The full path of the directory to create
+ *
* @throws IOException
* @return true
+ * @deprecated 1.8 Use ElggDiskFilestore::makeDirectoryRoot()
*/
protected function make_directory_root($dirroot) {
+ elgg_deprecated_notice('ElggDiskFilestore::make_directory_root() is deprecated by ::makeDirectoryRoot()', 1.8);
+
+ return $this->makeDirectoryRoot($dirroot);
+ }
+ // @codingStandardsIgnoreEnd
+
+ /**
+ * Create a directory $dirroot
+ *
+ * @param string $dirroot The full path of the directory to create
+ *
+ * @throws IOException
+ * @return true
+ */
+ protected function makeDirectoryRoot($dirroot) {
if (!file_exists($dirroot)) {
if (!@mkdir($dirroot, 0700, true)) {
- throw new IOException(sprintf(elgg_echo('IOException:CouldNotMake'), $dirroot));
+ throw new IOException(elgg_echo('IOException:CouldNotMake', array($dirroot)));
}
}
return true;
}
+ // @codingStandardsIgnoreStart
/**
* Multibyte string tokeniser.
*
- * Splits a string into an array. Will fail safely if mbstring is not installed (although this may still
- * not handle .
+ * Splits a string into an array. Will fail safely if mbstring is
+ * not installed.
*
- * @param string $string String
+ * @param string $string String
* @param string $charset The charset, defaults to UTF8
+ *
* @return array
- * @todo Can be deprecated since we no long split on usernames
+ * @deprecated 1.8 Files are stored by date and guid; no need for this.
*/
private function mb_str_split($string, $charset = 'UTF8') {
+ elgg_deprecated_notice('ElggDiskFilestore::mb_str_split() is deprecated.', 1.8);
+
if (is_callable('mb_substr')) {
$length = mb_strlen($string);
$array = array();
@@ -276,74 +330,64 @@ class ElggDiskFilestore extends ElggFilestore {
} else {
return str_split($string);
}
-
- return false;
}
+ // @codingStandardsIgnoreEnd
+ // @codingStandardsIgnoreStart
/**
* Construct a file path matrix for an entity.
*
- * @param int The guide of the entity to store the data under.
- * @return str The path where the entity's data will be stored.
+ * @param int $identifier The guide of the entity to store the data under.
+ *
+ * @return string The path where the entity's data will be stored.
+ * @deprecated 1.8 Use ElggDiskFilestore::makeFileMatrix()
*/
protected function make_file_matrix($identifier) {
- if (is_numeric($identifier)) {
- return $this->user_file_matrix($identifier);
- }
+ elgg_deprecated_notice('ElggDiskFilestore::make_file_matrix() is deprecated by ::makeFileMatrix()', 1.8);
- return $this->deprecated_file_matrix($identifier);
+ return $this->makeFileMatrix($identifier);
}
+ // @codingStandardsIgnoreEnd
/**
- * Construct a filename matrix.
- *
- * Generates a matrix using the entity's creation time and
- * unique guid.
+ * Construct a file path matrix for an entity.
*
- * File path matrixes are:
- * YYYY/MM/DD/guid/
+ * @param int $guid The guide of the entity to store the data under.
*
- * @param int $guid The entity to contrust a matrix for
- * @return str The
- * @todo This would work with non-users. Why is it restricted to only users?
+ * @return string The path where the entity's data will be stored.
*/
- protected function user_file_matrix($guid) {
- // lookup the entity
- $user = get_entity($guid);
- if ($user->type != 'user') {
- // only to be used for user directories
- return FALSE;
- }
+ protected function makeFileMatrix($guid) {
+ $entity = get_entity($guid);
- if (!$user->time_created) {
- // fall back to deprecated method
- return $this->deprecated_file_matrix($user->username);
+ if (!($entity instanceof ElggEntity) || !$entity->time_created) {
+ return false;
}
- $time_created = date('Y/m/d', $user->time_created);
- return "$time_created/$user->guid/";
+ $time_created = date('Y/m/d', $entity->time_created);
+
+ return "$time_created/$entity->guid/";
}
+ // @codingStandardsIgnoreStart
/**
- * Construct the filename matrix using a string
+ * Construct a filename matrix.
+ *
+ * Generates a matrix using the entity's creation time and
+ * unique guid.
*
- * Particularly, this is used with a username to generate the file storage
- * location.
+ * File path matrixes are:
+ * YYYY/MM/DD/guid/
*
- * @deprecated for user directories: use user_file_matrix() instead.
+ * @param int $guid The entity to contrust a matrix for
*
- * @param str $filename
- * @return str
+ * @return string The
*/
- protected function deprecated_file_matrix($filename) {
- // throw a warning for using deprecated method
- $error = 'Deprecated use of ElggDiskFilestore::make_file_matrix. ';
- $error .= 'Username passed instead of guid.';
- elgg_log($error, WARNING);
-
- $user = new ElggUser($filename);
- return $this->user_file_matrix($user->guid);
+ protected function user_file_matrix($guid) {
+ elgg_deprecated_notice('ElggDiskFilestore::user_file_matrix() is deprecated by ::makeFileMatrix()', 1.8);
+
+ return $this->makeFileMatrix($guid);
}
+ // @codingStandardsIgnoreEnd
/**
* Returns a list of attributes to save to the database when saving
@@ -358,7 +402,9 @@ class ElggDiskFilestore extends ElggFilestore {
/**
* Sets parameters that should be saved to database.
*
- * return bool
+ * @param array $parameters Set parameters to save to DB for this filestore.
+ *
+ * @return bool
*/
public function setParameters(array $parameters) {
if (isset($parameters['dir_root'])) {
@@ -368,4 +414,4 @@ class ElggDiskFilestore extends ElggFilestore {
return false;
}
-} \ No newline at end of file
+}