diff --git a/lib/Service/ApiService.php b/lib/Service/ApiService.php index a5cbc03e207..5ed1b3e7924 100644 --- a/lib/Service/ApiService.php +++ b/lib/Service/ApiService.php @@ -31,6 +31,7 @@ use OCA\Text\AppInfo\Application; use OCA\Text\DocumentHasUnsavedChangesException; use OCA\Text\DocumentSaveConflictException; +use OCA\Text\TextFile; use OCA\Text\VersionMismatchException; use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Http; @@ -141,7 +142,7 @@ public function fetch($documentId, $sessionId, $sessionToken) { if ($this->sessionService->isValidSession($documentId, $sessionId, $sessionToken)) { $this->sessionService->removeInactiveSessions($documentId); try { - $file = $this->documentService->getBaseFile($documentId); + $file = new TextFile($this->documentService->getBaseFile($documentId), $this->encodingService); } catch (NotFoundException $e) { return new NotFoundResponse(); } diff --git a/lib/TextFile.php b/lib/TextFile.php new file mode 100644 index 00000000000..30b58c84c80 --- /dev/null +++ b/lib/TextFile.php @@ -0,0 +1,96 @@ + + * + * @author Raul Ferreira Fuentes + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCA\Text; + +use OCA\Text\Service\EncodingService; +use OCP\Files\NotFoundException; +use OCP\Files\SimpleFS\ISimpleFile; + +/** + * Wrapper around a ISimpleFile object to ensure that it is correctly encoded (UTF-8) for the text app. + */ +class TextFile implements ISimpleFile { + + /** @var ISimpleFile */ + private $file; + /** @var EncodingService */ + private $encodingService; + + public function __construct(ISimpleFile $file, EncodingService $encodingService) { + $this->file = $file; + $this->encodingService = $encodingService; + } + + public function getName() { + return $this->file->getName(); + } + + public function getSize() { + return $this->file->getSize(); + } + + public function getETag() { + return $this->file->getETag(); + } + + public function getMTime() { + return $this->file->getMTime(); + } + + public function getContent() { + $content = $this->encodingService->encodeToUtf8($this->file->getContent()); + if (!$content) { + throw new NotFoundException('File not compatible with text because it could not be encoded to UTF-8.'); + } + + return $content; + } + + public function putContent($data) { + return $this->file->putContent($data); + } + + public function delete() { + $this->file->delete(); + } + + public function getMimeType() { + return 'text/plain;encoding=utf-8'; + } + + public function getExtension(): string { + return $this->file->getExtension(); + } + + public function read() { + return $this->file->read(); + } + + public function write() { + return $this->file->write(); + } +}