Merge pull request #4339 from owncloud/mimetype-defaults

Add the option to provide templates for newly created files
This commit is contained in:
Thomas Müller 2013-08-17 08:42:49 -07:00
commit 12f4494de0
8 changed files with 740 additions and 576 deletions

View File

@ -77,6 +77,12 @@ if($source) {
exit();
} else {
$success = false;
if (!$content) {
$templateManager = OC_Helper::getFileTemplateManager();
$mimeType = OC_Helper::getMimeType($target);
$content = $templateManager->getTemplate($mimeType);
}
if($content) {
$success = \OC\Files\Filesystem::file_put_contents($target, $content);
} else {
@ -87,9 +93,11 @@ if($source) {
$meta = \OC\Files\Filesystem::getFileInfo($target);
$id = $meta['fileid'];
$mime = $meta['mimetype'];
$size = $meta['size'];
OCP\JSON::success(array('data' => array(
'id' => $id,
'mime' => $mime,
'size' => $size,
'content' => $content,
)));
exit();

View File

@ -5,11 +5,11 @@ $l = OC_L10N::get('files');
OCP\App::registerAdmin('files', 'admin');
OCP\App::addNavigationEntry( array( "id" => "files_index",
"order" => 0,
"href" => OCP\Util::linkTo( "files", "index.php" ),
"icon" => OCP\Util::imagePath( "core", "places/files.svg" ),
"name" => $l->t("Files") ));
OCP\App::addNavigationEntry(array("id" => "files_index",
"order" => 0,
"href" => OCP\Util::linkTo("files", "index.php"),
"icon" => OCP\Util::imagePath("core", "places/files.svg"),
"name" => $l->t("Files")));
OC_Search::registerProvider('OC_Search_Provider_File');
@ -21,3 +21,7 @@ OC_Search::registerProvider('OC_Search_Provider_File');
\OC_Hook::connect('OC_Filesystem', 'post_rename', '\OC\Files\Cache\Updater', 'renameHook');
\OCP\BackgroundJob::addRegularTask('\OC\Files\Cache\BackgroundWatcher', 'checkNext');
$templateManager = OC_Helper::getFileTemplateManager();
$templateManager->registerTemplate('text/html', 'core/templates/filetemplates/template.html');

View File

@ -1,343 +1,345 @@
$(document).ready(function() {
file_upload_param = {
dropZone: $('#content'), // restrict dropZone to content div
//singleFileUploads is on by default, so the data.files array will always have length 1
add: function(e, data) {
file_upload_param = {
dropZone: $('#content'), // restrict dropZone to content div
//singleFileUploads is on by default, so the data.files array will always have length 1
add: function(e, data) {
if(data.files[0].type === '' && data.files[0].size == 4096)
{
data.textStatus = 'dirorzero';
data.errorThrown = t('files','Unable to upload your file as it is a directory or has 0 bytes');
var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload');
fu._trigger('fail', e, data);
return true; //don't upload this file but go on with next in queue
}
var totalSize=0;
$.each(data.originalFiles, function(i,file){
totalSize+=file.size;
});
if(totalSize>$('#max_upload').val()){
data.textStatus = 'notenoughspace';
data.errorThrown = t('files','Not enough space available');
var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload');
fu._trigger('fail', e, data);
return false; //don't upload anything
}
// start the actual file upload
var jqXHR = data.submit();
// remember jqXHR to show warning to user when he navigates away but an upload is still in progress
if (typeof data.context !== 'undefined' && data.context.data('type') === 'dir') {
var dirName = data.context.data('file');
if(typeof uploadingFiles[dirName] === 'undefined') {
uploadingFiles[dirName] = {};
}
uploadingFiles[dirName][data.files[0].name] = jqXHR;
} else {
uploadingFiles[data.files[0].name] = jqXHR;
}
//show cancel button
if($('html.lte9').length === 0 && data.dataType !== 'iframe') {
$('#uploadprogresswrapper input.stop').show();
}
},
/**
* called after the first add, does NOT have the data param
* @param e
*/
start: function(e) {
//IE < 10 does not fire the necessary events for the progress bar.
if($('html.lte9').length > 0) {
return;
}
$('#uploadprogressbar').progressbar({value:0});
$('#uploadprogressbar').fadeIn();
},
fail: function(e, data) {
if (typeof data.textStatus !== 'undefined' && data.textStatus !== 'success' ) {
if (data.textStatus === 'abort') {
$('#notification').text(t('files', 'Upload cancelled.'));
} else {
// HTTP connection problem
$('#notification').text(data.errorThrown);
}
$('#notification').fadeIn();
//hide notification after 5 sec
setTimeout(function() {
$('#notification').fadeOut();
}, 5000);
}
delete uploadingFiles[data.files[0].name];
},
progress: function(e, data) {
// TODO: show nice progress bar in file row
},
progressall: function(e, data) {
//IE < 10 does not fire the necessary events for the progress bar.
if($('html.lte9').length > 0) {
return;
}
var progress = (data.loaded/data.total)*100;
$('#uploadprogressbar').progressbar('value',progress);
},
/**
* called for every successful upload
* @param e
* @param data
*/
done:function(e, data) {
// handle different responses (json or body from iframe for ie)
var response;
if (typeof data.result === 'string') {
response = data.result;
} else {
//fetch response from iframe
response = data.result[0].body.innerText;
}
var result=$.parseJSON(response);
if(typeof result[0] !== 'undefined' && result[0].status === 'success') {
var file = result[0];
} else {
data.textStatus = 'servererror';
data.errorThrown = t('files', result.data.message);
var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload');
fu._trigger('fail', e, data);
}
var filename = result[0].originalname;
// delete jqXHR reference
if (typeof data.context !== 'undefined' && data.context.data('type') === 'dir') {
var dirName = data.context.data('file');
delete uploadingFiles[dirName][filename];
if ($.assocArraySize(uploadingFiles[dirName]) == 0) {
delete uploadingFiles[dirName];
}
} else {
delete uploadingFiles[filename];
}
},
/**
* called after last upload
* @param e
* @param data
*/
stop: function(e, data) {
if(data.dataType !== 'iframe') {
$('#uploadprogresswrapper input.stop').hide();
}
//IE < 10 does not fire the necessary events for the progress bar.
if($('html.lte9').length > 0) {
return;
}
$('#uploadprogressbar').progressbar('value',100);
$('#uploadprogressbar').fadeOut();
}
}
var file_upload_handler = function() {
$('#file_upload_start').fileupload(file_upload_param);
};
if ( document.getElementById('data-upload-form') ) {
$(file_upload_handler);
}
$.assocArraySize = function(obj) {
// http://stackoverflow.com/a/6700/11236
var size = 0, key;
for (key in obj) {
if (obj.hasOwnProperty(key)) size++;
}
return size;
};
// warn user not to leave the page while upload is in progress
$(window).bind('beforeunload', function(e) {
if ($.assocArraySize(uploadingFiles) > 0)
return t('files','File upload is in progress. Leaving the page now will cancel the upload.');
});
//add multiply file upload attribute to all browsers except konqueror (which crashes when it's used)
if(navigator.userAgent.search(/konqueror/i)==-1){
$('#file_upload_start').attr('multiple','multiple')
}
//if the breadcrumb is to long, start by replacing foldernames with '...' except for the current folder
var crumb=$('div.crumb').first();
while($('div.controls').height()>40 && crumb.next('div.crumb').length>0){
crumb.children('a').text('...');
crumb=crumb.next('div.crumb');
}
//if that isn't enough, start removing items from the breacrumb except for the current folder and it's parent
var crumb=$('div.crumb').first();
var next=crumb.next('div.crumb');
while($('div.controls').height()>40 && next.next('div.crumb').length>0){
crumb.remove();
crumb=next;
next=crumb.next('div.crumb');
}
//still not enough, start shorting down the current folder name
var crumb=$('div.crumb>a').last();
while($('div.controls').height()>40 && crumb.text().length>6){
var text=crumb.text()
text=text.substr(0,text.length-6)+'...';
crumb.text(text);
}
$(document).click(function(){
$('#new>ul').hide();
$('#new').removeClass('active');
$('#new li').each(function(i,element){
if($(element).children('p').length==0){
$(element).children('form').remove();
$(element).append('<p>'+$(element).data('text')+'</p>');
}
});
});
$('#new li').click(function(){
if($(this).children('p').length==0){
return;
}
$('#new li').each(function(i,element){
if($(element).children('p').length==0){
$(element).children('form').remove();
$(element).append('<p>'+$(element).data('text')+'</p>');
}
});
var type=$(this).data('type');
var text=$(this).children('p').text();
$(this).data('text',text);
$(this).children('p').remove();
var form=$('<form></form>');
var input=$('<input>');
form.append(input);
$(this).append(form);
input.focus();
form.submit(function(event){
event.stopPropagation();
event.preventDefault();
var newname=input.val();
if(type == 'web' && newname.length == 0) {
OC.Notification.show(t('files', 'URL cannot be empty.'));
return false;
} else if (type != 'web' && !Files.isFileNameValid(newname)) {
return false;
} else if( type == 'folder' && $('#dir').val() == '/' && newname == 'Shared') {
OC.Notification.show(t('files','Invalid folder name. Usage of \'Shared\' is reserved by ownCloud'));
return false;
}
if (FileList.lastAction) {
FileList.lastAction();
}
var name = getUniqueName(newname);
if (newname != name) {
FileList.checkName(name, newname, true);
var hidden = true;
} else {
var hidden = false;
}
switch(type){
case 'file':
$.post(
OC.filePath('files','ajax','newfile.php'),
{dir:$('#dir').val(),filename:name},
function(result){
if (result.status == 'success') {
var date=new Date();
FileList.addFile(name,0,date,false,hidden);
var tr=$('tr').filterAttr('data-file',name);
tr.attr('data-mime',result.data.mime);
tr.attr('data-id', result.data.id);
getMimeIcon(result.data.mime,function(path){
tr.find('td.filename').attr('style','background-image:url('+path+')');
});
} else {
OC.dialogs.alert(result.data.message, t('core', 'Error'));
if(data.files[0].type === '' && data.files[0].size == 4096)
{
data.textStatus = 'dirorzero';
data.errorThrown = t('files','Unable to upload your file as it is a directory or has 0 bytes');
var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload');
fu._trigger('fail', e, data);
return true; //don't upload this file but go on with next in queue
}
}
);
break;
case 'folder':
$.post(
OC.filePath('files','ajax','newfolder.php'),
{dir:$('#dir').val(),foldername:name},
function(result){
if (result.status == 'success') {
var date=new Date();
FileList.addDir(name,0,date,hidden);
var tr=$('tr').filterAttr('data-file',name);
tr.attr('data-id', result.data.id);
} else {
OC.dialogs.alert(result.data.message, t('core', 'Error'));
}
}
);
break;
case 'web':
if(name.substr(0,8)!='https://' && name.substr(0,7)!='http://'){
name='http://'+name;
}
var localName=name;
if(localName.substr(localName.length-1,1)=='/'){//strip /
localName=localName.substr(0,localName.length-1)
}
if(localName.indexOf('/')){//use last part of url
localName=localName.split('/').pop();
} else { //or the domain
localName=(localName.match(/:\/\/(.[^\/]+)/)[1]).replace('www.','');
}
localName = getUniqueName(localName);
//IE < 10 does not fire the necessary events for the progress bar.
if($('html.lte9').length > 0) {
} else {
$('#uploadprogressbar').progressbar({value:0});
$('#uploadprogressbar').fadeIn();
}
var eventSource=new OC.EventSource(OC.filePath('files','ajax','newfile.php'),{dir:$('#dir').val(),source:name,filename:localName});
eventSource.listen('progress',function(progress){
//IE < 10 does not fire the necessary events for the progress bar.
if($('html.lte9').length > 0) {
} else {
var totalSize=0;
$.each(data.originalFiles, function(i,file){
totalSize+=file.size;
});
if(totalSize>$('#max_upload').val()){
data.textStatus = 'notenoughspace';
data.errorThrown = t('files','Not enough space available');
var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload');
fu._trigger('fail', e, data);
return false; //don't upload anything
}
// start the actual file upload
var jqXHR = data.submit();
// remember jqXHR to show warning to user when he navigates away but an upload is still in progress
if (typeof data.context !== 'undefined' && data.context.data('type') === 'dir') {
var dirName = data.context.data('file');
if(typeof uploadingFiles[dirName] === 'undefined') {
uploadingFiles[dirName] = {};
}
uploadingFiles[dirName][data.files[0].name] = jqXHR;
} else {
uploadingFiles[data.files[0].name] = jqXHR;
}
//show cancel button
if($('html.lte9').length === 0 && data.dataType !== 'iframe') {
$('#uploadprogresswrapper input.stop').show();
}
},
/**
* called after the first add, does NOT have the data param
* @param e
*/
start: function(e) {
//IE < 10 does not fire the necessary events for the progress bar.
if($('html.lte9').length > 0) {
return;
}
$('#uploadprogressbar').progressbar({value:0});
$('#uploadprogressbar').fadeIn();
},
fail: function(e, data) {
if (typeof data.textStatus !== 'undefined' && data.textStatus !== 'success' ) {
if (data.textStatus === 'abort') {
$('#notification').text(t('files', 'Upload cancelled.'));
} else {
// HTTP connection problem
$('#notification').text(data.errorThrown);
}
$('#notification').fadeIn();
//hide notification after 5 sec
setTimeout(function() {
$('#notification').fadeOut();
}, 5000);
}
delete uploadingFiles[data.files[0].name];
},
progress: function(e, data) {
// TODO: show nice progress bar in file row
},
progressall: function(e, data) {
//IE < 10 does not fire the necessary events for the progress bar.
if($('html.lte9').length > 0) {
return;
}
var progress = (data.loaded/data.total)*100;
$('#uploadprogressbar').progressbar('value',progress);
}
});
eventSource.listen('success',function(data){
var mime=data.mime;
var size=data.size;
var id=data.id;
$('#uploadprogressbar').fadeOut();
var date=new Date();
FileList.addFile(localName,size,date,false,hidden);
var tr=$('tr').filterAttr('data-file',localName);
tr.data('mime',mime).data('id',id);
tr.attr('data-id', id);
getMimeIcon(mime,function(path){
tr.find('td.filename').attr('style','background-image:url('+path+')');
});
});
eventSource.listen('error',function(error){
$('#uploadprogressbar').fadeOut();
alert(error);
});
break;
}
var li=form.parent();
form.remove();
li.append('<p>'+li.data('text')+'</p>');
$('#new>a').click();
},
/**
* called for every successful upload
* @param e
* @param data
*/
done:function(e, data) {
// handle different responses (json or body from iframe for ie)
var response;
if (typeof data.result === 'string') {
response = data.result;
} else {
//fetch response from iframe
response = data.result[0].body.innerText;
}
var result=$.parseJSON(response);
if(typeof result[0] !== 'undefined' && result[0].status === 'success') {
var file = result[0];
} else {
data.textStatus = 'servererror';
data.errorThrown = t('files', result.data.message);
var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload');
fu._trigger('fail', e, data);
}
var filename = result[0].originalname;
// delete jqXHR reference
if (typeof data.context !== 'undefined' && data.context.data('type') === 'dir') {
var dirName = data.context.data('file');
delete uploadingFiles[dirName][filename];
if ($.assocArraySize(uploadingFiles[dirName]) == 0) {
delete uploadingFiles[dirName];
}
} else {
delete uploadingFiles[filename];
}
},
/**
* called after last upload
* @param e
* @param data
*/
stop: function(e, data) {
if(data.dataType !== 'iframe') {
$('#uploadprogresswrapper input.stop').hide();
}
//IE < 10 does not fire the necessary events for the progress bar.
if($('html.lte9').length > 0) {
return;
}
$('#uploadprogressbar').progressbar('value',100);
$('#uploadprogressbar').fadeOut();
}
}
var file_upload_handler = function() {
$('#file_upload_start').fileupload(file_upload_param);
};
if ( document.getElementById('data-upload-form') ) {
$(file_upload_handler);
}
$.assocArraySize = function(obj) {
// http://stackoverflow.com/a/6700/11236
var size = 0, key;
for (key in obj) {
if (obj.hasOwnProperty(key)) size++;
}
return size;
};
// warn user not to leave the page while upload is in progress
$(window).bind('beforeunload', function(e) {
if ($.assocArraySize(uploadingFiles) > 0)
return t('files','File upload is in progress. Leaving the page now will cancel the upload.');
});
//add multiply file upload attribute to all browsers except konqueror (which crashes when it's used)
if(navigator.userAgent.search(/konqueror/i)==-1){
$('#file_upload_start').attr('multiple','multiple')
}
//if the breadcrumb is to long, start by replacing foldernames with '...' except for the current folder
var crumb=$('div.crumb').first();
while($('div.controls').height()>40 && crumb.next('div.crumb').length>0){
crumb.children('a').text('...');
crumb=crumb.next('div.crumb');
}
//if that isn't enough, start removing items from the breacrumb except for the current folder and it's parent
var crumb=$('div.crumb').first();
var next=crumb.next('div.crumb');
while($('div.controls').height()>40 && next.next('div.crumb').length>0){
crumb.remove();
crumb=next;
next=crumb.next('div.crumb');
}
//still not enough, start shorting down the current folder name
var crumb=$('div.crumb>a').last();
while($('div.controls').height()>40 && crumb.text().length>6){
var text=crumb.text()
text=text.substr(0,text.length-6)+'...';
crumb.text(text);
}
$(document).click(function(){
$('#new>ul').hide();
$('#new').removeClass('active');
$('#new li').each(function(i,element){
if($(element).children('p').length==0){
$(element).children('form').remove();
$(element).append('<p>'+$(element).data('text')+'</p>');
}
});
});
$('#new li').click(function(){
if($(this).children('p').length==0){
return;
}
$('#new li').each(function(i,element){
if($(element).children('p').length==0){
$(element).children('form').remove();
$(element).append('<p>'+$(element).data('text')+'</p>');
}
});
var type=$(this).data('type');
var text=$(this).children('p').text();
$(this).data('text',text);
$(this).children('p').remove();
var form=$('<form></form>');
var input=$('<input>');
form.append(input);
$(this).append(form);
input.focus();
form.submit(function(event){
event.stopPropagation();
event.preventDefault();
var newname=input.val();
if(type == 'web' && newname.length == 0) {
OC.Notification.show(t('files', 'URL cannot be empty.'));
return false;
} else if (type != 'web' && !Files.isFileNameValid(newname)) {
return false;
} else if( type == 'folder' && $('#dir').val() == '/' && newname == 'Shared') {
OC.Notification.show(t('files','Invalid folder name. Usage of \'Shared\' is reserved by ownCloud'));
return false;
}
if (FileList.lastAction) {
FileList.lastAction();
}
var name = getUniqueName(newname);
if (newname != name) {
FileList.checkName(name, newname, true);
var hidden = true;
} else {
var hidden = false;
}
switch(type){
case 'file':
$.post(
OC.filePath('files','ajax','newfile.php'),
{dir:$('#dir').val(),filename:name},
function(result){
if (result.status == 'success') {
var date=new Date();
FileList.addFile(name,0,date,false,hidden);
var tr=$('tr').filterAttr('data-file',name);
tr.attr('data-size',result.data.size);
tr.attr('data-mime',result.data.mime);
tr.attr('data-id', result.data.id);
tr.find('.filesize').text(humanFileSize(result.data.size));
getMimeIcon(result.data.mime,function(path){
tr.find('td.filename').attr('style','background-image:url('+path+')');
});
} else {
OC.dialogs.alert(result.data.message, t('core', 'Error'));
}
}
);
break;
case 'folder':
$.post(
OC.filePath('files','ajax','newfolder.php'),
{dir:$('#dir').val(),foldername:name},
function(result){
if (result.status == 'success') {
var date=new Date();
FileList.addDir(name,0,date,hidden);
var tr=$('tr').filterAttr('data-file',name);
tr.attr('data-id', result.data.id);
} else {
OC.dialogs.alert(result.data.message, t('core', 'Error'));
}
}
);
break;
case 'web':
if(name.substr(0,8)!='https://' && name.substr(0,7)!='http://'){
name='http://'+name;
}
var localName=name;
if(localName.substr(localName.length-1,1)=='/'){//strip /
localName=localName.substr(0,localName.length-1)
}
if(localName.indexOf('/')){//use last part of url
localName=localName.split('/').pop();
} else { //or the domain
localName=(localName.match(/:\/\/(.[^\/]+)/)[1]).replace('www.','');
}
localName = getUniqueName(localName);
//IE < 10 does not fire the necessary events for the progress bar.
if($('html.lte9').length > 0) {
} else {
$('#uploadprogressbar').progressbar({value:0});
$('#uploadprogressbar').fadeIn();
}
var eventSource=new OC.EventSource(OC.filePath('files','ajax','newfile.php'),{dir:$('#dir').val(),source:name,filename:localName});
eventSource.listen('progress',function(progress){
//IE < 10 does not fire the necessary events for the progress bar.
if($('html.lte9').length > 0) {
} else {
$('#uploadprogressbar').progressbar('value',progress);
}
});
eventSource.listen('success',function(data){
var mime=data.mime;
var size=data.size;
var id=data.id;
$('#uploadprogressbar').fadeOut();
var date=new Date();
FileList.addFile(localName,size,date,false,hidden);
var tr=$('tr').filterAttr('data-file',localName);
tr.data('mime',mime).data('id',id);
tr.attr('data-id', id);
getMimeIcon(mime,function(path){
tr.find('td.filename').attr('style','background-image:url('+path+')');
});
});
eventSource.listen('error',function(error){
$('#uploadprogressbar').fadeOut();
alert(error);
});
break;
}
var li=form.parent();
form.remove();
li.append('<p>'+li.data('text')+'</p>');
$('#new>a').click();
});
});
});
});

View File

@ -365,7 +365,9 @@ $(document).ready(function() {
FileList.addFile(name,0,date,false,hidden);
var tr=$('tr').filterAttr('data-file',name);
tr.attr('data-mime',result.data.mime);
tr.attr('data-size',result.data.size);
tr.attr('data-id', result.data.id);
tr.find('.filesize').text(humanFileSize(result.data.size));
getMimeIcon(result.data.mime,function(path){
tr.find('td.filename').attr('style','background-image:url('+path+')');
});

View File

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html>
<head>
</head>
<body>
</body>
</html>

View File

@ -0,0 +1,121 @@
<?php
/**
* Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OC\Files\Type;
/**
* Class Detection
*
* Mimetype detection
*
* @package OC\Files\Type
*/
class Detection {
protected $mimetypes = array();
/**
* add an extension -> mimetype mapping
*
* @param string $extension
* @param string $mimetype
*/
public function registerType($extension, $mimetype) {
$this->mimetypes[$extension] = $mimetype;
}
/**
* add an array of extension -> mimetype mappings
*
* @param array $types
*/
public function registerTypeArray($types) {
$this->mimetypes = array_merge($this->mimetypes, $types);
}
/**
* detect mimetype only based on filename, content of file is not used
*
* @param string $path
* @return string
*/
public function detectPath($path) {
if (strpos($path, '.')) {
//try to guess the type by the file extension
$extension = strtolower(strrchr(basename($path), "."));
$extension = substr($extension, 1); //remove leading .
return (isset($this->mimetypes[$extension])) ? $this->mimetypes[$extension] : 'application/octet-stream';
} else {
return 'application/octet-stream';
}
}
/**
* detect mimetype based on both filename and content
*
* @param string $path
* @return string
*/
public function detect($path) {
$isWrapped = (strpos($path, '://') !== false) and (substr($path, 0, 7) === 'file://');
if (@is_dir($path)) {
// directories are easy
return "httpd/unix-directory";
}
$mimeType = $this->detectPath($path);
if ($mimeType === 'application/octet-stream' and function_exists('finfo_open')
and function_exists('finfo_file') and $finfo = finfo_open(FILEINFO_MIME)
) {
$info = @strtolower(finfo_file($finfo, $path));
if ($info) {
$mimeType = substr($info, 0, strpos($info, ';'));
}
finfo_close($finfo);
}
if (!$isWrapped and $mimeType === 'application/octet-stream' && function_exists("mime_content_type")) {
// use mime magic extension if available
$mimeType = mime_content_type($path);
}
if (!$isWrapped and $mimeType === 'application/octet-stream' && \OC_Helper::canExecute("file")) {
// it looks like we have a 'file' command,
// lets see if it does have mime support
$path = escapeshellarg($path);
$fp = popen("file -b --mime-type $path 2>/dev/null", "r");
$reply = fgets($fp);
pclose($fp);
//trim the newline
$mimeType = trim($reply);
}
return $mimeType;
}
/**
* detect mimetype based on the content of a string
*
* @param string $data
* @return string
*/
public function detectString($data) {
if (function_exists('finfo_open') and function_exists('finfo_file')) {
$finfo = finfo_open(FILEINFO_MIME);
return finfo_buffer($finfo, $data);
} else {
$tmpFile = \OC_Helper::tmpFile();
$fh = fopen($tmpFile, 'wb');
fwrite($fh, $data, 8024);
fclose($fh);
$mime = $this->detect($tmpFile);
unset($tmpFile);
return $mime;
}
}
}

View File

@ -0,0 +1,46 @@
<?php
/**
* Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OC\Files\Type;
class TemplateManager {
protected $templates = array();
public function registerTemplate($mimetype, $path) {
$this->templates[$mimetype] = $path;
}
/**
* get the path of the template for a mimetype
*
* @param string $mimetype
* @return string | null
*/
public function getTemplatePath($mimetype) {
if (isset($this->templates[$mimetype])) {
return $this->templates[$mimetype];
} else {
return null;
}
}
/**
* get the template content for a mimetype
*
* @param string $mimetype
* @return string
*/
public function getTemplate($mimetype) {
$path = $this->getTemplatePath($mimetype);
if ($path) {
return file_get_contents($path);
} else {
return '';
}
}
}

View File

@ -25,9 +25,10 @@
* Collection of useful functions
*/
class OC_Helper {
private static $mimetypes=array();
private static $tmpFiles=array();
private static $tmpFiles = array();
private static $mimetypeIcons = array();
private static $mimetypeDetector;
private static $templateManager;
/**
* @brief Creates an url using a defined route
@ -39,7 +40,7 @@ class OC_Helper {
*
* Returns a url to the given app and file.
*/
public static function linkToRoute( $route, $parameters = array() ) {
public static function linkToRoute($route, $parameters = array()) {
$urlLinkTo = OC::getRouter()->generate($route, $parameters);
return $urlLinkTo;
}
@ -49,38 +50,35 @@ class OC_Helper {
* @param string $app app
* @param string $file file
* @param array $args array with param=>value, will be appended to the returned url
* The value of $args will be urlencoded
* The value of $args will be urlencoded
* @return string the url
*
* Returns a url to the given app and file.
*/
public static function linkTo( $app, $file, $args = array() ) {
if( $app != '' ) {
public static function linkTo($app, $file, $args = array()) {
if ($app != '') {
$app_path = OC_App::getAppPath($app);
// Check if the app is in the app folder
if( $app_path && file_exists( $app_path.'/'.$file )) {
if(substr($file, -3) == 'php' || substr($file, -3) == 'css') {
$urlLinkTo = OC::$WEBROOT . '/index.php/apps/' . $app;
$urlLinkTo .= ($file!='index.php') ? '/' . $file : '';
}else{
$urlLinkTo = OC_App::getAppWebPath($app) . '/' . $file;
if ($app_path && file_exists($app_path . '/' . $file)) {
if (substr($file, -3) == 'php' || substr($file, -3) == 'css') {
$urlLinkTo = OC::$WEBROOT . '/index.php/apps/' . $app;
$urlLinkTo .= ($file != 'index.php') ? '/' . $file : '';
} else {
$urlLinkTo = OC_App::getAppWebPath($app) . '/' . $file;
}
} else {
$urlLinkTo = OC::$WEBROOT . '/' . $app . '/' . $file;
}
else{
$urlLinkTo = OC::$WEBROOT . '/' . $app . '/' . $file;
}
}
else{
if( file_exists( OC::$SERVERROOT . '/core/'. $file )) {
$urlLinkTo = OC::$WEBROOT . '/core/'.$file;
}
else{
$urlLinkTo = OC::$WEBROOT . '/'.$file;
} else {
if (file_exists(OC::$SERVERROOT . '/core/' . $file)) {
$urlLinkTo = OC::$WEBROOT . '/core/' . $file;
} else {
$urlLinkTo = OC::$WEBROOT . '/' . $file;
}
}
if ($args && $query = http_build_query($args, '', '&')) {
$urlLinkTo .= '?'.$query;
$urlLinkTo .= '?' . $query;
}
return $urlLinkTo;
@ -91,13 +89,13 @@ class OC_Helper {
* @param string $app app
* @param string $file file
* @param array $args array with param=>value, will be appended to the returned url
* The value of $args will be urlencoded
* The value of $args will be urlencoded
* @return string the url
*
* Returns a absolute url to the given app and file.
*/
public static function linkToAbsolute( $app, $file, $args = array() ) {
$urlLinkTo = self::linkTo( $app, $file, $args );
public static function linkToAbsolute($app, $file, $args = array()) {
$urlLinkTo = self::linkTo($app, $file, $args);
return self::makeURLAbsolute($urlLinkTo);
}
@ -108,9 +106,8 @@ class OC_Helper {
*
* Returns a absolute url to the given app and file.
*/
public static function makeURLAbsolute( $url )
{
return OC_Request::serverProtocol(). '://' . OC_Request::serverHost() . $url;
public static function makeURLAbsolute($url) {
return OC_Request::serverProtocol() . '://' . OC_Request::serverHost() . $url;
}
/**
@ -120,8 +117,8 @@ class OC_Helper {
*
* Returns a url to the given service.
*/
public static function linkToRemoteBase( $service ) {
return self::linkTo( '', 'remote.php') . '/' . $service;
public static function linkToRemoteBase($service) {
return self::linkTo('', 'remote.php') . '/' . $service;
}
/**
@ -132,9 +129,9 @@ class OC_Helper {
*
* Returns a absolute url to the given service.
*/
public static function linkToRemote( $service, $add_slash = true ) {
public static function linkToRemote($service, $add_slash = true) {
return self::makeURLAbsolute(self::linkToRemoteBase($service))
. (($add_slash && $service[strlen($service)-1]!='/')?'/':'');
. (($add_slash && $service[strlen($service) - 1] != '/') ? '/' : '');
}
/**
@ -146,8 +143,8 @@ class OC_Helper {
* Returns a absolute url to the given service.
*/
public static function linkToPublic($service, $add_slash = false) {
return self::linkToAbsolute( '', 'public.php') . '?service=' . $service
. (($add_slash && $service[strlen($service)-1]!='/')?'/':'');
return self::linkToAbsolute('', 'public.php') . '?service=' . $service
. (($add_slash && $service[strlen($service) - 1] != '/') ? '/' : '');
}
/**
@ -158,25 +155,25 @@ class OC_Helper {
*
* Returns the path to the image.
*/
public static function imagePath( $app, $image ) {
public static function imagePath($app, $image) {
// Read the selected theme from the config file
$theme = OC_Util::getTheme();
// Check if the app is in the app folder
if( file_exists( OC::$SERVERROOT."/themes/$theme/apps/$app/img/$image" )) {
return OC::$WEBROOT."/themes/$theme/apps/$app/img/$image";
}elseif( file_exists(OC_App::getAppPath($app)."/img/$image" )) {
return OC_App::getAppWebPath($app)."/img/$image";
}elseif( !empty( $app ) and file_exists( OC::$SERVERROOT."/themes/$theme/$app/img/$image" )) {
return OC::$WEBROOT."/themes/$theme/$app/img/$image";
}elseif( !empty( $app ) and file_exists( OC::$SERVERROOT."/$app/img/$image" )) {
return OC::$WEBROOT."/$app/img/$image";
}elseif( file_exists( OC::$SERVERROOT."/themes/$theme/core/img/$image" )) {
return OC::$WEBROOT."/themes/$theme/core/img/$image";
}elseif( file_exists( OC::$SERVERROOT."/core/img/$image" )) {
return OC::$WEBROOT."/core/img/$image";
}else{
throw new RuntimeException('image not found: image:'.$image.' webroot:'.OC::$WEBROOT.' serverroot:'.OC::$SERVERROOT);
if (file_exists(OC::$SERVERROOT . "/themes/$theme/apps/$app/img/$image")) {
return OC::$WEBROOT . "/themes/$theme/apps/$app/img/$image";
} elseif (file_exists(OC_App::getAppPath($app) . "/img/$image")) {
return OC_App::getAppWebPath($app) . "/img/$image";
} elseif (!empty($app) and file_exists(OC::$SERVERROOT . "/themes/$theme/$app/img/$image")) {
return OC::$WEBROOT . "/themes/$theme/$app/img/$image";
} elseif (!empty($app) and file_exists(OC::$SERVERROOT . "/$app/img/$image")) {
return OC::$WEBROOT . "/$app/img/$image";
} elseif (file_exists(OC::$SERVERROOT . "/themes/$theme/core/img/$image")) {
return OC::$WEBROOT . "/themes/$theme/core/img/$image";
} elseif (file_exists(OC::$SERVERROOT . "/core/img/$image")) {
return OC::$WEBROOT . "/core/img/$image";
} else {
throw new RuntimeException('image not found: image:' . $image . ' webroot:' . OC::$WEBROOT . ' serverroot:' . OC::$SERVERROOT);
}
}
@ -197,28 +194,28 @@ class OC_Helper {
}
// Replace slash and backslash with a minus
$icon = str_replace('/', '-', $mimetype);
$icon = str_replace( '\\', '-', $icon);
$icon = str_replace('\\', '-', $icon);
// Is it a dir?
if ($mimetype === 'dir') {
self::$mimetypeIcons[$mimetype] = OC::$WEBROOT.'/core/img/filetypes/folder.png';
return OC::$WEBROOT.'/core/img/filetypes/folder.png';
self::$mimetypeIcons[$mimetype] = OC::$WEBROOT . '/core/img/filetypes/folder.png';
return OC::$WEBROOT . '/core/img/filetypes/folder.png';
}
// Icon exists?
if (file_exists(OC::$SERVERROOT.'/core/img/filetypes/'.$icon.'.png')) {
self::$mimetypeIcons[$mimetype] = OC::$WEBROOT.'/core/img/filetypes/'.$icon.'.png';
return OC::$WEBROOT.'/core/img/filetypes/'.$icon.'.png';
if (file_exists(OC::$SERVERROOT . '/core/img/filetypes/' . $icon . '.png')) {
self::$mimetypeIcons[$mimetype] = OC::$WEBROOT . '/core/img/filetypes/' . $icon . '.png';
return OC::$WEBROOT . '/core/img/filetypes/' . $icon . '.png';
}
// Try only the first part of the filetype
$mimePart = substr($icon, 0, strpos($icon, '-'));
if (file_exists(OC::$SERVERROOT.'/core/img/filetypes/'.$mimePart.'.png')) {
self::$mimetypeIcons[$mimetype] = OC::$WEBROOT.'/core/img/filetypes/'.$mimePart.'.png';
return OC::$WEBROOT.'/core/img/filetypes/'.$mimePart.'.png';
if (file_exists(OC::$SERVERROOT . '/core/img/filetypes/' . $mimePart . '.png')) {
self::$mimetypeIcons[$mimetype] = OC::$WEBROOT . '/core/img/filetypes/' . $mimePart . '.png';
return OC::$WEBROOT . '/core/img/filetypes/' . $mimePart . '.png';
} else {
self::$mimetypeIcons[$mimetype] = OC::$WEBROOT.'/core/img/filetypes/file.png';
return OC::$WEBROOT.'/core/img/filetypes/file.png';
self::$mimetypeIcons[$mimetype] = OC::$WEBROOT . '/core/img/filetypes/file.png';
return OC::$WEBROOT . '/core/img/filetypes/file.png';
}
}
@ -229,25 +226,25 @@ class OC_Helper {
*
* Makes 2048 to 2 kB.
*/
public static function humanFileSize( $bytes ) {
if( $bytes < 0 ) {
public static function humanFileSize($bytes) {
if ($bytes < 0) {
$l = OC_L10N::get('lib');
return "?";
}
if( $bytes < 1024 ) {
if ($bytes < 1024) {
return "$bytes B";
}
$bytes = round( $bytes / 1024, 1 );
if( $bytes < 1024 ) {
$bytes = round($bytes / 1024, 1);
if ($bytes < 1024) {
return "$bytes kB";
}
$bytes = round( $bytes / 1024, 1 );
if( $bytes < 1024 ) {
$bytes = round($bytes / 1024, 1);
if ($bytes < 1024) {
return "$bytes MB";
}
// Wow, heavy duty for owncloud
$bytes = round( $bytes / 1024, 1 );
$bytes = round($bytes / 1024, 1);
return "$bytes GB";
}
@ -260,21 +257,21 @@ class OC_Helper {
*
* Inspired by: http://www.php.net/manual/en/function.filesize.php#92418
*/
public static function computerFileSize( $str ) {
$str=strtolower($str);
public static function computerFileSize($str) {
$str = strtolower($str);
$bytes_array = array(
'b' => 1,
'k' => 1024,
'kb' => 1024,
'mb' => 1024 * 1024,
'm' => 1024 * 1024,
'm' => 1024 * 1024,
'gb' => 1024 * 1024 * 1024,
'g' => 1024 * 1024 * 1024,
'g' => 1024 * 1024 * 1024,
'tb' => 1024 * 1024 * 1024 * 1024,
't' => 1024 * 1024 * 1024 * 1024,
't' => 1024 * 1024 * 1024 * 1024,
'pb' => 1024 * 1024 * 1024 * 1024 * 1024,
'p' => 1024 * 1024 * 1024 * 1024 * 1024,
'p' => 1024 * 1024 * 1024 * 1024 * 1024,
);
$bytes = floatval($str);
@ -299,18 +296,17 @@ class OC_Helper {
return chmod($path, $filemode);
$dh = opendir($path);
while (($file = readdir($dh)) !== false) {
if($file != '.' && $file != '..') {
$fullpath = $path.'/'.$file;
if(is_link($fullpath))
if ($file != '.' && $file != '..') {
$fullpath = $path . '/' . $file;
if (is_link($fullpath))
return false;
elseif(!is_dir($fullpath) && !@chmod($fullpath, $filemode))
return false;
elseif(!self::chmodr($fullpath, $filemode))
elseif (!is_dir($fullpath) && !@chmod($fullpath, $filemode))
return false; elseif (!self::chmodr($fullpath, $filemode))
return false;
}
}
closedir($dh);
if(@chmod($path, $filemode))
if (@chmod($path, $filemode))
return true;
else
return false;
@ -323,8 +319,8 @@ class OC_Helper {
*
*/
static function copyr($src, $dest) {
if(is_dir($src)) {
if(!is_dir($dest)) {
if (is_dir($src)) {
if (!is_dir($dest)) {
mkdir($dest);
}
$files = scandir($src);
@ -333,7 +329,7 @@ class OC_Helper {
self::copyr("$src/$file", "$dest/$file");
}
}
}elseif(file_exists($src) && !\OC\Files\Filesystem::isFileBlacklisted($src)) {
} elseif (file_exists($src) && !\OC\Files\Filesystem::isFileBlacklisted($src)) {
copy($src, $dest);
}
}
@ -344,105 +340,74 @@ class OC_Helper {
* @return bool
*/
static function rmdirr($dir) {
if(is_dir($dir)) {
$files=scandir($dir);
foreach($files as $file) {
if (is_dir($dir)) {
$files = scandir($dir);
foreach ($files as $file) {
if ($file != "." && $file != "..") {
self::rmdirr("$dir/$file");
}
}
rmdir($dir);
}elseif(file_exists($dir)) {
} elseif (file_exists($dir)) {
unlink($dir);
}
if(file_exists($dir)) {
if (file_exists($dir)) {
return false;
}else{
} else {
return true;
}
}
/**
* @return \OC\Files\Type\Detection
*/
static public function getMimetypeDetector() {
if (!self::$mimetypeDetector) {
self::$mimetypeDetector = new \OC\Files\Type\Detection();
self::$mimetypeDetector->registerTypeArray(include 'mimetypes.list.php');
}
return self::$mimetypeDetector;
}
/**
* @return \OC\Files\Type\TemplateManager
*/
static public function getFileTemplateManager() {
if (!self::$templateManager) {
self::$templateManager = new \OC\Files\Type\TemplateManager();
}
return self::$templateManager;
}
/**
* Try to guess the mimetype based on filename
*
* @param string $path
* @return string
*/
static public function getFileNameMimeType($path){
if(strpos($path, '.')) {
//try to guess the type by the file extension
if(!self::$mimetypes || self::$mimetypes != include 'mimetypes.list.php') {
self::$mimetypes=include 'mimetypes.list.php';
}
$extension=strtolower(strrchr(basename($path), "."));
$extension=substr($extension, 1);//remove leading .
return (isset(self::$mimetypes[$extension]))?self::$mimetypes[$extension]:'application/octet-stream';
}else{
return 'application/octet-stream';
}
static public function getFileNameMimeType($path) {
return self::getMimetypeDetector()->detectPath($path);
}
/**
* get the mimetype form a local file
*
* @param string $path
* @return string
* does NOT work for ownClouds filesystem, use OC_FileSystem::getMimeType instead
*/
static function getMimeType($path) {
$isWrapped=(strpos($path, '://')!==false) and (substr($path, 0, 7)=='file://');
if (@is_dir($path)) {
// directories are easy
return "httpd/unix-directory";
}
$mimeType = self::getFileNameMimeType($path);
if($mimeType=='application/octet-stream' and function_exists('finfo_open')
and function_exists('finfo_file') and $finfo=finfo_open(FILEINFO_MIME)) {
$info = @strtolower(finfo_file($finfo, $path));
if($info) {
$mimeType=substr($info, 0, strpos($info, ';'));
}
finfo_close($finfo);
}
if (!$isWrapped and $mimeType=='application/octet-stream' && function_exists("mime_content_type")) {
// use mime magic extension if available
$mimeType = mime_content_type($path);
}
if (!$isWrapped and $mimeType=='application/octet-stream' && OC_Helper::canExecute("file")) {
// it looks like we have a 'file' command,
// lets see if it does have mime support
$path=escapeshellarg($path);
$fp = popen("file -b --mime-type $path 2>/dev/null", "r");
$reply = fgets($fp);
pclose($fp);
//trim the newline
$mimeType = trim($reply);
}
return $mimeType;
return self::getMimetypeDetector()->detect($path);
}
/**
* get the mimetype form a data string
*
* @param string $data
* @return string
*/
static function getStringMimeType($data) {
if(function_exists('finfo_open') and function_exists('finfo_file')) {
$finfo=finfo_open(FILEINFO_MIME);
return finfo_buffer($finfo, $data);
}else{
$tmpFile=OC_Helper::tmpFile();
$fh=fopen($tmpFile, 'wb');
fwrite($fh, $data, 8024);
fclose($fh);
$mime=self::getMimeType($tmpFile);
unset($tmpFile);
return $mime;
}
return self::getMimetypeDetector()->detectString($data);
}
/**
@ -454,9 +419,9 @@ class OC_Helper {
*/
//FIXME: should also check for value validation (i.e. the email is an email).
public static function init_var($s, $d="") {
public static function init_var($s, $d = "") {
$r = $d;
if(isset($_REQUEST[$s]) && !empty($_REQUEST[$s])) {
if (isset($_REQUEST[$s]) && !empty($_REQUEST[$s])) {
$r = OC_Util::sanitizeHTML($_REQUEST[$s]);
}
@ -466,12 +431,13 @@ class OC_Helper {
/**
* returns "checked"-attribute if request contains selected radio element
* OR if radio element is the default one -- maybe?
*
* @param string $s Name of radio-button element name
* @param string $v Value of current radio-button element
* @param string $d Value of default radio-button element
*/
public static function init_radio($s, $v, $d) {
if((isset($_REQUEST[$s]) && $_REQUEST[$s]==$v) || (!isset($_REQUEST[$s]) && $v == $d))
if ((isset($_REQUEST[$s]) && $_REQUEST[$s] == $v) || (!isset($_REQUEST[$s]) && $v == $d))
print "checked=\"checked\" ";
}
@ -503,17 +469,17 @@ class OC_Helper {
$dirs = explode(PATH_SEPARATOR, $path);
// WARNING : We have to check if open_basedir is enabled :
$obd = ini_get('open_basedir');
if($obd != "none") {
if ($obd != "none") {
$obd_values = explode(PATH_SEPARATOR, $obd);
if(count($obd_values) > 0 and $obd_values[0]) {
if (count($obd_values) > 0 and $obd_values[0]) {
// open_basedir is in effect !
// We need to check if the program is in one of these dirs :
$dirs = $obd_values;
}
}
foreach($dirs as $dir) {
foreach($exts as $ext) {
if($check_fn("$dir/$name".$ext))
foreach ($dirs as $dir) {
foreach ($exts as $ext) {
if ($check_fn("$dir/$name" . $ext))
return true;
}
}
@ -522,18 +488,19 @@ class OC_Helper {
/**
* copy the contents of one stream to another
*
* @param resource $source
* @param resource $target
* @return int the number of bytes copied
*/
public static function streamCopy($source, $target) {
if(!$source or !$target) {
if (!$source or !$target) {
return false;
}
$result = true;
$count = 0;
while(!feof($source)) {
if ( ( $c = fwrite($target, fread($source, 8192)) ) === false) {
while (!feof($source)) {
if (($c = fwrite($target, fread($source, 8192))) === false) {
$result = false;
} else {
$count += $c;
@ -544,37 +511,39 @@ class OC_Helper {
/**
* create a temporary file with an unique filename
*
* @param string $postfix
* @return string
*
* temporary files are automatically cleaned up after the script is finished
*/
public static function tmpFile($postfix='') {
$file=get_temp_dir().'/'.md5(time().rand()).$postfix;
$fh=fopen($file, 'w');
public static function tmpFile($postfix = '') {
$file = get_temp_dir() . '/' . md5(time() . rand()) . $postfix;
$fh = fopen($file, 'w');
fclose($fh);
self::$tmpFiles[]=$file;
self::$tmpFiles[] = $file;
return $file;
}
/**
* move a file to oc-noclean temp dir
*
* @param string $filename
* @return mixed
*
*/
public static function moveToNoClean($filename='') {
public static function moveToNoClean($filename = '') {
if ($filename == '') {
return false;
}
$tmpDirNoClean=get_temp_dir().'/oc-noclean/';
$tmpDirNoClean = get_temp_dir() . '/oc-noclean/';
if (!file_exists($tmpDirNoClean) || !is_dir($tmpDirNoClean)) {
if (file_exists($tmpDirNoClean)) {
unlink($tmpDirNoClean);
}
mkdir($tmpDirNoClean);
}
$newname=$tmpDirNoClean.basename($filename);
$newname = $tmpDirNoClean . basename($filename);
if (rename($filename, $newname)) {
return $newname;
} else {
@ -584,34 +553,35 @@ class OC_Helper {
/**
* create a temporary folder with an unique filename
*
* @return string
*
* temporary files are automatically cleaned up after the script is finished
*/
public static function tmpFolder() {
$path=get_temp_dir().'/'.md5(time().rand());
$path = get_temp_dir() . '/' . md5(time() . rand());
mkdir($path);
self::$tmpFiles[]=$path;
return $path.'/';
self::$tmpFiles[] = $path;
return $path . '/';
}
/**
* remove all files created by self::tmpFile
*/
public static function cleanTmp() {
$leftoversFile=get_temp_dir().'/oc-not-deleted';
if(file_exists($leftoversFile)) {
$leftovers=file($leftoversFile);
foreach($leftovers as $file) {
$leftoversFile = get_temp_dir() . '/oc-not-deleted';
if (file_exists($leftoversFile)) {
$leftovers = file($leftoversFile);
foreach ($leftovers as $file) {
self::rmdirr($file);
}
unlink($leftoversFile);
}
foreach(self::$tmpFiles as $file) {
if(file_exists($file)) {
if(!self::rmdirr($file)) {
file_put_contents($leftoversFile, $file."\n", FILE_APPEND);
foreach (self::$tmpFiles as $file) {
if (file_exists($file)) {
if (!self::rmdirr($file)) {
file_put_contents($leftoversFile, $file . "\n", FILE_APPEND);
}
}
}
@ -621,34 +591,34 @@ class OC_Helper {
* remove all files in PHP /oc-noclean temp dir
*/
public static function cleanTmpNoClean() {
$tmpDirNoCleanFile=get_temp_dir().'/oc-noclean/';
if(file_exists($tmpDirNoCleanFile)) {
$tmpDirNoCleanFile = get_temp_dir() . '/oc-noclean/';
if (file_exists($tmpDirNoCleanFile)) {
self::rmdirr($tmpDirNoCleanFile);
}
}
/**
* Adds a suffix to the name in case the file exists
*
* @param $path
* @param $filename
* @return string
*/
* Adds a suffix to the name in case the file exists
*
* @param $path
* @param $filename
* @return string
*/
public static function buildNotExistingFileName($path, $filename) {
$view = \OC\Files\Filesystem::getView();
return self::buildNotExistingFileNameForView($path, $filename, $view);
}
/**
* Adds a suffix to the name in case the file exists
*
* @param $path
* @param $filename
* @return string
*/
* Adds a suffix to the name in case the file exists
*
* @param $path
* @param $filename
* @return string
*/
public static function buildNotExistingFileNameForView($path, $filename, \OC\Files\View $view) {
if($path==='/') {
$path='';
if ($path === '/') {
$path = '';
}
if ($pos = strrpos($filename, '.')) {
$name = substr($filename, 0, $pos);
@ -660,10 +630,10 @@ class OC_Helper {
$newpath = $path . '/' . $filename;
if ($view->file_exists($newpath)) {
if(preg_match_all('/\((\d+)\)/', $name, $matches, PREG_OFFSET_CAPTURE)) {
if (preg_match_all('/\((\d+)\)/', $name, $matches, PREG_OFFSET_CAPTURE)) {
//Replace the last "(number)" with "(number+1)"
$last_match = count($matches[0])-1;
$counter = $matches[1][$last_match][0]+1;
$last_match = count($matches[0]) - 1;
$counter = $matches[1][$last_match][0] + 1;
$offset = $matches[0][$last_match][1];
$match_length = strlen($matches[0][$last_match][0]);
} else {
@ -671,9 +641,9 @@ class OC_Helper {
$offset = false;
}
do {
if($offset) {
if ($offset) {
//Replace the last "(number)" with "(number+1)"
$newname = substr_replace($name, '('.$counter.')', $offset, $match_length);
$newname = substr_replace($name, '(' . $counter . ')', $offset, $match_length);
} else {
$newname = $name . ' (' . $counter . ')';
}
@ -700,17 +670,17 @@ class OC_Helper {
}
/**
* @brief Returns an array with all keys from input lowercased or uppercased. Numbered indices are left as is.
*
* @param array $input The array to work on
* @param int $case Either MB_CASE_UPPER or MB_CASE_LOWER (default)
* @param string $encoding The encoding parameter is the character encoding. Defaults to UTF-8
* @return array
*
* Returns an array with all keys from input lowercased or uppercased. Numbered indices are left as is.
* based on http://www.php.net/manual/en/function.array-change-key-case.php#107715
*
*/
* @brief Returns an array with all keys from input lowercased or uppercased. Numbered indices are left as is.
*
* @param array $input The array to work on
* @param int $case Either MB_CASE_UPPER or MB_CASE_LOWER (default)
* @param string $encoding The encoding parameter is the character encoding. Defaults to UTF-8
* @return array
*
* Returns an array with all keys from input lowercased or uppercased. Numbered indices are left as is.
* based on http://www.php.net/manual/en/function.array-change-key-case.php#107715
*
*/
public static function mb_array_change_key_case($input, $case = MB_CASE_LOWER, $encoding = 'UTF-8') {
$case = ($case != MB_CASE_UPPER) ? MB_CASE_LOWER : MB_CASE_UPPER;
$ret = array();
@ -736,26 +706,26 @@ class OC_Helper {
$length = intval($length);
$string = mb_substr($string, 0, $start, $encoding) .
$replacement .
mb_substr($string, $start+$length, mb_strlen($string, 'UTF-8')-$start, $encoding);
mb_substr($string, $start + $length, mb_strlen($string, 'UTF-8') - $start, $encoding);
return $string;
}
/**
* @brief Replace all occurrences of the search string with the replacement string
*
* @param string $search The value being searched for, otherwise known as the needle.
* @param string $replace The replacement
* @param string $subject The string or array being searched and replaced on, otherwise known as the haystack.
* @param string $encoding The encoding parameter is the character encoding. Defaults to UTF-8
* @param int $count If passed, this will be set to the number of replacements performed.
* @return string
*
*/
* @brief Replace all occurrences of the search string with the replacement string
*
* @param string $search The value being searched for, otherwise known as the needle.
* @param string $replace The replacement
* @param string $subject The string or array being searched and replaced on, otherwise known as the haystack.
* @param string $encoding The encoding parameter is the character encoding. Defaults to UTF-8
* @param int $count If passed, this will be set to the number of replacements performed.
* @return string
*
*/
public static function mb_str_replace($search, $replace, $subject, $encoding = 'UTF-8', &$count = null) {
$offset = -1;
$length = mb_strlen($search, $encoding);
while(($i = mb_strrpos($subject, $search, $offset, $encoding)) !== false ) {
while (($i = mb_strrpos($subject, $search, $offset, $encoding)) !== false) {
$subject = OC_Helper::mb_substr_replace($subject, $replace, $i, $length);
$offset = $i - mb_strlen($subject, $encoding);
$count++;
@ -764,21 +734,21 @@ class OC_Helper {
}
/**
* @brief performs a search in a nested array
* @param array $haystack the array to be searched
* @param string $needle the search string
* @param string $index optional, only search this key name
* @return mixed the key of the matching field, otherwise false
*
* performs a search in a nested array
*
* taken from http://www.php.net/manual/en/function.array-search.php#97645
*/
* @brief performs a search in a nested array
* @param array $haystack the array to be searched
* @param string $needle the search string
* @param string $index optional, only search this key name
* @return mixed the key of the matching field, otherwise false
*
* performs a search in a nested array
*
* taken from http://www.php.net/manual/en/function.array-search.php#97645
*/
public static function recursiveArraySearch($haystack, $needle, $index = null) {
$aIt = new RecursiveArrayIterator($haystack);
$it = new RecursiveIteratorIterator($aIt);
while($it->valid()) {
while ($it->valid()) {
if (((isset($index) AND ($it->key() == $index)) OR (!isset($index))) AND ($it->current() == $needle)) {
return $aIt->key();
}
@ -792,6 +762,7 @@ class OC_Helper {
/**
* Shortens str to maxlen by replacing characters in the middle with '...', eg.
* ellipsis('a very long string with lots of useless info to make a better example', 14) becomes 'a very ...example'
*
* @param string $str the string
* @param string $maxlen the maximum length of the result
* @return string with at most maxlen characters
@ -822,7 +793,7 @@ class OC_Helper {
$maxUploadFilesize = min($upload_max_filesize, $post_max_size);
}
if($freeSpace !== \OC\Files\FREE_SPACE_UNKNOWN){
if ($freeSpace !== \OC\Files\FREE_SPACE_UNKNOWN) {
$freeSpace = max($freeSpace, 0);
return min($maxUploadFilesize, $freeSpace);
@ -833,6 +804,7 @@ class OC_Helper {
/**
* Checks if a function is available
*
* @param string $function_name
* @return bool
*/
@ -861,7 +833,7 @@ class OC_Helper {
$used = 0;
}
$free = \OC\Files\Filesystem::free_space();
if ($free >= 0){
if ($free >= 0) {
$total = $free + $used;
} else {
$total = $free; //either unknown or unlimited
@ -869,7 +841,7 @@ class OC_Helper {
if ($total == 0) {
$total = 1; // prevent division by zero
}
if ($total >= 0){
if ($total >= 0) {
$relative = round(($used / $total) * 10000) / 100;
} else {
$relative = 0;