aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files_archive
diff options
context:
space:
mode:
authorRobin Appelman <icewind@owncloud.com>2012-03-03 20:46:46 +0100
committerRobin Appelman <icewind@owncloud.com>2012-03-03 21:23:35 +0100
commita5df3f8ea74b53d914a9ebd2687f8ab73b0a201b (patch)
tree02f351d22e51b509db1e326a507d77437c207daf /apps/files_archive
parent72947e46d1a4c6066f561d3e49c032f23589e4e1 (diff)
downloadnextcloud-server-a5df3f8ea74b53d914a9ebd2687f8ab73b0a201b.tar.gz
nextcloud-server-a5df3f8ea74b53d914a9ebd2687f8ab73b0a201b.zip
allow transparent opening of zip files from the web interface
Diffstat (limited to 'apps/files_archive')
-rw-r--r--apps/files_archive/appinfo/app.php4
-rw-r--r--apps/files_archive/js/archive.js15
-rw-r--r--apps/files_archive/lib/storage.php50
3 files changed, 64 insertions, 5 deletions
diff --git a/apps/files_archive/appinfo/app.php b/apps/files_archive/appinfo/app.php
index e75f6fa0559..693c28d98a0 100644
--- a/apps/files_archive/appinfo/app.php
+++ b/apps/files_archive/appinfo/app.php
@@ -12,3 +12,7 @@ foreach(array('ZIP') as $type){
}
OC::$CLASSPATH['OC_Filestorage_Archive']='apps/files_archive/lib/storage.php';
+
+OC_Hook::connect('OC_Filesystem','get_mountpoint','OC_Filestorage_Archive','autoMount');
+
+OC_Util::addScript( 'files_archive', 'archive' );
diff --git a/apps/files_archive/js/archive.js b/apps/files_archive/js/archive.js
new file mode 100644
index 00000000000..ec316c7bf2c
--- /dev/null
+++ b/apps/files_archive/js/archive.js
@@ -0,0 +1,15 @@
+/**
+ * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+$(document).ready(function() {
+ if(typeof FileActions!=='undefined'){
+ FileActions.register('application/zip','Open','',function(filename){
+ window.location='index.php?dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename);
+ });
+ FileActions.setDefault('application/zip','Open');
+ }
+});
diff --git a/apps/files_archive/lib/storage.php b/apps/files_archive/lib/storage.php
index 4f4c0ef2abe..72a96ca5a5d 100644
--- a/apps/files_archive/lib/storage.php
+++ b/apps/files_archive/lib/storage.php
@@ -13,10 +13,13 @@ class OC_Filestorage_Archive extends OC_Filestorage_Common{
*/
private $archive;
private $path;
+ private static $mounted=array();
+ private static $enableAutomount=true;
+ private static $rootView;
private function stripPath($path){//files should never start with /
if(substr($path,0,1)=='/'){
- return substr($path,1);
+ $path=substr($path,1);
}
return $path;
}
@@ -52,9 +55,14 @@ class OC_Filestorage_Archive extends OC_Filestorage_Common{
if($path==''){
$stat=stat($this->path);
}else{
- $stat=array();
- $stat['mtime']=$this->archive->mtime($path);
- $stat['size']=$this->archive->filesize($path);
+ if($this->is_dir($path)){
+ $stat=array('size'=>0);
+ $stat['mtime']=filemtime($this->path);
+ }else{
+ $stat=array();
+ $stat['mtime']=$this->archive->mtime($path);
+ $stat['size']=$this->archive->filesize($path);
+ }
}
$stat['ctime']=$ctime;
return $stat;
@@ -64,7 +72,11 @@ class OC_Filestorage_Archive extends OC_Filestorage_Common{
if($path==''){
return 'dir';
}
- return $this->archive->fileExists($path.'/')?'dir':'file';
+ if(substr($path,-1)=='/'){
+ return $this->archive->fileExists($path)?'dir':'file';
+ }else{
+ return $this->archive->fileExists($path.'/')?'dir':'file';
+ }
}
public function is_readable($path){
return is_readable($this->path);
@@ -99,4 +111,32 @@ class OC_Filestorage_Archive extends OC_Filestorage_Common{
return false;//not supported
}
}
+
+ /**
+ * automount paths from file hooks
+ * @param aray params
+ */
+ public static function autoMount($params){
+ if(!self::$enableAutomount){
+ return;
+ }
+ $path=$params['path'];
+ if(!self::$rootView){
+ self::$rootView=new OC_FilesystemView('');
+ }
+ self::$enableAutomount=false;//prevent recursion
+ $supported=array('zip');
+ foreach($supported as $type){
+ $ext='.'.$type.'/';
+ if(($pos=strpos(strtolower($path),$ext))!==false){
+ $archive=substr($path,0,$pos+strlen($ext)-1);
+ if(self::$rootView->file_exists($archive) and array_search($archive,self::$mounted)===false){
+ $localArchive=self::$rootView->getLocalFile($archive);
+ OC_Filesystem::mount('OC_Filestorage_Archive',array('archive'=>$localArchive),$archive.'/');
+ self::$mounted[]=$archive;
+ }
+ }
+ }
+ self::$enableAutomount=true;
+ }
}