예제 #1
0
파일: Suspender.php 프로젝트: cwcw/cms
 /**
  * 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()))));
     }
 }
예제 #2
0
파일: Assassin.php 프로젝트: cwcw/cms
 /**
  * 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;
 }
예제 #3
0
파일: Connector.php 프로젝트: cwcw/cms
 /**
  * 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));
 }
예제 #4
0
파일: SdpDirectCall.php 프로젝트: cwcw/cms
 /**
  * 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);
 }
예제 #5
0
파일: Creator.php 프로젝트: cwcw/cms
 /**
  * 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
 }
예제 #6
0
파일: Recorder.php 프로젝트: cwcw/cms
 /**
  * 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();
 }
예제 #7
0
파일: SipReconnect.php 프로젝트: cwcw/cms
 /**
  * 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);
 }
예제 #8
0
파일: Handler.php 프로젝트: cwcw/cms
 /**
  * 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;
 }
예제 #9
0
파일: Relayer.php 프로젝트: cwcw/cms
 /**
  * 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;
 }