/*! * \internal * \brief Attempt to qualify the contact * * \details Sends a SIP OPTIONS request to the given contact in order to make * sure that contact is available. */ static int qualify_contact(struct ast_sip_endpoint *endpoint, struct ast_sip_contact *contact) { pjsip_tx_data *tdata; RAII_VAR(struct ast_sip_endpoint *, endpoint_local, NULL, ao2_cleanup); if (endpoint) { endpoint_local = ao2_bump(endpoint); } else { if (!ast_strlen_zero(contact->endpoint_name)) { endpoint_local = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", contact->endpoint_name); } if (!endpoint_local) { endpoint_local = find_an_endpoint(contact); } if (!endpoint_local) { ast_log(LOG_WARNING, "Unable to find an endpoint to qualify contact %s. Deleting this contact\n", contact->uri); contact_deleted(contact); return -1; } } if (ast_sip_create_request("OPTIONS", NULL, endpoint_local, NULL, contact, &tdata)) { ast_log(LOG_ERROR, "Unable to create request to qualify contact %s\n", contact->uri); return -1; } /* If an outbound proxy is specified set it on this request */ if (!ast_strlen_zero(contact->outbound_proxy) && ast_sip_set_outbound_proxy(tdata, contact->outbound_proxy)) { pjsip_tx_data_dec_ref(tdata); ast_log(LOG_ERROR, "Unable to apply outbound proxy on request to qualify contact %s\n", contact->uri); return -1; } init_start_time(contact); ao2_ref(contact, +1); if (ast_sip_send_out_of_dialog_request(tdata, endpoint_local, (int)(contact->qualify_timeout * 1000), contact, qualify_contact_cb) != PJ_SUCCESS) { ast_log(LOG_ERROR, "Unable to send request to qualify contact %s\n", contact->uri); update_contact_status(contact, UNAVAILABLE, 0); ao2_ref(contact, -1); return -1; } return 0; }
/*! * \internal * \brief Attempt to qualify the contact * * \details Sends a SIP OPTIONS request to the given contact in order to make * sure that contact is available. */ static int qualify_contact(struct ast_sip_endpoint *endpoint, struct ast_sip_contact *contact) { pjsip_tx_data *tdata; RAII_VAR(struct ast_sip_endpoint *, endpoint_local, NULL, ao2_cleanup); if (contact->authenticate_qualify) { endpoint_local = ao2_bump(endpoint); if (!endpoint_local) { /* * Find the "first" endpoint to completely qualify the contact - any * endpoint that is associated with the contact should do. */ endpoint_local = find_an_endpoint(contact); if (!endpoint_local) { ast_log(LOG_ERROR, "Unable to find an endpoint to qualify contact %s\n", contact->uri); return -1; } } } if (ast_sip_create_request("OPTIONS", NULL, NULL, NULL, contact, &tdata)) { ast_log(LOG_ERROR, "Unable to create request to qualify contact %s\n", contact->uri); return -1; } /* If an outbound proxy is specified set it on this request */ if (!ast_strlen_zero(contact->outbound_proxy) && ast_sip_set_outbound_proxy(tdata, contact->outbound_proxy)) { pjsip_tx_data_dec_ref(tdata); ast_log(LOG_ERROR, "Unable to apply outbound proxy on request to qualify contact %s\n", contact->uri); return -1; } init_start_time(contact); ao2_ref(contact, +1); if (ast_sip_send_out_of_dialog_request(tdata, endpoint_local, (int)(contact->qualify_timeout * 1000), contact, qualify_contact_cb) != PJ_SUCCESS) { ast_log(LOG_ERROR, "Unable to send request to qualify contact %s\n", contact->uri); update_contact_status(contact, UNAVAILABLE); ao2_ref(contact, -1); return -1; } return 0; }
static pj_status_t check_system_time(pj_uint64_t ts_elapsed) { enum { MIS = 5 }; SYSTEMTIME st; FILETIME ft; LARGE_INTEGER cur, calc; DWORD diff; pj_timestamp freq; pj_status_t status; /* Get system's current time */ GetLocalTime(&st); SystemTimeToFileTime(&st, &ft); cur.LowPart = ft.dwLowDateTime; cur.HighPart = ft.dwHighDateTime; cur.QuadPart /= SECS_TO_FT_MULT; cur.QuadPart -= base_time.QuadPart; /* Get our calculated system time */ status = pj_get_timestamp_freq(&freq); if (status != PJ_SUCCESS) return status; calc.QuadPart = g_start_time.QuadPart + ts_elapsed / freq.u64; /* See the difference between calculated and actual system time */ if (calc.QuadPart >= cur.QuadPart) { diff = (DWORD)(calc.QuadPart - cur.QuadPart); } else { diff = (DWORD)(cur.QuadPart - calc.QuadPart); } if (diff > MIS) { /* System time has changed */ PJ_LOG(3,("os_time_win32.c", "WinCE system time changed detected " "(diff=%u)", diff)); status = init_start_time(); } else { status = PJ_SUCCESS; } return status; }
// Find 1st Jan 1970 as a FILETIME static pj_status_t get_base_time(void) { SYSTEMTIME st; FILETIME ft; pj_status_t status = PJ_SUCCESS; memset(&st,0,sizeof(st)); st.wYear=1970; st.wMonth=1; st.wDay=1; SystemTimeToFileTime(&st, &ft); base_time.LowPart = ft.dwLowDateTime; base_time.HighPart = ft.dwHighDateTime; base_time.QuadPart /= SECS_TO_FT_MULT; #ifdef WINCE_TIME pj_enter_critical_section(); status = init_start_time(); pj_leave_critical_section(); #endif return status; }