Skip to content

Commit

Permalink
res_pjsip_pidf_eyebeam_body_supplement: Correct status presentation
Browse files Browse the repository at this point in the history
This change fixes PIDF content generation when the underlying device
state is considered in use. Previously it was incorrectly marked
as closed meaning they were offline/unavailable. The code now
correctly marks them as open.

Additionally:

  * Generate an XML element for our activity instead of a using a text
    node.

  * Consider every extension state other than "unavailable" to be 'open'
    status.

  * Update the XML namespaces and structure to reflect those
    documented in RFC 4480

  * Use 'on-the-phone' (defined in RFC 4880) instead of 'busy' as the
    "in use" activity. This change results in eyeBeam using the
    appropriate icon for the watched user.

This was tested on eyeBeam 1.5.20.2 build 59030 on Windows.

ASTERISK-26659 #close
Reported by: Abraham Liebsch
patches:
  ASTERISK-26659.diff submitted by snuffy (license 5024)

Change-Id: I6e5ad450f91106029fb30517b8c0ea0c2058c810
  • Loading branch information
seanbright committed Jul 26, 2017
1 parent 1bec535 commit 504c0cb
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 26 deletions.
16 changes: 8 additions & 8 deletions res/res_pjsip/presence_xml.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ void ast_sip_presence_exten_state_to_str(int state, char **statestring, char **p
case AST_EXTENSION_RINGING:
*statestring = "early";
*local_state = NOTIFY_INUSE;
*pidfstate = "busy";
*pidfstate = "on-the-phone";
*pidfnote = "Ringing";
break;
case (AST_EXTENSION_INUSE | AST_EXTENSION_RINGING):
Expand All @@ -99,31 +99,31 @@ void ast_sip_presence_exten_state_to_str(int state, char **statestring, char **p
*statestring = "confirmed";
}
*local_state = NOTIFY_INUSE;
*pidfstate = "busy";
*pidfstate = "on-the-phone";
*pidfnote = "Ringing";
break;
case AST_EXTENSION_INUSE:
*statestring = "confirmed";
*local_state = NOTIFY_INUSE;
*pidfstate = "busy";
*pidfstate = "on-the-phone";
*pidfnote = "On the phone";
break;
case AST_EXTENSION_BUSY:
*statestring = "confirmed";
*local_state = NOTIFY_CLOSED;
*pidfstate = "busy";
*local_state = NOTIFY_INUSE;
*pidfstate = "on-the-phone";
*pidfnote = "On the phone";
break;
case AST_EXTENSION_UNAVAILABLE:
*statestring = "terminated";
*local_state = NOTIFY_CLOSED;
*pidfstate = "away";
*pidfstate = "--";
*pidfnote = "Unavailable";
break;
case AST_EXTENSION_ONHOLD:
*statestring = "confirmed";
*local_state = NOTIFY_CLOSED;
*pidfstate = "busy";
*local_state = NOTIFY_INUSE;
*pidfstate = "on-the-phone";
*pidfnote = "On hold";
break;
case AST_EXTENSION_NOT_INUSE:
Expand Down
2 changes: 1 addition & 1 deletion res/res_pjsip_pidf_body_generator.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ static int pidf_generate_body_content(void *body, void *data)
pjpidf_tuple_set_contact(state_data->pool, tuple, pj_cstr(&contact, sanitized));
pjpidf_tuple_set_contact_prio(state_data->pool, tuple, pj_cstr(&priority, "1"));
pjpidf_status_set_basic_open(pjpidf_tuple_get_status(tuple),
local_state == NOTIFY_OPEN);
local_state == NOTIFY_OPEN || local_state == NOTIFY_INUSE);

return 0;
}
Expand Down
32 changes: 15 additions & 17 deletions res/res_pjsip_pidf_eyebeam_body_supplement.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,30 +46,28 @@
*/
static void add_eyebeam(pj_pool_t *pool, pj_xml_node *node, const char *pidfstate)
{
static const char *XMLNS_PP = "xmlns:pp";
static const char *XMLNS_PERSON = "urn:ietf:params:xml:ns:pidf:person";
static const char *XMLNS_DM_PREFIX = "xmlns:dm";
static const char *XMLNS_DM = "urn:ietf:params:xml:ns:pidf:data-model";

static const char *XMLNS_ES = "xmlns:es";
static const char *XMLNS_RPID_STATUS = "urn:ietf:params:xml:ns:pidf:rpid:status:rpid-status";
static const char *XMLNS_RPID_PREFIX = "xmlns:rpid";
static const char *XMLNS_RPID = "urn:ietf:params:xml:ns:pidf:rpid";

static const char *XMLNS_EP = "xmlns:ep";
static const char *XMLNS_RPID_PERSON = "urn:ietf:params:xml:ns:pidf:rpid:rpid-person";

pj_xml_node *person = ast_sip_presence_xml_create_node(pool, node, "pp:person");
pj_xml_node *status = ast_sip_presence_xml_create_node(pool, person, "status");
pj_xml_node *person = ast_sip_presence_xml_create_node(pool, node, "dm:person");

if (pidfstate[0] != '-') {
pj_xml_node *activities = ast_sip_presence_xml_create_node(pool, status, "ep:activities");
size_t str_size = sizeof("ep:") + strlen(pidfstate);
pj_xml_node *activities = ast_sip_presence_xml_create_node(pool, person, "rpid:activities");
size_t str_size = sizeof("rpid:") + strlen(pidfstate);
char *act_str = ast_alloca(str_size);

/* Safe */
strcpy(act_str, "rpid:");
strcat(act_str, pidfstate);

activities->content.ptr = pj_pool_alloc(pool, str_size);
activities->content.slen = pj_ansi_snprintf(activities->content.ptr, str_size,
"ep:%s", pidfstate);
ast_sip_presence_xml_create_node(pool, activities, act_str);
}

ast_sip_presence_xml_create_attr(pool, node, XMLNS_PP, XMLNS_PERSON);
ast_sip_presence_xml_create_attr(pool, node, XMLNS_ES, XMLNS_RPID_STATUS);
ast_sip_presence_xml_create_attr(pool, node, XMLNS_EP, XMLNS_RPID_PERSON);
ast_sip_presence_xml_create_attr(pool, node, XMLNS_DM_PREFIX, XMLNS_DM);
ast_sip_presence_xml_create_attr(pool, node, XMLNS_RPID_PREFIX, XMLNS_RPID);
}

static int pidf_supplement_body(void *body, void *data)
Expand Down

0 comments on commit 504c0cb

Please sign in to comment.