/*----------------------------------------------------------------------------*/ void tres_del_task(tres_res_t *task) { list_t obs_list; coap_observer_t *obs, *cur; tres_stop_monitoring(task); task->name[0] = '\0'; // a null name marks a deleted task // remove subscribers if any // TODO: can we notify the subscriber in some way? obs_list = coap_get_observers(); obs = (coap_observer_t *)list_head(obs_list); while(obs) { cur = obs; // next is set to NULL if the observer is removed, so we must save it here obs = obs->next; if(cur->url == task->lo_url || memcmp(cur->url, task->lo_url, strlen(cur->url)) == 0) { coap_remove_observer(cur); } } task_is_delete_all(task); if(task->pf_img) { tres_mem_pf_clear(task->pf_img); } task_reset_state(task); memb_free(&tasks_mem, task); }
int coap_remove_observer_by_client(uip_ipaddr_t *addr, uint16_t port) { int removed = 0; coap_observer_t* obs = NULL; for (obs = (coap_observer_t*)list_head(observers_list); obs; obs = obs->next) { PRINTF("Remove check Port %u\n", port); if (uip_ipaddr_cmp(&obs->addr, addr) && obs->port==port) { coap_remove_observer(obs); removed++; } } return removed; }
int coap_remove_observer_by_token(uip_ipaddr_t *addr, uint16_t port, uint8_t *token, size_t token_len) { int removed = 0; coap_observer_t* obs = NULL; for (obs = (coap_observer_t*)list_head(observers_list); obs; obs = obs->next) { PRINTF("Remove check Token 0x%02X%02X\n", token[0], token[1]); if (uip_ipaddr_cmp(&obs->addr, addr) && obs->port==port && memcmp(obs->token, token, token_len)==0) { coap_remove_observer(obs); removed++; } } return removed; }
int coap_remove_observer_by_mid(uip_ipaddr_t *addr, uint16_t port, uint16_t mid) { int removed = 0; coap_observer_t* obs = NULL; for (obs = (coap_observer_t*)list_head(observers_list); obs; obs = obs->next) { PRINTF("Remove check MID %u\n", mid); if (uip_ipaddr_cmp(&obs->addr, addr) && obs->port==port && obs->last_mid==mid) { coap_remove_observer(obs); removed++; } } return removed; }
int coap_remove_observer_by_url(uip_ipaddr_t *addr, uint16_t port, const char *url) { int removed = 0; coap_observer_t* obs = NULL; for (obs = (coap_observer_t*)list_head(observers_list); obs; obs = obs->next) { PRINTF("Remove check URL %p\n", url); if (uip_ipaddr_cmp(&obs->addr, addr) && obs->port==port && (obs->url==url || memcmp(obs->url, url, strlen(obs->url))==0)) { coap_remove_observer(obs); removed++; } } return removed; }