/** * Subscribe to engine events (OKMOVED,FAILMOVED,MOVED) * * @return void */ protected function _subscribeToEngineEvents() { $events = array(Streamwide_Engine_Events_Event::MOVED, Streamwide_Engine_Events_Event::OKMOVED, Streamwide_Engine_Events_Event::FAILMOVED, Streamwide_Engine_Events_Event::CHILD); $controller = $this->getController(); foreach (new ArrayIterator($events) as $event) { $controller->addEventListener($event, array('callback' => array($this, 'onSignalReceived'), 'options' => array('notifyFilter' => Streamwide_Engine_NotifyFilter_Factory::factory(Streamwide_Engine_NotifyFilter_Factory::T_EVT_SIG_PARAM_REMOTE, Streamwide_Engine_NotifyFilter_Factory::FILTER_EQUAL_TO, $this->_callLeg->getName())))); } }
/** * Kills a call leg * * @param Streamwide_Engine_Call_Leg_Abstract $callLeg * @param boolean $force * @return boolean */ public function kill(Streamwide_Engine_Call_Leg_Abstract $callLeg, $force = false) { if (false === $force && !$callLeg->isAlive()) { $this->dispatchErrorEvent(self::CALL_LEG_NOT_ALIVE_ERR_CODE); return false; } $callLegName = $callLeg->getName(); $signal = Streamwide_Engine_Signal::factory(Streamwide_Engine_Signal::KILL, $callLegName); if (false === $signal->send()) { $this->dispatchErrorEvent(self::KILL_SIGNAL_SEND_FAILURE_ERR_CODE); return false; } $callLeg->setDead(); $event = new Streamwide_Engine_Events_Event(Streamwide_Engine_Events_Event::SUCCESS); $event->setParam('callLeg', $callLeg); $this->dispatchEvent($event); return true; }
/** * Handle a CHILD signal received in the middle of the connection process * * @param Streamwide_Engine_Signal $signal * @param string $errorCode * @return void */ protected function _handleChildSignal(Streamwide_Engine_Signal $signal, $errorCode) { $this->_unsubscribeFromEngineEvents(); $remoteName = $signal->getRemote(); $defunctCallLeg = $remoteName === $this->_leftCallLeg->getName() ? $this->_leftCallLeg : $this->_rightCallLeg; if ($defunctCallLeg->isAlive()) { $defunctCallLeg->setDead(); } return $this->dispatchErrorEvent($errorCode, array('callLeg' => $defunctCallLeg)); }
/** * Set the right call leg * * @param Streamwide_Engine_Call_Leg_Abstract $rightCallLeg * @return void * @throws InvalidArgumentException */ public function setRightCallLeg(Streamwide_Engine_Call_Leg_Abstract $rightCallLeg) { if (!$rightCallLeg instanceof Streamwide_Engine_Sip_Call_Leg) { throw new InvalidArgumentException(__METHOD__ . ' requires parameter 1 to be an instance of Streamwide_Engine_Sip_Call_Leg'); } if ($rightCallLeg->isAlive()) { throw new InvalidArgumentException(__METHOD__ . ' requires parameter 1 to be a dead SIP call leg'); } parent::setRightCallLeg($rightCallLeg); }
/** * Subscribe to be notified on OK, FAIL and CHILD signals from SW Engine * * @return void */ protected function _subscribeToEngineEvents() { $controller = $this->getController(); // Start listen to OK signal $okNotifyFilter = Streamwide_Engine_NotifyFilter_Factory::factory(Streamwide_Engine_NotifyFilter_Factory::T_EVT_SIG_PARAM_REMOTE, Streamwide_Engine_NotifyFilter_Factory::FILTER_EQUAL_TO, $this->_callLeg->getName()); $controller->addEventListener(Streamwide_Engine_Events_Event::OK, array('callback' => array($this, 'onSignalReceived'), 'options' => array('autoRemove' => 'before', 'notifyFilter' => $okNotifyFilter))); // End listen to OK signal // Start listen to FAIL signal $failNotifyFilter = Streamwide_Engine_NotifyFilter_Factory::factory(Streamwide_Engine_NotifyFilter_Factory::T_EVT_SIG_PARAM_REMOTE, Streamwide_Engine_NotifyFilter_Factory::FILTER_EQUAL_TO, $this->_callLeg->getName()); $controller->addEventListener(Streamwide_Engine_Events_Event::FAIL, array('callback' => array($this, 'onSignalReceived'), 'options' => array('autoRemove' => 'before', 'notifyFilter' => $failNotifyFilter))); // End listen to FAIL signal // Start listen to CHILD signal $childNotifyFilter = Streamwide_Engine_NotifyFilter_Factory::factory(Streamwide_Engine_NotifyFilter_Factory::T_EVT_SIG_PARAM_REMOTE, Streamwide_Engine_NotifyFilter_Factory::FILTER_EQUAL_TO, $this->_callLeg->getName()); $controller->addEventListener(Streamwide_Engine_Events_Event::CHILD, array('callback' => array($this, 'onSignalReceived'), 'options' => array('notifyFilter' => $childNotifyFilter))); // Start listen to CHILD signal }
/** * Stop recording * * @return boolean */ public function stop() { if (!$this->isRecording()) { $this->dispatchErrorEvent(self::NOT_RECORDING_ERR_CODE); return false; } if (null === $this->_mediaServerCallLeg) { throw new RuntimeException('Media server call leg has not been set'); } $signal = Streamwide_Engine_Signal::factory(Streamwide_Engine_Signal::RECORDSTOP, $this->_mediaServerCallLeg->getName(), $this->_storage->toArray()); if (false === $signal->send()) { $this->dispatchErrorEvent(self::RECORDSTOP_SIGNAL_SEND_FAILURE_ERR_CODE); return false; } $this->_recordingStopTime = time(); $this->_stateManager->setState(self::STATE_READY); return $this->_delayRecorderStoppedEventDispatch(); }
/** * Set the right SIP call leg * * @param Streamwide_Engine_Call_Leg_Abstract $rightCallLeg * @return void * @throws InvalidArgumentException */ public function setRightCallLeg(Streamwide_Engine_Call_Leg_Abstract $rightCallLeg) { if (!$rightCallLeg instanceof Streamwide_Engine_Sip_Call_Leg) { throw new InvalidArgumentException(__METHOD__ . ' requires parameter 1 to be an instance of Streamwide_Engine_Sip_Call_Leg'); } if (!$rightCallLeg->isAlive()) { throw new InvalidArgumentException(__METHOD__ . ' requires parameter 1 to be an alive SIP call leg'); } if (!$rightCallLeg->hasSentOrReceivedOk()) { throw new InvalidArgumentException(__METHOD__ . ' requires parameter 1 to be an alive SIP call leg that has received the OK signal'); } parent::setRightCallLeg($rightCallLeg); }
/** * Set the call leg that is currently linked with the call leg that is expected * to generate the TRANSFER request * * @param Streamwide_Engine_Call_Leg_Abstract $transferSourceLink * @return void * @throws InvalidArgumentException */ public function setTransferSourceLink(Streamwide_Engine_Call_Leg_Abstract $transferSourceLink) { if (!$transferSourceLink instanceof Streamwide_Engine_Sip_Call_Leg && !$transferSourceLink instanceof Streamwide_Engine_Media_Server_Call_Leg) { throw new InvalidArgumentException(__METHOD__ . ' expects parameter 1 to be a SIP or MS call leg'); } if (!$transferSourceLink->isAlive()) { throw new InvalidArgumentException(__METHOD__ . ' expects parameter 1 to be an alive SIP or MS call leg'); } $this->_transferSourceLink = $transferSourceLink; }
/** * Make sure that both of the call legs involved in the relaying process * are alive * * @return boolean */ protected function _ensureAliveCallLegs() { if ($this->_leftCallLeg->isAlive() && $this->_rightCallLeg->isAlive()) { return true; } $this->dispatchErrorEvent(self::DEAD_CALL_LEG_ERR_CODE); return false; }