/** * Create new genesis document * @param File $file * */ public function __construct(File $file) { $view = $file->getOwnerView(); $path = $file->getPath(); $owner = $file->getOwner(); $this->view = new View('/' . $owner); if (!$this->view->file_exists(self::DOCUMENTS_DIRNAME)) { $this->view->mkdir(self::DOCUMENTS_DIRNAME); } $this->validate($view, $path); $this->hash = $view->hash('sha1', $path, false); $this->path = self::DOCUMENTS_DIRNAME . '/' . $this->hash . '.odt'; if (!$this->view->file_exists($this->path)) { //copy new genesis to /user/documents/{hash}.odt // get decrypted content $content = $view->file_get_contents($path); $mimetype = $view->getMimeType($path); $data = Filter::read($content, $mimetype); $this->view->file_put_contents($this->path, $data['content']); } try { $this->validate($this->view, $this->path); } catch (\Exception $e) { throw new \Exception('Failed to copy genesis'); } }
public function render() { if ($this->getStatus() === Http::STATUS_NOT_FOUND) { return ''; } $info = $this->view->getFileInfo($this->path); $this->ETag = $info['etag']; $content = $this->view->file_get_contents($this->path); $data = \OCA\Richdocuments\Filter::read($content, $info['mimetype']); $size = strlen($data['content']); if (isset($this->request->server['HTTP_RANGE']) && !is_null($this->request->server['HTTP_RANGE'])) { $isValidRange = preg_match('/^bytes=\\d*-\\d*(,\\d*-\\d*)*$/', $this->request->server['HTTP_RANGE']); if (!$isValidRange) { return $this->sendRangeNotSatisfiable($size); } $ranges = explode(',', substr($this->request->server['HTTP_RANGE'], 6)); foreach ($ranges as $range) { $parts = explode('-', $range); if ($parts[0] === '' && $parts[1] == '') { $this->sendNotSatisfiable($size); } if ($parts[0] === '') { $start = $size - $parts[1]; $end = $size - 1; } else { $start = $parts[0]; $end = $parts[1] === '' ? $size - 1 : $parts[1]; } if ($start > $end) { $this->sendNotSatisfiable($size); } $buffer = substr($data['content'], $start, $end - $start); $md5Sum = md5($buffer); // send the headers and data $this->addHeader('Content-Length', $end - $start); $this->addHeader('Content-md5', $md5Sum); $this->addHeader('Accept-Ranges', 'bytes'); $this->addHeader('Content-Range', 'bytes ' . $start . '-' . $end . '/' . $size); $this->addHeader('Connection', 'close'); $this->addHeader('Content-Type', $data['mimetype']); $this->addContentDispositionHeader(); return $buffer; } } $this->addHeader('Content-Type', $data['mimetype']); $this->addContentDispositionHeader(); $this->addHeader('Content-Length', $size); return $data['content']; }