Refacto all project

This commit is contained in:
Michel Roux 2023-06-16 16:58:23 +02:00
parent ba42ac92af
commit e896016ff9
33 changed files with 1518 additions and 1165 deletions

7
.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
.idea
*.iml
/vendor/
/build/
node_modules/
/.php-cs-fixer.cache
js/*hot-update.*

18
.php-cs-fixer.dist.php Normal file
View File

@ -0,0 +1,18 @@
<?php
declare(strict_types=1);
require_once './vendor/autoload.php';
use Nextcloud\CodingStandard\Config;
$config = new Config();
$config
->getFinder()
->ignoreVCSIgnored(true)
->notPath('build')
->notPath('l10n')
->notPath('src')
->notPath('vendor')
->in(__DIR__);
return $config;

View File

@ -12,7 +12,6 @@
namespace OCA\Epubreader\AppInfo; namespace OCA\Epubreader\AppInfo;
use OCP\AppFramework\App;
use OCP\Util; use OCP\Util;
$l = \OC::$server->getL10N('epubreader'); $l = \OC::$server->getL10N('epubreader');

View File

@ -29,7 +29,7 @@ See [README] for more exhaustive information on features and potential misfeatur
[README]: https://github.com/e-alfred/epubreader/blob/master/epubreader/README.md [README]: https://github.com/e-alfred/epubreader/blob/master/epubreader/README.md
]]> ]]>
</description> </description>
<version>1.4.7</version> <version>1.4.8</version>
<licence>agpl</licence> <licence>agpl</licence>
<author>Frank de Lange</author> <author>Frank de Lange</author>
<author>e-alfred</author> <author>e-alfred</author>
@ -46,7 +46,7 @@ See [README] for more exhaustive information on features and potential misfeatur
<screenshot>https://github.com/e-alfred/epubreader/blob/master/screenshots/photo_2017-03-15_17-22-00.jpg?raw=true</screenshot> <screenshot>https://github.com/e-alfred/epubreader/blob/master/screenshots/photo_2017-03-15_17-22-00.jpg?raw=true</screenshot>
<screenshot>https://github.com/e-alfred/epubreader/blob/master/screenshots/photo_2017-03-15_17-22-02.jpg?raw=true</screenshot> <screenshot>https://github.com/e-alfred/epubreader/blob/master/screenshots/photo_2017-03-15_17-22-02.jpg?raw=true</screenshot>
<dependencies> <dependencies>
<nextcloud min-version="21" max-version="23"/> <nextcloud min-version="21" max-version="27"/>
</dependencies> </dependencies>
<settings> <settings>
<personal>OCA\Epubreader\Settings\Personal</personal> <personal>OCA\Epubreader\Settings\Personal</personal>

View File

@ -11,31 +11,30 @@
*/ */
return ['routes' => [ return ['routes' => [
// Page // Page
['name' => 'page#showReader', 'url' => '/', 'verb' => 'GET'], ['name' => 'page#showReader', 'url' => '/', 'verb' => 'GET'],
// Bookmarks // Bookmarks
['name' => 'bookmark#get_cursor', 'url' => '/bookmark/cursor/{fileId}', 'verb' => 'GET'], ['name' => 'bookmark#get_cursor', 'url' => '/bookmark/cursor/{fileId}', 'verb' => 'GET'],
['name' => 'bookmark#set_cursor', 'url' => '/bookmark/cursor', 'verb' => 'POST'], ['name' => 'bookmark#set_cursor', 'url' => '/bookmark/cursor', 'verb' => 'POST'],
['name' => 'bookmark#delete_cursor', 'url' => '/bookmark/cursor/{fileId}', 'verb' => 'DELETE'], ['name' => 'bookmark#delete_cursor', 'url' => '/bookmark/cursor/{fileId}', 'verb' => 'DELETE'],
['name' => 'bookmark#get', 'url' => '/bookmark/{fileId}/{name}', 'verb' => 'GET', 'defaults' => ['name' => '']], ['name' => 'bookmark#get', 'url' => '/bookmark/{fileId}/{name}', 'verb' => 'GET', 'defaults' => ['name' => '']],
['name' => 'bookmark#get', 'url' => '/bookmark/{fileId}/{type}/{name}', 'verb' => 'GET', 'defaults' => ['name' => '']], ['name' => 'bookmark#get', 'url' => '/bookmark/{fileId}/{type}/{name}', 'verb' => 'GET', 'defaults' => ['name' => '']],
['name' => 'bookmark#set', 'url' => '/bookmark', 'verb' => 'POST'], ['name' => 'bookmark#set', 'url' => '/bookmark', 'verb' => 'POST'],
['name' => 'bookmark#delete', 'url' => '/bookmark/{fileId}/{name}', 'verb' => 'DELETE'], ['name' => 'bookmark#delete', 'url' => '/bookmark/{fileId}/{name}', 'verb' => 'DELETE'],
// Metadata // Metadata
['name' => 'metadata#get', 'url' => '/metadata/{fileId}/{name}', 'verb' => 'GET', 'defaults' => ['name' => '']], ['name' => 'metadata#get', 'url' => '/metadata/{fileId}/{name}', 'verb' => 'GET', 'defaults' => ['name' => '']],
['name' => 'metadata#set', 'url' => '/metadata/{fileId}/{name}/{value}', 'verb' => 'POST'], ['name' => 'metadata#set', 'url' => '/metadata/{fileId}/{name}/{value}', 'verb' => 'POST'],
// Preferences // Preferences
['name' => 'preference#get_default', 'url' => '/preference/default/{scope}/{name}', 'verb' => 'GET', 'defaults' => ['name' => '']], ['name' => 'preference#get_default', 'url' => '/preference/default/{scope}/{name}', 'verb' => 'GET', 'defaults' => ['name' => '']],
['name' => 'preference#set_default', 'url' => '/preference/default', 'verb' => 'POST'], ['name' => 'preference#set_default', 'url' => '/preference/default', 'verb' => 'POST'],
['name' => 'preference#delete_default', 'url' => '/preference/default/{scope}/{name}', 'verb' => 'DELETE'], ['name' => 'preference#delete_default', 'url' => '/preference/default/{scope}/{name}', 'verb' => 'DELETE'],
['name' => 'preference#get', 'url' => '/preference/{fileId}/{scope}/{name}', 'verb' => 'GET', 'defaults' => ['name' => '']], ['name' => 'preference#get', 'url' => '/preference/{fileId}/{scope}/{name}', 'verb' => 'GET', 'defaults' => ['name' => '']],
['name' => 'preference#set', 'url' => '/preference', 'verb' => 'POST'], ['name' => 'preference#set', 'url' => '/preference', 'verb' => 'POST'],
['name' => 'preference#delete', 'url' => '/preference/{fileId}/{scope}/{name}', 'verb' => 'DELETE'], ['name' => 'preference#delete', 'url' => '/preference/{fileId}/{scope}/{name}', 'verb' => 'DELETE'],
// User Settings // User Settings
['name' => 'settings#setPreference', 'url' => '/settings/set', 'verb' => 'POST'], ['name' => 'settings#setPreference', 'url' => '/settings/set', 'verb' => 'POST'],
]]; ]];

30
composer.json Normal file
View File

@ -0,0 +1,30 @@
{
"name": "nextcloud/epubreader",
"description": "EPUB/CBZ/PDF ebook reader",
"version": "1.4.8",
"type": "project",
"license": "AGPL-3.0-or-later",
"require-dev": {
"nextcloud/ocp": "^21.0.0",
"psalm/phar": "^5.12.0",
"nextcloud/coding-standard": "^1.1.1"
},
"scripts": {
"lint": "find . -name \\*.php -not -path './vendor/*' -print0 | xargs -0 -n1 php -l",
"cs:check": "php-cs-fixer fix --dry-run --diff",
"cs:fix": "php-cs-fixer fix",
"psalm": "psalm.phar --threads=1 --no-cache",
"psalm:fix": "psalm.phar --no-cache --alter --issues=InvalidReturnType,InvalidNullableReturnType,MissingParamType,InvalidFalsableReturnType"
},
"autoload": {
"psr-4": {
"OCA\\Epubreader\\": "lib/",
"OC\\": "stubs/oc/"
}
},
"config": {
"platform": {
"php": "7.4"
}
}
}

189
composer.lock generated Normal file
View File

@ -0,0 +1,189 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "6684feffdd51c1ea6c0f31066f3e5560",
"packages": [],
"packages-dev": [
{
"name": "nextcloud/coding-standard",
"version": "v1.1.1",
"source": {
"type": "git",
"url": "https://github.com/nextcloud/coding-standard.git",
"reference": "55def702fb9a37a219511e1d8c6fe8e37164c1fb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nextcloud/coding-standard/zipball/55def702fb9a37a219511e1d8c6fe8e37164c1fb",
"reference": "55def702fb9a37a219511e1d8c6fe8e37164c1fb",
"shasum": ""
},
"require": {
"php": "^7.3|^8.0",
"php-cs-fixer/shim": "^3.17"
},
"type": "library",
"autoload": {
"psr-4": {
"Nextcloud\\CodingStandard\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Christoph Wurst",
"email": "christoph@winzerhof-wurst.at"
}
],
"description": "Nextcloud coding standards for the php cs fixer",
"support": {
"issues": "https://github.com/nextcloud/coding-standard/issues",
"source": "https://github.com/nextcloud/coding-standard/tree/v1.1.1"
},
"time": "2023-06-01T12:05:01+00:00"
},
{
"name": "nextcloud/ocp",
"version": "v21.0.0",
"source": {
"type": "git",
"url": "https://github.com/nextcloud-deps/ocp.git",
"reference": "41e1476b4aed5bce7371895054049eca353729c5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/41e1476b4aed5bce7371895054049eca353729c5",
"reference": "41e1476b4aed5bce7371895054049eca353729c5",
"shasum": ""
},
"require": {
"php": "^7.3 || ~8.0.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "21.0.0-dev"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Christoph Wurst",
"email": "christoph@winzerhof-wurst.at"
}
],
"description": "Composer package containing Nextcloud's public API (classes, interfaces)",
"support": {
"source": "https://github.com/nextcloud-deps/ocp/tree/v21.0.0"
},
"time": "2021-03-01T08:42:25+00:00"
},
{
"name": "php-cs-fixer/shim",
"version": "v3.17.0",
"source": {
"type": "git",
"url": "https://github.com/PHP-CS-Fixer/shim.git",
"reference": "f51b4aed90565c447136f1d015798f6f7c82490f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/f51b4aed90565c447136f1d015798f6f7c82490f",
"reference": "f51b4aed90565c447136f1d015798f6f7c82490f",
"shasum": ""
},
"require": {
"ext-json": "*",
"ext-tokenizer": "*",
"php": "^7.4 || ^8.0"
},
"replace": {
"friendsofphp/php-cs-fixer": "self.version"
},
"suggest": {
"ext-dom": "For handling output formats in XML",
"ext-mbstring": "For handling non-UTF8 characters."
},
"bin": [
"php-cs-fixer",
"php-cs-fixer.phar"
],
"type": "application",
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
},
{
"name": "Dariusz Rumiński",
"email": "dariusz.ruminski@gmail.com"
}
],
"description": "A tool to automatically fix PHP code style",
"support": {
"issues": "https://github.com/PHP-CS-Fixer/shim/issues",
"source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.17.0"
},
"time": "2023-05-22T20:00:38+00:00"
},
{
"name": "psalm/phar",
"version": "5.12.0",
"source": {
"type": "git",
"url": "https://github.com/psalm/phar.git",
"reference": "e7f9306ec83c706b4dba451f6adfb865ce4688e4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/psalm/phar/zipball/e7f9306ec83c706b4dba451f6adfb865ce4688e4",
"reference": "e7f9306ec83c706b4dba451f6adfb865ce4688e4",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"conflict": {
"vimeo/psalm": "*"
},
"bin": [
"psalm.phar"
],
"type": "library",
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Composer-based Psalm Phar",
"support": {
"issues": "https://github.com/psalm/phar/issues",
"source": "https://github.com/psalm/phar/tree/5.12.0"
},
"time": "2023-05-22T21:30:41+00:00"
}
],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": [],
"platform-dev": [],
"platform-overrides": {
"php": "7.4"
},
"plugin-api-version": "2.3.0"
}

View File

@ -10,115 +10,114 @@
namespace OCA\Epubreader\Controller; namespace OCA\Epubreader\Controller;
use OCP\IRequest;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\DataResponse;
use OCA\Epubreader\Service\BookmarkService; use OCA\Epubreader\Service\BookmarkService;
use OCP\AppFramework\Controller;
use OCP\IRequest;
class BookmarkController extends Controller { class BookmarkController extends Controller {
private $bookmarkService; private $bookmarkService;
/** /**
* @param string $AppName * @param string $AppName
* @param IRequest $request * @param IRequest $request
* @param BookmarkService $bookmarkService * @param BookmarkService $bookmarkService
*/ */
public function __construct($AppName, public function __construct($AppName,
IRequest $request, IRequest $request,
BookmarkService $bookmarkService ) { BookmarkService $bookmarkService) {
parent::__construct($AppName, $request); parent::__construct($AppName, $request);
$this->bookmarkService = $bookmarkService; $this->bookmarkService = $bookmarkService;
} }
/** /**
* @brief return bookmark * @brief return bookmark
* *
* @NoAdminRequired * @NoAdminRequired
* @NoCSRFRequired * @NoCSRFRequired
* *
* @param int $fileId * @param int $fileId
* @param string $name * @param string $name
* *
* @return array|\OCP\AppFramework\Http\JSONResponse * @return array|\OCP\AppFramework\Http\JSONResponse
*/ */
public function get($fileId, $name, $type=null) { public function get($fileId, $name, $type = null) {
return $this->bookmarkService->get($fileId, $name, $type); return $this->bookmarkService->get($fileId, $name, $type);
} }
/** /**
* @brief write bookmark * @brief write bookmark
* *
* @NoAdminRequired * @NoAdminRequired
* @NoCSRFRequired * @NoCSRFRequired
* *
* @param int $fileId * @param int $fileId
* @param string $name * @param string $name
* @param string $value * @param string $value
* *
* @return array|\OCP\AppFramework\Http\JSONResponse * @return array|\OCP\AppFramework\Http\JSONResponse
*/ */
public function set($fileId, $name, $value, $type=null, $content=null) { public function set($fileId, $name, $value, $type = null, $content = null) {
return $this->bookmarkService->set($fileId, $name, $value, $type, $content); return $this->bookmarkService->set($fileId, $name, $value, $type, $content);
} }
/** /**
* @brief return cursor for $fileId * @brief return cursor for $fileId
* *
* @NoAdminRequired * @NoAdminRequired
* @NoCSRFRequired * @NoCSRFRequired
* *
* @param int $fileId * @param int $fileId
* *
* @return array|\OCP\AppFramework\Http\JSONResponse * @return array|\OCP\AppFramework\Http\JSONResponse
*/ */
public function getCursor($fileId) { public function getCursor($fileId) {
return $this->bookmarkService->getCursor($fileId); return $this->bookmarkService->getCursor($fileId);
} }
/** /**
* @brief write cursor for $fileId * @brief write cursor for $fileId
* *
* @NoAdminRequired * @NoAdminRequired
* @NoCSRFRequired * @NoCSRFRequired
* *
* @param int $fileId * @param int $fileId
* @param string $value * @param string $value
* *
* @return array|\OCP\AppFramework\Http\JSONResponse * @return array|\OCP\AppFramework\Http\JSONResponse
*/ */
public function setCursor($fileId, $value) { public function setCursor($fileId, $value) {
return $this->bookmarkService->setCursor($fileId, $value); return $this->bookmarkService->setCursor($fileId, $value);
} }
/** /**
* @brief delete bookmark * @brief delete bookmark
* *
* @NoAdminRequired * @NoAdminRequired
* @NoCSRFRequired * @NoCSRFRequired
* *
* @param int $fileId * @param int $fileId
* @param string name * @param string name
* *
*/ */
public function delete($fileId, $name) { public function delete($fileId, $name) {
return $this->bookmarkService->delete($fileId, $name); return $this->bookmarkService->delete($fileId, $name);
} }
/** /**
* @brief delete cursor * @brief delete cursor
* *
* @NoAdminRequired * @NoAdminRequired
* @NoCSRFRequired * @NoCSRFRequired
* *
* @param int $fileId * @param int $fileId
* *
*/ */
public function deleteCursor($fileId) { public function deleteCursor($fileId) {
return $this->bookmarkService->deleteCursor($fileId); return $this->bookmarkService->deleteCursor($fileId);
} }
} }

View File

@ -10,71 +10,71 @@
namespace OCA\Epubreader\Controller; namespace OCA\Epubreader\Controller;
use OCP\IRequest; use OCA\Epubreader\Service\MetadataService;
use OCP\AppFramework\Controller; use OCP\AppFramework\Controller;
use OCA\Epubreader\Service\MetadataService; use OCP\IRequest;
class MetadataController extends Controller { class MetadataController extends Controller {
private $metadataService; private $metadataService;
/** /**
* @param string $AppName * @param string $AppName
* @param IRequest $request * @param IRequest $request
* @param MetadataService $metadataService * @param MetadataService $metadataService
*/ */
public function __construct($AppName, public function __construct($AppName,
IRequest $request, IRequest $request,
MetadataService $metadataService ) { MetadataService $metadataService) {
parent::__construct($AppName, $request); parent::__construct($AppName, $request);
$this->metadataService = $metadataService; $this->metadataService = $metadataService;
} }
/** /**
* @brief write metadata * @brief write metadata
* *
* @NoAdminRequired * @NoAdminRequired
* *
* @param int $fileId * @param int $fileId
* @param string $value * @param string $value
* *
* @return array|\OCP\AppFramework\Http\JSONResponse * @return array|\OCP\AppFramework\Http\JSONResponse
*/ */
public function setAll($fileId, $value) { public function setAll($fileId, $value) {
return $this->metadataService->setAll($fileId, $value); return $this->metadataService->setAll($fileId, $value);
} }
/** /**
* @brief return metadata item * @brief return metadata item
* *
* @NoAdminRequired * @NoAdminRequired
* @NoCSRFRequired * @NoCSRFRequired
* *
* @param int $fileId * @param int $fileId
* @param string $name * @param string $name
* *
* @return array|\OCP\AppFramework\Http\JSONResponse * @return array|\OCP\AppFramework\Http\JSONResponse
*/ */
public function get($fileId, $name) { public function get($fileId, $name) {
return $this->metadataService->get($fileId, $name); return $this->metadataService->get($fileId, $name);
} }
/** /**
* @brief write metadata item * @brief write metadata item
* *
* @NoAdminRequired * @NoAdminRequired
* *
* @param int $fileId * @param int $fileId
* @param string $name * @param string $name
* @param string $value * @param string $value
* *
* @return array|\OCP\AppFramework\Http\JSONResponse * @return array|\OCP\AppFramework\Http\JSONResponse
*/ */
public function set($fileId, $name, $value) { public function set($fileId, $name, $value) {
return $this->metadataService->set($fileId, $name, $value); return $this->metadataService->set($fileId, $name, $value);
} }
} }

View File

@ -10,104 +10,102 @@
namespace OCA\Epubreader\Controller; namespace OCA\Epubreader\Controller;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\IRequest;
use OCP\IURLGenerator;
use OCP\Files\IRootFolder;
use OCP\Share\IManager;
use OCP\Files\FileInfo;
use OCP\Files\NotFoundException;
use OCA\Epubreader\Service\BookmarkService; use OCA\Epubreader\Service\BookmarkService;
use OCA\Epubreader\Service\MetadataService; use OCA\Epubreader\Service\MetadataService;
use OCA\Epubreader\Service\PreferenceService; use OCA\Epubreader\Service\PreferenceService;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException;
use OCP\IRequest;
use OCP\IURLGenerator;
use OCP\Share\IManager;
class PageController extends Controller { class PageController extends Controller {
/** @var IURLGenerator */ /** @var IURLGenerator */
private $urlGenerator; private $urlGenerator;
/** @var IRootFolder */ /** @var IRootFolder */
private $rootFolder; private $rootFolder;
private $shareManager; private $shareManager;
private $userId; private $userId;
private $bookmarkService; private $bookmarkService;
private $metadataService; private $metadataService;
private $preferenceService; private $preferenceService;
/** /**
* @param string $AppName * @param string $AppName
* @param IRequest $request * @param IRequest $request
* @param IURLGenerator $urlGenerator * @param IURLGenerator $urlGenerator
* @param IRootFolder $rootFolder * @param IRootFolder $rootFolder
* @param IManager $shareManager * @param IManager $shareManager
* @param string $UserId * @param string $UserId
* @param BookmarkService $bookmarkService * @param BookmarkService $bookmarkService
* @param PreferenceService $preferenceService * @param PreferenceService $preferenceService
* @param MetadataService $metadataService * @param MetadataService $metadataService
*/ */
public function __construct( public function __construct(
$AppName, $AppName,
IRequest $request, IRequest $request,
IURLGenerator $urlGenerator, IURLGenerator $urlGenerator,
IRootFolder $rootFolder, IRootFolder $rootFolder,
IManager $shareManager, IManager $shareManager,
$UserId, $UserId,
BookmarkService $bookmarkService, BookmarkService $bookmarkService,
PreferenceService $preferenceService, PreferenceService $preferenceService,
MetadataService $metadataService) { MetadataService $metadataService) {
parent::__construct($AppName, $request); parent::__construct($AppName, $request);
$this->urlGenerator = $urlGenerator; $this->urlGenerator = $urlGenerator;
$this->rootFolder = $rootFolder; $this->rootFolder = $rootFolder;
$this->shareManager = $shareManager; $this->shareManager = $shareManager;
$this->userId = $UserId; $this->userId = $UserId;
$this->bookmarkService = $bookmarkService; $this->bookmarkService = $bookmarkService;
$this->metadataService = $metadataService; $this->metadataService = $metadataService;
$this->preferenceService = $preferenceService; $this->preferenceService = $preferenceService;
} }
/** /**
* @PublicPage * @PublicPage
* @NoCSRFRequired * @NoCSRFRequired
* *
* @return TemplateResponse * @return TemplateResponse
*/ */
public function showReader() { public function showReader() {
$templates= [ $templates = [
'application/epub+zip' => 'epubreader', 'application/epub+zip' => 'epubreader',
'application/x-cbr' => 'cbreader', 'application/x-cbr' => 'cbreader',
'application/pdf' => 'pdfreader' 'application/pdf' => 'pdfreader'
]; ];
/** /**
* $fileInfo = [ * $fileInfo = [
* fileId => null, * fileId => null,
* fileName => null, * fileName => null,
* fileType => null * fileType => null
* ]; * ];
*/ */
$fileInfo = $this->getFileInfo($this->request->get['file']); $fileInfo = $this->getFileInfo($this->request->getParam('file'));
$fileId = $fileInfo['fileId']; $fileId = $fileInfo['fileId'];
$type = $this->request->get["type"]; $type = $this->request->getParam('type');
$scope = $template = $templates[$type]; $scope = $template = $templates[$type];
$params = [ $params = [
'urlGenerator' => $this->urlGenerator, 'urlGenerator' => $this->urlGenerator,
'downloadLink' => $this->request->get['file'], 'downloadLink' => $this->request->getParam('file'),
'scope' => $scope, 'scope' => $scope,
'fileId' => $fileInfo['fileId'], 'fileId' => $fileInfo['fileId'],
'fileName' => $fileInfo['fileName'], 'fileName' => $fileInfo['fileName'],
'fileType' => $fileInfo['fileType'], 'fileType' => $fileInfo['fileType'],
'cursor' => $this->toJson($this->bookmarkService->getCursor($fileId)), 'cursor' => $this->toJson($this->bookmarkService->getCursor($fileId)),
'defaults' => $this->toJson($this->preferenceService->getDefault($scope)), 'defaults' => $this->toJson($this->preferenceService->getDefault($scope)),
'preferences' => $this->toJson($this->preferenceService->get($scope, $fileId)), 'preferences' => $this->toJson($this->preferenceService->get($scope, $fileId)),
'defaults' => $this->toJson($this->preferenceService->getDefault($scope)), 'metadata' => $this->toJson($this->metadataService->get($fileId)),
'metadata' => $this->toJson($this->metadataService->get($fileId)), 'annotations' => $this->toJson($this->bookmarkService->get($fileId))
'annotations' => $this->toJson($this->bookmarkService->get($fileId)) ];
];
$policy = new ContentSecurityPolicy(); $policy = new ContentSecurityPolicy();
$policy->addAllowedStyleDomain('\'self\''); $policy->addAllowedStyleDomain('\'self\'');
$policy->addAllowedStyleDomain('blob:'); $policy->addAllowedStyleDomain('blob:');
$policy->addAllowedScriptDomain('\'self\''); $policy->addAllowedScriptDomain('\'self\'');
@ -118,60 +116,59 @@ class PageController extends Controller {
$policy->addAllowedFontDomain('blob:'); $policy->addAllowedFontDomain('blob:');
$policy->addAllowedImageDomain('blob:'); $policy->addAllowedImageDomain('blob:');
$response = new TemplateResponse($this->appName, $template, $params, 'blank'); $response = new TemplateResponse($this->appName, $template, $params, 'blank');
$response->setContentSecurityPolicy($policy); $response->setContentSecurityPolicy($policy);
return $response; return $response;
} }
/** /**
* @brief sharing-aware file info retriever * @brief sharing-aware file info retriever
* *
* Work around the differences between normal and shared file access * Work around the differences between normal and shared file access
* (this should be abstracted away in OC/NC IMnsHO) * (this should be abstracted away in OC/NC IMnsHO)
* *
* @param string $path path-fragment from url * @param string $path path-fragment from url
* @return array * @return array
* @throws NotFoundException * @throws NotFoundException
*/ */
private function getFileInfo($path) { private function getFileInfo($path) {
$count = 0; $count = 0;
$shareToken = preg_replace("/(?:\/index\.php)?\/s\/([A-Za-z0-9]{15,32})\/download.*/", "$1", $path, 1,$count); $shareToken = preg_replace("/(?:\/index\.php)?\/s\/([A-Za-z0-9]{15,32})\/download.*/", "$1", $path, 1, $count);
if ($count === 1) { if ($count === 1) {
/* shared file or directory */ /* shared file or directory */
$node = $this->shareManager->getShareByToken($shareToken)->getNode(); $node = $this->shareManager->getShareByToken($shareToken)->getNode();
$type = $node->getType(); $type = $node->getType();
/* shared directory, need file path to continue, */ /* shared directory, need file path to continue, */
if ($type == \OCP\Files\FileInfo::TYPE_FOLDER) { if ($type == \OCP\Files\FileInfo::TYPE_FOLDER) {
$query = []; $query = [];
parse_str(parse_url($path, PHP_URL_QUERY), $query); parse_str(parse_url($path, PHP_URL_QUERY), $query);
if (isset($query['path']) && isset($query['files'])) { if (isset($query['path']) && isset($query['files'])) {
$node = $node->get($query['path'])->get($query['files']); $node = $node->get($query['path'])->get($query['files']);
} else { } else {
throw new NotFoundException('Shared file path or name not set'); throw new NotFoundException('Shared file path or name not set');
} }
} }
$filePath = $node->getPath(); $filePath = $node->getPath();
$fileId = $node->getId(); $fileId = $node->getId();
} else { } else {
$filePath = $path; $filePath = $path;
$fileId = $this->rootFolder->getUserFolder($this->userId) $fileId = $this->rootFolder->getUserFolder($this->userId)
->get(preg_replace("/.*\/remote.php\/webdav(.*)/", "$1", rawurldecode($this->request->get['file']))) ->get(preg_replace("/.*\/remote.php\/webdav(.*)/", "$1", rawurldecode($this->request->getParam('file'))))
->getFileInfo() ->getId();
->getId(); }
}
return [ return [
'fileName' => pathInfo($filePath, PATHINFO_FILENAME), 'fileName' => pathInfo($filePath, PATHINFO_FILENAME),
'fileType' => strtolower(pathInfo($filePath, PATHINFO_EXTENSION)), 'fileType' => strtolower(pathInfo($filePath, PATHINFO_EXTENSION)),
'fileId' => $fileId 'fileId' => $fileId
]; ];
} }
private function toJson($value) { private function toJson($value) {
return htmlspecialchars(json_encode($value), ENT_QUOTES, 'UTF-8'); return htmlspecialchars(json_encode($value), ENT_QUOTES, 'UTF-8');
} }
} }

View File

@ -10,119 +10,118 @@
namespace OCA\Epubreader\Controller; namespace OCA\Epubreader\Controller;
use OCP\IRequest;
use OCP\IURLGenerator;
use OCP\AppFramework\Http;
use OCP\AppFramework\Controller;
use OCA\Epubreader\Service\PreferenceService; use OCA\Epubreader\Service\PreferenceService;
use OCP\AppFramework\Controller;
use OCP\IRequest;
use OCP\IURLGenerator;
class PreferenceController extends Controller { class PreferenceController extends Controller {
private $urlGenerator; private $urlGenerator;
private $preferenceService; private $preferenceService;
/** /**
* @param string $AppName * @param string $AppName
* @param IRequest $request * @param IRequest $request
* @param IURLGenerator $urlGenerator * @param IURLGenerator $urlGenerator
* @param PreferenceService $preferenceService * @param PreferenceService $preferenceService
*/ */
public function __construct($AppName, public function __construct($AppName,
IRequest $request, IRequest $request,
IURLGenerator $urlGenerator, IURLGenerator $urlGenerator,
PreferenceService $preferenceService ) { PreferenceService $preferenceService) {
parent::__construct($AppName, $request); parent::__construct($AppName, $request);
$this->urlGenerator = $urlGenerator; $this->urlGenerator = $urlGenerator;
$this->preferenceService = $preferenceService; $this->preferenceService = $preferenceService;
} }
/** /**
* @brief return preference for $fileId * @brief return preference for $fileId
* *
* @NoAdminRequired * @NoAdminRequired
* @NoCSRFRequired * @NoCSRFRequired
* *
* @param string $scope * @param string $scope
* @param int $fileId * @param int $fileId
* @param string $name if null, return all preferences for $scope + $fileId * @param string $name if null, return all preferences for $scope + $fileId
* *
* @return array|\OCP\AppFramework\Http\JSONResponse * @return array|\OCP\AppFramework\Http\JSONResponse
*/ */
public function get($scope, $fileId, $name) { public function get($scope, $fileId, $name) {
return $this->preferenceService->get($scope, $fileId, $name); return $this->preferenceService->get($scope, $fileId, $name);
} }
/** /**
* @brief write preference for $fileId * @brief write preference for $fileId
* *
* @NoAdminRequired * @NoAdminRequired
* @NoCSRFRequired * @NoCSRFRequired
* *
* @param string $scope * @param string $scope
* @param int $fileId * @param int $fileId
* @param string $name * @param string $name
* @param string $value * @param string $value
* *
* @return array|\OCP\AppFramework\Http\JSONResponse * @return array|\OCP\AppFramework\Http\JSONResponse
*/ */
public function set($scope, $fileId, $name, $value) { public function set($scope, $fileId, $name, $value) {
return $this->preferenceService->set($scope, $fileId, $name, $value); return $this->preferenceService->set($scope, $fileId, $name, $value);
} }
/** /**
* @brief return default preference * @brief return default preference
* *
* @NoAdminRequired * @NoAdminRequired
* @NoCSRFRequired * @NoCSRFRequired
* *
* @param string $scope * @param string $scope
* @param string $name if null, return all default preferences for scope * @param string $name if null, return all default preferences for scope
* *
* @return array|\OCP\AppFramework\Http\JSONResponse * @return array|\OCP\AppFramework\Http\JSONResponse
*/ */
public function getDefault($scope, $name) { public function getDefault($scope, $name) {
return $this->preferenceService->getDefault($scope, $name); return $this->preferenceService->getDefault($scope, $name);
} }
/** /**
* @brief write default preference * @brief write default preference
* *
* @NoAdminRequired * @NoAdminRequired
* @NoCSRFRequired * @NoCSRFRequired
* *
* @param string $scope * @param string $scope
* @param string $name * @param string $name
* @param string $value * @param string $value
* *
* @return array|\OCP\AppFramework\Http\JSONResponse * @return array|\OCP\AppFramework\Http\JSONResponse
*/ */
public function setDefault($scope, $name, $value) { public function setDefault($scope, $name, $value) {
return $this->preferenceService->setDefault($scope, $name, $value); return $this->preferenceService->setDefault($scope, $name, $value);
} }
/** /**
* @brief delete preference * @brief delete preference
* *
* @param string $scope * @param string $scope
* @param int $fileId * @param int $fileId
* @param string $name * @param string $name
* *
*/ */
public function delete($scope, $fileId, $name) { public function delete($scope, $fileId, $name) {
return $this->preferenceService->delete($scope, $fileId, $name); return $this->preferenceService->delete($scope, $fileId, $name);
} }
/** /**
* @brief delete default preference * @brief delete default preference
* *
* @param $scope * @param $scope
* @param $name * @param $name
* *
*/ */
public function deleteDefault($scope, $name) { public function deleteDefault($scope, $name) {
return $this->preferenceService->deleteDefault($scope, $name); return $this->preferenceService->deleteDefault($scope, $name);
} }
} }

View File

@ -11,47 +11,47 @@
*/ */
namespace OCA\Epubreader\Controller; namespace OCA\Epubreader\Controller;
use OCA\Epubreader\Config;
use OCA\Epubreader\Service\PreferenceService;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\JSONResponse;
use OCP\IRequest; use OCP\IRequest;
use OCP\IURLGenerator; use OCP\IURLGenerator;
use OCP\AppFramework\Http;
use OCP\AppFramework\Controller;
use OCA\Epubreader\Service\PreferenceService;
use OCA\Epubreader\Config;
use OCP\AppFramework\Http\JSONResponse;
class SettingsController extends Controller { class SettingsController extends Controller {
private $urlGenerator; private $urlGenerator;
private $preferenceService; private $preferenceService;
/**
* @param string $AppName
* @param IRequest $request
* @param IURLGenerator $urlGenerator
* @param PreferenceService $preferenceService
*/
public function __construct($AppName,
IRequest $request,
IURLGenerator $urlGenerator,
PreferenceService $preferenceService ) {
parent::__construct($AppName, $request);
$this->urlGenerator = $urlGenerator;
$this->preferenceService = $preferenceService;
}
/** /**
* @brief set preference for file type association * @param string $AppName
* * @param IRequest $request
* @NoAdminRequired * @param IURLGenerator $urlGenerator
* * @param PreferenceService $preferenceService
* @param int $EpubEnable */
* @param int $EpubEnable public function __construct($AppName,
* @param int $CbxEnable IRequest $request,
* IURLGenerator $urlGenerator,
PreferenceService $preferenceService) {
parent::__construct($AppName, $request);
$this->urlGenerator = $urlGenerator;
$this->preferenceService = $preferenceService;
}
/**
* @brief set preference for file type association
*
* @NoAdminRequired
*
* @param int $EpubEnable
* @param int $PdfEnable
* @param int $CbxEnable
*
* @return array|\OCP\AppFramework\Http\JSONResponse * @return array|\OCP\AppFramework\Http\JSONResponse
*/ */
public function setPreference(string $EpubEnable, string $PdfEnable, string $CbxEnable) { public function setPreference(int $EpubEnable, int $PdfEnable, int $CbxEnable) {
$l = \OC::$server->getL10N('epubreader'); $l = \OC::$server->getL10N('epubreader');
@ -60,9 +60,9 @@ class SettingsController extends Controller {
Config::set('cbx_enable', $CbxEnable); Config::set('cbx_enable', $CbxEnable);
$response = array( $response = array(
'data' => array('message'=> $l->t('Settings updated successfully.')), 'data' => array('message' => $l->t('Settings updated successfully.')),
'status' => 'success' 'status' => 'success'
); );
return new JSONResponse($response); return new JSONResponse($response);
} }

View File

@ -10,39 +10,92 @@
namespace OCA\Epubreader\Db; namespace OCA\Epubreader\Db;
use OCP\AppFramework\Db\Entity;
class Bookmark extends ReaderEntity implements \JsonSerializable { class Bookmark extends ReaderEntity implements \JsonSerializable {
protected $userId; // user protected $userId; // user
protected $fileId; // book (identified by fileId) for which this mark is valid protected $fileId; // book (identified by fileId) for which this mark is valid
protected $type; // type, defaults to "bookmark" protected $type; // type, defaults to "bookmark"
protected $name; // name, defaults to $location protected $name; // name, defaults to $location
protected $value; // bookmark value (format-specific, eg. page number for PDF, CFI for epub, etc) protected $value; // bookmark value (format-specific, eg. page number for PDF, CFI for epub, etc)
protected $content; // bookmark content (annotations etc), can be empty protected $content; // bookmark content (annotations etc), can be empty
protected $lastModified; // modification timestamp protected $lastModified; // modification timestamp
public function jsonSerialize() { public function jsonSerialize(): array {
return [ return [
'id' => $this->getId(), 'id' => $this->getId(),
'userId' => $this->getUserId(), 'userId' => $this->getUserId(),
'fileId' => $this->getFileId(), 'fileId' => $this->getFileId(),
'type' => $this->getType(), 'type' => $this->getType(),
'name' => $this->getName(), 'name' => $this->getName(),
'value' => static::conditional_json_decode($this->getValue()), 'value' => static::conditional_json_decode($this->getValue()),
'content' => static::conditional_json_decode($this->getContent()), 'content' => static::conditional_json_decode($this->getContent()),
'lastModified' => $this->getLastModified() 'lastModified' => $this->getLastModified()
]; ];
} }
public function toService() { public function toService() {
return [ return [
'name' => $this->getName(), 'name' => $this->getName(),
'type' => $this->getType(), 'type' => $this->getType(),
'value' => $this->conditional_json_decode($this->getValue()), 'value' => $this->conditional_json_decode($this->getValue()),
'content' => $this->conditional_json_decode($this->getContent()), 'content' => $this->conditional_json_decode($this->getContent()),
'lastModified' => $this->getLastModified(), 'lastModified' => $this->getLastModified(),
]; ];
} }
public function getUserId() {
return $this->userId;
}
public function setUserId($userId) {
$this->userId = $userId;
}
public function getFileId() {
return $this->fileId;
}
public function setFileId($fileId) {
$this->fileId = $fileId;
}
public function getType() {
return $this->type;
}
public function setType($type) {
$this->type = $type;
}
public function getName() {
return $this->name;
}
public function setName($name) {
$this->name = $name;
}
public function getValue() {
return $this->value;
}
public function setValue($value) {
$this->value = $value;
}
public function getContent() {
return $this->content;
}
public function setContent($content) {
$this->content = $content;
}
public function getLastModified() {
return $this->lastModified;
}
public function setLastModified($lastModified) {
$this->lastModified = $lastModified;
}
} }

View File

@ -10,115 +10,91 @@
namespace OCA\Epubreader\Db; namespace OCA\Epubreader\Db;
use OCA\Epubreader\Utility\Time;
use OCP\IDBConnection; use OCP\IDBConnection;
use OCA\Epubreader\Utility\Time;
class BookmarkMapper extends ReaderMapper { class BookmarkMapper extends ReaderMapper {
private $userId; private $userId;
/** /**
* @param IDbConnection $db * @param IDbConnection $db
* @param $UserId * @param $UserId
* @param Time $time * @param Time $time
*/ */
public function __construct(IDBConnection $db, $UserId, Time $time) { public function __construct(IDBConnection $db, $UserId, Time $time) {
parent::__construct($db, 'reader_bookmarks', Bookmark::class, $time); parent::__construct($db, 'reader_bookmarks', Bookmark::class, $time);
/** @var int $UserId */ /** @var int $UserId */
$this->userId = $UserId; $this->userId = $UserId;
} }
/** /**
* @brief get bookmarks for $fileId+$userId(+$name) * @brief get bookmarks for $fileId+$userId(+$name)
* @param $fileId * @param $fileId
* @param string $name * @param string $name
* @return array * @return array
*/ */
public function get($fileId, $name, $type = null) { public function get(int $fileId, $name, $type = null) {
$query = $this->db->getQueryBuilder(); $query = $this->db->getQueryBuilder();
$query->select('*') $query->select('*')
->from($this->getTableName()) ->from($this->getTableName())
->where($query->expr()->eq('file_id', $query->createNamedParameter($fileId))) ->where($query->expr()->eq('file_id', $query->createNamedParameter($fileId)))
->andWhere($query->expr()->eq('user_id', $query->createNamedParameter($this->userId))); ->andWhere($query->expr()->eq('user_id', $query->createNamedParameter($this->userId)));
if ($type !== null) { if ($type !== null) {
$query->andWhere($query->expr()->eq('type', $query->createNamedParameter($type))); $query->andWhere($query->expr()->eq('type', $query->createNamedParameter($type)));
} }
if ($name !== null) { if ($name !== null) {
$query->andWhere($query->expr()->eq('name', $query->createNamedParameter($name))); $query->andWhere($query->expr()->eq('name', $query->createNamedParameter($name)));
} }
return $this->findEntities($query); return $this->findEntities($query);
} }
/** /**
* @brief write bookmark to database * @brief write bookmark to database
* *
* @param int $fileId * @param int $fileId
* @param string $name * @param string $name
* @param string $value * @param string $value
* *
* @return Bookmark the newly created or updated bookmark * @return Bookmark the newly created or updated bookmark
*/ */
public function set($fileId, $name, $value, $type, $content=null) { public function set($fileId, $name, $value, $type, $content = null) {
$result = $this->get($fileId, $name); $result = $this->get($fileId, $name);
if(empty($result)) { if(empty($result)) {
// anonymous bookmarks are named after their contents // anonymous bookmarks are named after their contents
if (null === $name) { if (null === $name) {
$name = $value; $name = $value;
} }
// default type is "bookmark" // default type is "bookmark"
if (null === $type) { if (null === $type) {
$type = "bookmark"; $type = "bookmark";
} }
$bookmark = new Bookmark(); $bookmark = new Bookmark();
$bookmark->setFileId($fileId); $bookmark->setFileId($fileId);
$bookmark->setUserId($this->userId); $bookmark->setUserId($this->userId);
$bookmark->setType($type); $bookmark->setType($type);
$bookmark->setName($name); $bookmark->setName($name);
$bookmark->setValue($value); $bookmark->setValue($value);
$bookmark->setContent($content); $bookmark->setContent($content);
$this->insert($bookmark); $this->insert($bookmark);
} else { } else {
$bookmark = $result[0]; $bookmark = $result[0];
$bookmark->setValue($value); $bookmark->setValue($value);
$bookmark->setContent($content); $bookmark->setContent($content);
$this->update($bookmark); $this->update($bookmark);
} }
return $bookmark; return $bookmark;
} }
/* currently not used */
public function deleteForFileId($fileId) {
$sql = "SELECT * FROM `*PREFIX*reader_bookmarks` WHERE file_id=?";
$args = [ $fileId ];
array_map(
function($entity) {
$this->delete($entity);
}, $this->findEntities($sql, $args)
);
}
/* currently not used */
public function deleteForUserId($userId) {
$sql = "SELECT * FROM `*PREFIX*reader_bookmarks` WHERE user_id=?";
$args = [ $userId ];
array_map(
function($entity) {
$this->delete($entity);
}, $this->findEntities($sql, $args)
);
}
} }

View File

@ -10,33 +10,78 @@
namespace OCA\Epubreader\Db; namespace OCA\Epubreader\Db;
use OCP\AppFramework\Db\Entity;
class Preference extends ReaderEntity implements \JsonSerializable { class Preference extends ReaderEntity implements \JsonSerializable {
protected $userId; // user for whom this preference is valid protected $userId; // user for whom this preference is valid
protected $scope; // scope (default or specific renderer) protected $scope; // scope (default or specific renderer)
protected $fileId; // file for which this preference is set protected $fileId; // file for which this preference is set
protected $name; // preference name protected $name; // preference name
protected $value; // preference value protected $value; // preference value
protected $lastModified; // modification timestamp protected $lastModified; // modification timestamp
public function jsonSerialize() { public function jsonSerialize(): array {
return [ return [
'id' => $this->getId(), 'id' => $this->getId(),
'scope' => $this->getScope(), 'scope' => $this->getScope(),
'fileId' => $this->getFileId(), 'fileId' => $this->getFileId(),
'name' => $this->getName(), 'name' => $this->getName(),
'value' => $this->conditional_json_decode($this->getValue()), 'value' => $this->conditional_json_decode($this->getValue()),
'lastModified' => $this->getLastModified(), 'lastModified' => $this->getLastModified(),
]; ];
} }
public function toService() { public function toService() {
return [ return [
'name' => $this->getName(), 'name' => $this->getName(),
'value' => $this->conditional_json_decode($this->getValue()), 'value' => $this->conditional_json_decode($this->getValue()),
]; ];
} }
public function getUserId() {
return $this->userId;
}
public function setUserId($userId) {
$this->userId = $userId;
}
public function getScope() {
return $this->scope;
}
public function setScope($scope) {
$this->scope = $scope;
}
public function getFileId() {
return $this->fileId;
}
public function setFileId($fileId) {
$this->fileId = $fileId;
}
public function getName() {
return $this->name;
}
public function setName($name) {
$this->name = $name;
}
public function getValue() {
return $this->value;
}
public function setValue($value) {
$this->value = $value;
}
public function getLastModified() {
return $this->lastModified;
}
public function setLastModified($lastModified) {
$this->lastModified = $lastModified;
}
} }

View File

@ -10,93 +10,72 @@
namespace OCA\Epubreader\Db; namespace OCA\Epubreader\Db;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCA\Epubreader\Utility\Time; use OCA\Epubreader\Utility\Time;
use OCP\IDBConnection; use OCP\IDBConnection;
class PreferenceMapper extends ReaderMapper { class PreferenceMapper extends ReaderMapper {
public function __construct(IDBConnection $db, $UserId, Time $time) { private $userId;
parent::__construct($db, 'reader_prefs', Preference::class, $time);
$this->userId = $UserId;
}
/** public function __construct(IDBConnection $db, $UserId, Time $time) {
* @brief get preferences for $scope+$fileId+$userId(+$name) parent::__construct($db, 'reader_prefs', Preference::class, $time);
* $this->userId = $UserId;
* @param string $scope }
* @param int $fileId
* @param string $name
* @return array
*/
public function get($scope, $fileId, $name=null) {
$query = $this->db->getQueryBuilder();
$query->select('*')
->from($this->getTableName())
->where($query->expr()->eq('scope', $query->createNamedParameter($scope)))
->andWhere($query->expr()->eq('file_id', $query->createNamedParameter($fileId)))
->andWhere($query->expr()->eq('user_id', $query->createNamedParameter($this->userId)));
if (!empty($name)) { /**
$query->andWhere($query->expr()->eq('name', $query->createNamedParameter($name))); * @brief get preferences for $scope+$fileId+$userId(+$name)
} *
* @param string $scope
* @param int $fileId
* @param string $name
* @return array
*/
public function get($scope, $fileId, $name = null) {
$query = $this->db->getQueryBuilder();
$query->select('*')
->from($this->getTableName())
->where($query->expr()->eq('scope', $query->createNamedParameter($scope)))
->andWhere($query->expr()->eq('file_id', $query->createNamedParameter($fileId)))
->andWhere($query->expr()->eq('user_id', $query->createNamedParameter($this->userId)));
return $this->findEntities($query); if (!empty($name)) {
} $query->andWhere($query->expr()->eq('name', $query->createNamedParameter($name)));
}
/** return $this->findEntities($query);
* @brief write preference to database }
*
* @param string $scope
* @param int $fileId
* @param string $name
* @param string $value
*
* @return Preference the newly created or updated preference
*/
public function set($scope, $fileId, $name, $value) {
$result = $this->get($scope, $fileId, $name); /**
* @brief write preference to database
*
* @param string $scope
* @param int $fileId
* @param string $name
* @param string $value
*
* @return Preference the newly created or updated preference
*/
public function set($scope, $fileId, $name, $value) {
if(empty($result)) { $result = $this->get($scope, $fileId, $name);
$preference = new Preference(); if(empty($result)) {
$preference->setScope($scope);
$preference->setFileId($fileId);
$preference->setUserId($this->userId);
$preference->setName($name);
$preference->setValue($value);
$this->insert($preference); $preference = new Preference();
} else { $preference->setScope($scope);
$preference = $result[0]; $preference->setFileId($fileId);
$preference->setValue($value); $preference->setUserId($this->userId);
$preference->setName($name);
$preference->setValue($value);
$this->update($preference); $this->insert($preference);
} } else {
$preference = $result[0];
$preference->setValue($value);
return $preference; $this->update($preference);
} }
/* currently not used*/ return $preference;
public function deleteForFileId($fileId) { }
$sql = "SELECT * FROM `*PREFIX*reader_prefs` WHERE file_id=?";
$args = [ $fileId ];
array_map(
function($entity) {
$this->delete($entity);
}, $this->findEntities($sql, $args)
);
}
/* currently not used*/
public function deleteForUserId($userId) {
$sql = "SELECT * FROM `*PREFIX*reader_prefs` WHERE user_id=?";
$args = [ $userId ];
array_map(
function($entity) {
$this->delete($entity);
}, $this->findEntities($sql, $args)
);
}
} }

View File

@ -14,26 +14,24 @@ use OCP\AppFramework\Db\Entity;
class ReaderEntity extends Entity { class ReaderEntity extends Entity {
/* returns decoded json if input is json, otherwise returns input */ private $lastModified;
public static function conditional_json_decode($el) {
$result = json_decode($el); /* returns decoded json if input is json, otherwise returns input */
if (json_last_error() === JSON_ERROR_NONE) { public static function conditional_json_decode($el) {
return $result; $result = json_decode($el);
} else { if (json_last_error() === JSON_ERROR_NONE) {
return $el; return $result;
} } else {
} return $el;
}
}
public function getLastModified() {
return $this->lastModified;
}
public function setLastModified($lastModified) {
$this->lastModified = $lastModified;
}
/*
public function toService() {
return [
'name' => $this->getName(),
'type' => $this->getType(),
'value' => $this->conditional_json_decode($this->getValue()),
'content' => $this->conditional_json_decode($this->getContent()),
'lastModified' => $this->getLastModified(),
];
}
*/
} }

View File

@ -10,31 +10,34 @@
namespace OCA\Epubreader\Db; namespace OCA\Epubreader\Db;
use OCP\IDBConnection;
use OCP\AppFramework\Db\QBMapper;
use OCP\AppFramework\Db\Entity;
use OCA\Epubreader\Utility\Time; use OCA\Epubreader\Utility\Time;
use OCP\AppFramework\Db\Entity;
use OCP\AppFramework\Db\QBMapper;
use OCP\IDBConnection;
/**
* @template-extends QBMapper<ReaderEntity>
*/
abstract class ReaderMapper extends QBMapper { abstract class ReaderMapper extends QBMapper {
/** /**
* @var Time * @var Time
*/ */
private $time; private $time;
public function __construct(IDBConnection $db, $table, $entity, Time $time) { public function __construct(IDBConnection $db, $table, $entity, Time $time) {
parent::__construct($db, $table, $entity); parent::__construct($db, $table, $entity);
$this->time = $time; $this->time = $time;
} }
public function update(Entity $entity): Entity { public function update(Entity $entity): Entity {
$entity->setLastModified($this->time->getMicroTime()); $entity->setLastModified($this->time->getMicroTime());
return parent::update($entity); return parent::update($entity);
} }
public function insert(Entity $entity): Entity { public function insert(Entity $entity): Entity {
$entity->setLastModified($this->time->getMicroTime()); $entity->setLastModified($this->time->getMicroTime());
return parent::insert($entity); return parent::insert($entity);
} }
} }

View File

@ -10,61 +10,60 @@
namespace OCA\Epubreader; namespace OCA\Epubreader;
use OCP\IDBConnection;
use OCP\Files\Node;
use OCP\IUser;
use OCP\Util;
use \OC\User\User as User; use \OC\User\User as User;
use OCP\Files\Node;
use OCP\IDBConnection;
use OCP\Util;
class Hooks { class Hooks {
public static function register() { public static function register() {
Util::connectHook('\OCP\Config', 'js', 'OCA\Epubreader\Hooks', 'announce_settings'); Util::connectHook('\OCP\Config', 'js', 'OCA\Epubreader\Hooks', 'announce_settings');
\OC::$server->getRootFolder()->listen('\OC\Files', 'preDelete', function (Node $node) { \OC::$server->getRootFolder()->listen('\OC\Files', 'preDelete', function (Node $node) {
$fileId = $node->getId(); $fileId = $node->getId();
$connection = \OC::$server->getDatabaseConnection(); $connection = \OC::$server->getDatabaseConnection();
self::deleteFile($connection, $fileId); self::deleteFile($connection, $fileId);
}); });
\OC::$server->getUserManager()->listen('\OC\User', 'preDelete', function (User $user) { \OC::$server->getUserManager()->listen('\OC\User', 'preDelete', function (User $user) {
$userId = $user->getUID(); $userId = $user->getUID();
$connection = \OC::$server->getDatabaseConnection(); $connection = \OC::$server->getDatabaseConnection();
self::deleteUser($connection, $userId); self::deleteUser($connection, $userId);
}); });
} }
public static function announce_settings(array $settings) { public static function announce_settings(array $settings) {
// Nextcloud encodes this as JSON, Owncloud does not (yet) (#75) // Nextcloud encodes this as JSON, Owncloud does not (yet) (#75)
// TODO: rmeove this when Owncloud starts encoding oc_appconfig as JSON just like it already encodes most other properties // TODO: rmeove this when Owncloud starts encoding oc_appconfig as JSON just like it already encodes most other properties
$isJson = self::isJson($settings['array']['oc_appconfig']); $isJson = self::isJson($settings['array']['oc_appconfig']);
$array = ($isJson) ? json_decode($settings['array']['oc_appconfig'], true) : $settings['array']['oc_appconfig']; $array = ($isJson) ? json_decode($settings['array']['oc_appconfig'], true) : $settings['array']['oc_appconfig'];
$array['filesReader']['enableEpub'] = Config::get('epub_enable', 'true'); $array['filesReader']['enableEpub'] = Config::get('epub_enable', 'true');
$array['filesReader']['enablePdf'] = Config::get('pdf_enable', 'true'); $array['filesReader']['enablePdf'] = Config::get('pdf_enable', 'true');
$array['filesReader']['enableCbx'] = Config::get('cbx_enable', 'true'); $array['filesReader']['enableCbx'] = Config::get('cbx_enable', 'true');
$settings['array']['oc_appconfig'] = ($isJson) ? json_encode($array) : $array; $settings['array']['oc_appconfig'] = ($isJson) ? json_encode($array) : $array;
} }
protected static function deleteFile(IDBConnection $connection, $fileId) { protected static function deleteFile(IDBConnection $connection, $fileId) {
$queryBuilder = $connection->getQueryBuilder(); $queryBuilder = $connection->getQueryBuilder();
$queryBuilder->delete('reader_bookmarks')->where('file_id = file_id')->setParameter('file_id', $fileId); $queryBuilder->delete('reader_bookmarks')->where('file_id = file_id')->setParameter('file_id', $fileId);
$queryBuilder->execute(); $queryBuilder->execute();
$queryBuilder = $connection->getQueryBuilder(); $queryBuilder = $connection->getQueryBuilder();
$queryBuilder->delete('reader_prefs')->where('file_id = file_id')->setParameter('file_id', $fileId); $queryBuilder->delete('reader_prefs')->where('file_id = file_id')->setParameter('file_id', $fileId);
$queryBuilder->execute(); $queryBuilder->execute();
} }
protected static function deleteUser(IDBConnection $connection, $userId) { protected static function deleteUser(IDBConnection $connection, $userId) {
$queryBuilder = $connection->getQueryBuilder(); $queryBuilder = $connection->getQueryBuilder();
$queryBuilder->delete('reader_bookmarks')->where('user_id = user_id')->setParameter('user_id', $userId); $queryBuilder->delete('reader_bookmarks')->where('user_id = user_id')->setParameter('user_id', $userId);
$queryBuilder->execute(); $queryBuilder->execute();
$queryBuilder = $connection->getQueryBuilder(); $queryBuilder = $connection->getQueryBuilder();
$queryBuilder->delete('reader_prefs')->where('user_id = user_id')->setParameter('user_id', $userId); $queryBuilder->delete('reader_prefs')->where('user_id = user_id')->setParameter('user_id', $userId);
$queryBuilder->execute(); $queryBuilder->execute();
} }
private static function isJson($string) { private static function isJson($string) {
return is_string($string) && is_array(json_decode($string, true)) && (json_last_error() == JSON_ERROR_NONE) ? true : false; return is_string($string) && is_array(json_decode($string, true)) && (json_last_error() == JSON_ERROR_NONE) ? true : false;
} }
} }

View File

@ -10,104 +10,102 @@
namespace OCA\Epubreader\Service; namespace OCA\Epubreader\Service;
use OCA\Epubreader\Db\BookmarkMapper; use OCA\Epubreader\Db\BookmarkMapper;
class BookmarkService extends Service { class BookmarkService extends Service {
// "bookmark" name to use for the cursor (current reading position) // "bookmark" name to use for the cursor (current reading position)
const CURSOR = '__CURSOR__'; public const CURSOR = '__CURSOR__';
const bookmark_type = 'bookmark'; public const bookmark_type = 'bookmark';
private $bookmarkMapper; private $bookmarkMapper;
private $userId; private $userId;
public function __construct(BookmarkMapper $bookmarkMapper, $UserId) { public function __construct(BookmarkMapper $bookmarkMapper, $UserId) {
parent::__construct($bookmarkMapper); parent::__construct($bookmarkMapper);
$this->bookmarkMapper = $bookmarkMapper; $this->bookmarkMapper = $bookmarkMapper;
$this->userId = $UserId; $this->userId = $UserId;
} }
/** /**
* @brief get bookmark * @brief get bookmark
* *
* bookmark type is format-dependent, eg CFI for epub, page number for CBR/CBZ, etc * bookmark type is format-dependent, eg CFI for epub, page number for CBR/CBZ, etc
* *
* @param int $fileId * @param int $fileId
* @param string $name * @param string $name
* *
* @return array * @return array
*/ */
public function get($fileId, $name=null, $type=null) { public function get($fileId, $name = null, $type = null) {
$result = $this->bookmarkMapper->get($fileId, $name, $type); $result = $this->bookmarkMapper->get($fileId, $name, $type);
return array_map( return array_map(
function($entity) { function ($entity) {
return $entity->toService(); return $entity->toService();
}, $result); }, $result);
} }
/** /**
* @brief write bookmark * @brief write bookmark
* *
* position type is format-dependent, eg CFI for epub, page number for CBR/CBZ, etc * position type is format-dependent, eg CFI for epub, page number for CBR/CBZ, etc
* *
* @param int $fileId * @param int $fileId
* @param string $name * @param string $name
* @param string $value * @param string $value
* *
* @return array * @return array
*/ */
public function set($fileId, $name, $value, $type=null, $content=null) { public function set($fileId, $name, $value, $type = null, $content = null) {
return $this->bookmarkMapper->set($fileId, $name, $value, $type, $content); return $this->bookmarkMapper->set($fileId, $name, $value, $type, $content);
} }
/** /**
* @brief get cursor (current position in book) * @brief get cursor (current position in book)
* *
* @param int $fileId * @param int $fileId
* *
* @return array * @return array
*/ */
public function getCursor($fileId) { public function getCursor($fileId) {
$result = $this->get($fileId, static::CURSOR); $result = $this->get($fileId, static::CURSOR);
if (count($result) === 1) { if (count($result) === 1) {
return $result[0]; return $result[0];
} }
} }
/** /**
* @brief set cursor (current position in book) * @brief set cursor (current position in book)
* *
* @param int $fileId * @param int $fileId
* @param string $value * @param string $value
* *
* @return array * @return array
*/ */
public function setCursor($fileId, $value) { public function setCursor($fileId, $value) {
return $this->bookmarkMapper->set($fileId, static::CURSOR, $value, static::bookmark_type); return $this->bookmarkMapper->set($fileId, static::CURSOR, $value, static::bookmark_type);
} }
/** /**
* @brief delete bookmark * @brief delete bookmark
* *
* @param int $fileId * @param int $fileId
* @param string $name * @param string $name
* *
*/ */
public function delete($fileId, $name, $type=null) { public function delete($fileId, $name, $type = null) {
foreach ($this->bookmarkMapper->get($fileId, $name, $type) as $bookmark) { foreach ($this->bookmarkMapper->get($fileId, $name, $type) as $bookmark) {
$this->bookmarkMapper->delete($bookmark); $this->bookmarkMapper->delete($bookmark);
} }
} }
/** /**
* @brief delete cursor * @brief delete cursor
* *
* @param int $fileId * @param int $fileId
* *
*/ */
public function deleteCursor($fileId) { public function deleteCursor($fileId) {
$this->delete($fileId, static::CURSOR, static::bookmark_type); $this->delete($fileId, static::CURSOR, static::bookmark_type);
} }
} }

View File

@ -14,62 +14,51 @@ use OCP\App\IAppManager;
class MetadataService { class MetadataService {
private $appManager; private $appManager;
/** /**
* @param IAppManager $appManager * @param IAppManager $appManager
*/ */
public function __construct(IAppManager $appManager) { public function __construct(IAppManager $appManager) {
$this->appManager = $appManager; $this->appManager = $appManager;
} }
/** /**
* @brief get metadata item(s) * @brief get metadata item(s)
* *
* @param int $fileId * @param int $fileId
* @param string $name * @param string $name
* *
* @return array * @return array
*/ */
public function get($fileId, $name=null) { public function get($fileId, $name = null) {
if ($this->appManager->isInstalled('files_opds')) { return [];
if ($meta = \OCA\Files_Opds\Meta::get($fileId)) { }
if (!empty($name) && array_key_exists($name, $meta)) {
return [$item => $meta[$name]];
} else {
return $meta;
}
}
}
return []; /**
} * @brief write metadata to database
*
* @param int $fileId
* @param array $value
*
* @return array
*/
public function setAll($fileId, $value) {
// no-op for now
return [];
}
/** /**
* @brief write metadata to database * @brief write metadata item to database
* *
* @param int $fileId * @param int $fileId
* @param array $value * @param string $name
* * @param array $value
* @return array *
*/ * @return array
public function setAll($fileId, $value) { */
// no-op for now public function set($fileId, $name, $value) {
return []; // no-op for now
} return [];
}
/**
* @brief write metadata item to database
*
* @param int $fileId
* @param string $name
* @param array $value
*
* @return array
*/
public function set($fileId, $name, $value) {
// no-op for now
return [];
}
} }

View File

@ -14,104 +14,104 @@ use OCA\Epubreader\Db\PreferenceMapper;
class PreferenceService extends Service { class PreferenceService extends Service {
// (ab)use the fact that $fileId never goes below 1 by using the // (ab)use the fact that $fileId never goes below 1 by using the
// value 0 to indicate a default preference // value 0 to indicate a default preference
const DEFAULTS = 0; public const DEFAULTS = 0;
private $preferenceMapper; private $preferenceMapper;
/** /**
* @param PreferenceMapper $preferenceMapper * @param PreferenceMapper $preferenceMapper
*/ */
public function __construct(PreferenceMapper $preferenceMapper) { public function __construct(PreferenceMapper $preferenceMapper) {
parent::__construct($preferenceMapper); parent::__construct($preferenceMapper);
$this->preferenceMapper = $preferenceMapper; $this->preferenceMapper = $preferenceMapper;
} }
/** /**
* @brief get preference * @brief get preference
* *
* scope identifies preference source, i.e. which renderer the preference applies to * scope identifies preference source, i.e. which renderer the preference applies to
* preference type is format-dependent, eg CFI for epub, page number for CBR/CBZ, etc * preference type is format-dependent, eg CFI for epub, page number for CBR/CBZ, etc
* *
* @param string $scope * @param string $scope
* @param int $fileId * @param int $fileId
* @param string $name * @param string $name
* *
* @return array * @return array
*/ */
public function get($scope, $fileId, $name=null) { public function get($scope, $fileId, $name = null) {
$result = $this->preferenceMapper->get($scope, $fileId, $name); $result = $this->preferenceMapper->get($scope, $fileId, $name);
return array_map( return array_map(
function($entity) { function ($entity) {
return $entity->toService(); return $entity->toService();
}, $result); }, $result);
} }
/** /**
* @brief write preference * @brief write preference
* *
* scope identifies preference source, i.e. which renderer the preference applies to * scope identifies preference source, i.e. which renderer the preference applies to
* position type is format-dependent, eg CFI for epub, page number for CBR/CBZ, etc * position type is format-dependent, eg CFI for epub, page number for CBR/CBZ, etc
* *
* @param string $scope * @param string $scope
* @param int $fileId * @param int $fileId
* @param string $name * @param string $name
* @param string $value * @param string $value
* *
* @return array * @return array
*/ */
public function set($scope, $fileId, $name, $value) { public function set($scope, $fileId, $name, $value) {
return $this->preferenceMapper->set($scope, $fileId, $name, $value); return $this->preferenceMapper->set($scope, $fileId, $name, $value);
} }
/** /**
* @brief get default preference * @brief get default preference
* *
* @param string $scope * @param string $scope
* @param string $name * @param string $name
* *
* @return array * @return array
*/ */
public function getDefault($scope, $name=null) { public function getDefault($scope, $name = null) {
return $this->get($scope, static::DEFAULTS, $name); return $this->get($scope, static::DEFAULTS, $name);
} }
/** /**
* @brief set default preference * @brief set default preference
* *
* @param string $scope * @param string $scope
* @param string $name * @param string $name
* @param string $value * @param string $value
* *
* @return array * @return array
*/ */
public function setDefault($scope, $name, $value) { public function setDefault($scope, $name, $value) {
return $this->preferenceMapper->set($scope, static::DEFAULTS, $name, $value); return $this->preferenceMapper->set($scope, static::DEFAULTS, $name, $value);
} }
/** /**
* @brief delete preference * @brief delete preference
* *
* @param string $scope * @param string $scope
* @param int $fileId * @param int $fileId
* @param string $name * @param string $name
* *
*/ */
public function delete($scope, $fileId, $name) { public function delete($scope, $fileId, $name) {
foreach($this->preferenceMapper->get($scope, $fileId, $name) as $preference) { foreach($this->preferenceMapper->get($scope, $fileId, $name) as $preference) {
$this->preferenceMapper->delete($preference); $this->preferenceMapper->delete($preference);
} }
} }
/** /**
* @brief delete default * @brief delete default
* *
* @param string $scope * @param string $scope
* @param string $name * @param string $name
* *
*/ */
public function deleteDefault($scope, $name) { public function deleteDefault($scope, $name) {
$this->delete($scope, static::DEFAULTS, $name); $this->delete($scope, static::DEFAULTS, $name);
} }
} }

View File

@ -14,12 +14,9 @@ use OCA\Epubreader\Db\ReaderMapper;
abstract class Service { abstract class Service {
protected $mapper; protected $mapper;
public function __construct(ReaderMapper $mapper){ public function __construct(ReaderMapper $mapper) {
$this->mapper = $mapper; $this->mapper = $mapper;
} }
} }

View File

@ -12,78 +12,71 @@
namespace OCA\Epubreader\Settings; namespace OCA\Epubreader\Settings;
use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\TemplateResponse;
use OCP\Settings\ISettings;
use OCP\IConfig; use OCP\IConfig;
use OCP\Settings\ISettings;
class Personal implements ISettings class Personal implements ISettings {
{
private $userId; private $userId;
private $configManager; private $configManager;
public function __construct( public function __construct(
$userId, $userId,
IConfig $configManager IConfig $configManager
) ) {
{ $this->userId = $userId;
$this->userId = $userId; $this->configManager = $configManager;
$this->configManager = $configManager; }
}
/** /**
* @return TemplateResponse returns the instance with all parameters set, ready to be rendered * @return TemplateResponse returns the instance with all parameters set, ready to be rendered
* @since 9.1 * @since 9.1
*/ */
public function getForm() public function getForm() {
{
$parameters = [ $parameters = [
'EpubEnable' => $this->configManager->getUserValue($this->userId, 'epubreader', 'epub_enable'), 'EpubEnable' => $this->configManager->getUserValue($this->userId, 'epubreader', 'epub_enable'),
'PdfEnable' => $this->configManager->getUserValue($this->userId, 'epubreader', 'pdf_enable'), 'PdfEnable' => $this->configManager->getUserValue($this->userId, 'epubreader', 'pdf_enable'),
'CbxEnable' => $this->configManager->getUserValue($this->userId, 'epubreader', 'cbx_enable'), 'CbxEnable' => $this->configManager->getUserValue($this->userId, 'epubreader', 'cbx_enable'),
]; ];
return new TemplateResponse('epubreader', 'settings-personal', $parameters, ''); return new TemplateResponse('epubreader', 'settings-personal', $parameters, '');
} }
/** /**
* Print config section (ownCloud 10) * Print config section (ownCloud 10)
* *
* @return TemplateResponse * @return TemplateResponse
*/ */
public function getPanel() public function getPanel() {
{ return $this->getForm();
return $this->getForm(); }
}
/** /**
* @return string the section ID, e.g. 'sharing' * @return string the section ID, e.g. 'sharing'
* @since 9.1 * @since 9.1
*/ */
public function getSection() public function getSection() {
{ return 'epubreader';
return 'epubreader'; }
}
/** /**
* Get section ID (ownCloud 10) * Get section ID (ownCloud 10)
* *
* @return string * @return string
*/ */
public function getSectionID() public function getSectionID() {
{ return 'epubreader';
return 'epubreader'; }
}
/** /**
* @return int whether the form should be rather on the top or bottom of * @return int whether the form should be rather on the top or bottom of
* the admin section. The forms are arranged in ascending order of the * the admin section. The forms are arranged in ascending order of the
* priority values. It is required to return a value between 0 and 100. * priority values. It is required to return a value between 0 and 100.
* *
* E.g.: 70 * E.g.: 70
* @since 9.1 * @since 9.1
*/ */
public function getPriority() public function getPriority() {
{ return 10;
return 10; }
}
} }

View File

@ -15,56 +15,50 @@ use OCP\IL10N;
use OCP\IURLGenerator; use OCP\IURLGenerator;
use OCP\Settings\IIconSection; use OCP\Settings\IIconSection;
class PersonalSection implements IIconSection class PersonalSection implements IIconSection {
{ /** @var IURLGenerator */
/** @var IURLGenerator */ private $urlGenerator;
private $urlGenerator; /** @var IL10N */
/** @var IL10N */ private $l;
private $l;
public function __construct(IURLGenerator $urlGenerator, IL10N $l) public function __construct(IURLGenerator $urlGenerator, IL10N $l) {
{ $this->urlGenerator = $urlGenerator;
$this->urlGenerator = $urlGenerator; $this->l = $l;
$this->l = $l; }
}
/** /**
* returns the relative path to an 16*16 icon describing the section. * returns the relative path to an 16*16 icon describing the section.
* *
* @returns string * @returns string
*/ */
public function getIcon() public function getIcon() {
{ return $this->urlGenerator->imagePath('epubreader', 'app.svg');
return $this->urlGenerator->imagePath('epubreader', 'app.svg'); }
}
/** /**
* returns the ID of the section. It is supposed to be a lower case string, * returns the ID of the section. It is supposed to be a lower case string,
* *
* @returns string * @returns string
*/ */
public function getID() public function getID() {
{ return 'epubreader';
return 'epubreader'; }
}
/** /**
* returns the translated name as it should be displayed * returns the translated name as it should be displayed
* *
* @return string * @return string
*/ */
public function getName() public function getName() {
{ return $this->l->t('EPUB/CBZ/PDF ebook reader');
return $this->l->t('EPUB/CBZ/PDF ebook reader'); }
}
/** /**
* returns priority for positioning * returns priority for positioning
* *
* @return int * @return int
*/ */
public function getPriority() public function getPriority() {
{ return 20;
return 20; }
}
} }

View File

@ -11,17 +11,16 @@
namespace OCA\Epubreader\Utility; namespace OCA\Epubreader\Utility;
class Time { class Time {
public function getTime() { public function getTime() {
return time(); return time();
} }
/** /**
* * @return string the current unix time in miliseconds
* @return int the current unix time in miliseconds */
*/ public function getMicroTime(): string {
public function getMicroTime() { list($millisecs, $secs) = explode(" ", microtime());
list($millisecs, $secs) = explode(" ", microtime()); return $secs . substr($millisecs, 2, 6);
return $secs . substr($millisecs, 2, 6); }
}
} }

View File

@ -15,8 +15,7 @@ namespace OCA\Epubreader;
/** /**
* Config class for Reader * Config class for Reader
*/ */
class Config class Config {
{
/** /**
* @brief get user config value * @brief get user config value
* *

35
psalm.xml Normal file
View File

@ -0,0 +1,35 @@
<?xml version="1.0"?>
<psalm
errorLevel="4"
resolveFromConfigFile="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="https://getpsalm.org/schema/config"
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
>
<projectFiles>
<directory name="lib" />
<directory name="stubs" />
</projectFiles>
<extraFiles>
<directory name="vendor" />
<ignoreFiles>
<directory name="vendor/psalm" />
</ignoreFiles>
</extraFiles>
<issueHandlers>
<UndefinedDocblockClass>
<errorLevel type="suppress">
<referencedClass name="OC\AppFramework\OCS\BaseResponse" />
<referencedClass name="Doctrine\DBAL\Schema\Schema" />
<referencedClass name="Doctrine\DBAL\Schema\SchemaException" />
<referencedClass name="Doctrine\DBAL\Driver\Statement" />
<referencedClass name="Doctrine\DBAL\Schema\Table" />
</errorLevel>
</UndefinedDocblockClass>
<UndefinedClass>
<errorLevel type="suppress">
<referencedClass name="OC" />
</errorLevel>
</UndefinedClass>
</issueHandlers>
</psalm>

View File

@ -0,0 +1,53 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @author Jörn Friedrich Dreyer <jfd@butonic.de>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Robin Appelman <robin@icewind.nl>
*
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* 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, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
namespace OC\Hooks;
/**
* Class Emitter
*
* interface for all classes that are able to emit events
*
* @package OC\Hooks
* @deprecated 18.0.0 use events and the \OCP\EventDispatcher\IEventDispatcher service
*/
interface Emitter {
/**
* @param string $scope
* @param string $method
* @param callable $callback
* @return void
* @deprecated 18.0.0 use \OCP\EventDispatcher\IEventDispatcher::addListener
*/
public function listen($scope, $method, callable $callback);
/**
* @param string $scope optional
* @param string $method optional
* @param callable $callback optional
* @return void
* @deprecated 18.0.0 use \OCP\EventDispatcher\IEventDispatcher::removeListener
*/
public function removeListener($scope = null, $method = null, callable $callback = null);
}

View File

@ -1,30 +1,30 @@
<?php <?php
/** @var array $_ */ /** @var array $_ */
/** @var OCP\IURLGenerator $urlGenerator */ /** @var OCP\IURLGenerator $urlGenerator */
$urlGenerator = $_['urlGenerator']; $urlGenerator = $_['urlGenerator'];
$downloadLink = $_['downloadLink']; $downloadLink = $_['downloadLink'];
$fileId = $_['fileId']; $fileId = $_['fileId'];
$fileName = $_['fileName']; $fileName = $_['fileName'];
$fileType = $_['fileType']; $fileType = $_['fileType'];
$scope = $_['scope']; $scope = $_['scope'];
$cursor = $_['cursor']; $cursor = $_['cursor'];
$defaults = $_['defaults']; $defaults = $_['defaults'];
$preferences = $_['preferences']; $preferences = $_['preferences'];
$metadata = $_['metadata']; $metadata = $_['metadata'];
$annotations = $_['annotations']; $annotations = $_['annotations'];
$title = htmlentities(basename($downloadLink)); $title = htmlentities(basename($downloadLink));
$revision = '0048'; $revision = '0048';
$version = \OC::$server->getAppManager()->getAppVersion('epubreader') . '.' . $revision; $version = \OC::$server->getAppManager()->getAppVersion('epubreader') . '.' . $revision;
/* Mobile safari, the new IE6 */ /* Mobile safari, the new IE6 */
$idevice = (strstr($_SERVER['HTTP_USER_AGENT'],'iPhone') $idevice = (strstr($_SERVER['HTTP_USER_AGENT'], 'iPhone')
|| strstr($_SERVER['HTTP_USER_AGENT'],'iPad') || strstr($_SERVER['HTTP_USER_AGENT'], 'iPad')
|| strstr($_SERVER['HTTP_USER_AGENT'],'iPod')); || strstr($_SERVER['HTTP_USER_AGENT'], 'iPod'));
/* Owncloud currently does not implement CSPv3, remove this test when it does */ /* Owncloud currently does not implement CSPv3, remove this test when it does */
$nonce = class_exists('\OC\Security\CSP\ContentSecurityPolicyNonceManager') $nonce = class_exists('\OC\Security\CSP\ContentSecurityPolicyNonceManager')
? \OC::$server->getContentSecurityPolicyNonceManager()->getNonce() ? \OC::$server->getContentSecurityPolicyNonceManager()->getNonce()
: 'nonce_not_implemented'; : 'nonce_not_implemented';
?> ?>
<html dir="ltr"> <html dir="ltr">
@ -32,7 +32,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-capable" content="yes">
<!-- <base href="<?php p($urlGenerator->linkTo('epubreader',''));?>"> --> <!-- <base href="<?php p($urlGenerator->linkTo('epubreader', ''));?>"> -->
<title> <title>
<?php p($title);?> <?php p($title);?>
</title> </title>

View File

@ -1,30 +1,30 @@
<?php <?php
/** @var array $_ */ /** @var array $_ */
/** @var OCP\IURLGenerator $urlGenerator */ /** @var OCP\IURLGenerator $urlGenerator */
$urlGenerator = $_['urlGenerator']; $urlGenerator = $_['urlGenerator'];
$downloadLink = $_['downloadLink']; $downloadLink = $_['downloadLink'];
$fileId = $_['fileId']; $fileId = $_['fileId'];
$fileName = $_['fileName']; $fileName = $_['fileName'];
$fileType = $_['fileType']; $fileType = $_['fileType'];
$scope = $_['scope']; $scope = $_['scope'];
$cursor = $_['cursor']; $cursor = $_['cursor'];
$defaults = $_['defaults']; $defaults = $_['defaults'];
$preferences = $_['preferences']; $preferences = $_['preferences'];
$metadata = $_['metadata']; $metadata = $_['metadata'];
$annotations = $_['annotations']; $annotations = $_['annotations'];
$title = htmlentities(basename($downloadLink)); $title = htmlentities(basename($downloadLink));
$revision = '0072'; $revision = '0072';
$version = \OC::$server->getAppManager()->getAppVersion('epubreader') . '.' . $revision; $version = \OC::$server->getAppManager()->getAppVersion('epubreader') . '.' . $revision;
/* Mobile safari, the new IE6 */ /* Mobile safari, the new IE6 */
$idevice = (strstr($_SERVER['HTTP_USER_AGENT'],'iPhone') $idevice = (strstr($_SERVER['HTTP_USER_AGENT'], 'iPhone')
|| strstr($_SERVER['HTTP_USER_AGENT'],'iPad') || strstr($_SERVER['HTTP_USER_AGENT'], 'iPad')
|| strstr($_SERVER['HTTP_USER_AGENT'],'iPod')); || strstr($_SERVER['HTTP_USER_AGENT'], 'iPod'));
/* Owncloud currently does not implement CSPv3, remove this test when it does */ /* Owncloud currently does not implement CSPv3, remove this test when it does */
$nonce = class_exists('\OC\Security\CSP\ContentSecurityPolicyNonceManager') $nonce = class_exists('\OC\Security\CSP\ContentSecurityPolicyNonceManager')
? \OC::$server->getContentSecurityPolicyNonceManager()->getNonce() ? \OC::$server->getContentSecurityPolicyNonceManager()->getNonce()
: 'nonce_not_implemented'; : 'nonce_not_implemented';
?> ?>
<html dir="ltr"> <html dir="ltr">
@ -32,7 +32,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-capable" content="yes">
<!-- <base href="<?php p($urlGenerator->linkTo('epubreader',''));?>"> --> <!-- <base href="<?php p($urlGenerator->linkTo('epubreader', ''));?>"> -->
<title> <title>
<?php p($title);?> <?php p($title);?>
</title> </title>
@ -113,21 +113,21 @@
<div class="control-group"> <div class="control-group">
<div> <div>
<input type="checkbox" id="custom_font_family" name="font_family"> <input type="checkbox" id="custom_font_family" name="font_family">
<label for="custom_font_family"><?php print ($l->t ('custom font')); ?></label> <label for="custom_font_family"><?php print($l->t('custom font')); ?></label>
<select id="font_family" disabled=""> <select id="font_family" disabled="">
<option value="verdana, trebuchet, droid sans serif, sans, sans-serif"> sans </option> <option value="verdana, trebuchet, droid sans serif, sans, sans-serif"> sans </option>
<option value="georgia, times new roman, droid serif, serif"> serif </option> <option value="georgia, times new roman, droid serif, serif"> serif </option>
<option value="monospace"><?php print ($l->t ('monospace')); ?> </option> <option value="monospace"><?php print($l->t('monospace')); ?> </option>
</select> </select>
</div> </div>
<div> <div>
<input type="checkbox" id="custom_font_size" name="font_size"> <input type="checkbox" id="custom_font_size" name="font_size">
<label for="custom_font_size"><?php print ($l->t ('font size')); ?></label> <label for="custom_font_size"><?php print($l->t('font size')); ?></label>
<input type="number" id="font_size" value="100" min="50" max="150" disabled=""> % <input type="number" id="font_size" value="100" min="50" max="150" disabled=""> %
</div> </div>
<div> <div>
<input type="checkbox" id="custom_font_weight" name="font_weight"> <input type="checkbox" id="custom_font_weight" name="font_weight">
<label for="custom_font_weight"><?php print ($l->t ('font weight')); ?></label> <label for="custom_font_weight"><?php print($l->t('font weight')); ?></label>
<select id="font_weight" disabled=""> <select id="font_weight" disabled="">
<option value="100">thin</option> <option value="100">thin</option>
<option value="200">extra light</option> <option value="200">extra light</option>
@ -154,7 +154,7 @@
<div class="control-group"> <div class="control-group">
<input type="checkbox" id="use_custom_colors" name="use_custom_colors"> <input type="checkbox" id="use_custom_colors" name="use_custom_colors">
<label for="use_custom_colors"> <label for="use_custom_colors">
<?php print ($l->t ('Use custom colors')); ?>; <?php print($l->t('Use custom colors')); ?>;
</label> </label>
<div class="center-box"> <div class="center-box">
<input type="color" id="day_color" value="#0a0a0a"> <input type="color" id="day_color" value="#0a0a0a">
@ -172,7 +172,7 @@
<legend>night</legend> <legend>night</legend>
<div class="control-group"> <div class="control-group">
<div class="center-box nightshift"> <div class="center-box nightshift">
<?php print ($l->t ('night mode can be toggled by clicking the book title')); ?>; <?php print($l->t('night mode can be toggled by clicking the book title')); ?>;
</div> </div>
<div class="center-box"> <div class="center-box">
<input type="color" id="night_color" value="#454545"> <input type="color" id="night_color" value="#454545">
@ -202,19 +202,19 @@
<div class="control-group"> <div class="control-group">
<input type="checkbox" id="sidebarReflow" name="sidebarReflow"> <input type="checkbox" id="sidebarReflow" name="sidebarReflow">
<label for="sidebarReflow"> <label for="sidebarReflow">
<?php print ($l->t ('reflow text when sidebars are open')); ?>; <?php print($l->t('reflow text when sidebars are open')); ?>;
</label> </label>
</div> </div>
<div class="control-group"> <div class="control-group">
<input type="checkbox" id="touch_nav" name="touch_nav"> <input type="checkbox" id="touch_nav" name="touch_nav">
<label for="touch_nav"> <label for="touch_nav">
<?php print ($l->t ('disable extra-wide page turn areas')); ?>; <?php print($l->t('disable extra-wide page turn areas')); ?>;
</label> </label>
</div> </div>
<div class="control-group"> <div class="control-group">
<input type="checkbox" id="page_turn_arrows" name="page_turn_arrows"> <input type="checkbox" id="page_turn_arrows" name="page_turn_arrows">
<label for="page_turn_arrows"> <label for="page_turn_arrows">
<?php print ($l->t ('show page turn arrows')); ?>; <?php print($l->t('show page turn arrows')); ?>;
</label> </label>
</div> </div>

View File

@ -1,30 +1,30 @@
<?php <?php
/** @var array $_ */ /** @var array $_ */
/** @var OCP\IURLGenerator $urlGenerator */ /** @var OCP\IURLGenerator $urlGenerator */
$urlGenerator = $_['urlGenerator']; $urlGenerator = $_['urlGenerator'];
$downloadLink = $_['downloadLink']; $downloadLink = $_['downloadLink'];
$fileId = $_['fileId']; $fileId = $_['fileId'];
$fileName = $_['fileName']; $fileName = $_['fileName'];
$fileType = $_['fileType']; $fileType = $_['fileType'];
$scope = $_['scope']; $scope = $_['scope'];
$cursor = $_['cursor']; $cursor = $_['cursor'];
$defaults = $_['defaults']; $defaults = $_['defaults'];
$preferences = $_['preferences']; $preferences = $_['preferences'];
$metadata = $_['metadata']; $metadata = $_['metadata'];
$annotations = $_['annotations']; $annotations = $_['annotations'];
$title = htmlentities(basename($downloadLink)); $title = htmlentities(basename($downloadLink));
$revision = '0130'; $revision = '0130';
$version = \OC::$server->getAppManager()->getAppVersion('epubreader') . '.' . $revision; $version = \OC::$server->getAppManager()->getAppVersion('epubreader') . '.' . $revision;
/* Mobile safari, the new IE6 */ /* Mobile safari, the new IE6 */
$idevice = (strstr($_SERVER['HTTP_USER_AGENT'],'iPhone') $idevice = (strstr($_SERVER['HTTP_USER_AGENT'], 'iPhone')
|| strstr($_SERVER['HTTP_USER_AGENT'],'iPad') || strstr($_SERVER['HTTP_USER_AGENT'], 'iPad')
|| strstr($_SERVER['HTTP_USER_AGENT'],'iPod')); || strstr($_SERVER['HTTP_USER_AGENT'], 'iPod'));
/* Owncloud currently does not implement CSPv3, remove this test when it does */ /* Owncloud currently does not implement CSPv3, remove this test when it does */
$nonce = class_exists('\OC\Security\CSP\ContentSecurityPolicyNonceManager') $nonce = class_exists('\OC\Security\CSP\ContentSecurityPolicyNonceManager')
? \OC::$server->getContentSecurityPolicyNonceManager()->getNonce() ? \OC::$server->getContentSecurityPolicyNonceManager()->getNonce()
: 'nonce_not_implemented'; : 'nonce_not_implemented';
?> ?>
<html dir="ltr"> <html dir="ltr">
@ -32,7 +32,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-capable" content="yes">
<!-- <base href="<?php p($urlGenerator->linkTo('epubreader',''));?>"> --> <!-- <base href="<?php p($urlGenerator->linkTo('epubreader', ''));?>"> -->
<title> <title>
<?php p($title);?> <?php p($title);?>
</title> </title>

View File

@ -19,7 +19,9 @@ style('epubreader', 'settings');
<p> <p>
<input type="checkbox" name="EpubEnable" id="EpubEnable" class="checkbox" <input type="checkbox" name="EpubEnable" id="EpubEnable" class="checkbox"
value="1" <?php if ($_['EpubEnable'] === "true") print_unescaped('checked="checked"'); ?> /> value="1" <?php if ($_['EpubEnable'] === "true") {
print_unescaped('checked="checked"');
} ?> />
<label for="EpubEnable"> <label for="EpubEnable">
<?php p($l->t('Epub'));?> <?php p($l->t('Epub'));?>
</label> </label>
@ -27,14 +29,18 @@ style('epubreader', 'settings');
<p> <p>
<input type="checkbox" name="PdfEnable" id="PdfEnable" class="checkbox" <input type="checkbox" name="PdfEnable" id="PdfEnable" class="checkbox"
value="1" <?php if ($_['PdfEnable'] === "true") print_unescaped('checked="checked"'); ?> /> value="1" <?php if ($_['PdfEnable'] === "true") {
print_unescaped('checked="checked"');
} ?> />
<label for="PdfEnable"> <label for="PdfEnable">
<?php p($l->t('PDF'));?> <?php p($l->t('PDF'));?>
</label><br/> </label><br/>
</p> </p>
<p> <p>
<input type="checkbox" name="CbxEnable" id="CbxEnable" class="checkbox" <input type="checkbox" name="CbxEnable" id="CbxEnable" class="checkbox"
value="1" <?php if ($_['CbxEnable'] === "true") print_unescaped('checked="checked"'); ?> /> value="1" <?php if ($_['CbxEnable'] === "true") {
print_unescaped('checked="checked"');
} ?> />
<label for="CbxEnable"> <label for="CbxEnable">
<?php p($l->t('CBR/CBZ'));?> <?php p($l->t('CBR/CBZ'));?>
</label><br/> </label><br/>