diff options
Diffstat (limited to 'src/filemanager/fileopctx.h')
-rw-r--r-- | src/filemanager/fileopctx.h | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/src/filemanager/fileopctx.h b/src/filemanager/fileopctx.h new file mode 100644 index 0000000..348507e --- /dev/null +++ b/src/filemanager/fileopctx.h @@ -0,0 +1,198 @@ +/** \file fileopctx.h + * \brief Header: file operation contexts + * \date 1998 + * \author Federico Mena <federico@nuclecu.unam.mx> + * \author Miguel de Icaza <miguel@nuclecu.unam.mx> + */ + +#ifndef MC__FILEOPCTX_H +#define MC__FILEOPCTX_H + +#include <sys/stat.h> +#include <sys/types.h> +#include <inttypes.h> /* uintmax_t */ + +#include "lib/global.h" +#include "lib/vfs/vfs.h" + + +/*** typedefs(not structures) and defined constants **********************************************/ + +typedef int (*mc_stat_fn) (const vfs_path_t * vpath, struct stat * buf); + +/*** enums ***************************************************************************************/ + +typedef enum +{ + FILEGUI_DIALOG_ONE_ITEM, + FILEGUI_DIALOG_MULTI_ITEM, + FILEGUI_DIALOG_DELETE_ITEM +} filegui_dialog_type_t; + +typedef enum +{ + OP_COPY = 0, + OP_MOVE = 1, + OP_DELETE = 2 +} FileOperation; + +typedef enum +{ + RECURSIVE_YES = 0, + RECURSIVE_NO = 1, + RECURSIVE_ALWAYS = 2, + RECURSIVE_NEVER = 3, + RECURSIVE_ABORT = 4 +} FileCopyMode; + +/* ATTENTION: avoid overlapping with B_* values (lib/widget/dialog.h) */ +typedef enum +{ + FILE_CONT = 10, + FILE_RETRY, + FILE_SKIP, + FILE_ABORT, + FILE_SKIPALL, + FILE_SUSPEND +} FileProgressStatus; + +/* First argument passed to real functions */ +enum OperationMode +{ + Foreground, + Background +}; + +/*** structures declarations (and typedefs of structures)*****************************************/ + +struct mc_search_struct; + +/* This structure describes a context for file operations. It is used to update + * the progress windows and pass around options. + */ +typedef struct +{ + /* Operation type (copy, move, delete) */ + FileOperation operation; + + /* The estimated time of arrival in seconds */ + double eta_secs; + + /* Transferred bytes per second */ + long bps; + + /* Transferred seconds */ + long bps_time; + + /* Whether the panel total has been computed */ + gboolean progress_totals_computed; + filegui_dialog_type_t dialog_type; + + /* Counters for progress indicators */ + size_t progress_count; + uintmax_t progress_bytes; + + /* The value of the "preserve Attributes" checkbox in the copy file dialog. + * We can't use the value of "ctx->preserve" because it can change in order + * to preserve file attributs when moving files across filesystem boundaries + * (we want to keep the value of the checkbox between copy operations). + */ + gboolean op_preserve; + + /* Result from the recursive query */ + FileCopyMode recursive_result; + + /* Whether to do a reget */ + off_t do_reget; + + /* Controls appending to files */ + gboolean do_append; + + /* Whether to stat or lstat */ + gboolean follow_links; + + /* Pointer to the stat function we will use */ + mc_stat_fn stat_func; + + /* Whether to recompute symlinks */ + gboolean stable_symlinks; + + /* Preserve the original files' owner, group, permissions, and + * timestamps (owner, group only as root). + */ + gboolean preserve; + + /* If running as root, preserve the original uid/gid (we don't want to + * try chown for non root) preserve_uidgid = preserve && uid == 0 + */ + gboolean preserve_uidgid; + + /* The bits to preserve in created files' modes on file copy */ + mode_t umask_kill; + + /* The mask of files to actually operate on */ + char *dest_mask; + + /* search handler */ + struct mc_search_struct *search_handle; + + /* Whether to dive into subdirectories for recursive operations */ + gboolean dive_into_subdirs; + + /* When moving directories cross filesystem boundaries delete the + * successfully copied files when all files below the directory and its + * subdirectories were processed. + * + * If erase_at_end is FALSE files will be deleted immediately after their + * successful copy (Note: this behavior is not tested and at the moment + * it can't be changed at runtime). + */ + gboolean erase_at_end; + + /* PID of the child for background operations */ + pid_t pid; + + /* toggle if all errors should be ignored */ + gboolean skip_all; + + /* Whether the file operation is in pause */ + gboolean suspended; + + /* User interface data goes here */ + void *ui; +} file_op_context_t; + +typedef struct +{ + size_t progress_count; + size_t prev_progress_count; /* Used in OP_MOVE between copy and remove directories */ + uintmax_t progress_bytes; + uintmax_t copied_bytes; + size_t bps; + size_t bps_count; + gint64 transfer_start; + double eta_secs; + + gboolean ask_overwrite; +} file_op_total_context_t; + +/*** global variables defined in .c file *********************************************************/ + +extern const char *op_names[3]; + +/*** declarations of public functions ************************************************************/ + +file_op_context_t *file_op_context_new (FileOperation op); +void file_op_context_destroy (file_op_context_t * ctx); + +file_op_total_context_t *file_op_total_context_new (void); +void file_op_total_context_destroy (file_op_total_context_t * tctx); + +/* The following functions are implemented separately by each port */ +FileProgressStatus file_progress_real_query_replace (file_op_context_t * ctx, + enum OperationMode mode, const char *src, + struct stat *src_stat, const char *dst, + struct stat *dst_stat); + +/*** inline functions ****************************************************************************/ +#endif /* MC__FILEOPCTX_H */ |