diff options
Diffstat (limited to 'lib/Controller/DocumentController.php')
-rw-r--r-- | lib/Controller/DocumentController.php | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/lib/Controller/DocumentController.php b/lib/Controller/DocumentController.php new file mode 100644 index 00000000..b961b126 --- /dev/null +++ b/lib/Controller/DocumentController.php @@ -0,0 +1,166 @@ +<?php +/** + * ownCloud - Richdocuments App + * + * @author Victor Dubiniuk + * @copyright 2014 Victor Dubiniuk victor.dubiniuk@gmail.com + * + * This file is licensed under the Affero General Public License version 3 or + * later. + */ + +namespace OCA\Richdocuments\Controller; + +use OCA\Richdocuments\WOPI\DiscoveryManager; +use \OCP\AppFramework\Controller; +use \OCP\IRequest; +use \OCP\IConfig; +use \OCP\IL10N; +use \OCP\AppFramework\Http\ContentSecurityPolicy; +use \OCP\AppFramework\Http\TemplateResponse; +use \OCA\Richdocuments\AppConfig; +use \OCA\Richdocuments\Helper; +use \OC\Files\View; +use \OCP\ICacheFactory; + +class DocumentController extends Controller { + + private $uid; + private $l10n; + private $settings; + private $appConfig; + private $cache; + /** @var DiscoveryManager */ + private $discoveryManager; + const ODT_TEMPLATE_PATH = '/assets/odttemplate.odt'; + + public function __construct($appName, + $UserId, + IRequest $request, + IConfig $settings, + AppConfig $appConfig, + IL10N $l10n, + ICacheFactory $cache, + DiscoveryManager $discoveryManager) { + parent::__construct($appName, $request); + $this->uid = $UserId; + $this->l10n = $l10n; + $this->settings = $settings; + $this->appConfig = $appConfig; + $this->cache = $cache->create($appName); + $this->discoveryManager = $discoveryManager; + } + + /** + * @NoAdminRequired + * @NoCSRFRequired + * + * @return TemplateResponse + */ + public function index(){ + $response = new TemplateResponse('richdocuments', 'documents'); + $policy = new ContentSecurityPolicy(); + $policy->addAllowedFrameDomain($this->appConfig->getAppValue('wopi_url')); + $response->setContentSecurityPolicy($policy); + return $response; + } + + /** + * @NoAdminRequired + */ + public function create(){ + $mimetype = $this->request->post['mimetype']; + $filename = $this->request->post['filename']; + $dir = $this->request->post['dir']; + + $view = new View('/' . $this->uid . '/files'); + if (!$dir){ + $dir = '/'; + } + + $basename = $this->l10n->t('New Document.odt'); + switch ($mimetype) { + case 'application/vnd.oasis.opendocument.spreadsheet': + $basename = $this->l10n->t('New Spreadsheet.ods'); + break; + case 'application/vnd.oasis.opendocument.presentation': + $basename = $this->l10n->t('New Presentation.odp'); + break; + case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': + $basename = $this->l10n->t('New Document.docx'); + break; + case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': + $basename = $this->l10n->t('New Spreadsheet.xlsx'); + break; + case 'application/vnd.openxmlformats-officedocument.presentationml.presentation': + $basename = $this->l10n->t('New Presentation.pptx'); + break; + default: + // to be safe + $mimetype = 'application/vnd.oasis.opendocument.text'; + break; + } + + if (!$filename){ + $path = Helper::getNewFileName($view, $dir . '/' . $basename); + } else { + $path = $dir . '/' . $filename; + } + + $content = ''; + if (class_exists('\OC\Files\Type\TemplateManager')){ + $manager = \OC_Helper::getFileTemplateManager(); + $content = $manager->getTemplate($mimetype); + } + + if (!$content){ + $content = file_get_contents(dirname(__DIR__) . self::ODT_TEMPLATE_PATH); + } + + $discovery_parsed = null; + try { + $discovery = $this->discoveryManager->get(); + + $loadEntities = libxml_disable_entity_loader(true); + $discovery_parsed = simplexml_load_string($discovery); + libxml_disable_entity_loader($loadEntities); + + if ($discovery_parsed === false) { + $this->cache->remove('discovery.xml'); + $wopiRemote = $this->getWopiUrl(false); + + return array( + 'status' => 'error', + 'message' => $this->l10n->t('Collabora Online: discovery.xml from "%s" is not a well-formed XML string.', array($wopiRemote)), + 'hint' => $this->l10n->t('Please contact the "%s" administrator.', array($wopiRemote)) + ); + } + } + catch (ResponseException $e) { + return array( + 'status' => 'error', + 'message' => $e->getMessage(), + 'hint' => $e->getHint() + ); + } + + if ($content && $view->file_put_contents($path, $content)){ + $info = $view->getFileInfo($path); + $ret = $this->getWopiSrcUrl($discovery_parsed, $mimetype); + $response = array( + 'status' => 'success', + 'fileid' => $info['fileid'], + 'urlsrc' => $ret['urlsrc'], + 'action' => $ret['action'], + 'lolang' => $this->settings->getUserValue($this->uid, 'core', 'lang', 'en'), + 'data' => \OCA\Files\Helper::formatFileInfo($info) + ); + } else { + $response = array( + 'status' => 'error', + 'message' => (string) $this->l10n->t('Can\'t create document') + ); + } + return $response; + } +} |