return -1;
}
+ if (!ast_res_pjsip_find_or_create_contact_status(contact)) {
+ ao2_ref(contact, -1);
+ return -1;
+ }
+
ast_string_field_set(contact, uri, contact_uri);
ao2_link(aor->permanent_contacts, contact);
ao2_ref(contact, -1);
"Contact",
flexwidth, flexwidth,
wrapper->contact_id,
- ast_sip_get_contact_short_status_label(status->status),
- (status->status != UNKNOWN ? ((long long) status->rtt) / 1000.0 : NAN));
+ ast_sip_get_contact_short_status_label(status ? status->status : UNKNOWN),
+ (status && (status->status != UNKNOWN) ? ((long long) status->rtt) / 1000.0 : NAN));
return 0;
}
struct ast_sip_cli_formatter_entry *contact_formatter;
struct ast_sip_cli_formatter_entry *aor_formatter;
+/*! \brief Always create a contact_status for each contact */
+static int contact_apply_handler(const struct ast_sorcery *sorcery, void *object)
+{
+ struct ast_sip_contact_status *status;
+ struct ast_sip_contact *contact = object;
+
+ status = ast_res_pjsip_find_or_create_contact_status(contact);
+
+ return status ? 0 : -1;
+}
+
/*! \brief Initialize sorcery with location support */
int ast_sip_initialize_sorcery_location(void)
{
ast_sorcery_apply_default(sorcery, "contact", "astdb", "registrar");
ast_sorcery_apply_default(sorcery, "aor", "config", "pjsip.conf,criteria=type=aor");
- if (ast_sorcery_object_register(sorcery, "contact", contact_alloc, NULL, NULL) ||
+ if (ast_sorcery_object_register(sorcery, "contact", contact_alloc, NULL, contact_apply_handler) ||
ast_sorcery_object_register(sorcery, "aor", aor_alloc, NULL, NULL)) {
return -1;
}
}
/*!
- * \internal
* \brief Retrieve a ast_sip_contact_status object from sorcery creating
* one if not found.
*/
-static struct ast_sip_contact_status *find_or_create_contact_status(const struct ast_sip_contact *contact)
+struct ast_sip_contact_status *ast_res_pjsip_find_or_create_contact_status(const struct ast_sip_contact *contact)
{
struct ast_sip_contact_status *status;
return NULL;
}
+ status->status = UNKNOWN;
+ status->rtt_start = ast_tv(0, 0);
+ status->rtt = 0;
+
if (ast_sorcery_create(ast_sip_get_sorcery(), status)) {
ast_log(LOG_ERROR, "Unable to persist ast_sip_contact_status for contact %s\n",
contact->uri);
struct ast_sip_contact_status *status;
struct ast_sip_contact_status *update;
- status = find_or_create_contact_status(contact);
+ status = ast_res_pjsip_find_or_create_contact_status(contact);
if (!status) {
ast_log(LOG_ERROR, "Unable to find ast_sip_contact_status for contact %s\n",
contact->uri);
update->rtt_start = ast_tv(0, 0);
-
-
ast_test_suite_event_notify("AOR_CONTACT_QUALIFY_RESULT",
"Contact: %s\r\n"
"Status: %s\r\n"
struct ast_sip_contact_status *status;
struct ast_sip_contact_status *update;
- status = find_or_create_contact_status(contact);
+ status = ast_res_pjsip_find_or_create_contact_status(contact);
if (!status) {
ast_log(LOG_ERROR, "Unable to find ast_sip_contact_status for contact %s\n",
contact->uri);