- ** plugin.php
- **
- ** This file provides the framework for a plugin architecture.
- **
- ** Plugins will eventually be a way to provide added functionality
- ** without having to patch the SquirrelMail source code. Have some
- ** patience, though, as the these funtions might change in the near
- ** future.
- **
- ** Documentation on how to write plugins might show up some time.
- **
- ** $Id$
- **/
-
-
- $plugin_php = true;
- $plugin_general_debug = false;
-
- // This function adds a plugin
- function use_plugin ($name) {
- global $plugin_general_debug;
-
- if (file_exists('../plugins/'.$name.'/setup.php')) {
- if ($plugin_general_debug)
- echo "plugin: -- Loading $name/setup.php<br>\n";
- include ('../plugins/'.$name.'/setup.php');
- $function = 'squirrelmail_plugin_init_'.$name;
- if (function_exists($function))
- {
- if ($plugin_general_debug)
- echo "plugin: ---- Executing $function to init plugin<br>\n";
- $function($plugin_general_debug);
- }
- elseif ($plugin_general_debug)
- echo "plugin: -- Init function $function doesn't exist.<br>\n";
- }
- elseif ($plugin_general_debug)
- echo "plugin: Couldn't find $name/setup.php<br>\n";
- }
+ * plugin.php
+ *
+ * This file provides the framework for a plugin architecture.
+ *
+ * Documentation on how to write plugins might show up some time.
+ *
+ * @copyright © 1999-2006 The SquirrelMail Project Team
+ * @license http://opensource.org/licenses/gpl-license.php GNU Public License
+ * @version $Id$
+ * @package squirrelmail
+ */
+
+/**
+ * This function adds a plugin.
+ * @param string $name Internal plugin name (ie. delete_move_next)
+ * @return void
+ */
+function use_plugin ($name) {
+ if (file_exists(SM_PATH . "plugins/$name/setup.php")) {
+ include_once(SM_PATH . "plugins/$name/setup.php");
+
+ /**
+ * As of SM 1.5.2, plugin hook registration is statically
+ * accomplished using the configuration utility (config/conf.pl).
+ * And this code is deprecated (but let's keep it until
+ * the new registration system is proven).
+ *
+ */
+ //$function = "squirrelmail_plugin_init_$name";
+ //if (function_exists($function)) {
+ // $function();
+ //}
+ }
+}
+
+/**
+ * This function executes a plugin hook.
+ *
+ * It includes an arbitrary return value that is managed by
+ * all plugins on the same hook and returned to the core hook
+ * location.
+ *
+ * The desired format of the return value should be defined
+ * by the context in which the hook is called.
+ *
+ * Note that the master return value for this hook is passed
+ * to each plugin after the main argument(s) value/array as a
+ * convenience only - to show what the current return value is
+ * even though it is liable to be changed by other plugins.
+ *
+ * If any plugin on this hook wants to modify the $args
+ * plugin parameter, it simply has to use call-by-reference
+ * syntax in the hook function that it has registered for the
+ * current hook. Note that this is in addition to (entirely
+ * independent of) the return value for this hook.
+ *
+ * @param string $name Name of hook being executed
+ * @param mixed $args A single value or an array of arguments
+ * that are to be passed to all plugins
+ * operating off the hook being called.
+ * Note that this argument is passed by
+ * reference thus it is liable to be
+ * changed after the hook completes.
+ *
+ * @return mixed The return value that is managed by the plugins
+ * on the current hook.
+ *
+ */
+function do_hook($name, &$args) {
+
+ global $squirrelmail_plugin_hooks, $currentHookName;
+ $currentHookName = $name;
+ $ret = NULL;
+
+ if (isset($squirrelmail_plugin_hooks[$name])
+ && is_array($squirrelmail_plugin_hooks[$name])) {
+ foreach ($squirrelmail_plugin_hooks[$name] as $plugin_name => $function) {
+ use_plugin($plugin_name);
+ if (function_exists($function)) {
+ $ret = $function($args, $ret);
+ }
+ }
+ }
+
+ $currentHookName = '';
+ return $ret;
+
+}
+
+/**
+ * This function executes a hook that allows for an arbitrary
+ * return value from each plugin that will be merged into one
+ * array (or one string if all return values are strings) and
+ * returned to the core hook location.
+ *
+ * Note that unlike PHP's array_merge function, matching array keys
+ * will not overwrite each other, instead, values under such keys
+ * will be concatenated if they are both strings, or merged if they
+ * are arrays (in the same (non-overwrite) manner recursively).
+ *
+ * Plugins returning non-arrays (strings, objects, etc) will have
+ * their output added to the end of the ultimate return array,
+ * unless ALL values returned are strings, in which case one string
+ * with all returned strings concatenated together is returned.
+ *
+ * If any plugin on this hook wants to modify the $args
+ * plugin parameter, it simply has to use call-by-reference
+ * syntax in the hook function that it has registered for the
+ * current hook. Note that this is in addition to (entirely
+ * independent of) the return value for this hook.
+ *
+ * @param string $name Name of hook being executed
+ * @param mixed $args A single value or an array of arguments
+ * that are to be passed to all plugins
+ * operating off the hook being called.
+ * Note that this argument is passed by
+ * reference thus it is liable to be
+ * changed after the hook completes.
+ *
+ * @return mixed the merged return arrays or strings of each
+ * plugin on this hook.
+ *
+ */
+function concat_hook_function($name, &$args) {
+
+ global $squirrelmail_plugin_hooks, $currentHookName;
+ $currentHookName = $name;
+ $ret = '';
+
+ if (isset($squirrelmail_plugin_hooks[$name])
+ && is_array($squirrelmail_plugin_hooks[$name])) {
+ foreach ($squirrelmail_plugin_hooks[$name] as $plugin_name => $function) {
+ use_plugin($plugin_name);
+ if (function_exists($function)) {
+ $plugin_ret = $function($args);
+ if (!empty($plugin_ret)) {
+ $ret = sqm_array_merge($ret, $plugin_ret);
+ }
+ }
+ }
+ }
+
+ $currentHookName = '';
+ return $ret;
+
+}
+
+/**
+ * This function is used for hooks which are to return true or
+ * false. If $priority is > 0, any one or more trues will override
+ * any falses. If $priority < 0, then one or more falses will
+ * override any trues.
+ * Priority 0 means majority rules. Ties will be broken with $tie
+ *
+ * If any plugin on this hook wants to modify the $args
+ * plugin parameter, it simply has to use call-by-reference
+ * syntax in the hook function that it has registered for the
+ * current hook. Note that this is in addition to (entirely
+ * independent of) the return value for this hook.
+ *
+ * @param string $name The hook name
+ * @param mixed $args A single value or an array of arguments
+ * that are to be passed to all plugins
+ * operating off the hook being called.
+ * Note that this argument is passed by
+ * reference thus it is liable to be
+ * changed after the hook completes.
+ * @param int $priority See explanation above
+ * @param boolean $tie See explanation above
+ *
+ * @return boolean The result of the function
+ *
+ */
+function boolean_hook_function($name, &$args, $priority=0, $tie=false) {
+
+ global $squirrelmail_plugin_hooks, $currentHookName;
+ $yea = 0;
+ $nay = 0;
+ $ret = $tie;