summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsua-lib/pjsua_pres.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjsip/src/pjsua-lib/pjsua_pres.c')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_pres.c44
1 files changed, 29 insertions, 15 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_pres.c b/pjsip/src/pjsua-lib/pjsua_pres.c
index 88ea317f..c78e8b5c 100644
--- a/pjsip/src/pjsua-lib/pjsua_pres.c
+++ b/pjsip/src/pjsua-lib/pjsua_pres.c
@@ -1320,13 +1320,17 @@ pj_status_t pjsua_pres_init_acc(int acc_id)
/* Unpublish presence publication */
-void pjsua_pres_unpublish(pjsua_acc *acc)
+void pjsua_pres_unpublish(pjsua_acc *acc, unsigned flags)
{
if (acc->publish_sess) {
pjsua_acc_config *acc_cfg = &acc->cfg;
acc->online_status = PJ_FALSE;
- send_publish(acc->index, PJ_FALSE);
+
+ if ((flags & PJSUA_DESTROY_NO_TX_MSG) == 0) {
+ send_publish(acc->index, PJ_FALSE);
+ }
+
/* By ticket #364, don't destroy the session yet (let the callback
destroy it)
if (acc->publish_sess) {
@@ -1339,7 +1343,7 @@ void pjsua_pres_unpublish(pjsua_acc *acc)
}
/* Terminate server subscription for the account */
-void pjsua_pres_delete_acc(int acc_id)
+void pjsua_pres_delete_acc(int acc_id, unsigned flags)
{
pjsua_acc *acc = &pjsua_var.acc[acc_id];
pjsua_srv_pres *uapres;
@@ -1361,11 +1365,15 @@ void pjsua_pres_delete_acc(int acc_id)
pres_status.info[0].basic_open = pjsua_var.acc[acc_id].online_status;
pjsip_pres_set_status(uapres->sub, &pres_status);
- if (pjsip_pres_notify(uapres->sub,
- PJSIP_EVSUB_STATE_TERMINATED, NULL,
- &reason, &tdata)==PJ_SUCCESS)
- {
- pjsip_pres_send_request(uapres->sub, tdata);
+ if ((flags & PJSUA_DESTROY_NO_TX_MSG) == 0) {
+ if (pjsip_pres_notify(uapres->sub,
+ PJSIP_EVSUB_STATE_TERMINATED, NULL,
+ &reason, &tdata)==PJ_SUCCESS)
+ {
+ pjsip_pres_send_request(uapres->sub, tdata);
+ }
+ } else {
+ pjsip_pres_terminate(uapres->sub, PJ_FALSE);
}
uapres = next;
@@ -1376,7 +1384,7 @@ void pjsua_pres_delete_acc(int acc_id)
pj_list_init(&acc->pres_srv_list);
/* Terminate presence publication, if any */
- pjsua_pres_unpublish(acc);
+ pjsua_pres_unpublish(acc, flags);
}
@@ -2251,6 +2259,10 @@ static void pres_timer_cb(pj_timer_heap_t *th,
for (i=0; i<PJ_ARRAY_SIZE(pjsua_var.acc); ++i) {
pjsua_acc *acc = &pjsua_var.acc[i];
+ /* Acc may not be ready yet, otherwise assertion will happen */
+ if (!pjsua_acc_is_valid(i))
+ continue;
+
/* Retry PUBLISH */
if (acc->cfg.publish_enabled && acc->publish_sess==NULL)
pjsua_pres_init_publish_acc(acc->index);
@@ -2324,7 +2336,7 @@ pj_status_t pjsua_pres_start(void)
/*
* Shutdown presence.
*/
-void pjsua_pres_shutdown(void)
+void pjsua_pres_shutdown(unsigned flags)
{
unsigned i;
@@ -2339,18 +2351,20 @@ void pjsua_pres_shutdown(void)
for (i=0; i<PJ_ARRAY_SIZE(pjsua_var.acc); ++i) {
if (!pjsua_var.acc[i].valid)
continue;
- pjsua_pres_delete_acc(i);
+ pjsua_pres_delete_acc(i, flags);
}
for (i=0; i<PJ_ARRAY_SIZE(pjsua_var.buddy); ++i) {
pjsua_var.buddy[i].monitor = 0;
}
- refresh_client_subscriptions();
+ if ((flags & PJSUA_DESTROY_NO_TX_MSG) == 0) {
+ refresh_client_subscriptions();
- for (i=0; i<PJ_ARRAY_SIZE(pjsua_var.acc); ++i) {
- if (pjsua_var.acc[i].valid)
- pjsua_pres_update_acc(i, PJ_FALSE);
+ for (i=0; i<PJ_ARRAY_SIZE(pjsua_var.acc); ++i) {
+ if (pjsua_var.acc[i].valid)
+ pjsua_pres_update_acc(i, PJ_FALSE);
+ }
}
pj_log_pop_indent();