From 6808d53d0f8044a395a4e0099689d282285a0ac0 Mon Sep 17 00:00:00 2001 From: Friendika Date: Wed, 22 Dec 2010 14:16:22 -0800 Subject: plugin/addon API landing - still things left to do before it's useful --- boot.php | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 6 deletions(-) (limited to 'boot.php') diff --git a/boot.php b/boot.php index 9cc4d0f34..de1669439 100644 --- a/boot.php +++ b/boot.php @@ -2,7 +2,7 @@ set_time_limit(0); -define ( 'BUILD_ID', 1027 ); +define ( 'BUILD_ID', 1028 ); define ( 'DFRN_PROTOCOL_VERSION', '2.0' ); define ( 'EOL', "
\r\n" ); @@ -35,6 +35,13 @@ define ( 'REL_VIP', 1); define ( 'REL_FAN', 2); define ( 'REL_BUD', 3); +/** + * Hook array order + */ + +define ( 'HOOK_HOOK', 0); +define ( 'HOOK_FILE', 1); +define ( 'HOOK_FUNCTION', 2); /** * @@ -372,7 +379,8 @@ function system_unavailable() { // Primarily involved with database upgrade, but also sets the // base url for use in cmdline programs which don't have -// $_SERVER variables. +// $_SERVER variables, and synchronising the state of installed plugins. + if(! function_exists('check_config')) { function check_config(&$a) { @@ -404,6 +412,65 @@ function check_config(&$a) { set_config('system','build', BUILD_ID); } } + + /** + * + * Synchronise plugins: + * + * $a->config['system']['addon'] contains a comma-separated list of names + * of plugins/addons which are used on this system. + * Go through the database list of already installed addons, and if we have + * an entry, but it isn't in the config list, call the uninstall procedure + * and mark it uninstalled in the database (for now we'll remove it). + * Then go through the config list and if we have a plugin that isn't installed, + * call the install procedure and add it to the database. + * + */ + + $r = q("SELECT * FROM `addon` WHERE `installed` = 1"); + if(count($r)) + $installed = $r; + + $plugins = get_config('system','addon'); + $plugins_arr = array(); + + if($plugins) + $plugins_arr = explode(',',str_replace(' ', '',$plugins)); + + $installed_arr = array(); + foreach($installed as $i) { + if(! in_array($i['name'],$plugins_arr)) { + logger("Addons: uninstalling " . $i['name']); + q("DELETE FROM `addon` WHERE `id` = %d LIMIT 1", + intval($i['id']) + ); + + @include_once('addon/' . $i['name'] . '/' . $i['name'] . '.php'); + if(function_exists($i['name'] . '_uninstall')) { + $func = $i['name'] . '_uninstall'; + $func(); + } + } + else + $installed_arr[] = $i['name']; + } + + if(count($plugins_arr)) { + foreach($plugins_arr as $p) { + if(! in_array($p,$installed_arr)) { + logger("Addons: installing " . $p); + @include_once('addon/' . $p . '/' . $p . '.php'); + if(function_exists($p . '_install')) { + $func = $p . '_install'; + $func(); + $r = q("INSERT INTO `addon` (`name`, `installed`) VALUES ( '%s', 1 ) ", + dbesc($p) + ); + } + } + } + } + return; }} @@ -1991,10 +2058,10 @@ function call_hooks($name, $data = null) { if(count($a->hooks)) { foreach($a->hooks as $hook) { - if($hook[0] === $name) { - @require_once($hook[1]); - if(function_exists($hook[2])) { - $func = $hook[2]; + if($hook[HOOK_HOOK] === $name) { + @include_once($hook[HOOK_FILE]); + if(function_exists($hook[HOOK_FUNCTION])) { + $func = $hook[HOOK_FUNCTION]; $func($a,$data); } } -- cgit v1.2.3