[svn-commits] dvossel: branch dvossel/sip_resource_list_trunk r188018 - /team/dvossel/sip_r...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Fri Apr 10 17:36:22 CDT 2009


Author: dvossel
Date: Fri Apr 10 17:36:13 2009
New Revision: 188018

URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=188018
Log:
The first NOTIFY is now sent immediatly after processing the rlmi SUBSCRIPTION.   dialog version number is incremented correctly.  locking has still not been addressed

Modified:
    team/dvossel/sip_resource_list_trunk/channels/chan_sip.c

Modified: team/dvossel/sip_resource_list_trunk/channels/chan_sip.c
URL: http://svn.digium.com/svn-view/asterisk/team/dvossel/sip_resource_list_trunk/channels/chan_sip.c?view=diff&rev=188018&r1=188017&r2=188018
==============================================================================
--- team/dvossel/sip_resource_list_trunk/channels/chan_sip.c (original)
+++ team/dvossel/sip_resource_list_trunk/channels/chan_sip.c Fri Apr 10 17:36:13 2009
@@ -10611,7 +10611,7 @@
 		break;
 	case DIALOG_INFO_XML: /* SNOM subscribes in this format */
 		ast_str_append(tmp, 0, "<?xml version=\"1.0\"?>\n");
-		ast_str_append(tmp, 0, "<dialog-info xmlns=\"urn:ietf:params:xml:ns:dialog-info\" version=\"%d\" state=\"%s\" entity=\"%s\">\n", p->dialogver++, full ? "full" : "partial", mto);
+		ast_str_append(tmp, 0, "<dialog-info xmlns=\"urn:ietf:params:xml:ns:dialog-info\" version=\"%d\" state=\"%s\" entity=\"%s\">\n", p->dialogver, full ? "full" : "partial", mto);
 		if ((state & AST_EXTENSION_RINGING) && sip_cfg.notifyringing) {
 			const char *local_display = exten;
 			char *local_target = mto;
@@ -10668,7 +10668,7 @@
 static int transmit_state_notify(struct sip_pvt *p, int state, int full, int timeout)
 {
 	struct ast_str *tmp = ast_str_alloca(4000);
-	struct ast_str *content_type = ast_str_alloca(256);
+	struct ast_str *tmp2 = ast_str_alloca(256);
 	char from[256], to[256];
 	char *c, *mfrom, *mto;
 	struct sip_request req;
@@ -10737,10 +10737,10 @@
 		if(rlist) {
 			add_header(&req, "Require", "eventlist");
 			/* since multipart/related is involved, boundary and start must be added to Content-Type */
-			ast_str_append(&content_type, 0, "multipart/related;type=\"%s\";", subscriptiontype->mediatype);
-			ast_str_append(&content_type, 0, "start=\"<%s@%s>\";", rlist->contentid, p->fromdomain);
-			ast_str_append(&content_type, 0, "boundary=\"%s\"", boundary); //todohere better boundary
-			add_header(&req, "Content-Type", ast_str_buffer(content_type));
+			ast_str_append(&tmp2, 0, "multipart/related;type=\"%s\";", subscriptiontype->mediatype);
+			ast_str_append(&tmp2, 0, "start=\"<%s@%s>\";", rlist->contentid, p->fromdomain);
+			ast_str_append(&tmp2, 0, "boundary=\"%s\"", boundary); //todohere better boundary
+			add_header(&req, "Content-Type", ast_str_buffer(tmp2));
 
 			/* most of the Content of this NOTIFY is created in state_notify_build, 
 	 		* but when multipart/related is involved, some over head must be done here */
@@ -10761,7 +10761,9 @@
 				ast_str_append(&tmp, 0, "Content-Type: %s\r\n\r\n", subscriptiontype->mediatype);
 
 				//todohere, if not full, then only transmit resources marked for update
-				state_notify_build(resource->laststate, full, resource->exten, rlist->context, &tmp, p, p->multipart_subscribed, mfrom, mto);
+				ast_str_reset(tmp2);
+				ast_str_append(&tmp2, 0, "sip:%s@%s", resource->exten, p->fromdomain);
+				state_notify_build(resource->laststate, full, resource->exten, rlist->context, &tmp, p, p->multipart_subscribed, mfrom, ast_str_buffer(tmp2));
 			}
 			ast_str_append(&tmp, 0, "\r\n--%s", boundary);
 
@@ -10771,21 +10773,25 @@
 			ast_log(LOG_WARNING, "transmit_state_notify() NOTIFY rlmi, but no resource list\n");
 			return -1;
 		}
+		p->dialogver++;
 		break;
 	case CPIM_PIDF_XML:
 		add_header(&req, "Event", subscriptiontype->event);
 		state_notify_build(state, full, p->exten, p->context, &tmp, p, p->subscribed, mfrom, mto);
 		add_header(&req, "Content-Type", subscriptiontype->mediatype);
+		p->dialogver++;
 		break;
 	case PIDF_XML: /* Eyebeam supports this format */
 		add_header(&req, "Event", subscriptiontype->event);
 		state_notify_build(state, full, p->exten, p->context, &tmp, p, p->subscribed, mfrom, mto);
 		add_header(&req, "Content-Type", subscriptiontype->mediatype);
+		p->dialogver++;
 		break;
 	case DIALOG_INFO_XML: /* SNOM subscribes in this format */
 		add_header(&req, "Event", subscriptiontype->event);
 		state_notify_build(state, full, p->exten, p->context, &tmp, p, p->subscribed, mfrom, mto);
 		add_header(&req, "Content-Type", subscriptiontype->mediatype);
+		p->dialogver++;
 		break;
 	case NONE:
 	default:
@@ -12355,7 +12361,6 @@
 		break;
 	}
 
-//todohere transmit notify to all rlist watchers, something like this transmit_rlist_state_notify(p, state, 1, FALSE);
 	AST_LIST_TRAVERSE(&rlist->watchers, pvt, rlist_entry) {
 		ast_log(LOG_NOTICE, "SENDING NOTIFY FOR pvt\n"); //todohere remove
 		transmit_state_notify(pvt, state, 1, FALSE);
@@ -21310,9 +21315,10 @@
 		} else if (p->subscribed == DIALOG_RLMI_XML) { /* resource lists extension states are handled differently */
 			if (rlist_add_watcher(p) > 0) {
 				ast_set_flag(&p->flags[1], SIP_PAGE2_DIALOG_ESTABLISHED);
+				p->dialogver = 0;
+				ast_string_field_build(p, subscribeuri, "%s@%s", p->exten, p->context);
 				transmit_response(p, "200 OK", req);
-				ast_string_field_build(p, subscribeuri, "%s@%s", p->exten, p->context);
-				p->dialogver = 0;
+				transmit_state_notify(p, 0, 1, FALSE);
 				//todohere force first notify and delete any matching old subscriptions (they will time out, but why wait
 			} else {
 				transmit_response(p, "404 Not found", req);
@@ -23517,6 +23523,7 @@
 
 static int rlist_add_watcher(struct sip_pvt *p)
 {
+	int res = 0;
 	if (p) {
 		/* find and point p->rlist to match, rlist ref is incremented if found */
 		rlist_find(p->exten, p->context, p);
@@ -23526,12 +23533,14 @@
 			p->rlist->num_watchers++;
 			rlist_start_monitor(p->rlist);
 			return 1;
+		} else {
+			res = -1;
 		}
 	} else {
-		return -1;
-	}
-
-	return 0;
+		res = -1;
+	}
+
+	return res;
 }
 
 static int rlist_remove_watcher(struct sip_pvt *p)




More information about the svn-commits mailing list