Changeset 1ec732a in mainline


Ignore:
Timestamp:
2025-11-28T20:40:11Z (6 weeks ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
144fafd
Parents:
3a4c6d9
Message:

Verify file - navigator operation and command-line utility.

Location:
uspace
Files:
15 added
18 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/meson.build

    r3a4c6d9 r1ec732a  
    103103        'usbinfo',
    104104        'viewer',
     105        'verify',
    105106        'vol',
    106107        'vuhid',
  • uspace/app/nav/dlg/progress.c

    r3a4c6d9 r1ec732a  
    134134        /* FIXME: Auto layout */
    135135        if (ui_is_textmode(ui)) {
    136                 rect.p0.x = 3;
     136                rect.p0.x = 1;
    137137                rect.p0.y = 2;
    138                 rect.p1.x = 47;
     138                rect.p1.x = 49;
    139139                rect.p1.y = 3;
     140        } else {
     141                rect.p0.x = 10;
     142                rect.p0.y = 35;
     143                rect.p1.x = 390;
     144                rect.p1.y = 50;
     145        }
     146
     147        ui_label_set_rect(label, &rect);
     148        ui_label_set_halign(label, gfx_halign_center);
     149
     150        rc = ui_fixed_add(fixed, ui_label_ctl(label));
     151        if (rc != EOK)
     152                goto error;
     153
     154        dialog->ltotal_prog = label;
     155        label = NULL;
     156
     157        rc = ui_label_create(ui_res, "XXX of XXX (XXX%)", &label);
     158        if (rc != EOK)
     159                goto error;
     160
     161        /* FIXME: Auto layout */
     162        if (ui_is_textmode(ui)) {
     163                rect.p0.x = 1;
     164                rect.p0.y = 4;
     165                rect.p1.x = 49;
     166                rect.p1.y = 5;
    140167        } else {
    141168                rect.p0.x = 10;
     
    240267 *
    241268 * @param dialog Progress dialog
    242  * @param text New text for current file progress
     269 * @param progress Progress
    243270 *
    244271 * @return EOK on success or an error code
    245272 */
    246 errno_t progress_dlg_set_curf_prog(progress_dlg_t *dialog, const char *text)
    247 {
     273errno_t progress_dlg_set_progress(progress_dlg_t *dialog,
     274    fmgt_progress_t *progress)
     275{
     276        char buf[128];
    248277        errno_t rc;
    249278
    250         rc = ui_label_set_text(dialog->lcurf_prog, text);
     279        snprintf(buf, sizeof(buf), "Total: %s files, %s.",
     280            progress->total_procf, progress->total_procb);
     281
     282        rc = ui_label_set_text(dialog->ltotal_prog, buf);
    251283        if (rc != EOK)
    252284                return rc;
    253285
    254         return ui_label_paint(dialog->lcurf_prog);
     286        rc = ui_label_paint(dialog->ltotal_prog);
     287        if (rc != EOK)
     288                return rc;
     289
     290        snprintf(buf, sizeof(buf), "Current file: %s of %s (%s done).",
     291            progress->curf_procb, progress->curf_totalb,
     292            progress->curf_percent);
     293
     294        rc = ui_label_set_text(dialog->lcurf_prog, buf);
     295        if (rc != EOK)
     296                return rc;
     297
     298        rc = ui_label_paint(dialog->lcurf_prog);
     299        if (rc != EOK)
     300                return rc;
     301
     302        return EOK;
    255303}
    256304
  • uspace/app/nav/dlg/progress.h

    r3a4c6d9 r1ec732a  
    3838
    3939#include <errno.h>
     40#include <fmgt.h>
    4041#include <types/ui/ui.h>
    4142#include "../types/dlg/progress.h"
     
    4647extern void progress_dlg_set_cb(progress_dlg_t *, progress_dlg_cb_t *,
    4748    void *);
    48 extern errno_t progress_dlg_set_curf_prog(progress_dlg_t *, const char *);
     49extern errno_t progress_dlg_set_progress(progress_dlg_t *, fmgt_progress_t *);
    4950extern void progress_dlg_destroy(progress_dlg_t *);
    5051
  • uspace/app/nav/menu.c

    r3a4c6d9 r1ec732a  
    5757        ui_menu_entry_t *mopen;
    5858        ui_menu_entry_t *medit;
     59        ui_menu_entry_t *mverify;
    5960        ui_menu_entry_t *mfsep;
    6061        ui_menu_entry_t *mexit;
     
    9798        ui_menu_entry_set_cb(medit, nav_menu_file_edit, (void *) menu);
    9899
     100        rc = ui_menu_entry_create(mfile, "~V~erify", "Ctrl-V", &mverify);
     101        if (rc != EOK)
     102                goto error;
     103
     104        ui_menu_entry_set_cb(mverify, nav_menu_file_verify, (void *) menu);
     105
    99106        rc = ui_menu_entry_sep_create(mfile, &mfsep);
    100107        if (rc != EOK)
     
    194201}
    195202
     203/** File / Verify menu entry selected.
     204 *
     205 * @param mentry Menu entry
     206 * @param arg Argument (navigator_t *)
     207 */
     208void nav_menu_file_verify(ui_menu_entry_t *mentry, void *arg)
     209{
     210        nav_menu_t *menu = (nav_menu_t *)arg;
     211
     212        if (menu->cb != NULL && menu->cb->file_verify != NULL)
     213                menu->cb->file_verify(menu->cb_arg);
     214}
     215
    196216/** File / Exit menu entry selected.
    197217 *
  • uspace/app/nav/menu.h

    r3a4c6d9 r1ec732a  
    4949extern void nav_menu_file_open(ui_menu_entry_t *, void *);
    5050extern void nav_menu_file_edit(ui_menu_entry_t *, void *);
     51extern void nav_menu_file_verify(ui_menu_entry_t *, void *);
    5152extern void nav_menu_file_exit(ui_menu_entry_t *, void *);
    5253
  • uspace/app/nav/meson.build

    r3a4c6d9 r1ec732a  
    3232        'dlg/newfiledlg.c',
    3333        'dlg/progress.c',
     34        'dlg/verifydlg.c',
    3435        'main.c',
    3536        'menu.c',
     
    3738        'newfile.c',
    3839        'panel.c',
     40        'verify.c',
    3941)
    4042
     
    4345        'dlg/newfiledlg.c',
    4446        'dlg/progress.c',
     47        'dlg/verifydlg.c',
    4548        'menu.c',
    4649        'nav.c',
    4750        'newfile.c',
    4851        'panel.c',
     52        'verify.c',
    4953        'test/main.c',
    5054        'test/menu.c',
  • uspace/app/nav/nav.c

    r3a4c6d9 r1ec732a  
    5353#include "nav.h"
    5454#include "panel.h"
     55#include "verify.h"
    5556
    5657#define EDITOR_CMD "/app/edit"
     
    6768static void navigator_file_open(void *);
    6869static void navigator_file_edit(void *);
     70static void navigator_file_verify(void *);
    6971static void navigator_file_exit(void *);
    7072
     
    7375        .file_open = navigator_file_open,
    7476        .file_edit = navigator_file_edit,
     77        .file_verify = navigator_file_verify,
    7578        .file_exit = navigator_file_exit
    7679};
     
    135138                        navigator_file_edit((void *)navigator);
    136139                        break;
     140                case KC_V:
     141                        navigator_file_verify((void *)navigator);
     142                        break;
    137143                case KC_Q:
    138144                        ui_quit(navigator->ui);
     
    526532}
    527533
     534/** File / Verify menu entry selected */
     535static void navigator_file_verify(void *arg)
     536{
     537        navigator_t *navigator = (navigator_t *)arg;
     538
     539        ui_file_list_entry_t *entry;
     540        ui_file_list_entry_attr_t attr;
     541        fmgt_flist_t *flist;
     542        panel_t *panel;
     543        errno_t rc;
     544
     545        panel = navigator_get_active_panel(navigator);
     546        entry = ui_file_list_get_cursor(panel->flist);
     547        ui_file_list_entry_get_attr(entry, &attr);
     548
     549        rc = fmgt_flist_create(&flist);
     550        if (rc != EOK)
     551                return;
     552
     553        rc = fmgt_flist_append(flist, attr.name);
     554        if (rc != EOK) {
     555                fmgt_flist_destroy(flist);
     556                return;
     557        }
     558
     559        /* flist ownership transferred */
     560        navigator_verify_dlg(navigator, flist);
     561}
     562
    528563/** File / Exit menu entry selected */
    529564static void navigator_file_exit(void *arg)
  • uspace/app/nav/newfile.c

    r3a4c6d9 r1ec732a  
    259259{
    260260        navigator_t *nav = (navigator_t *)arg;
    261         char buf[128];
    262 
    263         snprintf(buf, sizeof(buf), "Written %s of %s (%s done).",
    264             progress->curf_procb, progress->curf_totalb,
    265             progress->curf_percent);
    266         progress_dlg_set_curf_prog(nav->progress_dlg, buf);
     261
     262        progress_dlg_set_progress(nav->progress_dlg, progress);
    267263}
    268264
  • uspace/app/nav/types/dlg/progress.h

    r3a4c6d9 r1ec732a  
    4646        /** Dialog window */
    4747        ui_window_t *window;
     48        /** Label with total progress */
     49        ui_label_t *ltotal_prog;
    4850        /** Label with current file progress */
    4951        ui_label_t *lcurf_prog;
  • uspace/app/nav/types/menu.h

    r3a4c6d9 r1ec732a  
    4949        /** File / Edit */
    5050        void (*file_edit)(void *);
     51        /** File / Verify */
     52        void (*file_verify)(void *);
    5153        /** File / Exit */
    5254        void (*file_exit)(void *);
  • uspace/app/newfile/newfile.c

    r3a4c6d9 r1ec732a  
    241241        }
    242242
    243         (void)nonint;
    244         (void)quiet;
    245         (void)sparse;
    246 
    247243        if (fsize != NULL) {
    248244                rc = capa_parse(fsize, &fcap);
  • uspace/lib/fmgt/include/fmgt.h

    r3a4c6d9 r1ec732a  
    4242#include <stddef.h>
    4343#include <stdint.h>
     44#include "fmgt/flist.h"
    4445#include "fmgt/newfile.h"
     46#include "fmgt/verify.h"
    4547#include "types/fmgt.h"
    4648
  • uspace/lib/fmgt/include/fmgt/newfile.h

    r3a4c6d9 r1ec732a  
    3232/**
    3333 * @file
    34  * @brief File management library - creating new files.
     34 * @brief Create new files.
    3535 */
    3636
  • uspace/lib/fmgt/include/types/fmgt.h

    r3a4c6d9 r1ec732a  
    3838#define TYPES_FMGT_H
    3939
     40#include <adt/list.h>
    4041#include <capa.h>
    4142#include <errno.h>
    4243#include <fibril_synch.h>
    4344#include <stdbool.h>
     45
     46#define FMGT_FILE_COUNT_BUFSIZE 16
    4447
    4548/** File management progress update */
     
    5154        /** Percent of current file processed */
    5255        char curf_percent[5];
     56        /** Total number of bytes processed */
     57        char total_procb[CAPA_BLOCKS_BUFSIZE];
     58        /** Number of files processed */
     59        char total_procf[FMGT_FILE_COUNT_BUFSIZE];
    5360} fmgt_progress_t;
    5461
     
    101108        /** Progress was displayed for current file */
    102109        bool curf_progr;
     110        /** Total number of processed bytes */
     111        uint64_t total_procb;
     112        /** Total number of processed files */
     113        unsigned total_procf;
    103114        /** Post an immediate initial progress update */
    104115        bool do_init_update;
    105116} fmgt_t;
    106117
    107 /** New file flags. */
     118/** New file flags */
    108119typedef enum {
    109120        nf_none = 0x0,
     
    111122} fmgt_nf_flags_t;
    112123
     124/** File list */
     125typedef struct {
     126        /** List of fmgt_flist_entry_t */
     127        list_t files;
     128} fmgt_flist_t;
     129
     130/** File list entry */
     131typedef struct {
     132        /** Containing file list */
     133        fmgt_flist_t *flist;
     134        /** Link to flist->files */
     135        link_t lfiles;
     136        /** File name */
     137        char *fname;
     138} fmgt_flist_entry_t;
     139
     140/** File system tree walk callbacks */
     141typedef struct {
     142        errno_t (*dir_enter)(void *, const char *);
     143        errno_t (*dir_leave)(void *, const char *);
     144        errno_t (*file)(void *, const char *);
     145} fmgt_walk_cb_t;
     146
     147/** File system tree walk parameters */
     148typedef struct {
     149        /** List of files or directories (walk roots) */
     150        fmgt_flist_t *flist;
     151        /** Callbacks */
     152        fmgt_walk_cb_t *cb;
     153        /** Callback argument */
     154        void *arg;
     155} fmgt_walk_params_t;
     156
    113157#endif
    114158
  • uspace/lib/fmgt/meson.build

    r3a4c6d9 r1ec732a  
    2828
    2929src = files(
     30        'src/flist.c',
    3031        'src/fmgt.c',
    31         'src/newfile.c'
     32        'src/newfile.c',
     33        'src/verify.c',
     34        'src/walk.c'
    3235)
    3336
  • uspace/lib/fmgt/private/fmgt.h

    r3a4c6d9 r1ec732a  
    4747extern bool fmgt_abort_query(fmgt_t *);
    4848extern fmgt_error_action_t fmgt_io_error_query(fmgt_t *, fmgt_io_error_t *);
     49extern void fmgt_progress_init(fmgt_t *);
     50extern void fmgt_progress_init_file(fmgt_t *, const char *);
     51extern void fmgt_progress_incr_bytes(fmgt_t *, uint64_t);
     52extern void fmgt_progress_incr_files(fmgt_t *);
    4953extern void fmgt_initial_progress_update(fmgt_t *);
    5054extern void fmgt_final_progress_update(fmgt_t *);
  • uspace/lib/fmgt/src/fmgt.c

    r3a4c6d9 r1ec732a  
    104104}
    105105
     106/** Initialize progress counters at beginning of operation.
     107 *
     108 * @param fmgt File management object
     109 */
     110void fmgt_progress_init(fmgt_t *fmgt)
     111{
     112        fmgt->total_procf = 0;
     113        fmgt->total_procb = 0;
     114
     115        fmgt->curf_procb = 0;
     116        fmgt->curf_totalb = 0;
     117        fmgt->curf_progr = false;
     118}
     119
     120/** Initialize progress counters at beginning of processing a file.
     121 *
     122 * @param fmgt File management object
     123 * @param fname File name
     124 */
     125void fmgt_progress_init_file(fmgt_t *fmgt, const char *fname)
     126{
     127        vfs_stat_t stat;
     128        errno_t rc;
     129
     130        fmgt->curf_procb = 0;
     131        fmgt->curf_totalb = 0;
     132
     133        rc = vfs_stat_path(fname, &stat);
     134        if (rc == EOK)
     135                fmgt->curf_totalb = stat.size;
     136}
     137
     138/** Increase count of processed bytes.
     139 *
     140 * @param fmgt File management object
     141 * @param nbytes Number of newly processed bytes
     142 */
     143void fmgt_progress_incr_bytes(fmgt_t *fmgt, uint64_t nbytes)
     144{
     145        fmgt->curf_procb += nbytes;
     146        fmgt->total_procb += nbytes;
     147}
     148
     149/** Increase count of processed files.
     150 *
     151 * @parma fmgt File management object
     152 */
     153void fmgt_progress_incr_files(fmgt_t *fmgt)
     154{
     155        ++fmgt->total_procf;
     156}
     157
    106158/** Get progress update report.
    107159 *
     
    124176        snprintf(progress->curf_percent, sizeof(progress->curf_percent), "%u%%",
    125177            percent);
     178        snprintf(progress->total_procf, sizeof(progress->total_procf), "%u",
     179            fmgt->total_procf);
     180        capa_blocks_format_buf(fmgt->total_procb, 1, progress->total_procb,
     181            sizeof(progress->total_procb));
    126182}
    127183
  • uspace/lib/fmgt/src/newfile.c

    r3a4c6d9 r1ec732a  
    3030 * @{
    3131 */
    32 /** @file File management library - creating new files.
     32/** @file Create new files.
    3333 */
    3434
     
    109109        }
    110110
    111         fmgt->curf_procb = 0;
    112         fmgt->curf_totalb = fsize;
    113         fmgt->curf_progr = false;
    114         fmgt_timer_start(fmgt);
    115 
     111        /* Clear statistics. */
     112        fmgt_progress_init(fmgt);
    116113        fmgt_initial_progress_update(fmgt);
    117114
     
    149146                }
    150147
    151                 fmgt->curf_procb += nw;
     148                fmgt_progress_incr_bytes(fmgt, nw);
    152149
    153150                /* User requested abort? */
Note: See TracChangeset for help on using the changeset viewer.