coap_pdu_t *CAGeneratePDU(uint32_t code, const CAInfo_t *info, const CAEndpoint_t *endpoint) { OIC_LOG(DEBUG, TAG, "IN"); VERIFY_NON_NULL_RET(info, TAG, "info", NULL); VERIFY_NON_NULL_RET(endpoint, TAG, "endpoint", NULL); coap_pdu_t *pdu = NULL; // RESET have to use only 4byte (empty message) // and ACKNOWLEDGE can use empty message when code is empty. if (CA_MSG_RESET == info->type || (CA_EMPTY == code && CA_MSG_ACKNOWLEDGE == info->type)) { OIC_LOG(DEBUG, TAG, "code is empty"); if (!(pdu = CAGeneratePDUImpl((code_t) code, info, endpoint, NULL))) { OIC_LOG(ERROR, TAG, "pdu NULL"); return NULL; } } else { coap_list_t *optlist = NULL; if (CA_MSG_ACKNOWLEDGE != info->type && info->resourceUri) { uint32_t length = strlen(info->resourceUri); if (CA_MAX_URI_LENGTH < length) { OIC_LOG(ERROR, TAG, "URI len err"); return NULL; } uint32_t uriLength = length + sizeof(COAP_URI_HEADER); char *coapUri = (char *) OICCalloc(1, uriLength); if (NULL == coapUri) { OIC_LOG(ERROR, TAG, "out of memory"); return NULL; } OICStrcat(coapUri, uriLength, COAP_URI_HEADER); OICStrcat(coapUri, uriLength, info->resourceUri); // parsing options in URI CAResult_t res = CAParseURI(coapUri, &optlist); if (CA_STATUS_OK != res) { if (optlist) { coap_delete_list(optlist); } OICFree(coapUri); return NULL; } OICFree(coapUri); } // parsing options in HeadOption CAResult_t ret = CAParseHeadOption(code, info, &optlist); if (CA_STATUS_OK != ret) { coap_delete_list(optlist); return NULL; } pdu = CAGeneratePDUImpl((code_t) code, info, endpoint, optlist); if (NULL == pdu) { OIC_LOG(ERROR, TAG, "pdu NULL"); coap_delete_list(optlist); return NULL; } // free option list coap_delete_list(optlist); } // pdu print method : coap_show_pdu(pdu); OIC_LOG(DEBUG, TAG, "OUT"); return pdu; }
coap_pdu_t *CAGeneratePDU(uint32_t code, const CAInfo_t *info, const CAEndpoint_t *endpoint, coap_list_t **optlist, coap_transport_t *transport) { VERIFY_NON_NULL_RET(info, TAG, "info", NULL); VERIFY_NON_NULL_RET(endpoint, TAG, "endpoint", NULL); VERIFY_NON_NULL_RET(optlist, TAG, "optlist", NULL); OIC_LOG_V(DEBUG, TAG, "generate pdu for [%d]adapter, [%d]flags", endpoint->adapter, endpoint->flags); coap_pdu_t *pdu = NULL; // RESET have to use only 4byte (empty message) // and ACKNOWLEDGE can use empty message when code is empty. if (CA_MSG_RESET == info->type || (CA_EMPTY == code && CA_MSG_ACKNOWLEDGE == info->type)) { if (CA_EMPTY != code) { OIC_LOG(ERROR, TAG, "reset is not empty message"); return NULL; } if (info->payloadSize > 0 || info->payload || info->token || info->tokenLength > 0) { OIC_LOG(ERROR, TAG, "Empty message has unnecessary data after messageID"); return NULL; } OIC_LOG(DEBUG, TAG, "code is empty"); if (!(pdu = CAGeneratePDUImpl((code_t) code, info, endpoint, NULL, transport))) { OIC_LOG(ERROR, TAG, "pdu NULL"); return NULL; } } else { if (info->resourceUri) { OIC_LOG_V(DEBUG, TAG, "uri : %s", info->resourceUri); uint32_t length = strlen(info->resourceUri); if (CA_MAX_URI_LENGTH < length) { OIC_LOG(ERROR, TAG, "URI len err"); return NULL; } uint32_t uriLength = length + sizeof(COAP_URI_HEADER); char *coapUri = (char *) OICCalloc(1, uriLength); if (NULL == coapUri) { OIC_LOG(ERROR, TAG, "out of memory"); return NULL; } OICStrcat(coapUri, uriLength, COAP_URI_HEADER); OICStrcat(coapUri, uriLength, info->resourceUri); // parsing options in URI CAResult_t res = CAParseURI(coapUri, optlist); if (CA_STATUS_OK != res) { OICFree(coapUri); return NULL; } OICFree(coapUri); } // parsing options in HeadOption CAResult_t ret = CAParseHeadOption(code, info, optlist); if (CA_STATUS_OK != ret) { return NULL; } pdu = CAGeneratePDUImpl((code_t) code, info, endpoint, *optlist, transport); if (NULL == pdu) { OIC_LOG(ERROR, TAG, "pdu NULL"); return NULL; } } // pdu print method : coap_show_pdu(pdu); return pdu; }