Ejemplo n.º 1
0
Archivo: Relayer.php Proyecto: cwcw/cms
 /**
  * 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;
 }