stla: add support of task interrupt (stop)
This commit is contained in:
parent
d128eb92fd
commit
fb89b4ddcb
@ -13,17 +13,28 @@ typedef struct foug_stream_fwd_iterator
|
|||||||
char* buffer;
|
char* buffer;
|
||||||
uint32_t buffer_offset;
|
uint32_t buffer_offset;
|
||||||
uint32_t buffer_size;
|
uint32_t buffer_size;
|
||||||
size_t stream_offset;
|
|
||||||
|
|
||||||
void* cookie;
|
void* cookie;
|
||||||
void (*stream_read_hook)(const struct foug_stream_fwd_iterator* it);
|
void (*stream_read_hook)(struct foug_stream_fwd_iterator* it);
|
||||||
} foug_stream_fwd_iterator_t;
|
} foug_stream_fwd_iterator_t;
|
||||||
|
|
||||||
static void foug_stream_fwd_iterator_read_hook(const foug_stream_fwd_iterator_t* it)
|
typedef struct foug_stream_fwd_iterator_stla_cookie
|
||||||
{
|
{
|
||||||
foug_task_control_t* ctrl = it != NULL ? (foug_task_control_t*)(it->cookie) : NULL;
|
foug_task_control_t* task_control;
|
||||||
/*if (ctrl != NULL)
|
size_t stream_data_size;
|
||||||
foug_task_control_set_progress(ctrl, it->stream_offset); */
|
size_t stream_offset;
|
||||||
|
foug_bool_t is_stop_requested;
|
||||||
|
} foug_stream_fwd_iterator_stla_cookie_t;
|
||||||
|
|
||||||
|
static void foug_stream_fwd_iterator_stla_read_hook(foug_stream_fwd_iterator_t* it)
|
||||||
|
{
|
||||||
|
foug_stream_fwd_iterator_stla_cookie_t* cookie =
|
||||||
|
it != NULL ? (foug_stream_fwd_iterator_stla_cookie_t*)(it->cookie) : NULL;
|
||||||
|
if (cookie != NULL) {
|
||||||
|
const uint8_t progress_pc = foug_percentage(0, cookie->stream_data_size, cookie->stream_offset);
|
||||||
|
cookie->is_stop_requested = !foug_task_control_handle_progress(cookie->task_control, progress_pc);
|
||||||
|
cookie->stream_offset += it->buffer_size;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static char* current_char(foug_stream_fwd_iterator_t* it)
|
static char* current_char(foug_stream_fwd_iterator_t* it)
|
||||||
@ -38,17 +49,16 @@ static char* current_char(foug_stream_fwd_iterator_t* it)
|
|||||||
|
|
||||||
static char* next_char(foug_stream_fwd_iterator_t* it)
|
static char* next_char(foug_stream_fwd_iterator_t* it)
|
||||||
{
|
{
|
||||||
size_t char_count_read;
|
|
||||||
|
|
||||||
if (it == NULL)
|
if (it == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if ((it->buffer_offset + 1) < it->buffer_size) {
|
if ((it->buffer_offset + 1) < it->buffer_size) {
|
||||||
++(it->buffer_offset);
|
++(it->buffer_offset);
|
||||||
++(it->stream_offset);
|
|
||||||
return it->buffer + it->buffer_offset;
|
return it->buffer + it->buffer_offset;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
size_t char_count_read;
|
||||||
|
|
||||||
if (foug_stream_error(it->stream) != 0 || foug_stream_at_end(it->stream))
|
if (foug_stream_error(it->stream) != 0 || foug_stream_at_end(it->stream))
|
||||||
return NULL;
|
return NULL;
|
||||||
/* Read next chunk of data */
|
/* Read next chunk of data */
|
||||||
@ -58,8 +68,9 @@ static char* next_char(foug_stream_fwd_iterator_t* it)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
it->buffer_offset = 0;
|
it->buffer_offset = 0;
|
||||||
++(it->stream_offset);
|
|
||||||
it->buffer_size = char_count_read;
|
it->buffer_size = char_count_read;
|
||||||
|
if (it->stream_read_hook != NULL)
|
||||||
|
it->stream_read_hook(it);
|
||||||
return it->buffer;
|
return it->buffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -224,22 +235,25 @@ int foug_stla_read(foug_stla_read_args_t *args)
|
|||||||
{
|
{
|
||||||
char fixed_buffer[FOUG_STLA_READ_STRING_BUFFER_LEN];
|
char fixed_buffer[FOUG_STLA_READ_STRING_BUFFER_LEN];
|
||||||
foug_string_buffer_t string_buffer;
|
foug_string_buffer_t string_buffer;
|
||||||
foug_stl_triangle_t triangle;
|
|
||||||
foug_stream_fwd_iterator_t it;
|
foug_stream_fwd_iterator_t it;
|
||||||
int eat_facet_result;
|
foug_stream_fwd_iterator_stla_cookie_t stla_cookie;
|
||||||
|
|
||||||
if (args->buffer == NULL)
|
if (args->buffer == NULL)
|
||||||
return FOUG_DATAX_NULL_BUFFER_ERROR;
|
return FOUG_DATAX_NULL_BUFFER_ERROR;
|
||||||
if (args->buffer_size == 0)
|
if (args->buffer_size == 0)
|
||||||
return FOUG_DATAX_INVALID_BUFFER_SIZE_ERROR;
|
return FOUG_DATAX_INVALID_BUFFER_SIZE_ERROR;
|
||||||
|
|
||||||
|
stla_cookie.task_control = &args->task_control;
|
||||||
|
stla_cookie.stream_data_size = args->data_size_hint;
|
||||||
|
stla_cookie.stream_offset = 0;
|
||||||
|
stla_cookie.is_stop_requested = 0;
|
||||||
|
|
||||||
it.stream = &(args->stream);
|
it.stream = &(args->stream);
|
||||||
it.buffer = args->buffer;
|
it.buffer = args->buffer;
|
||||||
it.buffer_offset = 0;
|
it.buffer_offset = 0;
|
||||||
it.buffer_size = args->buffer_size;
|
it.buffer_size = args->buffer_size;
|
||||||
it.stream_offset = 0;
|
it.cookie = &stla_cookie;
|
||||||
it.cookie = &(args->task_control);
|
it.stream_read_hook = foug_stream_fwd_iterator_stla_read_hook;
|
||||||
it.stream_read_hook = foug_stream_fwd_iterator_read_hook;
|
|
||||||
foug_stream_fwd_iterator_init(&it);
|
foug_stream_fwd_iterator_init(&it);
|
||||||
|
|
||||||
string_buffer.data = fixed_buffer;
|
string_buffer.data = fixed_buffer;
|
||||||
@ -247,16 +261,20 @@ int foug_stla_read(foug_stla_read_args_t *args)
|
|||||||
string_buffer.len = 0;
|
string_buffer.len = 0;
|
||||||
|
|
||||||
/* Eat solids */
|
/* Eat solids */
|
||||||
while (eat_token(&it, "solid") == 0) {
|
while (eat_token(&it, "solid") == 0 && !stla_cookie.is_stop_requested) {
|
||||||
|
int eat_facet_result;
|
||||||
|
foug_stl_triangle_t triangle;
|
||||||
|
|
||||||
/* Try to eat solid's name */
|
/* Try to eat solid's name */
|
||||||
if (eat_string(&it, &string_buffer) != 0) {
|
if (eat_string(&it, &string_buffer) != 0)
|
||||||
return FOUG_STLA_READ_PARSE_ERROR;
|
return FOUG_STLA_READ_PARSE_ERROR;
|
||||||
}
|
|
||||||
if (args->geom_input.begin_solid_func != NULL)
|
if (args->geom_input.begin_solid_func != NULL)
|
||||||
args->geom_input.begin_solid_func(&args->geom_input, string_buffer.data);
|
args->geom_input.begin_solid_func(&args->geom_input, string_buffer.data);
|
||||||
|
|
||||||
/* Try to eat facets */
|
/* Try to eat facets */
|
||||||
while ((eat_facet_result = eat_facet(&it, &string_buffer, &triangle)) >= 0) {
|
while ((eat_facet_result = eat_facet(&it, &string_buffer, &triangle)) >= 0
|
||||||
|
&& !stla_cookie.is_stop_requested)
|
||||||
|
{
|
||||||
if (eat_facet_result == 0) {
|
if (eat_facet_result == 0) {
|
||||||
if (args->geom_input.process_next_triangle_func != NULL)
|
if (args->geom_input.process_next_triangle_func != NULL)
|
||||||
args->geom_input.process_next_triangle_func(&args->geom_input, &triangle);
|
args->geom_input.process_next_triangle_func(&args->geom_input, &triangle);
|
||||||
@ -278,5 +296,5 @@ int foug_stla_read(foug_stla_read_args_t *args)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return FOUG_DATAX_NO_ERROR;
|
return !stla_cookie.is_stop_requested ? FOUG_DATAX_NO_ERROR : FOUG_DATAX_TASK_STOPPED_ERROR;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user