qeo_retcode_t qeo_json_state_reader_foreach(const qeo_json_state_reader_t *reader, qeo_json_iterate_callback cb, uintptr_t userdata) { qeojson_reader_t *jsonreader = (qeojson_reader_t *) reader; qeo_retcode_t rc = QEO_OK; char *datastr = NULL; if ((NULL == reader) || (NULL == cb)) { rc = QEO_EINVAL; } else { qeocore_filter_t filter = { 0 }; qeo_iterate_action_t action = QEO_ITERATE_CONTINUE; qeocore_data_t *data; data = qeocore_reader_data_new(jsonreader->reader); if (NULL == data) { rc = QEO_ENOMEM; } else { json_reader_dispatcher_cookie_t *dc = (json_reader_dispatcher_cookie_t *)qeocore_reader_get_userdata(jsonreader->reader); filter.instance_handle = DDS_HANDLE_NIL; while (1) { rc = qeocore_reader_read(jsonreader->reader, &filter, data); if (QEO_OK == rc) { filter.instance_handle = qeocore_data_get_instance_handle(data); datastr = json_from_data(dc->typedesc, data); action = cb(datastr, userdata); free(datastr); if (QEO_ITERATE_CONTINUE == action) { qeocore_data_reset(data); continue; } } else if (QEO_ENODATA == rc) { rc = QEO_OK; } /* QEO_ENODATA or ITERATE_ABORT or error */ break; } qeocore_data_free(data); } } return rc; }
static int fwd_server_count_instances(const qeocore_reader_t *reader) { qeo_retcode_t rc = QEO_OK; qeocore_filter_t filter = { 0 }; qeocore_data_t *data; int cnt = 0; data = qeocore_reader_data_new(reader); if (NULL != data) { filter.instance_handle = DDS_HANDLE_NIL; while (1) { rc = qeocore_reader_read(reader, &filter, data); if (QEO_OK == rc) { filter.instance_handle = qeocore_data_get_instance_handle(data); cnt++; #ifdef DEBUG { const org_qeo_system_Forwarder_t *fwd = qeocore_data_get_data(data); qeo_log_d("forwarder %d : id=%" PRIx64 " -> %s", cnt, fwd->deviceId, (fwd->deviceId == reader->entity.factory->qeo_id.device_id ? "self" : "other")); } #endif qeocore_data_reset(data); continue; } else if (QEO_ENODATA == rc) { rc = QEO_OK; } /* QEO_ENODATA or error */ break; } qeocore_data_free(data); } if (QEO_OK == rc) { qeo_log_i("found %d local forwarders", cnt); } else { qeo_log_e("failed to read all local forwarders"); } return cnt; }
qeo_retcode_t qeo_state_reader_foreach(const qeo_state_reader_t *reader, qeo_iterate_callback cb, uintptr_t userdata) { qeocore_reader_t *r = (qeocore_reader_t *)reader; qeo_retcode_t rc = QEO_OK; if ((NULL == r) || (NULL == cb)) { rc = QEO_EINVAL; } else { qeocore_filter_t filter = { 0 }; qeo_iterate_action_t action = QEO_ITERATE_CONTINUE; qeocore_data_t *data; data = qeocore_reader_data_new(r); if (NULL == data) { rc = QEO_ENOMEM; } else { filter.instance_handle = DDS_HANDLE_NIL; while (1) { rc = qeocore_reader_read(r, &filter, data); if (QEO_OK == rc) { filter.instance_handle = qeocore_data_get_instance_handle(data); if (QEO_ITERATE_CONTINUE == action) { action = cb(qeocore_data_get_data(data), userdata); } qeocore_data_reset(data); } else if (QEO_ENODATA == rc) { rc = QEO_OK; break; } } qeocore_data_free(data); } } return rc; }