[svn-commits] oej: branch group/pinana-publish-1.4 r296521 - /team/group/pinana-publish-1.4...
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Sun Nov 28 12:55:28 CST 2010
Author: oej
Date: Sun Nov 28 12:55:24 2010
New Revision: 296521
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=296521
Log:
Handling the subscription state header
Modified:
team/group/pinana-publish-1.4/channels/chan_sip.c
Modified: team/group/pinana-publish-1.4/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/group/pinana-publish-1.4/channels/chan_sip.c?view=diff&rev=296521&r1=296520&r2=296521
==============================================================================
--- team/group/pinana-publish-1.4/channels/chan_sip.c (original)
+++ team/group/pinana-publish-1.4/channels/chan_sip.c Sun Nov 28 12:55:24 2010
@@ -1877,7 +1877,7 @@
static int sip_set_udptl_peer(struct ast_channel *chan, struct ast_udptl *udptl);
/*------ Remote publish/subscribe support */
-static int sip_pres_notify_update(struct sip_pvt *dialog, struct sip_request *req);
+static int sip_pres_notify_update(struct sip_pvt *dialog, struct sip_request *req, int terminated, const char *termreason);
/*! \brief Definition of this channel for PBX channel registration */
static const struct ast_channel_tech sip_tech = {
@@ -15077,17 +15077,34 @@
/* This is mostly a skeleton for future improvements */
/* Mostly created to return proper answers on notifications on outbound REFER's */
int res = 0;
+ int terminated = FALSE;
const char *event = get_header(req, "Event");
+ const char *substate = get_header(req, "Subscription-State");
+ const char *termreason = NULL;
char *eventid = NULL;
char *sep;
- if( (sep = strchr(event, ';')) ) { /* XXX bug here - overwriting string ? */
+ // add_header(&req, "Subscription-State", "terminated;reason=timeout");
+ // add_header(&req, "Subscription-State", "terminated;reason=probation");
+ // add_header(&req, "Subscription-State", "terminated;reason=noresource");
+ // Subscription-State: active
+
+ if( (sep = strchr(substate, ';')) ) { /* XXX bug here - overwriting const string ? */
+ *sep++ = '\0';
+ termreason = sep;
+ }
+ if (strcasecmp(substate, "terminated")) {
+ terminated = TRUE;
+ ast_log(LOG_NOTICE, "%s : Subscription terminated. Event %s Reason %s\n", p->callid, event, termreason);
+ }
+ if( (sep = strchr(event, ';')) ) { /* XXX bug here - overwriting const string ? */
*sep++ = '\0';
eventid = sep;
}
- if (option_debug > 1 && sipdebug)
+ if (option_debug > 1 && sipdebug) {
ast_log(LOG_DEBUG, "Got NOTIFY Event: %s\n", event);
+ }
if (!strcmp(event, "refer")) {
/* Save nesting depth for now, since there might be other events we will
@@ -15191,7 +15208,7 @@
/* Confirm that we received this packet */
transmit_response(p, "200 OK", req);
} else if (!strcasecmp(event, "dialog")) {
- res = sip_pres_notify_update(p, req);
+ res = sip_pres_notify_update(p, req, terminated, termreason);
} else {
/* We don't understand this event. */
if (option_debug > 1) {
@@ -15201,8 +15218,9 @@
transmit_response(p, "489 Bad event", req);
res = -1;
};
- if (!p->lastinvite)
+ if (!p->lastinvite || terminated) {
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
+ }
return res;
}
@@ -19576,7 +19594,7 @@
}
/*! \brief Parse the incoming NOTIFY update and update the device state provider system for this device */
-static int sip_pres_notify_update(struct sip_pvt *dialog, struct sip_request *req)
+static int sip_pres_notify_update(struct sip_pvt *dialog, struct sip_request *req, int terminated, const char *termreason)
{
char buf[SIPBUFSIZE * 8];
char *state;
More information about the svn-commits
mailing list