summaryrefslogtreecommitdiff
path: root/res/res_pjsip_mwi.c
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2014-08-07 19:26:32 +0000
committerMark Michelson <mmichelson@digium.com>2014-08-07 19:26:32 +0000
commit99d0bccd350cd42941c195667a5733ca6a4368a4 (patch)
treedf35d3d85a37e598bbfd8c7604ab65248cca19df /res/res_pjsip_mwi.c
parentea7d4ab09e05a2ebffc8ec81acb3c242d78a3732 (diff)
Add support for RFC 4662 resource list subscriptions.
This commit adds the ability for a user to configure a resource list in pjsip.conf. Subscribing to this list simultaneously subscribes the subscriber to all resources listed. This has the potential to reduce the amount of SIP traffic when loads of subscribers on a system attempt to subscribe to each others' states. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@420384 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res/res_pjsip_mwi.c')
-rw-r--r--res/res_pjsip_mwi.c50
1 files changed, 23 insertions, 27 deletions
diff --git a/res/res_pjsip_mwi.c b/res/res_pjsip_mwi.c
index 55ef300e8..37e1da0bb 100644
--- a/res/res_pjsip_mwi.c
+++ b/res/res_pjsip_mwi.c
@@ -48,17 +48,20 @@ AO2_GLOBAL_OBJ_STATIC(unsolicited_mwi);
#define MWI_TYPE "application"
#define MWI_SUBTYPE "simple-message-summary"
+#define MWI_DATASTORE "MWI datastore"
+
static void mwi_subscription_shutdown(struct ast_sip_subscription *sub);
static void mwi_to_ami(struct ast_sip_subscription *sub, struct ast_str **buf);
static int mwi_new_subscribe(struct ast_sip_endpoint *endpoint,
const char *resource);
-static int mwi_notify_required(struct ast_sip_subscription *sip_sub,
- enum ast_sip_subscription_notify_reason reason);
+static int mwi_subscription_established(struct ast_sip_subscription *sub);
+static void *mwi_get_notify_data(struct ast_sip_subscription *sub);
static struct ast_sip_notifier mwi_notifier = {
.default_accept = MWI_TYPE"/"MWI_SUBTYPE,
.new_subscribe = mwi_new_subscribe,
- .notify_required = mwi_notify_required,
+ .subscription_established = mwi_subscription_established,
+ .get_notify_data = mwi_get_notify_data,
};
static struct ast_sip_subscription_handler mwi_handler = {
@@ -457,7 +460,7 @@ static void mwi_subscription_shutdown(struct ast_sip_subscription *sub)
{
struct mwi_subscription *mwi_sub;
RAII_VAR(struct ast_datastore *, mwi_datastore,
- ast_sip_subscription_get_datastore(sub, "MWI datastore"), ao2_cleanup);
+ ast_sip_subscription_get_datastore(sub, MWI_DATASTORE), ao2_cleanup);
if (!mwi_datastore) {
return;
@@ -473,7 +476,7 @@ static int add_mwi_datastore(struct mwi_subscription *sub)
{
RAII_VAR(struct ast_datastore *, mwi_datastore, NULL, ao2_cleanup);
- mwi_datastore = ast_sip_subscription_alloc_datastore(&mwi_ds_info, "MWI datastore");
+ mwi_datastore = ast_sip_subscription_alloc_datastore(&mwi_ds_info, MWI_DATASTORE);
if (!mwi_datastore) {
return -1;
}
@@ -676,7 +679,7 @@ static int mwi_new_subscribe(struct ast_sip_endpoint *endpoint,
return 200;
}
-static int mwi_initial_subscription(struct ast_sip_subscription *sip_sub)
+static int mwi_subscription_established(struct ast_sip_subscription *sip_sub)
{
const char *resource = ast_sip_subscription_get_resource_name(sip_sub);
struct mwi_subscription *sub;
@@ -694,39 +697,32 @@ static int mwi_initial_subscription(struct ast_sip_subscription *sip_sub)
return -1;
}
- send_mwi_notify(sub);
-
ao2_cleanup(sub);
ao2_cleanup(endpoint);
return 0;
}
-static int mwi_notify_required(struct ast_sip_subscription *sip_sub,
- enum ast_sip_subscription_notify_reason reason)
+static void *mwi_get_notify_data(struct ast_sip_subscription *sub)
{
+ struct ast_sip_message_accumulator *counter;
struct mwi_subscription *mwi_sub;
struct ast_datastore *mwi_datastore;
- switch (reason) {
- case AST_SIP_SUBSCRIPTION_NOTIFY_REASON_STARTED:
- return mwi_initial_subscription(sip_sub);
- case AST_SIP_SUBSCRIPTION_NOTIFY_REASON_RENEWED:
- case AST_SIP_SUBSCRIPTION_NOTIFY_REASON_TERMINATED:
- case AST_SIP_SUBSCRIPTION_NOTIFY_REASON_OTHER:
- mwi_datastore = ast_sip_subscription_get_datastore(sip_sub, "MWI datastore");
-
- if (!mwi_datastore) {
- return -1;
- }
-
- mwi_sub = mwi_datastore->data;
+ mwi_datastore = ast_sip_subscription_get_datastore(sub, MWI_DATASTORE);
+ if (!mwi_datastore) {
+ return NULL;
+ }
+ mwi_sub = mwi_datastore->data;
- send_mwi_notify(mwi_sub);
+ counter = ao2_alloc(sizeof(*counter), NULL);
+ if (!counter) {
ao2_cleanup(mwi_datastore);
- break;
+ return NULL;
}
- return 0;
+ ao2_callback(mwi_sub->stasis_subs, OBJ_NODATA, get_message_count, counter);
+ ao2_cleanup(mwi_datastore);
+ return counter;
}
static void mwi_subscription_mailboxes_str(struct ao2_container *stasis_subs,
@@ -753,7 +749,7 @@ static void mwi_to_ami(struct ast_sip_subscription *sub,
{
struct mwi_subscription *mwi_sub;
RAII_VAR(struct ast_datastore *, mwi_datastore,
- ast_sip_subscription_get_datastore(sub, "MWI datastore"), ao2_cleanup);
+ ast_sip_subscription_get_datastore(sub, MWI_DATASTORE), ao2_cleanup);
if (!mwi_datastore) {
return;