You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
4.6 KiB
PHP
167 lines
4.6 KiB
PHP
<?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;
|
|
}
|
|
}
|