/** * To put a call leg on hold we start by sending a MOVED. If the call leg answers with OKMOVED * we deal with it in this method * * @param Streamwide_Engine_Signal $signal * @return void */ protected function _handleOkMovedSignal(Streamwide_Engine_Signal $signal) { $params = $signal->getParams(); $this->_callLeg->setParams($params); return $this->dispatchEvent(new Streamwide_Engine_Events_Event(Streamwide_Engine_Events_Event::CALL_LEG_ON_HOLD)); }
/** * Handle the OK signal * * @param Streamwide_Engine_Signal $signal * @return void */ protected function _handleOkSignal(Streamwide_Engine_Signal $signal) { $this->_unsubscribeFromEngineEvents(); $this->_rightCallLeg->setAlive(); $this->_rightCallLeg->okSent(); $this->_rightCallLeg->setParams($signal->getParams()); if (false === $signal->relay($this->_leftCallLeg->getName())) { return $this->dispatchErrorEvent(self::OK_SIGNAL_RELAY_ERR_CODE); } $this->_leftCallLeg->okReceived(); $event = new Streamwide_Engine_Events_Event(Streamwide_Engine_Events_Event::CONNECTED); $event->setParam('signal', $signal); return $this->dispatchEvent($event); }
/** * If we received OKMOVED from the right SIP call leg, we need to send an OKSDP to * the left SIP call leg. If we received OKMOVED from left SIP call leg reconnect * was successfull and we need to dispatch the CONNECTED event * * @param Streamwide_Engine_Signal $signal * @return void */ protected function _handleOkMovedSignal(Streamwide_Engine_Signal $signal) { $params = $signal->getParams(); $remoteName = $signal->getRemote(); if ($remoteName === $this->_rightCallLeg->getName()) { $this->_rightOkMovedReceived = true; $this->_rightCallLeg->setParams($params); $okSdpSignal = Streamwide_Engine_Signal::factory(Streamwide_Engine_Signal::OKSDP, $this->_leftCallLeg->getName(), array('sdp' => $params['sdp'])); if (false === $okSdpSignal->send()) { $this->_unsubscribeFromEngineEvents(); return $this->dispatchErrorEvent(self::OKSDP_SIGNAL_SEND_ERR_CODE); } return null; } if ($remoteName === $this->_leftCallLeg->getName()) { $this->_unsubscribeFromEngineEvents(); $this->_leftCallLeg->setParams($params); $event = new Streamwide_Engine_Events_Event(Streamwide_Engine_Events_Event::CONNECTED); $event->setParam('signal', $signal); if (null !== $this->_movedSignal) { $event->setParam('moved', $this->_movedSignal); } return $this->dispatchEvent($event); } }
/** * We have received the FAILSDP signal from the SIP call leg we need to * relay it to the MS call leg and dispatch an error event * * @param Streamwide_Engine_Signal $signal * @return void */ protected function _handleFailSdpSignal(Streamwide_Engine_Signal $signal) { $this->_unsubscribeFromEngineEvents(); if (false === $signal->relay($this->_rightCallLeg->getName())) { return $this->dispatchErrorEvent(self::FAILSDP_SIGNAL_RELAY_ERR_CODE); } $params = $signal->getParams(); $failureCode = isset($params['code']) ? $params['code'] : null; return $this->dispatchErrorEvent(self::MS_NOT_CREATED_ERR_CODE, array('failureCode' => $failureCode, 'signal' => $signal)); }
/** * We have received OK from the MS call leg. We can consider the reinivite was successfull, * so we dispatch the CONNECTED event. * * @param Streamwide_Engine_Signal $signal * @return void */ protected function _handleOkSignal(Streamwide_Engine_Signal $signal) { $this->_unsubscribeFromEngineEvents(); $params = $signal->getParams(); $this->_rightCallLeg->setAlive(); $this->_rightCallLeg->okSent(); $this->_rightCallLeg->setParams($params); $event = new Streamwide_Engine_Events_Event(Streamwide_Engine_Events_Event::CONNECTED); $event->setParam('signal', $signal); if (null !== $this->_movedSignal) { $event->setParam('moved', $this->_movedSignal); } return $this->dispatchEvent($event); }
/** * We have received FAILMOVED. If it came from SIP call leg we need to send a * FAILSDP to the MS call leg and dispatch an error event. If it came from MS call * leg the fax environment could not be created * * @param Streamwide_Engine_Signal $signal * @return void */ protected function _handleFailMovedSignal(Streamwide_Engine_Signal $signal) { $this->_unsubscribeFromEngineEvents(); $remote = $signal->getRemote(); if ($remote === $this->_leftCallLeg->getName()) { $failSdpSignal = Streamwide_Engine_Signal::factory(Streamwide_Engine_Signal::FAILSDP, $this->_rightCallLeg->getName(), $signal->getParams()); if (false === $failSdpSignal->send()) { $this->dispatchErrorEvent(self::FAILSDP_SIGNAL_SEND_ERR_CODE); } return null; } if ($remote === $this->_rightCallLeg->getName()) { return $this->dispatchErrorEvent(self::FAX_ENV_NOT_CREATED_ERR_CODE); } }
protected function _handleFailMovedSignal(Streamwide_Engine_Signal $signal) { $this->_unsubscribeFromEngineEvents(); if ($this->_sipCallLegCreationFailed) { if (!$this->_triggerErrorEventOnRemoteSipFailure) { return; } $errorCode = self::SIP_NOT_CREATED_ERR_CODE; $failureCode = $this->_sipCallLegCreationFailureCode; } else { $errorCode = self::MS_NOT_UPDATED_ERR_CODE; $params = $signal->getParams(); $failureCode = isset($params['code']) ? $params['code'] : null; $killSignal = Streamwide_Engine_Signal::factory(Streamwide_Engine_Signal::KILL, $this->_leftCallLeg->getName()); $killSignal->send(); } $this->dispatchErrorEvent($errorCode, array('failureCode' => $failureCode, 'signal' => $signal)); }
protected function _handleFailMovedSignal(Streamwide_Engine_Signal $signal) { $remote = $signal->getRemote(); $params = $signal->getParams(); $failureCode = isset($params['code']) ? $params['code'] : null; if ($remote === $this->_leftCallLeg->getName()) { $this->_sipCallLegUpdateFailed = true; $signal = Streamwide_Engine_Signal::factory(Streamwide_Engine_Signal::FAILSDP, $this->_rightCallLeg->getName(), null !== $failureCode ? array('code' => $failureCode) : $failureCode); if (false === $signal->send()) { $this->_unsubscribeFromEngineEvents(); $this->dispatchErrorEvent(self::FAILSDP_SIGNAL_SEND_ERR_CODE); } return; } if ($remote === $this->_rightCallLeg->getName()) { $this->_unsubscribeFromEngineEvents(); $errorCode = self::MS_NOT_UPDATED_ERR_CODE; if ($this->_sipCallLegUpdateFailed) { $errorCode = self::SIP_NOT_UPDATED_ERR_CODE; } return $this->dispatchErrorEvent($errorCode, array('failureCode' => $failureCode, 'signal' => $signal)); } }
/** * We have received OKMOVED from the callee SIP call leg. We need to send * OKSDP to caller SIP call leg. * * @param Streamwide_Engine_Signal $signal * @return void */ protected function _handleOkMovedSignal(Streamwide_Engine_Signal $signal) { $this->_okMovedReceived = true; $params = $signal->getParams(); $okSdpSignal = Streamwide_Engine_Signal::factory(Streamwide_Engine_Signal::OKSDP, $this->_rightCallLeg->getName(), array('sdp' => $params['sdp'])); if (false === $okSdpSignal->send()) { $this->_unsubscribeFromEngineEvents(); return $this->dispatchErrorEvent(self::OKSDP_SIGNAL_SEND_ERR_CODE); } }
/** * We have received the FAIL signal from the SW Engine, we need to unsubscribe * from the other signals, relay the FAIL signal to the SIP call leg and dispatch * an error event signaling that the MS call leg has not been created * * @param Streamwide_Engine_Signal $signal * @return void */ protected function _handleFailSignal(Streamwide_Engine_Signal $signal) { // unsubscribe from OK, FAIL and CHILD signals $this->_unsubscribeFromEngineEvents(); // relay the FAIL signal to the SIP call leg if (false === $signal->relay($this->_leftCallLeg->getName())) { return $this->dispatchErrorEvent(self::FAIL_SIGNAL_RELAY_ERR_CODE); } // dispatch an error event signaling that the MS call leg // could not be created $params = $signal->getParams(); $failureCode = isset($params['code']) ? $params['code'] : null; return $this->dispatchErrorEvent(self::MS_NOT_CREATED_ERR_CODE, array('failureCode' => $failureCode, 'signal' => $signal)); }
/** * Handle FAIL signal. The call leg was not created. We need to dispatch an error * event. * * @param Streamwide_Engine_Signal $signal * @param string $errorCode * @return void */ protected function _handleFailSignal(Streamwide_Engine_Signal $signal, $errorCode) { $this->_unsubscribeFromEngineEvents(); $this->_callLeg->setDead(); $params = $signal->getParams(); $failureCode = isset($params['code']) ? $params['code'] : null; $this->dispatchErrorEvent($errorCode, array('failureCode' => $failureCode, 'signal' => $signal)); }
/** * Because we are sending 2 CREATE signals, we can receive two OK signals as response (if * everything is well). On OK received from the SIP call leg we send an OKSDP signal * to the MS call leg. On OK received from the MS call leg we dispatch the CONNECTED event * * @param Streamwide_Engine_Signal $signal * @return void */ protected function _handleOkSignal(Streamwide_Engine_Signal $signal) { $remoteName = $signal->getRemote(); $params = $signal->getParams(); if ($remoteName === $this->_rightCallLeg->getName()) { // The OK came from the media server call leg $this->_rightCallLeg->setAlive(); $this->_rightCallLeg->okSent(); $this->_rightCallLeg->setParams($params); if ($this->_msNegotiationActive) { if ($this->_leftCallLeg->hasSentOrReceivedOk()) { $params = $this->_leftCallLeg->getParams(); $moved = Streamwide_Engine_Signal::factory(Streamwide_Engine_Signal::MOVED, $this->_rightCallLeg->getName(), array('sdp' => $params['sdp'])); if (false === $moved->send()) { $this->_unsubscribeFromEngineEvents(); return $this->dispatchErrorEvent(self::MOVED_SIGNAL_SEND_ERR_CODE); } } $event = new Streamwide_Engine_Events_Event(Streamwide_Engine_Events_Event::EARLY_MEDIA_NEGOTIATED); return $this->dispatchEvent($event); } else { $this->_unsubscribeFromEngineEvents(); $event = new Streamwide_Engine_Events_Event(Streamwide_Engine_Events_Event::CONNECTED); $event->setParam('signal', $signal); if (null !== $this->_movedSignal) { $event->setParam('moved', $this->_movedSignal); } return $this->dispatchEvent($event); } } if ($remoteName === $this->_leftCallLeg->getName()) { // The OK came from the sip call leg $this->_leftCallLeg->setAlive(); $this->_leftCallLeg->okSent(); $this->_leftCallLeg->setParams($params); if ($this->_msNegotiationActive) { if ($this->_rightCallLeg->hasSentOrReceivedOk()) { $moved = Streamwide_Engine_Signal::factory(Streamwide_Engine_Signal::MOVED, $this->_rightCallLeg->getName(), array('sdp' => $params['sdp'])); if (false === $moved->send()) { $this->_unsubscribeFromEngineEvents(); return $this->dispatchErrorEvent(self::MOVED_SIGNAL_SEND_ERR_CODE); } } return; } else { $okSdp = Streamwide_Engine_Signal::factory(Streamwide_Engine_Signal::OKSDP, $this->_rightCallLeg->getName(), array('sdp' => $params['sdp'])); if (false === $okSdp->send()) { $this->_unsubscribeFromEngineEvents(); return $this->dispatchErrorEvent(self::OKSDP_SIGNAL_SEND_ERR_CODE); } } } }