diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2013-09-25 13:36:30 +0200 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2013-09-30 16:36:59 +0200 |
commit | 9c9dc276b7a1d2592c4fb0a887888632dc1f1e29 (patch) | |
tree | bbe3aed3e09c31c68806bdb8acffef70ba08f51c /lib/private/hook.php | |
parent | a711399e62d5a9f14d4b748efe4354ee37e61f13 (diff) | |
download | nextcloud-server-9c9dc276b7a1d2592c4fb0a887888632dc1f1e29.tar.gz nextcloud-server-9c9dc276b7a1d2592c4fb0a887888632dc1f1e29.zip |
move the private namespace OC into lib/private - OCP will stay in lib/public
Conflicts:
lib/private/vcategories.php
Diffstat (limited to 'lib/private/hook.php')
-rw-r--r-- | lib/private/hook.php | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/lib/private/hook.php b/lib/private/hook.php new file mode 100644 index 00000000000..8516cf0dcff --- /dev/null +++ b/lib/private/hook.php @@ -0,0 +1,100 @@ +<?php + +/** + * This class manages the hooks. It basically provides two functions: adding + * slots and emitting signals. + */ +class OC_Hook{ + static private $registered = array(); + + /** + * @brief connects a function to a hook + * @param string $signalclass class name of emitter + * @param string $signalname name of signal + * @param string $slotclass class name of slot + * @param string $slotname name of slot + * @return bool + * + * This function makes it very easy to connect to use hooks. + * + * TODO: write example + */ + static public function connect( $signalclass, $signalname, $slotclass, $slotname ) { + // If we're trying to connect to an emitting class that isn't + // yet registered, register it + if( !array_key_exists( $signalclass, self::$registered )) { + self::$registered[$signalclass] = array(); + } + // If we're trying to connect to an emitting method that isn't + // yet registered, register it with the emitting class + if( !array_key_exists( $signalname, self::$registered[$signalclass] )) { + self::$registered[$signalclass][$signalname] = array(); + } + + // Connect the hook handler to the requested emitter + self::$registered[$signalclass][$signalname][] = array( + "class" => $slotclass, + "name" => $slotname + ); + + // No chance for failure ;-) + return true; + } + + /** + * @brief emits a signal + * @param string $signalclass class name of emitter + * @param string $signalname name of signal + * @param array $params defautl: array() array with additional data + * @return bool, true if slots exists or false if not + * + * Emits a signal. To get data from the slot use references! + * + * TODO: write example + */ + static public function emit( $signalclass, $signalname, $params = array()) { + + // Return false if no hook handlers are listening to this + // emitting class + if( !array_key_exists( $signalclass, self::$registered )) { + return false; + } + + // Return false if no hook handlers are listening to this + // emitting method + if( !array_key_exists( $signalname, self::$registered[$signalclass] )) { + return false; + } + + // Call all slots + foreach( self::$registered[$signalclass][$signalname] as $i ) { + try { + call_user_func( array( $i["class"], $i["name"] ), $params ); + } catch (Exception $e){ + OC_Log::write('hook', + 'error while running hook (' . $i["class"] . '::' . $i["name"] . '): '.$e->getMessage(), + OC_Log::ERROR); + } + } + + // return true + return true; + } + + /** + * clear hooks + * @param string $signalclass + * @param string $signalname + */ + static public function clear($signalclass='', $signalname='') { + if($signalclass) { + if($signalname) { + self::$registered[$signalclass][$signalname]=array(); + }else{ + self::$registered[$signalclass]=array(); + } + }else{ + self::$registered=array(); + } + } +} |