diff options
Diffstat (limited to 'Library/UefiShellUfmCommandLib/actions.c')
-rw-r--r-- | Library/UefiShellUfmCommandLib/actions.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/Library/UefiShellUfmCommandLib/actions.c b/Library/UefiShellUfmCommandLib/actions.c index 596e7c4..0089952 100644 --- a/Library/UefiShellUfmCommandLib/actions.c +++ b/Library/UefiShellUfmCommandLib/actions.c @@ -24,6 +24,8 @@ #define UPANEL ((PANEL == LEFT_PANEL) ? RIGHT_PANEL : LEFT_PANEL) #define FILECOUNT_LENGTH 20 +STATIC CONST CHAR16 cp_title[] = L" Copy "; +STATIC CONST CHAR16 cp_label[] = L"Copy %u files/directories to:"; STATIC CONST CHAR16 mv_title[] = L" Move "; STATIC CONST CHAR16 mv_label[] = L"Move %u files/directories to:"; STATIC CONST CHAR16 rm_title[] = L" Delete "; @@ -130,6 +132,48 @@ BOOLEAN hexedit(VOID) return TRUE; } +BOOLEAN cp(VOID) +{ + struct dbox_ctx *dbox; + UINTN i, size, line = PANEL->curline; + CHAR16 *label; + EFI_SHELL_FILE_INFO *file; + BOOLEAN status_op; + + if(!PANEL->cwd) + return FALSE; + + if(PANEL->marked < 1) + return FALSE; + + size = (StrLen(cp_label) + FILECOUNT_LENGTH + 1) * sizeof(CHAR16); + label = AllocatePool(size); + if(!label) + return FALSE; + + UnicodeSPrint(label, size, cp_label, PANEL->marked); + dbox = dbox_alloc(fm_ctx.scr, cp_title, label, TRUE, UPANEL->cwd); + + dbox_refresh(dbox); + status_op = dbox_handle(dbox); + if(status_op) { + for(i = 1; i <= PANEL->dirs->len; i++) { + if(PANEL->dirs->marked[i-1] == FALSE) + continue; + + file = dirl_getn(PANEL->dirs, i); + copy_file(file->FullName, dbox->in->buffer); // NOT UPANEL->cwd!!! + } + panel_cd_to(PANEL, PANEL->cwd); + panel_move_cursor(PANEL, (line > PANEL->dirs->len) ? PANEL->dirs->len : line); + } + + redraw(); + FreePool(label); + dbox_release(dbox); + return TRUE; +} + BOOLEAN mv(VOID) { struct dbox_ctx *dbox; |