50 #define LOG_MODULE "coap" 51 #define LOG_LEVEL LOG_LEVEL_COAP 53 #define ADD_CHAR_IF_POSSIBLE(char) \ 54 if(strpos >= *offset && bufpos < preferred_size) { \ 55 buffer[bufpos++] = char; \ 59 #define ADD_STRING_IF_POSSIBLE(string, op) \ 60 tmplen = strlen(string); \ 61 if(strpos + tmplen > *offset) { \ 62 bufpos += snprintf((char *)buffer + bufpos, \ 63 preferred_size - bufpos + 1, \ 66 + (*offset - (int32_t)strpos > 0 ? \ 67 *offset - (int32_t)strpos : 0)); \ 68 if(bufpos op preferred_size) { \ 69 LOG_DBG("BREAK at %s (%p)\n", string, resource); \ 79 well_known_core_get_handler(coap_message_t *request, coap_message_t *response,
80 uint8_t *buffer, uint16_t preferred_size,
86 coap_resource_t *resource = NULL;
88 #if COAP_LINK_FORMAT_FILTERING 90 const char *filter = NULL;
91 const char *attrib = NULL;
92 const char *found = NULL;
93 const char *end = NULL;
96 int len = coap_get_header_uri_query(request, &filter);
99 value = strchr(filter,
'=');
102 len -= strlen(filter) + 1;
104 LOG_DBG(
"Filter %s = ", filter);
105 LOG_DBG_COAP_STRING(value, len);
108 if(strcmp(filter,
"href") == 0 && value[0] ==
'/') {
113 lastchar = value[len - 1];
114 value[len - 1] =
'\0';
120 #if COAP_LINK_FORMAT_FILTERING 123 if(strcmp(filter,
"href") == 0) {
124 attrib = strstr(resource->url, value);
125 if(attrib == NULL || (value[-1] ==
'/' && attrib != resource->url)) {
128 end = attrib + strlen(attrib);
129 }
else if(resource->attributes != NULL) {
130 attrib = strstr(resource->attributes, filter);
132 || (attrib[strlen(filter)] !=
'=' 133 && attrib[strlen(filter)] !=
'"')) {
136 attrib += strlen(filter) + 2;
137 end = strchr(attrib,
'"');
140 LOG_DBG(
"Filter: res has attrib %s (%s)\n", attrib, value);
142 while((found = strstr(found, value)) != NULL) {
147 if(lastchar == found[len - 1] || lastchar ==
'*') {
155 LOG_DBG(
"Filter: res has prefix %s\n", found);
157 && (found[len] !=
'"' && found[len] !=
' ' && found[len] !=
'\0')) {
160 LOG_DBG(
"Filter: res has match\n");
164 LOG_DBG(
"/%s (%p)\npos: s%zu, o%ld, b%zu\n", resource->url, resource,
165 strpos, (
long)*offset, bufpos);
168 ADD_CHAR_IF_POSSIBLE(
',');
170 ADD_CHAR_IF_POSSIBLE(
'<');
171 ADD_CHAR_IF_POSSIBLE(
'/');
172 ADD_STRING_IF_POSSIBLE(resource->url, >=);
173 ADD_CHAR_IF_POSSIBLE(
'>');
175 if(resource->attributes != NULL && resource->attributes[0]) {
176 ADD_CHAR_IF_POSSIBLE(
';');
177 ADD_STRING_IF_POSSIBLE(resource->attributes, >);
181 if(bufpos > preferred_size && strpos - bufpos > *offset) {
182 LOG_DBG(
"BREAK at %s (%p)\n", resource->url, resource);
188 LOG_DBG(
"BUF %zu: ", bufpos);
189 LOG_DBG_COAP_STRING((
char *)buffer, bufpos);
192 coap_set_payload(response, buffer, bufpos);
193 coap_set_header_content_format(response, APPLICATION_LINK_FORMAT);
194 }
else if(strpos > 0) {
195 LOG_DBG(
"well_known_core_handler(): bufpos<=0\n");
197 coap_set_status_code(response, BAD_OPTION_4_02);
198 coap_set_payload(response,
"BlockOutOfScope", 15);
201 if(resource == NULL) {
205 LOG_DBG(
"MORE at %s (%p)\n", resource->url, resource);
206 *offset += preferred_size;
210 RESOURCE(res_well_known_core,
"ct=40", well_known_core_get_handler, NULL,
CoAP engine implementation.
coap_resource_t * coap_get_first_resource(void)
Returns the first of registered CoAP resources.
coap_resource_t * coap_get_next_resource(coap_resource_t *resource)
Returns the next registered CoAP resource.