Changeset 0ce9eb8 in mainline for uspace/app/nav/nav.c


Ignore:
Timestamp:
2026-02-10T12:52:07Z (4 weeks ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
857fba8
Parents:
26a9388
git-author:
Jiri Svoboda <jiri@…> (2026-02-10 18:51:59)
git-committer:
Jiri Svoboda <jiri@…> (2026-02-10 12:52:07)
Message:

Ask user what to do if destination file exists while copying.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/nav/nav.c

    r26a9388 r0ce9eb8  
    11/*
    2  * Copyright (c) 2025 Jiri Svoboda
     2 * Copyright (c) 2026 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4949#include <ui/window.h>
    5050#include "copy.h"
     51#include "dlg/existsdlg.h"
    5152#include "dlg/ioerrdlg.h"
    5253#include "menu.h"
     
    106107        .bretry = navigator_io_err_retry,
    107108        .close = navigator_io_err_close
     109};
     110
     111static void navigator_exists_overwrite(exists_dlg_t *, void *);
     112static void navigator_exists_skip(exists_dlg_t *, void *);
     113static void navigator_exists_abort(exists_dlg_t *, void *);
     114static void navigator_exists_close(exists_dlg_t *, void *);
     115
     116static exists_dlg_cb_t navigator_exists_dlg_cb = {
     117        .boverwrite = navigator_exists_overwrite,
     118        .bskip = navigator_exists_skip,
     119        .babort = navigator_exists_abort,
     120        .close = navigator_exists_close
    108121};
    109122
     
    273286        navigator->io_err_act_sel = false;
    274287
     288        fibril_mutex_initialize(&navigator->exists_act_lock);
     289        fibril_condvar_initialize(&navigator->exists_act_cv);
     290        navigator->exists_act_sel = false;
     291
    275292        *rnavigator = navigator;
    276293        return EOK;
     
    857874}
    858875
     876/** Called by fmgt to query for file/directory exists recovery action.
     877 *
     878 * @param arg Argument (navigator_t *)
     879 * @param exists File/directory exists report
     880 * @return Recovery action to take.
     881 */
     882fmgt_exists_action_t navigator_exists_query(void *arg, fmgt_exists_t *exists)
     883{
     884        navigator_t *nav = (navigator_t *)arg;
     885        exists_dlg_t *dlg;
     886        exists_dlg_params_t params;
     887        fmgt_exists_action_t exists_act;
     888        char *text1;
     889        errno_t rc;
     890        int rv;
     891
     892        exists_dlg_params_init(&params);
     893        rv = asprintf(&text1, "File %s exists.", exists->fname);
     894        if (rv < 0)
     895                return fmgt_exr_abort;
     896
     897        params.text1 = text1;
     898
     899        ui_lock(nav->ui);
     900        rc = exists_dlg_create(nav->ui, &params, &dlg);
     901        if (rc != EOK) {
     902                ui_unlock(nav->ui);
     903                free(text1);
     904                return fmgt_exr_abort;
     905        }
     906
     907        exists_dlg_set_cb(dlg, &navigator_exists_dlg_cb, (void *)nav);
     908
     909        ui_unlock(nav->ui);
     910        free(text1);
     911
     912        fibril_mutex_lock(&nav->exists_act_lock);
     913
     914        while (!nav->exists_act_sel) {
     915                fibril_condvar_wait(&nav->exists_act_cv,
     916                    &nav->exists_act_lock);
     917        }
     918
     919        exists_act = nav->exists_act;
     920        nav->exists_act_sel = false;
     921        fibril_mutex_unlock(&nav->exists_act_lock);
     922
     923        return exists_act;
     924}
     925
     926/** File/directory exists dialog overwrite button was pressed.
     927 *
     928 * @param dlg File/directory exists dialog
     929 * @param arg Argument (navigator_t *)
     930 */
     931static void navigator_exists_overwrite(exists_dlg_t *dlg, void *arg)
     932{
     933        navigator_t *nav = (navigator_t *)arg;
     934
     935        exists_dlg_destroy(dlg);
     936
     937        fibril_mutex_lock(&nav->exists_act_lock);
     938        nav->exists_act = fmgt_exr_overwrite;
     939        nav->exists_act_sel = true;
     940        fibril_condvar_signal(&nav->exists_act_cv);
     941        fibril_mutex_unlock(&nav->exists_act_lock);
     942}
     943
     944/** File/directory exists dialog skip button was pressed.
     945 *
     946 * @param dlg File/directory exists dialog
     947 * @param arg Argument (navigator_t *)
     948 */
     949static void navigator_exists_skip(exists_dlg_t *dlg, void *arg)
     950{
     951        navigator_t *nav = (navigator_t *)arg;
     952
     953        exists_dlg_destroy(dlg);
     954
     955        fibril_mutex_lock(&nav->exists_act_lock);
     956        nav->exists_act = fmgt_exr_skip;
     957        nav->exists_act_sel = true;
     958        fibril_condvar_signal(&nav->exists_act_cv);
     959        fibril_mutex_unlock(&nav->exists_act_lock);
     960}
     961
     962/** File/directory exists dialog abort button was pressed.
     963 *
     964 * @param dlg File/directory exists dialog
     965 * @param arg Argument (navigator_t *)
     966 */
     967static void navigator_exists_abort(exists_dlg_t *dlg, void *arg)
     968{
     969        navigator_t *nav = (navigator_t *)arg;
     970
     971        exists_dlg_destroy(dlg);
     972
     973        fibril_mutex_lock(&nav->exists_act_lock);
     974        nav->exists_act = fmgt_exr_abort;
     975        nav->exists_act_sel = true;
     976        fibril_condvar_signal(&nav->exists_act_cv);
     977        fibril_mutex_unlock(&nav->exists_act_lock);
     978}
     979
     980/** File/directory exists dialog closure requested.
     981 *
     982 * @param dlg File/directory exists dialog
     983 * @param arg Argument (navigator_t *)
     984 */
     985static void navigator_exists_close(exists_dlg_t *dlg, void *arg)
     986{
     987        navigator_t *nav = (navigator_t *)arg;
     988
     989        exists_dlg_destroy(dlg);
     990
     991        fibril_mutex_lock(&nav->exists_act_lock);
     992        nav->exists_act = fmgt_exr_abort;
     993        nav->exists_act_sel = true;
     994        fibril_condvar_signal(&nav->exists_act_cv);
     995        fibril_mutex_unlock(&nav->exists_act_lock);
     996}
     997
    859998/** @}
    860999 */
Note: See TracChangeset for help on using the changeset viewer.