From b72e6451f6a69e640fde435903d38c97799a351d Mon Sep 17 00:00:00 2001 From: tao3 Date: Sun, 2 Jun 2024 19:45:16 +0800 Subject: [PATCH] change: sip_subscribe_remove on close --- libsip/include/sip-uac.h | 1 + libsip/src/uac/sip-uac-subscribe.c | 24 ++++++++++++++---------- libsip/src/uas/sip-uas-subscribe.c | 10 ++++++---- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/libsip/include/sip-uac.h b/libsip/include/sip-uac.h index 2a5f835c..77749d0c 100644 --- a/libsip/include/sip-uac.h +++ b/libsip/include/sip-uac.h @@ -15,6 +15,7 @@ struct sip_uac_transaction_t; /// @param[out] session user-defined session-id(only code=2xx) /// @return 0-ok, other-error typedef int (*sip_uac_oninvite)(void* param, const struct sip_message_t* reply, struct sip_uac_transaction_t* t, struct sip_dialog_t* dialog, int code, void** session); +/// @param[in] subscribe MUST call sip_subscribe_remove on close /// @param[out] session user-defined session-id(only code=2xx) /// @return 0-ok, other-error typedef int (*sip_uac_onsubscribe)(void* param, const struct sip_message_t* reply, struct sip_uac_transaction_t* t, struct sip_subscribe_t* subscribe, int code, void** session); diff --git a/libsip/src/uac/sip-uac-subscribe.c b/libsip/src/uac/sip-uac-subscribe.c index 44bec2ee..987a9bc2 100644 --- a/libsip/src/uac/sip-uac-subscribe.c +++ b/libsip/src/uac/sip-uac-subscribe.c @@ -29,18 +29,22 @@ int sip_uac_subscribe_onreply(struct sip_uac_transaction_t* t, const struct sip_ } else { - r = t->onsubscribe(t->param, reply, t, NULL, reply->u.s.code, NULL); + // for subscribe expires 0, to sip_subscribe_remove + subscribe = sip_subscribe_fetch(t->agent, &t->req->callid, &t->req->from.tag, &t->req->to.tag, &t->req->event); + + r = t->onsubscribe(t->param, reply, t, subscribe, reply->u.s.code, subscribe ? &subscribe->evtsession : NULL); } if (subscribe) { - // delete subscribe if expires is 0 - h = sip_message_get_header_by_name(t->req, "Expires"); - if (h && 0 == cstrtol(h, NULL, 10)) - { - sip_subscribe_remove(t->agent, subscribe); - assert(1 == subscribe->ref); - } + // It's user due to remove subscribe on expires 0 + //// delete subscribe if expires is 0 + //h = sip_message_get_header_by_name(t->req, "Expires"); + //if (h && 0 == cstrtol(h, NULL, 10)) + //{ + // sip_subscribe_remove(t->agent, subscribe); + // assert(1 == subscribe->ref); + //} sip_subscribe_release(subscribe); } @@ -66,8 +70,8 @@ int sip_uac_notify_onreply(struct sip_uac_transaction_t* t, const struct sip_mes // NOTICE: ignore notify before subscribe created r = t->onreply(t->param, reply, t, reply->u.s.code); - if (0 == cstrcmp(&reply->substate.state, SIP_SUBSCRIPTION_STATE_TERMINATED)) - sip_subscribe_remove(t->agent, subscribe); + //if (0 == cstrcmp(&reply->substate.state, SIP_SUBSCRIPTION_STATE_TERMINATED)) + // sip_subscribe_remove(t->agent, subscribe); sip_subscribe_release(subscribe); return r; diff --git a/libsip/src/uas/sip-uas-subscribe.c b/libsip/src/uas/sip-uas-subscribe.c index cd853bea..b59812af 100644 --- a/libsip/src/uas/sip-uas-subscribe.c +++ b/libsip/src/uas/sip-uas-subscribe.c @@ -34,8 +34,10 @@ int sip_uas_onsubscribe(struct sip_uas_transaction_t* t, struct sip_dialog_t* di // notify expire //if (t->handler->onnotify) // t->handler->onnotify(param, req, t, subscribe->evtsession, NULL); - sip_subscribe_remove(t->agent, subscribe); - assert(1 == subscribe->ref); + + // It's user due to remove subscribe on expires 0 + //sip_subscribe_remove(t->agent, subscribe); + //assert(1 == subscribe->ref); } sip_subscribe_release(subscribe); @@ -74,8 +76,8 @@ int sip_uas_onnotify(struct sip_uas_transaction_t* t, const struct sip_message_t else r = 0; // just ignore - if (subscribe && 0 == cstrcmp(&req->substate.state, SIP_SUBSCRIPTION_STATE_TERMINATED)) - sip_subscribe_remove(t->agent, subscribe); + //if (subscribe && 0 == cstrcmp(&req->substate.state, SIP_SUBSCRIPTION_STATE_TERMINATED)) + // sip_subscribe_remove(t->agent, subscribe); sip_subscribe_release(subscribe); return r;