. * */ namespace OCA\Documents; class Genesis { const DOCUMENTS_DIRNAME='/documents'; protected $view; protected $path; protected $hash; /** * Create new genesis document * @param OCA\Documents\View $view Filesystem view with root '/user/files' * @param string $path relative path * @param string $owner file owner * */ public function __construct(\OCA\Documents\View $view, $path, $owner){ $this->view = new View('/' . $owner); $this->hash = $this->getDocumentHash($view, $path); if (!$this->view->file_exists(self::DOCUMENTS_DIRNAME)){ $this->view->mkdir(self::DOCUMENTS_DIRNAME ); } $this->path = self::DOCUMENTS_DIRNAME . '/' . $this->hash . '.odt'; if (!$this->view->file_exists($this->path)){ //copy new genesis to /user/documents/{hash}.odt $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; $this->view->copy('/files' . $path, $this->path); \OC_FileProxy::$enabled = $proxyStatus; } try { $this->validate($this->view, $this->path); } catch (\Exception $e){ throw new \Exception('Failed to copy genesis'); } } public function getPath(){ return $this->path; } public function getHash(){ return $this->hash; } public static function getHashByPath($path){ return preg_replace('|([a-zA-Z0-9])*\..*$|', '\1', $path); } protected function getDocumentHash($view, $path){ $this->validate($view, $path); return sha1($view->file_get_contents($path)); } /** * Check if genesis is valid * @param OCA\Documents\View $view * @param string $path relative to the view * @throws \Exception */ protected function validate($view, $path){ if (!$view->file_exists($path)){ throw new \Exception('Document not found ' . $path); } if (!$view->is_file($path)){ throw new \Exception('Object ' . $path . ' is not a file.'); } //TODO check if it is a valid odt } }