getParameters(). */ abstract public function setParameters(array $parameters); } /** * @class ElggDiskFilestore * This class uses disk storage to save data. * @author Marcus Povey */ class ElggDiskFilestore extends ElggFilestore { /** * Directory root. */ private $dir_root; /** * Default depth of file directory matrix */ private $matrix_depth = 5; /** * Construct a disk filestore using the given directory root. * * @param string $directory_root Root directory, must end in "/" */ public function __construct($directory_root) { $this->dir_root = $directory_root; } public function open(ElggFile $file, $mode) { // Try and create the directory try { $this->make_directory_root($this->dir_root); } catch (Exception $e){} $name = $file->getFilename(); $matrix = $this->make_file_matrix($name); switch ($mode) { case "read" : $mode = "r+b"; break; case "write" : $mode = "w+b"; break; case "append" : $mode = "a+b"; break; default: throw new InvalidParameterException("Unrecognised file mode '$mode'"); } return fopen($this->dir_root . $matrix . $name, $mode); } public function write($f, $data) { return fwrite($f, $data); } public function read($f, $length = 0, $offset = 0) { if ($offset) $this->seek($f, $offset); return fread($f, $length); } public function close($f) { return fclose($f); } public function delete(ElggFile $file) { $name = $file->getFilename(); $matrix = $this->make_file_matrix($name); $unlink = unlink($this->dir_root . $matrix . $name); if ($unlink) return $file->delete(); return false; } public function seek($f, $position) { return fseek($f, $position); } /** * Make the directory root. * * @param string $dirroot */ protected function make_directory_root($dirroot) { if (!mkdir($dir, 0700, true)) throw new IOException("Could not make $dirroot"); return true; } /** * Construct the filename matrix. * * @param string $filename */ protected function make_file_matrix($filename) { $matrix = ""; $len = strlen($ident); if ($len>$this->matrix_depth) $len = $this->matrix_depth; for ($n = 0; $n < strlen($ident); $n++) $matrix .= $ident[$n] . "/"; return $matrix; } public function getParameters() { return array("dir_root" => $this->dir_root); } public function setParameters(array $parameters) { if (isset($parameters['dir_root'])) { $this->dir_root = $parameters['dir_root']; return true; } return false; } } /** * @class ElggFile * This class represents a physical file. * @author Marcus Povey */ class ElggFile extends ElggObject { protected function initialise_attributes() { parent::initialise_attributes(); $this->attributes['subtype'] = "file"; } function __construct($guid = null) { parent::__construct($guid); } // TODO: Save filestore & filestore parameters - getparameters, save them as name/value with type "$datastoreclassname" // TODO: Set name and optional description //get datastore (save with object as meta/ load from create) // constrcut // initialise (set subtype to elggfile) // set name // read / write / open / close / delete // Get name // getFilestore // if $filestore is blank, try and get from meta // if meta not found or guid is null then get from default } /// Variable holding the default datastore $DEFAULT_FILE_STORE = NULL; /** * Return the default filestore. * * @return ElggFilestore */ function get_default_filestore() { global $DEFAULT_FILE_STORE; return $DEFAULT_FILE_STORE; } /** * Set the default filestore for the system. */ function set_default_filestore(ElggFilestore $filestore) { global $DEFAULT_FILE_STORE; $DEFAULT_FILE_STORE = $filestore; return true; } // Now register a default filestore set_default_filestore(new ElggDiskFilestore($CONFIG->dataroot)); ?>