[asterisk-commits] file: branch file/pjsip-subscription-persistence r415334 - /team/file/pjsip-s...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Jun 6 09:32:33 CDT 2014


Author: file
Date: Fri Jun  6 09:32:27 2014
New Revision: 415334

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=415334
Log:
Persist the expiration time of the subscription so the recreated subscription
does not start fresh at the requested (or default) expiration.

Modified:
    team/file/pjsip-subscription-persistence/res/res_pjsip_pubsub.c

Modified: team/file/pjsip-subscription-persistence/res/res_pjsip_pubsub.c
URL: http://svnview.digium.com/svn/asterisk/team/file/pjsip-subscription-persistence/res/res_pjsip_pubsub.c?view=diff&rev=415334&r1=415333&r2=415334
==============================================================================
--- team/file/pjsip-subscription-persistence/res/res_pjsip_pubsub.c (original)
+++ team/file/pjsip-subscription-persistence/res/res_pjsip_pubsub.c Fri Jun  6 09:32:27 2014
@@ -206,6 +206,8 @@
 	unsigned int cseq;
 	/*! Local tag of the dialog */
 	char *tag;
+	/*! When this subscription expires */
+	struct timeval expires;
 };
 
 /*!
@@ -293,6 +295,12 @@
 	sub->persistence->cseq = sub->dlg->local.cseq;
 
 	if (rdata) {
+		int expires;
+		pjsip_expires_hdr *expires_hdr = pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_EXPIRES, NULL);
+
+		expires = expires_hdr ? expires_hdr->ivalue : DEFAULT_PUBLISH_EXPIRES;
+		sub->persistence->expires = ast_tvadd(ast_tvnow(), ast_samp2tv(expires, 1));
+
 		ast_copy_string(sub->persistence->packet, rdata->pkt_info.packet, sizeof(sub->persistence->packet));
 		ast_copy_string(sub->persistence->src_name, rdata->pkt_info.src_name, sizeof(sub->persistence->src_name));
 		sub->persistence->src_port = rdata->pkt_info.src_port;
@@ -332,6 +340,7 @@
 	char event[32];
 	char accept[AST_SIP_MAX_ACCEPT][64];
 	pjsip_accept_hdr *accept_header;
+	pjsip_expires_hdr *expires_header;
 	pjsip_event_hdr *event_header;
 	struct ast_sip_subscription_handler *handler;
 	RAII_VAR(struct ast_sip_endpoint *, endpoint, NULL, ao2_cleanup);
@@ -339,6 +348,12 @@
 	size_t num_accept_headers;
 	struct ast_sip_pubsub_body_generator *generator;
 
+	/* If this subscription has already expired remove it */
+	if (ast_tvdiff_ms(persistence->expires, ast_tvnow()) <= 0) {
+		ast_sorcery_delete(ast_sip_get_sorcery(), persistence);
+		return 0;
+	}
+
 	endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", persistence->endpoint);
 	if (!endpoint) {
 		ast_log(LOG_WARNING, "A subscription for '%s' could not be recreated as the endpoint was not found\n",
@@ -367,6 +382,17 @@
 	rdata.tp_info.transport->type_name = persistence->transport_key;
 	pj_strset2(&rdata.tp_info.transport->local_name.host, persistence->local_name);
 	rdata.tp_info.transport->local_name.port = persistence->local_port;
+
+	/* Update the expiration header with the new expiration */
+	expires_header = pjsip_msg_find_hdr(rdata.msg_info.msg, PJSIP_H_EXPIRES, rdata.msg_info.msg->hdr.next);
+	if (!expires_header) {
+		expires_header = pjsip_expires_hdr_create(pool, 0);
+		if (!expires_header) {
+			return 0;
+		}
+		pjsip_msg_add_hdr(rdata.msg_info.msg, (pjsip_hdr*)expires_header);
+	}
+	expires_header->ivalue = (ast_tvdiff_ms(persistence->expires, ast_tvnow()) / 1000);
 
 	event_header = pjsip_msg_find_hdr_by_name(rdata.msg_info.msg, &str_event_name, rdata.msg_info.msg->hdr.next);
 	ast_copy_pj_str(event, &event_header->event_type, sizeof(event));
@@ -1760,6 +1786,18 @@
 	return 0;
 }
 
+static int persistence_expires_str2struct(const struct aco_option *opt, struct ast_variable *var, void *obj)
+{
+	struct subscription_persistence *persistence = obj;
+	return ast_get_timeval(var->value, &persistence->expires, ast_tv(0, 0), NULL);
+}
+
+static int persistence_expires_struct2str(const void *obj, const intptr_t *args, char **buf)
+{
+	const struct subscription_persistence *persistence = obj;
+	return (ast_asprintf(buf, "%ld", persistence->expires.tv_sec) < 0) ? -1 : 0;
+}
+
 static int load_module(void)
 {
 	static const pj_str_t str_PUBLISH = { "PUBLISH", 7 };
@@ -1813,6 +1851,8 @@
 		persistence_endpoint_str2struct, persistence_endpoint_struct2str, NULL, 0, 0);
 	ast_sorcery_object_field_register_custom_nodoc(sorcery, "subscription_persistence", "tag", "",
 		persistence_tag_str2struct, persistence_tag_struct2str, NULL, 0, 0);
+	ast_sorcery_object_field_register_custom_nodoc(sorcery, "subscription_persistence", "expires", "",
+		persistence_expires_str2struct, persistence_expires_struct2str, NULL, 0, 0);
 
 	ast_manager_register_xml(AMI_SHOW_SUBSCRIPTIONS_INBOUND, EVENT_FLAG_SYSTEM,
 				 ami_show_subscriptions_inbound);




More information about the asterisk-commits mailing list