From 70e056a2aa9f18989dbc956c5866ac5822dbd10a Mon Sep 17 00:00:00 2001 From: Celine Mercier Date: Thu, 24 Nov 2016 11:19:07 +0100 Subject: [PATCH] It is now impossible to open or clone a view that is not finished (= has been closed at least once) --- src/obiview.c | 21 ++++++++++++++++++--- src/obiview.h | 2 ++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/obiview.c b/src/obiview.c index 288464b..f772655 100644 --- a/src/obiview.c +++ b/src/obiview.c @@ -1169,7 +1169,7 @@ Obiview_p obi_new_view(OBIDMS_p dms, const char* view_name, Obiview_p view_to_cl } view->dms = dms; - view->read_only = 0; + view->read_only = false; // Create view file if (create_obiview_file(dms, view_name) < 0) @@ -1187,16 +1187,19 @@ Obiview_p obi_new_view(OBIDMS_p dms, const char* view_name, Obiview_p view_to_cl return NULL; } + // Flag the view as being a work in progress + (view->infos)->finished = false; + // Write used size in view file for initial structure (view->infos)->used_size = sizeof(Obiview_infos_t); // Clone view to clone if there is one if (view_to_clone != NULL) { - if (!(view_to_clone->read_only)) + if ((view_to_clone->infos)->finished == false) { obi_set_errno(OBIVIEW_ERROR); - obidebug(1, "\nA view can not be cloned if it is not read-only"); + obidebug(1, "\nA view can not be cloned if it is not finished"); obi_view_unmap_file(view->dms, view->infos); free(view); return NULL; @@ -1634,6 +1637,15 @@ Obiview_p obi_open_view(OBIDMS_p dms, const char* view_name) // Map view file view->infos = obi_view_map_file(dms, view_name); + // Check that the view is finished and can be opened + if ((view->infos)->finished == false) + { + obidebug(1, "\nError opening a view: the view is not finished"); + obi_view_unmap_file(view->dms, view->infos); + free(view); + return NULL; + } + // Open the line selection associated with the view if ((view->infos)->all_lines) view->line_selection = NULL; @@ -1983,6 +1995,9 @@ int obi_close_view(Obiview_p view) } } + // Flag the view as finished + (view->infos)->finished = true; + // Free the column dictionary ht_free(view->column_dict); diff --git a/src/obiview.h b/src/obiview.h index a7c3da8..791bad7 100644 --- a/src/obiview.h +++ b/src/obiview.h @@ -94,6 +94,8 @@ typedef struct Obiview_infos { */ Alias_column_pair_t column_references[MAX_NB_OPENED_COLUMNS]; /**< References (name, version and alias) for all the columns in the view. */ + bool finished; /** Whether the view is finished and can be read. + */ char comments[]; /**< Comments, additional informations on the view. */ } Obiview_infos_t, *Obiview_infos_p;