Failed to call user callback in SUBSCRIBE implemetation

CX
Chenhui Xu
Fri, May 27, 2016 5:30 AM

Hi,

Recently, I am implementing a SUBSCRIBE server to handing subscribe request
with PJSIP, the program flow as following:

pjsip_dlg_create_uas(pjsip_ua_instance(), rdata, &contact_uri, &dlg);

/* Create server subscription and register user callback functions */
pjsip_evsub_create_uas(dlg, &evsub_user, rdata, 0, &sub);

/* Add content-type header */
pj_list_init(&hdr_list);

/* This function would send back 200 OK */
pjsip_evsub_accept(sub, rdata, st_code, &hdr_list);

the user call back of evsub_user as following:

static pjsip_evsub_user evsub_user =
{
on_evsub_state,
on_tsx_state,
&on_rx_refresh,
NULL,
NULL,
&on_server_timeout,
};

But  the callback on_rx_refresh and on_server_timeout are never called.

I dive into the source code of pjsip and found the code as following:

pjsip/src/pjsip-simple/evsub.c
/*

  • Transaction event processing by UAS, after subscription is accepted.
    */
    static void on_tsx_state_uas( pjsip_evsub *sub, pjsip_transaction *tsx,
    pjsip_event *event)
    {

    if (pjsip_method_cmp(&tsx->method, &sub->method) == 0 ||
    pjsip_method_cmp(&tsx->method, &pjsip_subscribe_method) == 0)
    {
    ... ...

/* Only wants to handle the first event when the request is

  • received.
    */
    if (tsx->state != PJSIP_TSX_STATE_TRYING)
    return;

      on_rx_refresh and on_server_timeout are called here.
    

    }

}

From the code above the call back it only be called when the transaction in

PJSIP_TSX_STATE_TRYING state.
but the transaction would be switched into PJSIP_TSX_STATE_COMPLETE state,
when I call  pjsip_evsub_accept(sub, rdata, st_code, &hdr_list);

and from the PJSIP develop guide
http://www.pjsip.org/release/0.5.4/PJSIP-Dev-Guide.pdf (page 97)
on_evsub_state() would be called for state changed into ACCPETED when send
out 200OK, but actually it is not called in my program.

I am not sure what I am missing.

Chenhui Xu

Hi, Recently, I am implementing a SUBSCRIBE server to handing subscribe request with PJSIP, the program flow as following: pjsip_dlg_create_uas(pjsip_ua_instance(), rdata, &contact_uri, &dlg); /* Create server subscription and register user callback functions */ pjsip_evsub_create_uas(dlg, &evsub_user, rdata, 0, &sub); /* Add content-type header */ pj_list_init(&hdr_list); /* This function would send back 200 OK */ pjsip_evsub_accept(sub, rdata, st_code, &hdr_list); the user call back of evsub_user as following: static pjsip_evsub_user evsub_user = { on_evsub_state, on_tsx_state, &on_rx_refresh, NULL, NULL, &on_server_timeout, }; But the callback on_rx_refresh and on_server_timeout are never called. I dive into the source code of pjsip and found the code as following: pjsip/src/pjsip-simple/evsub.c /* * Transaction event processing by UAS, after subscription is accepted. */ static void on_tsx_state_uas( pjsip_evsub *sub, pjsip_transaction *tsx, pjsip_event *event) { if (pjsip_method_cmp(&tsx->method, &sub->method) == 0 || pjsip_method_cmp(&tsx->method, &pjsip_subscribe_method) == 0) { ... ... /* Only wants to handle the first event when the request is * received. */ if (tsx->state != PJSIP_TSX_STATE_TRYING) return; on_rx_refresh and on_server_timeout are called here. } } >From the code above the call back it only be called when the transaction in PJSIP_TSX_STATE_TRYING state. but the transaction would be switched into PJSIP_TSX_STATE_COMPLETE state, when I call pjsip_evsub_accept(sub, rdata, st_code, &hdr_list); and from the PJSIP develop guide http://www.pjsip.org/release/0.5.4/PJSIP-Dev-Guide.pdf (page 97) on_evsub_state() would be called for state changed into ACCPETED when send out 200OK, but actually it is not called in my program. I am not sure what I am missing. Chenhui Xu