HelenOS sources
This source file includes following definitions.
- navigator_copy_dlg
- copy_wfunc
- copy_bok
- copy_bcancel
- copy_close
- copy_abort_query
- copy_progress
#include <fmgt.h>
#include <stdlib.h>
#include <str_error.h>
#include <ui/fixed.h>
#include <ui/filelist.h>
#include <ui/msgdialog.h>
#include <ui/resource.h>
#include <ui/ui.h>
#include <ui/window.h>
#include <stdbool.h>
#include <str.h>
#include "copy.h"
#include "dlg/progress.h"
#include "dlg/copydlg.h"
#include "menu.h"
#include "nav.h"
#include "types/copy.h"
#include "panel.h"
static void copy_bok(copy_dlg_t *, void *);
static void copy_bcancel(copy_dlg_t *, void *);
static void copy_close(copy_dlg_t *, void *);
static copy_dlg_cb_t copy_cb = {
.bok = copy_bok,
.bcancel = copy_bcancel,
.close = copy_close
};
static bool copy_abort_query(void *);
static void copy_progress(void *, fmgt_progress_t *);
static fmgt_cb_t copy_fmgt_cb = {
.abort_query = copy_abort_query,
.io_error_query = navigator_io_error_query,
.progress = copy_progress,
};
void navigator_copy_dlg(navigator_t *navigator, fmgt_flist_t *flist)
{
copy_dlg_t *dlg;
panel_t *dpanel;
char *dest;
errno_t rc;
dpanel = navigator_get_inactive_panel(navigator);
if (dpanel == NULL) {
return;
}
dest = panel_get_dir(dpanel);
if (dest == NULL) {
return;
}
rc = copy_dlg_create(navigator->ui, flist, dest, &dlg);
if (rc != EOK) {
free(dest);
return;
}
copy_dlg_set_cb(dlg, ©_cb, (void *)navigator);
free(dest);
}
static void copy_wfunc(void *arg)
{
fmgt_t *fmgt = NULL;
navigator_copy_job_t *job = (navigator_copy_job_t *)arg;
char *msg = NULL;
navigator_t *nav = job->navigator;
ui_msg_dialog_t *dialog = NULL;
ui_msg_dialog_params_t params;
errno_t rc;
int rv;
rc = fmgt_create(&fmgt);
if (rc != EOK) {
return;
}
fmgt_set_cb(fmgt, ©_fmgt_cb, (void *)nav);
fmgt_set_init_update(fmgt, true);
rc = fmgt_copy(fmgt, job->flist, job->dest);
if (rc != EOK) {
rv = asprintf(&msg, "Error copying file(s) (%s).",
str_error(rc));
if (rv < 0)
return;
goto error;
}
fmgt_destroy(fmgt);
ui_lock(nav->ui);
progress_dlg_destroy(nav->progress_dlg);
navigator_refresh_panels(nav);
ui_unlock(nav->ui);
fmgt_flist_destroy(job->flist);
free(job);
return;
error:
fmgt_destroy(fmgt);
ui_lock(nav->ui);
progress_dlg_destroy(nav->progress_dlg);
navigator_refresh_panels(nav);
ui_msg_dialog_params_init(¶ms);
params.caption = "Error";
params.text = msg;
(void) ui_msg_dialog_create(nav->ui, ¶ms, &dialog);
ui_unlock(nav->ui);
free(msg);
}
static void copy_bok(copy_dlg_t *dlg, void *arg)
{
navigator_t *nav = (navigator_t *)arg;
ui_msg_dialog_t *dialog = NULL;
navigator_copy_job_t *job;
ui_msg_dialog_params_t params;
progress_dlg_params_t pd_params;
char *msg = NULL;
errno_t rc;
job = calloc(1, sizeof(navigator_copy_job_t));
if (job == NULL)
return;
job->navigator = nav;
job->flist = dlg->flist;
job->dest = str_dup(ui_entry_get_text(dlg->edest));
if (job->dest == NULL) {
free(job);
return;
}
copy_dlg_destroy(dlg);
dlg->flist = NULL;
progress_dlg_params_init(&pd_params);
pd_params.caption = "Copying";
rc = progress_dlg_create(nav->ui, &pd_params, &nav->progress_dlg);
if (rc != EOK) {
msg = str_dup("Out of memory.");
if (msg == NULL)
return;
goto error;
}
progress_dlg_set_cb(nav->progress_dlg, &navigator_progress_cb,
(void *)nav);
rc = navigator_worker_start(nav, copy_wfunc, (void *)job);
if (rc != EOK) {
msg = str_dup("Out of memory.");
if (msg == NULL)
return;
goto error;
}
return;
error:
ui_msg_dialog_params_init(¶ms);
params.caption = "Error";
params.text = msg;
(void) ui_msg_dialog_create(nav->ui, ¶ms, &dialog);
free(msg);
}
static void copy_bcancel(copy_dlg_t *dlg, void *arg)
{
(void)arg;
copy_dlg_destroy(dlg);
}
static void copy_close(copy_dlg_t *dlg, void *arg)
{
(void)arg;
copy_dlg_destroy(dlg);
}
static bool copy_abort_query(void *arg)
{
navigator_t *nav = (navigator_t *)arg;
return nav->abort_op;
}
static void copy_progress(void *arg, fmgt_progress_t *progress)
{
navigator_t *nav = (navigator_t *)arg;
progress_dlg_set_progress(nav->progress_dlg, progress);
}
HelenOS homepage, sources at GitHub