Beispiel #1
0
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;
}
Beispiel #2
0
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);
  }
}
Beispiel #3
0
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, &regc_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, &reg_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;
}
Beispiel #4
0
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;
}