/*! \brief * Allocate a memory buffer and print P-Associated_URI * header fields into it */ int build_p_associated_uri(ims_subscription* s) { char *p; int i, j, cnt = 0; ims_public_identity* id; LM_DBG("Building P-Associated-URI\n"); if (!s) { LM_ERR("Strange, no ims subscription data - how did we get here\n"); return -1; } p_associated_uri.data_len = calc_associateduri_buf_len(s); if (!p_associated_uri.data_len) return -1; if (!p_associated_uri.buf || (p_associated_uri.buf_len < p_associated_uri.data_len)) { if (p_associated_uri.buf) pkg_free(p_associated_uri.buf); p_associated_uri.buf = (char*) pkg_malloc(p_associated_uri.data_len); if (!p_associated_uri.buf) { p_associated_uri.data_len = 0; p_associated_uri.buf_len = 0; LM_ERR("no pkg memory left\n"); return -1; } else { p_associated_uri.buf_len = p_associated_uri.data_len; } } p = p_associated_uri.buf; memcpy(p, PASSOCIATEDURI, PASSOCIATEDURI_LEN); p += PASSOCIATEDURI_LEN; for (i = 0; i < s->service_profiles_cnt; i++) for (j = 0; j < s->service_profiles[i].public_identities_cnt; j++) { id = &(s->service_profiles[i].public_identities[j]); if (!id->barring) { if (cnt == 0) *p++ = '<'; else { memcpy(p, ">, <", 4); p += 4; } memcpy(p, id->public_identity.s, id->public_identity.len); p += id->public_identity.len; cnt++; } } if (cnt) *p++ = '>'; memcpy(p, "\r\n", CRLF_LEN); p += CRLF_LEN; p_associated_uri.data_len = p - p_associated_uri.buf; LM_DBG("Created P-Associated-URI HF %.*s\n", p_associated_uri.data_len, p_associated_uri.buf); return 0; }
int build_p_associated_uri(ims_subscription* s) { char *p; int i, j, cnt = 0,cnttel = 0;; ims_public_identity* id; LM_DBG("Building P-Associated-URI\n"); if (!s) { LM_ERR("No ims_subscription present\n"); return -1; } p_associated_uri.data_len = calc_associateduri_buf_len(s); if (!p_associated_uri.data_len) return -1; if (!p_associated_uri.buf || (p_associated_uri.buf_len < p_associated_uri.data_len)) { if (p_associated_uri.buf) pkg_free(p_associated_uri.buf); p_associated_uri.buf = (char*) pkg_malloc(p_associated_uri.data_len); if (!p_associated_uri.buf) { p_associated_uri.data_len = 0; p_associated_uri.buf_len = 0; LM_ERR("no pkg memory left\n"); return -1; } else { p_associated_uri.buf_len = p_associated_uri.data_len; } } p = p_associated_uri.buf; memcpy(p, PASSOCIATEDURI, PASSOCIATEDURI_LEN); p += PASSOCIATEDURI_LEN; for (i = 0; i < s->service_profiles_cnt; i++) for (j = 0; j < s->service_profiles[i].public_identities_cnt; j++) { id = &(s->service_profiles[i].public_identities[j]); if (!id->barring && !(strncmp(id->public_identity.s,"tel",3) == 0) ) { if (cnt == 0 && cnttel == 0){ *p++ = '<'; } else if(cnttel != 0 && cnt == 0){ memcpy(p, ", <", 3); p += 3; } else { memcpy(p, ">, <", 4); p += 4; } memcpy(p, id->public_identity.s, id->public_identity.len); p += id->public_identity.len; cnt++; }else if(!id->barring && strncmp(id->public_identity.s,"tel",3) == 0){ if(cnttel != 0 || cnt != 0){ memcpy(p, ", ", 2); p += 2; } memcpy(p, id->public_identity.s, id->public_identity.len); p += id->public_identity.len; cnttel++; } } if (cnt) *p++ = '>'; memcpy(p, "\r\n", CRLF_LEN); p += CRLF_LEN; p_associated_uri.data_len = p - p_associated_uri.buf; LM_DBG("Created P-Associated-URI HF %.*s\n", p_associated_uri.data_len, p_associated_uri.buf); return 0; }