diff --git a/pjsip/src/pjsua-lib/pjsua_pres.c b/pjsip/src/pjsua-lib/pjsua_pres.c index a06d6451d..f273c1bc5 100644 --- a/pjsip/src/pjsua-lib/pjsua_pres.c +++ b/pjsip/src/pjsua-lib/pjsua_pres.c @@ -329,6 +329,18 @@ pjsua_buddy_get_dlg_event_info( pjsua_buddy_id buddy_id, pjsua_buddy *buddy; pj_status_t status; +#define COPY_TO_BUF(status, field) \ + if (status.field.slen > 0) { \ + if (total + status.field.slen < sizeof(info->buf_)) { \ + info->field.ptr = info->buf_ + total; \ + pj_strncpy(&info->field, &status.field, status.field.slen); \ + total += info->field.slen; \ + } else { \ + PJ_LOG(4, (THIS_FILE, "Insufficient buffer when copying %s", \ + #field)); \ + } \ + } + PJ_ASSERT_RETURN(pjsua_buddy_is_valid(buddy_id), PJ_EINVAL); pj_bzero(info, sizeof(pjsua_buddy_dlg_event_info)); @@ -349,142 +361,24 @@ pjsua_buddy_get_dlg_event_info( pjsua_buddy_id buddy_id, pj_strncpy(&info->uri, &buddy->uri, sizeof(info->buf_)-total); total += info->uri.slen; - if (buddy->dlg_ev_status.info[0].dialog_info_state.slen > 0 && - total < sizeof(info->buf_)) - { - info->dialog_info_state.ptr = info->buf_ + total; - pj_strncpy(&info->dialog_info_state, - &buddy->dlg_ev_status.info[0].dialog_info_state, - buddy->dlg_ev_status.info[0].dialog_info_state.slen); - total += info->dialog_info_state.slen; - } - - if (buddy->dlg_ev_status.info[0].dialog_info_entity.slen > 0 && - total < sizeof(info->buf_)) - { - info->dialog_info_entity.ptr = info->buf_ + total; - pj_strncpy(&info->dialog_info_entity, - &buddy->dlg_ev_status.info[0].dialog_info_entity, - buddy->dlg_ev_status.info[0].dialog_info_entity.slen); - total += info->dialog_info_entity.slen; - } + COPY_TO_BUF(buddy->dlg_ev_status.info[0], dialog_info_state); + COPY_TO_BUF(buddy->dlg_ev_status.info[0], dialog_info_entity); if (buddy->dlg_ev_status.info[0].dialog_node) { - if (total < sizeof(info->buf_)) { - info->dialog_id.ptr = info->buf_ + total; - pj_strncpy(&info->dialog_id, - &buddy->dlg_ev_status.info[0].dialog_id, - sizeof(info->buf_)-total); - total += info->dialog_id.slen; - } - - if (total < sizeof(info->buf_)) { - info->dialog_call_id.ptr = info->buf_ + total; - pj_strncpy(&info->dialog_call_id, - &buddy->dlg_ev_status.info[0].dialog_call_id, - sizeof(info->buf_)-total); - total += info->dialog_call_id.slen; - } - - if (total < sizeof(info->buf_)) { - info->dialog_remote_tag.ptr = info->buf_ + total; - pj_strncpy(&info->dialog_remote_tag, - &buddy->dlg_ev_status.info[0].dialog_remote_tag, - sizeof(info->buf_)-total); - total += info->dialog_remote_tag.slen; - } - - if (total < sizeof(info->buf_)) { - info->dialog_local_tag.ptr = info->buf_ + total; - pj_strncpy(&info->dialog_local_tag, - &buddy->dlg_ev_status.info[0].dialog_local_tag, - sizeof(info->buf_)-total); - total += info->dialog_local_tag.slen; - } - - if (total < sizeof(info->buf_)) { - info->dialog_direction.ptr = info->buf_ + total; - pj_strncpy(&info->dialog_direction, - &buddy->dlg_ev_status.info[0].dialog_direction, - sizeof(info->buf_)-total); - total += info->dialog_direction.slen; - } - - if (total < sizeof(info->buf_)) { - info->dialog_state.ptr = info->buf_ + total; - pj_strncpy(&info->dialog_state, - &buddy->dlg_ev_status.info[0].dialog_state, - buddy->dlg_ev_status.info[0].dialog_state.slen); - total += info->dialog_state.slen; - } - - if (total < sizeof(info->buf_)) { - info->dialog_duration.ptr = info->buf_ + total; - pj_strncpy(&info->dialog_duration, - &buddy->dlg_ev_status.info[0].dialog_duration, - buddy->dlg_ev_status.info[0].dialog_duration.slen); - total += info->dialog_duration.slen; - } - - if (buddy->dlg_ev_status.info[0].local_identity.slen > 0 && - total < sizeof(info->buf_)) - { - info->local_identity.ptr = info->buf_ + total; - pj_strncpy(&info->local_identity, - &buddy->dlg_ev_status.info[0].local_identity, - buddy->dlg_ev_status.info[0].local_identity.slen); - total += info->local_identity.slen; - } - - if (buddy->dlg_ev_status.info[0].local_identity_display.slen > 0 && - total < sizeof(info->buf_)) - { - info->local_identity_display.ptr = info->buf_ + total; - pj_strncpy(&info->local_identity_display, - &buddy->dlg_ev_status.info[0].local_identity_display, - buddy->dlg_ev_status.info[0].local_identity_display.slen); - total += info->local_identity_display.slen; - } - - if (buddy->dlg_ev_status.info[0].local_target_uri.slen > 0 && - total < sizeof(info->buf_)) - { - info->local_target_uri.ptr = info->buf_ + total; - pj_strncpy(&info->local_target_uri, - &buddy->dlg_ev_status.info[0].local_target_uri, - buddy->dlg_ev_status.info[0].local_target_uri.slen); - total += info->local_target_uri.slen; - } - - if (buddy->dlg_ev_status.info[0].remote_identity.slen > 0 && - total < sizeof(info->buf_)) - { - info->remote_identity.ptr = info->buf_ + total; - pj_strncpy(&info->remote_identity, - &buddy->dlg_ev_status.info[0].remote_identity, - buddy->dlg_ev_status.info[0].remote_identity.slen); - total += info->remote_identity.slen; - } - - if (buddy->dlg_ev_status.info[0].remote_identity_display.slen > 0 && - total < sizeof(info->buf_)) - { - info->remote_identity_display.ptr = info->buf_ + total; - pj_strncpy(&info->remote_identity_display, - &buddy->dlg_ev_status.info[0].remote_identity_display, - buddy->dlg_ev_status.info[0].remote_identity_display.slen); - total += info->remote_identity_display.slen; - } - - if (buddy->dlg_ev_status.info[0].remote_target_uri.slen > 0 && - total < sizeof(info->buf_)) - { - info->remote_target_uri.ptr = info->buf_ + total; - pj_strncpy(&info->remote_target_uri, - &buddy->dlg_ev_status.info[0].remote_target_uri, - buddy->dlg_ev_status.info[0].remote_target_uri.slen); - total += info->remote_target_uri.slen; - } + COPY_TO_BUF(buddy->dlg_ev_status.info[0], dialog_id); + COPY_TO_BUF(buddy->dlg_ev_status.info[0], dialog_call_id); + COPY_TO_BUF(buddy->dlg_ev_status.info[0], dialog_remote_tag); + COPY_TO_BUF(buddy->dlg_ev_status.info[0], dialog_local_tag); + COPY_TO_BUF(buddy->dlg_ev_status.info[0], dialog_direction); + COPY_TO_BUF(buddy->dlg_ev_status.info[0], dialog_state); + COPY_TO_BUF(buddy->dlg_ev_status.info[0], dialog_duration); + + COPY_TO_BUF(buddy->dlg_ev_status.info[0], local_identity); + COPY_TO_BUF(buddy->dlg_ev_status.info[0], local_identity_display); + COPY_TO_BUF(buddy->dlg_ev_status.info[0], local_target_uri); + COPY_TO_BUF(buddy->dlg_ev_status.info[0], remote_identity); + COPY_TO_BUF(buddy->dlg_ev_status.info[0], remote_identity_display); + COPY_TO_BUF(buddy->dlg_ev_status.info[0], remote_target_uri); } /* subscription state and termination reason */