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; }
int main(int argc, const char **argv) { qeo_factory_t *factory; qeocore_reader_t *reader; qeocore_writer_t *writer; qeocore_type_t *type; qeocore_data_t *rdata, *wdata; int i; for (i = 0; i < 2; i++) { /* initialize */ assert(NULL != (factory = qeocore_factory_new(QEO_IDENTITY_DEFAULT))); init_factory(factory); assert(NULL != (type = nested_type_get(1, 0, 0))); assert(QEO_OK == qeocore_type_register(factory, type, "nested")); assert(NULL != (reader = qeocore_reader_open(factory, type, NULL, QEOCORE_EFLAG_STATE_UPDATE | QEOCORE_EFLAG_ENABLE, NULL, NULL))); assert(NULL != (writer = qeocore_writer_open(factory, type, NULL, QEOCORE_EFLAG_STATE_UPDATE | QEOCORE_EFLAG_ENABLE, NULL, NULL))); /* write */ assert(NULL != (wdata = qeocore_writer_data_new(writer))); fill_data(wdata); assert(QEO_OK == qeocore_writer_write(writer, wdata)); /* check data */ assert(NULL != (rdata = qeocore_reader_data_new(reader))); assert(QEO_OK == qeocore_reader_read(reader, NULL, rdata)); expected_status = QEOCORE_DATA; validate_data(rdata); /* remove */ assert(QEO_OK == qeocore_writer_remove(writer, wdata)); /* clean up */ qeocore_data_free(wdata); qeocore_data_free(rdata); qeocore_writer_close(writer); qeocore_reader_close(reader); qeocore_type_free(type); qeocore_factory_close(factory); } }