AmSession* AmSessionContainer::startSessionUAC(AmSipRequest& req) { AmSession* session = NULL; as_mut.lock(); try { if((session = createSession(req)) != 0){ session->dlg.updateStatusFromLocalRequest(req); // sets local tag as well session->setCallgroup(req.from_tag); session->setNegotiateOnReply(true); session->sendInvite(); session->start(); addSession_unsafe(req.callid,req.from_tag,req.from_tag,session); // session does not get its own INVITE // session->postEvent(new AmSipRequestEvent(req)); } } catch(const AmSession::Exception& e){ ERROR("%i %s\n",e.code,e.reason.c_str()); AmSipDialog::reply_error(req,e.code,e.reason); } catch(const string& err){ ERROR("startSession: %s\n",err.c_str()); AmSipDialog::reply_error(req,500,err); } catch(...){ ERROR("unexpected exception\n"); AmSipDialog::reply_error(req,500,"unexpected exception"); } as_mut.unlock(); return session; }
void AmSessionContainer::startSessionUAS(AmSipRequest& req) { as_mut.lock(); try { AmSession* session = getSession(req.callid,req.from_tag); if( session ){ // it's a forked-and-merged INVITE // reply 482 Loop detected throw AmSession::Exception(482, "Loop detected"); } else { // Call-ID and From-Tag are unknown: it's a new session AmSession* session; if((session = createSession(req)) != 0){ // update session's local tag (ID) if not already set session->setLocalTag(); const string& local_tag = session->getLocalTag(); // by default each session is in its own callgroup session->setCallgroup(local_tag); if (AmConfig::LogSessions) { INFO("Starting UAS session %s app %s\n", session->getLocalTag().c_str(), req.cmd.c_str()); } session->start(); addSession_unsafe(req.callid,req.from_tag,local_tag,session); session->postEvent(new AmSipRequestEvent(req)); } } } catch(const AmSession::Exception& e){ ERROR("%i %s\n",e.code,e.reason.c_str()); AmSipDialog::reply_error(req,e.code,e.reason); } catch(const string& err){ ERROR("startSession: %s\n",err.c_str()); AmSipDialog::reply_error(req,500,err); } catch(...){ ERROR("unexpected exception\n"); AmSipDialog::reply_error(req,500,"unexpected exception"); } as_mut.unlock(); }
void AmSessionContainer::startSessionUAS(AmSipRequest& req) { as_mut.lock(); try { AmSession* session = getSession(req.callid,req.from_tag); if( session ){ // it's a forked-and-merged INVITE // reply 482 Loop detected throw AmSession::Exception(482, "Loop detected"); } else { // Call-ID and From-Tag are unknown: it's a new session AmSession* session; if((session = createSession(req)) != 0){ string local_tag = AmSession::getNewId(); session->setLocalTag(local_tag); session->setCallgroup(local_tag); session->start(); addSession_unsafe(req.callid,req.from_tag,local_tag,session); session->postEvent(new AmSipRequestEvent(req)); } //else //throw AmSession::Exception(500,"internal error"); } } // catch(const AmSession::SessionTimerException& e){ // ERROR("%i %s\n",e.code,e.reason.c_str()); // AmSipDialog::reply_error(req,e.code,e.reason,e.getErrorHeaders()); // } catch(const AmSession::Exception& e){ ERROR("%i %s\n",e.code,e.reason.c_str()); AmSipDialog::reply_error(req,e.code,e.reason); } catch(const string& err){ ERROR("startSession: %s\n",err.c_str()); AmSipDialog::reply_error(req,500,err); } catch(...){ ERROR("unexpected exception\n"); AmSipDialog::reply_error(req,500,"unexpected exception"); } as_mut.unlock(); }
AmSession* AmSessionContainer::startSessionUAC(AmSipRequest& req, AmArg* session_params) { AmSession* session = NULL; as_mut.lock(); try { if((session = createSession(req, session_params)) != 0){ session->dlg.updateStatusFromLocalRequest(req); // sets local tag as well session->setCallgroup(req.from_tag); session->setNegotiateOnReply(true); if (int err = session->sendInvite(req.hdrs)) { ERROR("INVITE could not be sent: error code = %d.\n", err); delete session; as_mut.unlock(); return NULL; } if (AmConfig::LogSessions) { INFO("Starting UAC session %s app %s\n", session->getLocalTag().c_str(), req.cmd.c_str()); } session->start(); addSession_unsafe(req.callid,"",req.from_tag,session); // session does not get its own INVITE // session->postEvent(new AmSipRequestEvent(req)); } } catch(const AmSession::Exception& e){ ERROR("%i %s\n",e.code,e.reason.c_str()); AmSipDialog::reply_error(req,e.code,e.reason); } catch(const string& err){ ERROR("startSession: %s\n",err.c_str()); AmSipDialog::reply_error(req,500,err); } catch(...){ ERROR("unexpected exception\n"); AmSipDialog::reply_error(req,500,"unexpected exception"); } as_mut.unlock(); return session; }