/** * Relay a signal from one call leg to another * * @param Streamwide_Engine_Signal $signal * @return boolean * @throws RuntimeException */ protected function _relaySignal(Streamwide_Engine_Signal $signal) { $remote = $signal->getRemote(); if ($signal->hasBeenRelayed()) { $errorMessageTpl = $this->_errors[self::SIGNAL_RELAY_ERR_CODE]; $callLegName = $remote === $this->_leftCallLeg->getName() ? $this->_rightCallLeg->getName() : $this->_leftCallLeg->getName(); $this->_errors[self::SIGNAL_RELAY_ERR_CODE] = sprintf($errorMessageTpl, $signal->getName(), $callLegName); $this->dispatchErrorEvent(self::SIGNAL_RELAY_ERR_CODE); return false; } $callLegName = null; if ($remote === $this->_leftCallLeg->getName()) { $this->_relayFlow = self::LEFT_TO_RIGHT_RELAY; $callLegName = $this->_rightCallLeg->getName(); } elseif ($remote === $this->_rightCallLeg->getName()) { $this->_relayFlow = self::RIGHT_TO_LEFT_RELAY; $callLegName = $this->_leftCallLeg->getName(); } // this should not happen (but it doesn't hurt to check) if (null === $callLegName) { throw new RuntimeException(sprintf('Invalid remote name found in %s signal', $signal->getName())); } $preRelayCallback = $this->_retrievePreRelayCallback($signal); if (null !== $preRelayCallback) { $signal = call_user_func_array($preRelayCallback, array($signal)); } if (false === $signal->relay($callLegName)) { $errorMessageTpl = $this->_errors[self::SIGNAL_RELAY_ERR_CODE]; $this->_errors[self::SIGNAL_RELAY_ERR_CODE] = sprintf($errorMessageTpl, $signal->getName(), $callLegName); $this->dispatchErrorEvent(self::SIGNAL_RELAY_ERR_CODE); return false; } return true; }