summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsua/pjsua_pres.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjsip/src/pjsua/pjsua_pres.c')
-rw-r--r--pjsip/src/pjsua/pjsua_pres.c81
1 files changed, 52 insertions, 29 deletions
diff --git a/pjsip/src/pjsua/pjsua_pres.c b/pjsip/src/pjsua/pjsua_pres.c
index cba02b5c..b203a2ca 100644
--- a/pjsip/src/pjsua/pjsua_pres.c
+++ b/pjsip/src/pjsua/pjsua_pres.c
@@ -79,6 +79,7 @@ static void pres_evsub_on_srv_state( pjsip_evsub *sub, pjsip_event *event)
*/
static pj_bool_t pres_on_rx_request(pjsip_rx_data *rdata)
{
+ int acc_index;
pjsip_method *req_method = &rdata->msg_info.msg->line.req.method;
pjsua_srv_pres *uapres;
pjsip_evsub *sub;
@@ -93,9 +94,13 @@ static pj_bool_t pres_on_rx_request(pjsip_rx_data *rdata)
/* Incoming SUBSCRIBE: */
+ /* Find which account for the incoming request. */
+ acc_index = pjsua_find_account_for_incoming(rdata);
+
/* Create UAS dialog: */
status = pjsip_dlg_create_uas( pjsip_ua_instance(), rdata,
- &pjsua.contact_uri, &dlg);
+ &pjsua.acc[acc_index].contact_uri,
+ &dlg);
if (status != PJ_SUCCESS) {
pjsua_perror(THIS_FILE,
"Unable to create UAS dialog for subscription",
@@ -130,7 +135,7 @@ static pj_bool_t pres_on_rx_request(pjsip_rx_data *rdata)
pjsip_evsub_set_mod_data(sub, pjsua.mod.id, uapres);
/* Add server subscription to the list: */
- pj_list_push_back(&pjsua.pres_srv_list, uapres);
+ pj_list_push_back(&pjsua.acc[acc_index].pres_srv_list, uapres);
/* Create and send 200 (OK) to the SUBSCRIBE request: */
@@ -146,7 +151,7 @@ static pj_bool_t pres_on_rx_request(pjsip_rx_data *rdata)
/* Set our online status: */
pj_memset(&pres_status, 0, sizeof(pres_status));
pres_status.info_cnt = 1;
- pres_status.info[0].basic_open = pjsua.online_status;
+ pres_status.info[0].basic_open = pjsua.acc[acc_index].online_status;
//Both pjsua.local_uri and pjsua.contact_uri are enclosed in "<" and ">"
//causing XML parsing to fail.
//pres_status.info[0].contact = pjsua.local_uri;
@@ -174,20 +179,20 @@ static pj_bool_t pres_on_rx_request(pjsip_rx_data *rdata)
/* Refresh subscription (e.g. when our online status has changed) */
-static void refresh_server_subscription()
+static void refresh_server_subscription(int acc_index)
{
pjsua_srv_pres *uapres;
- uapres = pjsua.pres_srv_list.next;
+ uapres = pjsua.acc[acc_index].pres_srv_list.next;
- while (uapres != &pjsua.pres_srv_list) {
+ while (uapres != &pjsua.acc[acc_index].pres_srv_list) {
pjsip_pres_status pres_status;
pjsip_tx_data *tdata;
pjsip_pres_get_status(uapres->sub, &pres_status);
- if (pres_status.info[0].basic_open != pjsua.online_status) {
- pres_status.info[0].basic_open = pjsua.online_status;
+ if (pres_status.info[0].basic_open != pjsua.acc[acc_index].online_status) {
+ pres_status.info[0].basic_open = pjsua.acc[acc_index].online_status;
pjsip_pres_set_status(uapres->sub, &pres_status);
if (pjsua.quit_flag) {
@@ -298,13 +303,16 @@ static pjsip_evsub_user pres_callback =
/* It does what it says.. */
static void subscribe_buddy_presence(unsigned index)
{
+ int acc_index;
pjsip_dialog *dlg;
pjsip_tx_data *tdata;
pj_status_t status;
+ acc_index = pjsua.buddies[index].acc_index;
+
status = pjsip_dlg_create_uac( pjsip_ua_instance(),
- &pjsua.local_uri,
- &pjsua.contact_uri,
+ &pjsua.acc[acc_index].local_uri,
+ &pjsua.acc[acc_index].contact_uri,
&pjsua.buddies[index].uri,
NULL, &dlg);
if (status != PJ_SUCCESS) {
@@ -325,7 +333,7 @@ static void subscribe_buddy_presence(unsigned index)
pjsip_evsub_set_mod_data(pjsua.buddies[index].sub, pjsua.mod.id,
&pjsua.buddies[index]);
- status = pjsip_pres_initiate(pjsua.buddies[index].sub, 60, &tdata);
+ status = pjsip_pres_initiate(pjsua.buddies[index].sub, -1, &tdata);
if (status != PJ_SUCCESS) {
pjsua.buddies[index].sub = NULL;
pjsua_perror(THIS_FILE, "Unable to create initial SUBSCRIBE",
@@ -381,7 +389,7 @@ static void unsubscribe_buddy_presence(unsigned index)
/* It does what it says.. */
static void refresh_client_subscription(void)
{
- unsigned i;
+ int i;
for (i=0; i<pjsua.buddy_cnt; ++i) {
@@ -415,10 +423,10 @@ pj_status_t pjsua_pres_init()
/*
* Refresh presence
*/
-void pjsua_pres_refresh(void)
+void pjsua_pres_refresh(int acc_index)
{
refresh_client_subscription();
- refresh_server_subscription();
+ refresh_server_subscription(acc_index);
}
@@ -427,13 +435,20 @@ void pjsua_pres_refresh(void)
*/
void pjsua_pres_shutdown(void)
{
- unsigned i;
+ int acc_index;
+ int i;
+
+ for (acc_index=0; acc_index<pjsua.acc_cnt; ++acc_index) {
+ pjsua.acc[acc_index].online_status = 0;
+ }
- pjsua.online_status = 0;
for (i=0; i<pjsua.buddy_cnt; ++i) {
pjsua.buddies[i].monitor = 0;
}
- pjsua_pres_refresh();
+
+ for (acc_index=0; acc_index<pjsua.acc_cnt; ++acc_index) {
+ pjsua_pres_refresh(acc_index);
+ }
}
/*
@@ -441,22 +456,30 @@ void pjsua_pres_shutdown(void)
*/
void pjsua_pres_dump(void)
{
- unsigned i;
+ int acc_index;
+ int i;
PJ_LOG(3,(THIS_FILE, "Dumping pjsua server subscriptions:"));
- if (pj_list_empty(&pjsua.pres_srv_list)) {
- PJ_LOG(3,(THIS_FILE, " - none - "));
- } else {
- struct pjsua_srv_pres *uapres;
+ for (acc_index=0; acc_index < pjsua.acc_cnt; ++acc_index) {
- uapres = pjsua.pres_srv_list.next;
- while (uapres != &pjsua.pres_srv_list) {
-
- PJ_LOG(3,(THIS_FILE, " %10s %s",
- pjsip_evsub_get_state_name(uapres->sub),
- uapres->remote));
+ PJ_LOG(3,(THIS_FILE, " %.*s",
+ (int)pjsua.acc[acc_index].local_uri.slen,
+ pjsua.acc[acc_index].local_uri.ptr));
+
+ if (pj_list_empty(&pjsua.acc[acc_index].pres_srv_list)) {
+ PJ_LOG(3,(THIS_FILE, " - none - "));
+ } else {
+ struct pjsua_srv_pres *uapres;
+
+ uapres = pjsua.acc[acc_index].pres_srv_list.next;
+ while (uapres != &pjsua.acc[acc_index].pres_srv_list) {
+
+ PJ_LOG(3,(THIS_FILE, " %10s %s",
+ pjsip_evsub_get_state_name(uapres->sub),
+ uapres->remote));
- uapres = uapres->next;
+ uapres = uapres->next;
+ }
}
}