void AmSession::onSipRequest(const AmSipRequest& req) { CALL_EVENT_H(onSipRequest,req); DBG("onSipRequest: method = %s\n",req.method.c_str()); updateRefreshMethod(req.hdrs); if(req.method == SIP_METH_INVITE){ try { onInvite(req); } catch(const string& s) { ERROR("%s\n",s.c_str()); setStopped(); dlg->reply(req, 500, SIP_REPLY_SERVER_INTERNAL_ERROR); } catch(const AmSession::Exception& e) { ERROR("%i %s\n",e.code,e.reason.c_str()); setStopped(); dlg->reply(req, e.code, e.reason, NULL, e.hdrs); } } else if(req.method == SIP_METH_ACK){ return; } else if( req.method == SIP_METH_BYE ){ dlg->reply(req,200,"OK"); onBye(req); } else if( req.method == SIP_METH_CANCEL ){ onCancel(req); } else if( req.method == SIP_METH_INFO ){ const AmMimeBody* dtmf_body = req.body.hasContentType("application/dtmf-relay"); if (dtmf_body) { string dtmf_body_str((const char*)dtmf_body->getPayload(), dtmf_body->getLen()); postDtmfEvent(new AmSipDtmfEvent(dtmf_body_str)); dlg->reply(req, 200, "OK"); } else { dlg->reply(req, 415, "Unsupported Media Type"); } } else if (req.method == SIP_METH_PRACK) { // TODO: SDP dlg->reply(req, 200, "OK"); // TODO: WARN: only include latest SDP if req.rseq == dlg->rseq (latest 1xx) } else { dlg->reply(req, 501, "Not implemented"); } }
void AmSession::onSipRequest(const AmSipRequest& req) { CALL_EVENT_H(onSipRequest,req); dlg.updateStatus(req); DBG("onSipRequest: method = %s\n",req.method.c_str()); if(req.method == "INVITE"){ onInvite(req); if(detached.get() && !getStopped()){ onSessionStart(req); if(input || output) AmMediaProcessor::instance()->addSession(this, callgroup); else { ERROR("missing audio input and/or ouput.\n"); } } } else if( req.method == "BYE" ){ dlg.reply(req,200,"OK"); onBye(req); } else if( req.method == "CANCEL" ){ dlg.reply(req,200,"OK"); onCancel(); } else if( req.method == "INFO" ){ if ((strip_header_params(getHeader(req.hdrs, "Content-Type")) =="application/dtmf-relay")|| (strip_header_params(getHeader(req.hdrs, "c")) =="application/dtmf-relay")){ postDtmfEvent(new AmSipDtmfEvent(req.body)); dlg.reply(req, 200, "OK"); } } }