bool CIPFindDlg::CheckMACAddr(CString strMAC) { CStringA stra(strMAC.GetBuffer(0)); strMAC.ReleaseBuffer(); string str=stra.GetBuffer(0); stra.ReleaseBuffer(); if (-1 != str.find(":")) return CheckMac(str.c_str(), ":"); if (-1 != str.find("-")) return CheckMac(str.c_str(), "-"); return false; }
void UE::on_rx_request(pjsip_rx_data *rdata) { pjsip_msg* msg = rdata->msg_info.msg; pj_str_t message; stra(&message, "MESSAGE"); pjsip_method msg_method; pjsip_method_init(&msg_method, _pool, &message); if (pjsip_method_cmp(&msg_method, &msg->line.req.method) == 0) { std::string body((char*)msg->body->data, msg->body->len); pjsip_transaction* tsx; pjsip_endpt_respond(get_global_endpoint(), NULL, rdata, 200, NULL, NULL, NULL, &tsx); } else { pjsip_endpt_respond_stateless(get_global_endpoint(), rdata, 500, NULL, NULL, NULL); } }
pj_status_t UE::init_int(pj_log_func* logger, std::string realm, std::string myurl, std::string username, std::string password, std::string outbound_proxy) { pj_status_t status; char errmsg[PJ_ERR_MSG_SIZE]; pj_sockaddr addr; pj_str_t remote; pj_sockaddr remote_addr; init_pjsip(logger); std::string server_uri = std::string("sip:") + realm + std::string(";lr;transport=tcp"); _pool = pj_pool_create(get_global_pool_factory(), "a", 256, 256, NULL); pj_sockaddr_init(pj_AF_INET(), &addr, NULL, (pj_uint16_t)0); //status = pjsip_udp_transport_start(get_global_endpoint(), &addr.ipv4, NULL, 1, &_transport); //assert(status == PJ_SUCCESS); if (outbound_proxy.empty()) { outbound_proxy = realm; } pj_cstr(&remote, outbound_proxy.c_str()); pj_sockaddr_init(pj_AF_INET(), &remote_addr, &remote, (pj_uint16_t)5060); pjsip_tpselector sel2; sel2.type = PJSIP_TPSELECTOR_LISTENER; sel2.u.listener = get_global_tcp_factory(); status = pjsip_endpt_acquire_transport(get_global_endpoint(), PJSIP_TRANSPORT_TCP, &remote_addr, pj_sockaddr_get_len(&remote_addr), &sel2, &_transport); if (status != PJ_SUCCESS) { pj_strerror(status, errmsg, sizeof(errmsg)); PJ_LOG(1, (__FILE__, "TCP connection to %s failed: %s (%d)", outbound_proxy.c_str(), errmsg, status)); return status; } transport_mapping[_transport] = this; status = pjsip_regc_create(get_global_endpoint(), this, ®c_cb, &_regc); if (status != PJ_SUCCESS) { pj_strerror(status, errmsg, sizeof(errmsg)); PJ_LOG(1, (__FILE__, "Creating the REGISTER session failed: %s (%d)", errmsg, status)); return status; } pjsip_regc_set_reg_tsx_cb(_regc, ®_tsx_cb); pjsip_tpselector sel; sel.type = PJSIP_TPSELECTOR_TRANSPORT; sel.u.transport = _transport; pjsip_regc_set_transport(_regc, &sel); pjsip_auth_clt_pref prefs = {}; prefs.initial_auth = PJ_TRUE; pjsip_regc_set_prefs(_regc, &prefs); pjsip_cred_info cred; stra(&cred.realm, realm.c_str()); stra(&cred.scheme, "Digest"); stra(&cred.username, username.c_str()); stra(&cred.data, password.c_str()); cred.data_type = 0; // Plaintext password pjsip_cred_info creds[1] = {cred}; pjsip_regc_set_credentials(_regc, 1, creds); char contact[32]; snprintf(contact, 32, "sip:phone@%.*s:%d", (int)_transport->local_name.host.slen, _transport->local_name.host.ptr, _transport->local_name.port); stra(&_realm, realm.c_str()); stra(&_server, server_uri.c_str()); _server_uri = pjsip_parse_uri(_pool, _server.ptr, _server.slen, 0); stra(&_my_uri, myurl.c_str()); stra(&_username, username.c_str()); stra(&_contact, contact); return PJ_SUCCESS; }
int UE::send_message(std::string dest, std::string contents) { timeval before; timeval after; pthread_mutex_lock(&_msg_mutex); pj_str_t to; stra(&to, dest.c_str()); pj_str_t data; stra(&data, contents.c_str()); pj_str_t message; stra(&message, "MESSAGE"); pjsip_tx_data* tdata; pjsip_method msg_method; pjsip_method_init(&msg_method, _pool, &message); pjsip_endpt_create_request(get_global_endpoint(), &msg_method, &to, &_my_uri, &to, &_contact, NULL, -1, &data, &tdata); pjsip_tsx_create_uac(ua_module(), tdata, &_msg_tsx); pjsip_tpselector sel; sel.type = PJSIP_TPSELECTOR_TRANSPORT; sel.u.transport = _transport; pjsip_tsx_set_transport(_msg_tsx, &sel); pjsip_route_hdr* rt_hdr = pjsip_route_hdr_create(tdata->pool); rt_hdr->name_addr.uri = _server_uri; pjsip_msg_insert_first_hdr(tdata->msg, (pjsip_hdr*)rt_hdr); _msg_tsx->mod_data[ua_module()->id] = this; pj_grp_lock_add_ref(_msg_tsx->grp_lock); gettimeofday(&before, NULL); pj_status_t status = pjsip_tsx_send_msg(_msg_tsx, NULL); if (status != PJ_SUCCESS) { pthread_mutex_unlock(&_msg_mutex); return -1; } while (_msg_tsx->state < PJSIP_TSX_STATE_COMPLETED) { pthread_cond_wait(&_msg_cond, &_msg_mutex); } gettimeofday(&after, NULL); //unsigned long latency = ((after.tv_sec - before.tv_sec) * 1000000) + (after.tv_usec - before.tv_usec); //printf("Message latency is %lu\n", latency); int ret = _msg_tsx->status_code; pj_grp_lock_dec_ref(_msg_tsx->grp_lock); _msg_tsx = NULL; pthread_mutex_unlock(&_msg_mutex); return ret; }