[svn-commits] mmichelson: branch mmichelson/pubsub_bodies r405922 - in /team/mmichelson/pub...
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Mon Jan 20 14:18:48 CST 2014
Author: mmichelson
Date: Mon Jan 20 14:18:44 2014
New Revision: 405922
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=405922
Log:
Store primary body generator in the subscription.
This majorly messes up extens state providers, but it's
also a good check-in point before expanding on primary
body generator callbacks. Once the primary generator
callbacks are put in place, I can fix up exten state
completely.
Modified:
team/mmichelson/pubsub_bodies/include/asterisk/res_pjsip_pubsub.h
team/mmichelson/pubsub_bodies/res/res_pjsip_mwi.c
team/mmichelson/pubsub_bodies/res/res_pjsip_pidf.c
team/mmichelson/pubsub_bodies/res/res_pjsip_pubsub.c
Modified: team/mmichelson/pubsub_bodies/include/asterisk/res_pjsip_pubsub.h
URL: http://svnview.digium.com/svn/asterisk/team/mmichelson/pubsub_bodies/include/asterisk/res_pjsip_pubsub.h?view=diff&rev=405922&r1=405921&r2=405922
==============================================================================
--- team/mmichelson/pubsub_bodies/include/asterisk/res_pjsip_pubsub.h (original)
+++ team/mmichelson/pubsub_bodies/include/asterisk/res_pjsip_pubsub.h Mon Jan 20 14:18:44 2014
@@ -615,7 +615,7 @@
* \param body The pre-allocated body.
* \param data The data associated with body generation.
*/
-int ast_sip_pubsub_generate_body_content(char *content_type, char *content_subtype,
+int ast_sip_pubsub_generate_body_content(struct ast_sip_subscription *sub,
void *body, void *data);
/*!
Modified: team/mmichelson/pubsub_bodies/res/res_pjsip_mwi.c
URL: http://svnview.digium.com/svn/asterisk/team/mmichelson/pubsub_bodies/res/res_pjsip_mwi.c?view=diff&rev=405922&r1=405921&r2=405922
==============================================================================
--- team/mmichelson/pubsub_bodies/res/res_pjsip_mwi.c (original)
+++ team/mmichelson/pubsub_bodies/res/res_pjsip_mwi.c Mon Jan 20 14:18:44 2014
@@ -410,7 +410,7 @@
reason_str_ptr = &reason_str;
}
- if (ast_sip_pubsub_generate_body_content(MWI_TYPE, MWI_SUBTYPE, &body, &counter)) {
+ if (ast_sip_pubsub_generate_body_content(sub->sip_sub, &body, &counter)) {
ast_log(LOG_WARNING, "Unable to generate SIP MWI NOTIFY body.\n");
return;
}
Modified: team/mmichelson/pubsub_bodies/res/res_pjsip_pidf.c
URL: http://svnview.digium.com/svn/asterisk/team/mmichelson/pubsub_bodies/res/res_pjsip_pidf.c?view=diff&rev=405922&r1=405921&r2=405922
==============================================================================
--- team/mmichelson/pubsub_bodies/res/res_pjsip_pidf.c (original)
+++ team/mmichelson/pubsub_bodies/res/res_pjsip_pidf.c Mon Jan 20 14:18:44 2014
@@ -293,7 +293,8 @@
goto end;
}
- if (ast_sip_pubsub_generate_body_content("application", "pidf+xml", pres, &gen_data)) {
+ /* XXX Get this NULL fixed ASAP */
+ if (ast_sip_pubsub_generate_body_content(NULL, pres, &gen_data)) {
ast_log(LOG_WARNING, "Failed to generate PIDF NOTIFY body\n");
res = -1;
goto end;
@@ -388,7 +389,8 @@
goto end;
}
- if (ast_sip_pubsub_generate_body_content("application", "xpidf+xml", pres, &gen_data)) {
+ /* XXX Get this NULL fixed ASAP */
+ if (ast_sip_pubsub_generate_body_content(NULL, pres, &gen_data)) {
ast_log(LOG_WARNING, "Unable to generate XPIDF NOTIFY body\n");
res = -1;
goto end;
Modified: team/mmichelson/pubsub_bodies/res/res_pjsip_pubsub.c
URL: http://svnview.digium.com/svn/asterisk/team/mmichelson/pubsub_bodies/res/res_pjsip_pubsub.c?view=diff&rev=405922&r1=405921&r2=405922
==============================================================================
--- team/mmichelson/pubsub_bodies/res/res_pjsip_pubsub.c (original)
+++ team/mmichelson/pubsub_bodies/res/res_pjsip_pubsub.c Mon Jan 20 14:18:44 2014
@@ -81,6 +81,8 @@
.on_rx_request = pubsub_on_rx_request,
};
+#define MOD_DATA_BODY_GENERATOR "sub_body_generator"
+
static const pj_str_t str_event_name = { "Event", 5 };
/*! \brief Scheduler used for automatically expiring publications */
@@ -195,6 +197,8 @@
pjsip_evsub *evsub;
/*! The underlying PJSIP dialog */
pjsip_dialog *dlg;
+ /*! Primary body generaator for NOTIFYs */
+ struct ast_sip_pubsub_body_generator *body_generator;
/*! Next item in the list */
AST_LIST_ENTRY(ast_sip_subscription) next;
};
@@ -404,6 +408,8 @@
ao2_ref(sub, -1);
return NULL;
}
+ sub->body_generator = ast_sip_mod_data_get(rdata->endpt_info.mod_data,
+ pubsub_module.id, MOD_DATA_BODY_GENERATOR);
sub->role = role;
if (role == AST_SIP_NOTIFIER) {
dlg = ast_sip_create_dialog_uas(endpoint, rdata);
@@ -733,47 +739,23 @@
return find_body_generator_type_subtype(type, subtype);
}
-static struct ast_sip_subscription_handler *find_sub_handler(const char *event, char accept[AST_SIP_MAX_ACCEPT][64], size_t num_accept)
-{
- struct ast_sip_subscription_handler *handler;
+static struct ast_sip_pubsub_body_generator *find_body_generator(char accept[AST_SIP_MAX_ACCEPT][64],
+ size_t num_accept)
+{
int i;
-
- handler = find_sub_handler_for_event_name(event);
- if (!handler) {
- ast_log(LOG_WARNING, "No subscription handler found for event %s\n", event);
- return NULL;
- }
-
- /* If a SUBSCRIBE contains no Accept headers, then we must assume that
- * the default accept type for the event package is to be used.
- */
- if (num_accept == 0) {
- struct ast_sip_pubsub_body_generator *generator;
-
- generator = find_body_generator_accept(handler->default_accept);
- if (generator) {
- ast_debug(3, "Body generator %p found for accept type %s\n", generator, handler->default_accept);
- return handler;
- } else {
- ast_log(LOG_WARNING, "No body generator found for default accept type %s\n", handler->default_accept);
- return NULL;
- }
- }
+ struct ast_sip_pubsub_body_generator *generator = NULL;
for (i = 0; i < num_accept; ++i) {
- struct ast_sip_pubsub_body_generator *generator;
-
generator = find_body_generator_accept(accept[i]);
if (generator) {
ast_debug(3, "Body generator %p found for accept type %s\n", generator, accept[i]);
- return handler;
+ break;
} else {
ast_debug(3, "No body generator found for accept type %s\n", accept[i]);
}
}
- ast_log(LOG_WARNING, "No body generator found for any Accept headers\n");
- return NULL;
+ return generator;
}
static pj_bool_t pubsub_on_rx_subscribe_request(pjsip_rx_data *rdata)
@@ -787,6 +769,7 @@
RAII_VAR(struct ast_sip_endpoint *, endpoint, NULL, ao2_cleanup);
struct ast_sip_subscription *sub;
size_t num_accept_headers;
+ struct ast_sip_pubsub_body_generator *generator;
endpoint = ast_pjsip_rdata_get_endpoint(rdata);
ast_assert(endpoint != NULL);
@@ -814,25 +797,38 @@
}
ast_copy_pj_str(event, &event_header->event_type, sizeof(event));
- accept_header = pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_ACCEPT, rdata->msg_info.msg->hdr.next);
- if (accept_header) {
- int i;
-
- for (i = 0; i < accept_header->count; ++i) {
- ast_copy_pj_str(accept[i], &accept_header->values[i], sizeof(accept[i]));
- }
- num_accept_headers = accept_header->count;
- } else {
- num_accept_headers = 0;
- }
-
- handler = find_sub_handler(event, accept, num_accept_headers);
+ handler = find_sub_handler_for_event_name(event);
if (!handler) {
ast_log(LOG_WARNING, "No registered subscribe handler for event %s\n", event);
pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata, 489, NULL, NULL, NULL);
return PJ_TRUE;
}
- /* XXX Add code here to check for presence of body generators */
+
+ accept_header = pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_ACCEPT, rdata->msg_info.msg->hdr.next);
+ if (accept_header) {
+ int i;
+
+ for (i = 0; i < accept_header->count; ++i) {
+ ast_copy_pj_str(accept[i], &accept_header->values[i], sizeof(accept[i]));
+ }
+ num_accept_headers = accept_header->count;
+ } else {
+ /* If a SUBSCRIBE contains no Accept headers, then we must assume that
+ * the default accept type for the event package is to be used.
+ */
+ ast_copy_string(accept[0], handler->default_accept, sizeof(accept[0]));
+ num_accept_headers = 1;
+ }
+
+ generator = find_body_generator(accept, num_accept_headers);
+ if (!generator) {
+ pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata, 489, NULL, NULL, NULL);
+ return PJ_TRUE;
+ }
+
+ ast_sip_mod_data_set(rdata->tp_info.pool, rdata->endpt_info.mod_data,
+ pubsub_module.id, MOD_DATA_BODY_GENERATOR, generator);
+
sub = handler->new_subscribe(endpoint, rdata);
if (!sub) {
pjsip_transaction *trans = pjsip_rdata_get_tsx(rdata);
@@ -1148,31 +1144,40 @@
struct ast_sip_pubsub_body_generator *iter;
SCOPED_LOCK(lock, &body_generators, AST_RWLIST_WRLOCK, AST_RWLIST_UNLOCK);
- AST_LIST_TRAVERSE_SAFE_BEGIN(&body_generators, iter, list) {
+ AST_RWLIST_TRAVERSE_SAFE_BEGIN(&body_generators, iter, list) {
if (iter == generator) {
AST_LIST_REMOVE_CURRENT(list);
break;
}
}
- AST_LIST_TRAVERSE_SAFE_END;
-}
-
-int ast_sip_pubsub_generate_body_content(char *content_type, char *content_subtype,
+ AST_RWLIST_TRAVERSE_SAFE_END;
+}
+
+int ast_sip_pubsub_generate_body_content(struct ast_sip_subscription *sub,
void *body, void *data)
{
struct ast_sip_pubsub_body_generator *iter;
- int res = -1;
-
- SCOPED_LOCK(lock, &body_generators, AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK);
- AST_LIST_TRAVERSE(&body_generators, iter, list) {
- if (!strcmp(content_type, iter->type) &&
- !strcmp(content_subtype, iter->subtype)) {
+ int res;
+
+ res = sub->body_generator->generate_body_content(body, data);
+ if (res) {
+ return res;
+ }
+
+ AST_RWLIST_RDLOCK(&body_generators);
+ AST_RWLIST_TRAVERSE(&body_generators, iter, list) {
+ if (iter->generator_type != AST_SIP_PUBSUB_BODY_GENERATOR_SUPPLEMENTARY) {
+ continue;
+ }
+ if (!strcmp(sub->body_generator->type, iter->type) &&
+ !strcmp(sub->body_generator->subtype, iter->subtype)) {
res = iter->generate_body_content(body, data);
if (res) {
break;
}
}
}
+ AST_RWLIST_UNLOCK(&body_generators);
return res;
}
More information about the svn-commits
mailing list