/** * Treat an event by relaying the received signal * * @param Streamwide_Engine_Events_Event $event * @return void * @throws RuntimeException */ public function onSignalReceived(Streamwide_Engine_Events_Event $event) { $signal = $event->getParam('signal'); if (null === $signal) { return null; } // update call leg flags $this->_updateCallLegFlags($signal->getName()); // check to see if any of the call legs involved // in the relaying process has died if ($this->_isCallLegDead) { return $this->_handleCallLegDeath($signal->getRemote()); } // relay the signal if (false === $this->_relaySignal($signal)) { return null; } // update the call leg parameters $this->_updateCallLegParams($signal->getRemote(), $signal->getParams()); // deal with relay session $this->_startOrEndRelaySession($event); // dispatch the SIGNAL_RELAYED event $signalRelayedEvt = new Streamwide_Engine_Events_Event(Streamwide_Engine_Events_Event::SIGNAL_RELAYED); $params = array('signal' => $signal, 'from' => $this->_relayFlow === self::LEFT_TO_RIGHT_RELAY ? $this->_leftCallLeg : $this->_rightCallLeg, 'to' => $this->_relayFlow === self::RIGHT_TO_LEFT_RELAY ? $this->_leftCallLeg : $this->_rightCallLeg); $signalRelayedEvt->setParams($params); return $this->dispatchEvent($signalRelayedEvt); }