From a5df3f8ea74b53d914a9ebd2687f8ab73b0a201b Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 3 Mar 2012 20:46:46 +0100 Subject: [PATCH] allow transparent opening of zip files from the web interface --- apps/files_archive/appinfo/app.php | 4 +++ apps/files_archive/js/archive.js | 15 +++++++++ apps/files_archive/lib/storage.php | 50 +++++++++++++++++++++++++++--- 3 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 apps/files_archive/js/archive.js 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 + * 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; + } } -- 2.39.5