summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsua-lib/pjsua_pres.c
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-10-31 10:20:31 +0000
committerBenny Prijono <bennylp@teluu.com>2007-10-31 10:20:31 +0000
commit42ee53bda2fcf662954c7a62803a8c1e1c35e902 (patch)
tree24a51c8dc21618a7ff85cd2177f3c549712d2b29 /pjsip/src/pjsua-lib/pjsua_pres.c
parenta5465795aef807c0afbc86b600a2fcf2d8df4b37 (diff)
Ticket #405: Subscribe to buddy presence upon receiving incoming subscription from the buddy
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1534 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsua-lib/pjsua_pres.c')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_pres.c51
1 files changed, 48 insertions, 3 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_pres.c b/pjsip/src/pjsua-lib/pjsua_pres.c
index b544af69..0d750e07 100644
--- a/pjsip/src/pjsua-lib/pjsua_pres.c
+++ b/pjsip/src/pjsua-lib/pjsua_pres.c
@@ -22,9 +22,42 @@
#define THIS_FILE "pjsua_pres.c"
-#ifndef PJSUA_PRES_TIMER
-# define PJSUA_PRES_TIMER 120
-#endif
+
+static void subscribe_buddy_presence(unsigned index);
+
+
+/*
+ * Find buddy.
+ */
+static pjsua_buddy_id pjsua_find_buddy(const pjsip_uri *uri)
+{
+ const pjsip_sip_uri *sip_uri;
+ unsigned i;
+
+ uri = pjsip_uri_get_uri((pjsip_uri*)uri);
+
+ if (!PJSIP_URI_SCHEME_IS_SIP(uri) && !PJSIP_URI_SCHEME_IS_SIPS(uri))
+ return PJSUA_INVALID_ID;
+
+ sip_uri = (const pjsip_sip_uri*) uri;
+
+ for (i=0; i<PJ_ARRAY_SIZE(pjsua_var.buddy); ++i) {
+ const pjsua_buddy *b = &pjsua_var.buddy[i];
+
+ if (!pjsua_buddy_is_valid(i))
+ continue;
+
+ if (pj_stricmp(&sip_uri->user, &b->name)==0 &&
+ pj_stricmp(&sip_uri->host, &b->host)==0 &&
+ (sip_uri->port==(int)b->port || (sip_uri->port==0 && b->port==5060)))
+ {
+ /* Match */
+ return i;
+ }
+ }
+
+ return PJSUA_INVALID_ID;
+}
/*
@@ -465,6 +498,7 @@ static pj_bool_t pres_on_rx_request(pjsip_rx_data *rdata)
pjsip_dialog *dlg;
pjsip_expires_hdr *expires_hdr;
pjsip_evsub_state ev_state;
+ pjsua_buddy_id buddy_id;
pj_status_t status;
if (pjsip_method_cmp(req_method, pjsip_get_subscribe_method()) != 0)
@@ -596,6 +630,17 @@ static pj_bool_t pres_on_rx_request(pjsip_rx_data *rdata)
}
+ /* Subscribe to buddy's presence if we're not subscribed */
+ buddy_id = pjsua_find_buddy(dlg->remote.info->uri);
+ if (buddy_id != PJSUA_INVALID_ID) {
+ pjsua_buddy *b = &pjsua_var.buddy[buddy_id];
+ if (b->monitor && b->sub == NULL) {
+ PJ_LOG(4,(THIS_FILE, "Received SUBSCRIBE from buddy %d, "
+ "activating outgoing subscription", buddy_id));
+ subscribe_buddy_presence(buddy_id);
+ }
+ }
+
/* Done: */
PJSUA_UNLOCK();