summaryrefslogtreecommitdiffstats
path: root/src/io.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/io.c')
-rw-r--r--src/io.c136
1 files changed, 19 insertions, 117 deletions
diff --git a/src/io.c b/src/io.c
index e63182d..aa31313 100644
--- a/src/io.c
+++ b/src/io.c
@@ -48,25 +48,6 @@
#include "calcurse.h"
#include "sha1.h"
-typedef enum {
- PROGRESS_BAR_SAVE,
- PROGRESS_BAR_LOAD,
- PROGRESS_BAR_EXPORT
-} progress_bar_t;
-
-enum {
- PROGRESS_BAR_CONF,
- PROGRESS_BAR_TODO,
- PROGRESS_BAR_APTS,
- PROGRESS_BAR_KEYS
-};
-
-enum {
- PROGRESS_BAR_EXPORT_EVENTS,
- PROGRESS_BAR_EXPORT_APOINTS,
- PROGRESS_BAR_EXPORT_TODO
-};
-
struct ht_keybindings_s {
const char *label;
enum key key;
@@ -88,74 +69,6 @@ static int modified = 0;
static char apts_sha1[SHA1_DIGESTLEN * 2 + 1];
static char todo_sha1[SHA1_DIGESTLEN * 2 + 1];
-/* Draw a progress bar while saving, loading or exporting data. */
-static void progress_bar(progress_bar_t type, int progress)
-{
-#define NBFILES 4
-#define NBEXPORTED 3
-#define LABELENGTH 15
- int i, step, steps;
- const char *mesg_sav = _("Saving...");
- const char *mesg_load = _("Loading...");
- const char *mesg_export = _("Exporting...");
- const char *error_msg =
- _("Internal error while displaying progress bar");
- const char *barchar = "|";
- const char *file[NBFILES] = {
- "[ conf ]",
- "[ todo ]",
- "[ apts ]",
- "[ keys ]"
- };
- const char *data[NBEXPORTED] = {
- "[ events ]",
- "[appointments]",
- "[ todo ]"
- };
- int ipos = LABELENGTH + 2;
- int epos[NBFILES];
-
- /* progress bar length init. */
- ipos = LABELENGTH + 2;
- steps = (type == PROGRESS_BAR_EXPORT) ? NBEXPORTED : NBFILES;
- step = floor(col / (steps + 1));
- for (i = 0; i < steps - 1; i++)
- epos[i] = (i + 2) * step;
- epos[steps - 1] = col - 2;
-
- switch (type) {
- case PROGRESS_BAR_SAVE:
- EXIT_IF(progress < 0
- || progress > PROGRESS_BAR_KEYS, "%s", error_msg);
- status_mesg(mesg_sav, file[progress]);
- break;
- case PROGRESS_BAR_LOAD:
- EXIT_IF(progress < 0
- || progress > PROGRESS_BAR_KEYS, "%s", error_msg);
- status_mesg(mesg_load, file[progress]);
- break;
- case PROGRESS_BAR_EXPORT:
- EXIT_IF(progress < 0
- || progress > PROGRESS_BAR_EXPORT_TODO, "%s",
- error_msg);
- status_mesg(mesg_export, data[progress]);
- break;
- }
-
- /* Draw the progress bar. */
- mvwaddstr(win[STA].p, 1, ipos, barchar);
- mvwaddstr(win[STA].p, 1, epos[steps - 1], barchar);
- custom_apply_attr(win[STA].p, ATTR_HIGHEST);
- for (i = ipos + 1; i < epos[progress]; i++)
- mvwaddch(win[STA].p, 1, i, ' ' | A_REVERSE);
- custom_remove_attr(win[STA].p, ATTR_HIGHEST);
- wmove(win[STA].p, 0, 0);
- wins_wrefresh(win[STA].p);
-#undef NBFILES
-#undef NBEXPORTED
-#undef LABELENGTH
-}
-
/* Ask user for a file name to export data to. */
static FILE *get_export_stream(enum export_type type)
{
@@ -575,55 +488,44 @@ cleanup:
* IO_SAVE_RELOAD: cancel save operation (data files changed and reloaded)
* IO_SAVE_CANCEL: cancel save operation (user's decision, keep data files, no reload)
* IO_SAVE_NOOP: cancel save operation (nothing has changed)
+ * IO_SAVE_ERROR: cannot access data
*/
-int io_save_cal(enum save_display display)
+int io_save_cal(void)
{
- const char *access_pb = _("Problems accessing data file ...");
- int show_bar, ret = IO_SAVE_CTINUE;
+ int ret;
if (read_only)
return IO_SAVE_CANCEL;
- if (new_data()) {
+ if ((ret = new_data()) == NOKNOW) {
+ return IO_SAVE_ERROR;
+ } else if (ret) { /* New data */
if ((ret = resolve_save_conflict()))
return ret;
- } else
+ } else /* No new data */
if (!io_get_modified())
return IO_SAVE_NOOP;
+ ret = IO_SAVE_CTINUE;
+
run_hook("pre-save");
io_mutex_lock();
- show_bar = 0;
- if (ui_mode == UI_CURSES && display == IO_SAVE_DISPLAY_BAR
- && conf.progress_bar)
- show_bar = 1;
-
- if (show_bar)
- progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_CONF);
- if (!config_save())
- ERROR_MSG("%s", access_pb);
-
- if (show_bar)
- progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_TODO);
- if (!io_save_todo(path_todo))
- ERROR_MSG("%s", access_pb);
-
- if (show_bar)
- progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_APTS);
- if (!io_save_apts(path_apts))
- ERROR_MSG("%s", access_pb);
-
- if (show_bar)
- progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_KEYS);
- if (!io_save_keys())
- ERROR_MSG("%s", access_pb);
+ if (!io_save_todo(path_todo)) {
+ ret = IO_SAVE_ERROR;
+ goto cleanup;
+ }
+ if (!io_save_apts(path_apts)) {
+ ret = IO_SAVE_ERROR;
+ goto cleanup;
+ }
io_unset_modified();
io_compute_hash(path_apts, apts_sha1);
io_compute_hash(path_todo, todo_sha1);
+cleanup:
io_mutex_unlock();
run_hook("post-save");
return ret;
@@ -1520,7 +1422,7 @@ static void *io_psave_thread(void *arg)
for (;;) {
sleep(delay * MININSEC);
- io_save_cal(IO_SAVE_DISPLAY_NONE);
+ io_save_cal();
}
}