coap_pdu_t* CAGeneratePdu(const char* uri, const uint32_t code, const CAInfo_t info) { OIC_LOG(DEBUG, TAG, "generate PDU"); coap_pdu_t *pdu; char* coapUri = NULL; uint32_t coapHeaderLength = 12; uint32_t length; coap_list_t *optlist = NULL; if (NULL == uri) return NULL; length = strlen(uri); coapUri = (char*) OICMalloc(length + coapHeaderLength + 1); memset(coapUri, 0, length + coapHeaderLength + 1); if (NULL != coapUri) { memcpy(coapUri, "coap://[::]/", coapHeaderLength); memcpy(coapUri + coapHeaderLength, uri, length); // parsing options in URI CAParseURI(coapUri, &optlist); // parsing options in HeadOption if (NULL != &info) { CAParseHeadOption(code, info, &optlist); } OICFree(coapUri); } if (NULL != info.payload) { if (!(pdu = CACreatePDUforRequestWithPayload((code_t) code, optlist, info.payload))) return NULL; } else { if (!(pdu = CACreatePDUforRequest((code_t) code, optlist))) return NULL; } // pdu print method : coap_show_pdu(pdu); return pdu; }
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, NULL, info, endpoint))) { OIC_LOG(ERROR, TAG, "pdu NULL"); return NULL; } } else { coap_list_t *optlist = NULL; if (CA_MSG_ACKNOWLEDGE != info->type) { const char *uri = info->resourceUri; if (NULL == uri) { OIC_LOG(ERROR, TAG, "uri NULL"); return NULL; } uint32_t length = strlen(uri); 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, uri); // 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, optlist, info, endpoint); 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; }