Blame view

sources/lib/private/hook.php 3.04 KB
03e52840d   Kload   Init
1
2
3
4
5
6
7
8
9
10
  <?php
  
  /**
   * This class manages the hooks. It basically provides two functions: adding
   * slots and emitting signals.
   */
  class OC_Hook{
  	static private $registered = array();
  
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
11
  	 * connects a function to a hook
03e52840d   Kload   Init
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  	 * @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();
  		}
6d9380f96   Cédric Dupont   Update sources OC...
33
34
35
36
37
38
  		// dont connect hooks twice
  		foreach (self::$registered[$signalclass][$signalname] as $hook) {
  			if ($hook['class'] === $slotclass and $hook['name'] === $slotname) {
  				return false;
  			}
  		}
03e52840d   Kload   Init
39
40
41
42
43
44
45
46
47
48
49
  		// Connect the hook handler to the requested emitter
  		self::$registered[$signalclass][$signalname][] = array(
  				"class" => $slotclass,
  				"name" => $slotname
  		);
  
  		// No chance for failure ;-)
  		return true;
  	}
  
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
50
  	 * emits a signal
03e52840d   Kload   Init
51
52
  	 * @param string $signalclass class name of emitter
  	 * @param string $signalname name of signal
6d9380f96   Cédric Dupont   Update sources OC...
53
  	 * @param mixed $params default: array() array with additional data
03e52840d   Kload   Init
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
  	 * @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();
  		}
  	}
6d9380f96   Cédric Dupont   Update sources OC...
105
106
107
108
109
110
111
112
  
  	/**
  	 * DO NOT USE!
  	 * For unit tests ONLY!
  	 */
  	static public function getHooks() {
  		return self::$registered;
  	}
03e52840d   Kload   Init
113
  }