summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsip-simple/presence.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjsip/src/pjsip-simple/presence.c')
-rw-r--r--pjsip/src/pjsip-simple/presence.c205
1 files changed, 16 insertions, 189 deletions
diff --git a/pjsip/src/pjsip-simple/presence.c b/pjsip/src/pjsip-simple/presence.c
index 9694c81c..5b919ebd 100644
--- a/pjsip/src/pjsip-simple/presence.c
+++ b/pjsip/src/pjsip-simple/presence.c
@@ -179,6 +179,7 @@ PJ_DEF(pjsip_module*) pjsip_pres_instance(void)
*/
PJ_DEF(pj_status_t) pjsip_pres_create_uac( pjsip_dialog *dlg,
const pjsip_evsub_user *user_cb,
+ unsigned options,
pjsip_evsub **p_evsub )
{
pj_status_t status;
@@ -190,7 +191,8 @@ PJ_DEF(pj_status_t) pjsip_pres_create_uac( pjsip_dialog *dlg,
pjsip_dlg_inc_lock(dlg);
/* Create event subscription */
- status = pjsip_evsub_create_uac( dlg, &pres_user, &STR_PRESENCE, 0, &sub);
+ status = pjsip_evsub_create_uac( dlg, &pres_user, &STR_PRESENCE,
+ options, &sub);
if (status != PJ_SUCCESS)
goto on_return;
@@ -412,140 +414,34 @@ PJ_DEF(pj_status_t) pjsip_pres_set_status( pjsip_evsub *sub,
/*
- * Create PIDF document based on the presence info.
+ * Create message body.
*/
-static pjpidf_pres* pres_create_pidf( pj_pool_t *pool,
- pjsip_pres *pres )
+static pj_status_t pres_create_msg_body( pjsip_pres *pres,
+ pjsip_tx_data *tdata)
{
- pjpidf_pres *pidf;
- unsigned i;
pj_str_t entity;
/* Get publisher URI */
- entity.ptr = pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE);
+ entity.ptr = pj_pool_alloc(tdata->pool, PJSIP_MAX_URL_SIZE);
entity.slen = pjsip_uri_print(PJSIP_URI_IN_REQ_URI,
pres->dlg->local.info->uri,
entity.ptr, PJSIP_MAX_URL_SIZE);
if (entity.slen < 1)
- return NULL;
-
- /* Create <presence>. */
- pidf = pjpidf_create(pool, &entity);
-
- /* Create <tuple> */
- for (i=0; i<pres->status.info_cnt; ++i) {
-
- pjpidf_tuple *pidf_tuple;
- pjpidf_status *pidf_status;
-
- /* Add tuple id. */
- pidf_tuple = pjpidf_pres_add_tuple(pool, pidf,
- &pres->status.info[i].id);
-
- /* Set <contact> */
- if (pres->status.info[i].contact.slen)
- pjpidf_tuple_set_contact(pool, pidf_tuple,
- &pres->status.info[i].contact);
-
-
- /* Set basic status */
- pidf_status = pjpidf_tuple_get_status(pidf_tuple);
- pjpidf_status_set_basic_open(pidf_status,
- pres->status.info[i].basic_open);
- }
-
- return pidf;
-}
-
-
-/*
- * Create XPIDF document based on the presence info.
- */
-static pjxpidf_pres* pres_create_xpidf( pj_pool_t *pool,
- pjsip_pres *pres )
-{
- /* Note: PJSIP implementation of XPIDF is not complete!
- */
- pjxpidf_pres *xpidf;
- pj_str_t publisher_uri;
-
- PJ_LOG(4,(THIS_FILE, "Warning: XPIDF format is not fully supported "
- "by PJSIP"));
-
- publisher_uri.ptr = pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE);
- publisher_uri.slen = pjsip_uri_print(PJSIP_URI_IN_REQ_URI,
- pres->dlg->local.info->uri,
- publisher_uri.ptr,
- PJSIP_MAX_URL_SIZE);
- if (publisher_uri.slen < 1)
- return NULL;
-
- /* Create XPIDF document. */
- xpidf = pjxpidf_create(pool, &publisher_uri);
-
- /* Set basic status. */
- if (pres->status.info_cnt > 0)
- pjxpidf_set_status( xpidf, pres->status.info[0].basic_open);
- else
- pjxpidf_set_status( xpidf, PJ_FALSE);
-
- return xpidf;
-}
-
-
-/*
- * Function to print XML message body.
- */
-static int pres_print_body(struct pjsip_msg_body *msg_body,
- char *buf, pj_size_t size)
-{
- return pj_xml_print(msg_body->data, buf, size, PJ_TRUE);
-}
-
+ return PJ_ENOMEM;
-/*
- * Function to clone XML document.
- */
-static void* xml_clone_data(pj_pool_t *pool, const void *data, unsigned len)
-{
- PJ_UNUSED_ARG(len);
- return pj_xml_clone( pool, data);
-}
-
-
-/*
- * Create message body.
- */
-static pj_status_t pres_create_msg_body( pjsip_pres *pres,
- pjsip_tx_data *tdata)
-{
- pjsip_msg_body *body;
-
- body = pj_pool_zalloc(tdata->pool, sizeof(pjsip_msg_body));
-
if (pres->content_type == CONTENT_TYPE_PIDF) {
- body->data = pres_create_pidf(tdata->pool, pres);
- body->content_type.type = pj_str("application");
- body->content_type.subtype = pj_str("pidf+xml");
+ return pjsip_pres_create_pidf(tdata->pool, &pres->status,
+ &entity, &tdata->msg->body);
} else if (pres->content_type == CONTENT_TYPE_XPIDF) {
- body->data = pres_create_xpidf(tdata->pool, pres);
- body->content_type.type = pj_str("application");
- body->content_type.subtype = pj_str("xpidf+xml");
+ return pjsip_pres_create_xpidf(tdata->pool, &pres->status,
+ &entity, &tdata->msg->body);
} else {
return PJSIP_SIMPLE_EBADCONTENT;
}
-
-
- body->print_body = &pres_print_body;
- body->clone_data = &xml_clone_data;
-
- tdata->msg->body = body;
-
- return PJ_SUCCESS;
}
@@ -722,77 +618,6 @@ static void pres_on_evsub_rx_refresh( pjsip_evsub *sub,
}
}
-/*
- * Parse PIDF to info.
- */
-static pj_status_t pres_parse_pidf( pjsip_pres *pres,
- pjsip_rx_data *rdata,
- pjsip_pres_status *pres_status)
-{
- pjpidf_pres *pidf;
- pjpidf_tuple *pidf_tuple;
-
- pidf = pjpidf_parse(rdata->tp_info.pool,
- rdata->msg_info.msg->body->data,
- rdata->msg_info.msg->body->len);
- if (pidf == NULL)
- return PJSIP_SIMPLE_EBADPIDF;
-
- pres_status->info_cnt = 0;
-
- pidf_tuple = pjpidf_pres_get_first_tuple(pidf);
- while (pidf_tuple) {
- pjpidf_status *pidf_status;
-
- pj_strdup(pres->dlg->pool,
- &pres_status->info[pres_status->info_cnt].id,
- pjpidf_tuple_get_id(pidf_tuple));
-
- pj_strdup(pres->dlg->pool,
- &pres_status->info[pres_status->info_cnt].contact,
- pjpidf_tuple_get_contact(pidf_tuple));
-
- pidf_status = pjpidf_tuple_get_status(pidf_tuple);
- if (pidf_status) {
- pres_status->info[pres_status->info_cnt].basic_open =
- pjpidf_status_is_basic_open(pidf_status);
- } else {
- pres_status->info[pres_status->info_cnt].basic_open = PJ_FALSE;
- }
-
- pidf_tuple = pjpidf_pres_get_next_tuple( pidf, pidf_tuple );
- pres_status->info_cnt++;
- }
-
- return PJ_SUCCESS;
-}
-
-/*
- * Parse XPIDF info.
- */
-static pj_status_t pres_parse_xpidf( pjsip_pres *pres,
- pjsip_rx_data *rdata,
- pjsip_pres_status *pres_status)
-{
- pjxpidf_pres *xpidf;
-
- xpidf = pjxpidf_parse(rdata->tp_info.pool,
- rdata->msg_info.msg->body->data,
- rdata->msg_info.msg->body->len);
- if (xpidf == NULL)
- return PJSIP_SIMPLE_EBADXPIDF;
-
- pres_status->info_cnt = 1;
-
- pj_strdup(pres->dlg->pool,
- &pres_status->info[0].contact,
- pjxpidf_get_uri(xpidf));
- pres_status->info[0].basic_open = pjxpidf_get_status(xpidf);
- pres_status->info[0].id.slen = 0;
-
- return PJ_SUCCESS;
-}
-
/*
* Process the content of incoming NOTIFY request and update temporary
@@ -836,13 +661,15 @@ static pj_status_t pres_process_rx_notify( pjsip_pres *pres,
if (pj_stricmp(&ctype_hdr->media.type, &STR_APPLICATION)==0 &&
pj_stricmp(&ctype_hdr->media.subtype, &STR_PIDF_XML)==0)
{
- status = pres_parse_pidf( pres, rdata, &pres->tmp_status);
+ status = pjsip_pres_parse_pidf( rdata, pres->dlg->pool,
+ &pres->tmp_status);
}
else
if (pj_stricmp(&ctype_hdr->media.type, &STR_APPLICATION)==0 &&
pj_stricmp(&ctype_hdr->media.subtype, &STR_XPIDF_XML)==0)
{
- status = pres_parse_xpidf( pres, rdata, &pres->tmp_status);
+ status = pjsip_pres_parse_xpidf( rdata, pres->dlg->pool,
+ &pres->tmp_status);
}
else
{