示例#1
0
文件: sip.c 项目: hfreire/sipc
/*****************************************************************************
 * @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;

}
示例#2
0
//==========================================================================================================
// 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);
}