From 523fdda39915dd49190727ac74458a28f2d00f10 Mon Sep 17 00:00:00 2001
From: Robin Appelman <icewind@owncloud.com>
Date: Fri, 30 Mar 2012 14:39:07 +0200
Subject: [PATCH] add the option to only load apps of a specific type

---
 apps/files_archive/appinfo/info.xml    |  3 ++
 apps/files_encryption/appinfo/info.xml |  3 ++
 apps/files_remote/appinfo/info.xml     |  3 ++
 apps/files_sharing/appinfo/info.xml    |  3 ++
 files/ajax/download.php                |  3 ++
 files/ajax/list.php                    |  3 ++
 files/ajax/mimeicon.php                |  3 ++
 files/webdav.php                       |  3 ++
 lib/app.php                            | 51 +++++++++++++++++++++++---
 lib/base.php                           |  7 +++-
 10 files changed, 76 insertions(+), 6 deletions(-)

diff --git a/apps/files_archive/appinfo/info.xml b/apps/files_archive/appinfo/info.xml
index df767d39f6..236b5a64b0 100644
--- a/apps/files_archive/appinfo/info.xml
+++ b/apps/files_archive/appinfo/info.xml
@@ -7,4 +7,7 @@
 	<licence>AGPL</licence>
 	<author>Robin Appelman</author>
 	<require>3</require>
+	<types>
+		<filesystem/>
+	</types>
 </info>
diff --git a/apps/files_encryption/appinfo/info.xml b/apps/files_encryption/appinfo/info.xml
index 053044aaed..691b265bf6 100644
--- a/apps/files_encryption/appinfo/info.xml
+++ b/apps/files_encryption/appinfo/info.xml
@@ -7,4 +7,7 @@
 	<licence>AGPL</licence>
 	<author>Robin Appelman</author>
 	<require>3</require>
+	<types>
+		<filesystem/>
+	</types>
 </info>
diff --git a/apps/files_remote/appinfo/info.xml b/apps/files_remote/appinfo/info.xml
index 0720b6095b..8cf66ddbc3 100644
--- a/apps/files_remote/appinfo/info.xml
+++ b/apps/files_remote/appinfo/info.xml
@@ -7,4 +7,7 @@
 	<licence>AGPL</licence>
 	<author>Robin Appelman</author>
 	<require>3</require>
+	<types>
+		<filesystem/>
+	</types>
 </info>
diff --git a/apps/files_sharing/appinfo/info.xml b/apps/files_sharing/appinfo/info.xml
index abf847b448..8fda775520 100644
--- a/apps/files_sharing/appinfo/info.xml
+++ b/apps/files_sharing/appinfo/info.xml
@@ -8,4 +8,7 @@
 	<author>Michael Gapczynski</author>
 	<require>2</require>
 	<default_enable/>
+	<types>
+		<filesystem/>
+	</types>
 </info>
diff --git a/files/ajax/download.php b/files/ajax/download.php
index 198069f3fa..39852613ab 100644
--- a/files/ajax/download.php
+++ b/files/ajax/download.php
@@ -21,6 +21,9 @@
 *
 */
 
+// only need filesystem apps
+$RUNTIME_APPTYPES=array('filesystem');
+
 // Init owncloud
 require_once('../../lib/base.php');
 
diff --git a/files/ajax/list.php b/files/ajax/list.php
index 8a414827e1..ec9ab7342d 100644
--- a/files/ajax/list.php
+++ b/files/ajax/list.php
@@ -1,5 +1,8 @@
 <?php
 
+// only need filesystem apps
+$RUNTIME_APPTYPES=array('filesystem');
+
 // Init owncloud
 require_once('../../lib/base.php');
 
diff --git a/files/ajax/mimeicon.php b/files/ajax/mimeicon.php
index 8724016b3a..ff72ba0f5b 100644
--- a/files/ajax/mimeicon.php
+++ b/files/ajax/mimeicon.php
@@ -1,5 +1,8 @@
 <?php
 
+// no need for apps
+$RUNTIME_NOAPPS=false;
+
 // Init owncloud
 require_once('../../lib/base.php');
 
diff --git a/files/webdav.php b/files/webdav.php
index 6fae33a8f7..1120973787 100644
--- a/files/webdav.php
+++ b/files/webdav.php
@@ -26,6 +26,9 @@
 // Do not load FS ...
 $RUNTIME_NOSETUPFS = true;
 
+// only need filesystem apps
+$RUNTIME_APPTYPES=array('filesystem');
+
 require_once('../lib/base.php');
 
 // Backends
diff --git a/lib/app.php b/lib/app.php
index fa0a1d22d1..6c882963a0 100755
--- a/lib/app.php
+++ b/lib/app.php
@@ -34,16 +34,20 @@ class OC_App{
 	static private $settingsForms = array();
 	static private $adminForms = array();
 	static private $personalForms = array();
+	static private $appInfo = array();
 
 	/**
 	 * @brief loads all apps
+	 * @param array $types
 	 * @returns true/false
 	 *
 	 * This function walks through the owncloud directory and loads all apps
 	 * it can find. A directory contains an app if the file /appinfo/app.php
 	 * exists.
+	 *
+	 * if $types is set, only apps of those types will be loaded
 	 */
-	public static function loadApps(){
+	public static function loadApps($types=null){
 		// Did we allready load everything?
 		if( self::$init ){
 			return true;
@@ -51,14 +55,18 @@ class OC_App{
 
 		// Our very own core apps are hardcoded
 		foreach( array('files', 'settings') as $app ){
-			require( $app.'/appinfo/app.php' );
+			if(is_null($types) or self::isType($app,$types)){
+				require( $app.'/appinfo/app.php' );
+			}
 		}
 
 		// The rest comes here
 		$apps = self::getEnabledApps();
 		foreach( $apps as $app ){
-			if(is_file(OC::$APPSROOT.'/apps/'.$app.'/appinfo/app.php')){
-				require( $app.'/appinfo/app.php' );
+			if(is_null($types) or self::isType($app,$types)){
+				if(is_file(OC::$APPSROOT.'/apps/'.$app.'/appinfo/app.php')){
+					require( $app.'/appinfo/app.php' );
+				}
 			}
 		}
 
@@ -68,6 +76,28 @@ class OC_App{
 		return true;
 	}
 
+	/**
+	 * check if an app is of a sepcific type
+	 * @param string $app
+	 * @param string/array $types
+	 */
+	public static function isType($app,$types){
+		if(is_string($types)){
+			$types=array($types);
+		}
+		$appData=self::getAppInfo($app);
+		if(!isset($appData['types'])){
+			return false;
+		}
+		$appTypes=$appData['types'];
+		foreach($types as $type){
+			if(array_search($type,$appTypes)!==false){
+				return true;
+			}
+		}
+		return false;
+	}
+
 	/**
 	 * get all enabled apps
 	 */
@@ -283,6 +313,9 @@ class OC_App{
 		if($path){
 			$file=$appid;
 		}else{
+			if(isset(self::$appInfo[$appid])){
+				return self::$appInfo[$appid];
+			}
 			$file=OC::$APPSROOT.'/apps/'.$appid.'/appinfo/info.xml';
 		}
 		$data=array();
@@ -293,8 +326,16 @@ class OC_App{
 		$xml = new SimpleXMLElement($content);
 		$data['info']=array();
 		foreach($xml->children() as $child){
-			$data[$child->getName()]=(string)$child;
+			if($child->getName()=='types'){
+				$data['types']=array();
+				foreach($child->children() as $type){
+					$data['types'][]=$type->getName();
+				}
+			}else{
+				$data[$child->getName()]=(string)$child;
+			}
 		}
+		self::$appInfo[$appid]=$data;
 		return $data;
 	}
 
diff --git a/lib/base.php b/lib/base.php
index b07ac5af41..b031572f17 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -333,8 +333,13 @@ class OC{
 		// Load Apps
 		// This includes plugins for users and filesystems as well
 		global $RUNTIME_NOAPPS;
+		global $RUNTIME_APPTYPES;
 		if(!$RUNTIME_NOAPPS ){
-			OC_App::loadApps();
+			if($RUNTIME_APPTYPES){
+				OC_App::loadApps($RUNTIME_APPTYPES);
+			}else{
+				OC_App::loadApps();
+			}
 		}
 
 		//make sure temporary files are cleaned up
-- 
GitLab