/***************************************************************************** * @name * @description * @param * @return */ void send_sip_invite(sip_session_t *session) { int l; char *s; struct sockaddr_in addr; s = gen_call_id(session); session->call->id = (char *) malloc(strlen(s)*sizeof(char)); memcpy(session->call->id,s,strlen(s)); session->call->socket = open_udp_socket(session->localip,0); l = sizeof(addr); if(getsockname(session->call->socket,(struct sockaddr *) &addr,(socklen_t *) &l)) die_with_error("getsockname() failed"); session->call->sport = ntohs(addr.sin_port); s = mk_sip_msg(session,0,INVITE); if((l =sendto(session->socket,s,strlen(s)+1,0,(struct sockaddr *) &(session->addr), sizeof(session->addr)) ) != strlen(s)+1) die_with_error("sendto() failed"); session->prev_state = REGISTERED; session->curr_state = INVITING; }
//========================================================================================================== // Get the value for a variable that appear in the script in brackets (like [call_id]). Some are static to // the test (received from MServer), some generated, some stored from previous messages. //========================================================================================================== string ScriptReader::get_value(string var, int call_number, bool try_as_last) { smatch match; if(!regex_match(var, match, var_regex)) { throw string("Wrong format for var in ScriptReader::get_value(): " + var); } // var_regex: "(last_)?(((cseq)\\+(\\d+))|([-\\w]+))(:value)?" // submatches: 1 234 5 6 7 bool is_last = (match[1].length() > 0); bool just_value = (match[7].length() > 0); int add_to_cseq = 0; string name = match[2]; if(match[3].length() > 0) { name = match[4]; add_to_cseq = stoi(match[5]); } if(is_last || (try_as_last && (SipMessage::is_message_var(name) || SipParser::inst().match(HEADER_NAME, name)))) { string result = get_last_value(name, call_number, just_value); if(name == CSEQ) { return to_string(stoi(result) + add_to_cseq); } return result; } if(name == BRANCH) { return gen_branch(); } CallIDKind cid_kind = string_to_call_id_kind(name); if(cid_kind != NONE) { return gen_call_id(cid_kind); } if(name == TAG) { return gen_tag(); } if(vars.count(name) != 0) { return vars[name]; } if(static_vars.count(name) != 0) { return static_vars.at(name); } return MServer::inst.get_value(name); }