void hash_file_stop(void) { gtkhash_hash_file_set_stop(&hash_priv.file_data, true); while (gtkhash_hash_file_get_state(&hash_priv.file_data) != HASH_FILE_STATE_IDLE) { gtk_main_iteration_do(false); } if (hash_priv.uris) { g_slist_free_full(hash_priv.uris, g_free); hash_priv.uris = NULL; } }
static bool gtkhash_hash_file_thread(struct hash_file_s *data) { static void (* const state_funcs[])(struct hash_file_s *) = { [HASH_FILE_STATE_IDLE] = NULL, [HASH_FILE_STATE_START] = gtkhash_hash_file_start, [HASH_FILE_STATE_OPEN] = gtkhash_hash_file_open, [HASH_FILE_STATE_GET_SIZE] = gtkhash_hash_file_get_size, [HASH_FILE_STATE_READ] = gtkhash_hash_file_read, [HASH_FILE_STATE_HASH] = gtkhash_hash_file_hash, [HASH_FILE_STATE_HASH_FINISH] = gtkhash_hash_file_hash_finish, [HASH_FILE_STATE_CLOSE] = gtkhash_hash_file_close, [HASH_FILE_STATE_FINISH] = gtkhash_hash_file_finish, [HASH_FILE_STATE_CALLBACK] = gtkhash_hash_file_callback, }; enum hash_file_state_e state = gtkhash_hash_file_get_state(data); state_funcs[state](data); return true; } void gtkhash_hash_file(struct hash_file_s *data, const char *uri, const uint8_t *hmac_key, const size_t key_size) { g_assert(data); g_assert(uri && *uri); g_assert(gtkhash_hash_file_get_state(data) == HASH_FILE_STATE_IDLE); g_assert(data->priv.source == 0); g_assert(data->priv.report_source == 0);