2 Defines the Main Editor data type -
4 - Instances of the other objects of the editor
7 Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>
8 This program and the accompanying materials
9 are licensed and made available under the terms and conditions of the BSD License
10 which accompanies this distribution. The full text of the license may be found at
11 http://opensource.org/licenses/bsd-license.php
13 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
14 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 #include "HexEditor.h"
19 #include "EditStatusBar.h"
20 #include "EditInputBar.h"
22 HEFI_EDITOR_COLOR_ATTRIBUTES HOriginalColors
;
26 // the first time editor launch
31 // it's time editor should exit
35 BOOLEAN HEditorMouseAction
;
37 extern HEFI_EDITOR_BUFFER_IMAGE HBufferImage
;
38 extern HEFI_EDITOR_BUFFER_IMAGE HBufferImageBackupVar
;
40 extern BOOLEAN HBufferImageMouseNeedRefresh
;
41 extern BOOLEAN HBufferImageNeedRefresh
;
42 extern BOOLEAN HBufferImageOnlyLineNeedRefresh
;
44 HEFI_EDITOR_GLOBAL_EDITOR HMainEditor
;
45 HEFI_EDITOR_GLOBAL_EDITOR HMainEditorBackupVar
;
48 // basic initialization for MainEditor
50 HEFI_EDITOR_GLOBAL_EDITOR HMainEditorConst
= {
69 Help info that will be displayed.
71 EFI_STRING_ID HexMainMenuHelpInfo
[] = {
72 STRING_TOKEN(STR_HEXEDIT_HELP_TITLE
),
73 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
74 STRING_TOKEN(STR_HEXEDIT_HELP_LIST_TITLE
),
75 STRING_TOKEN(STR_HEXEDIT_HELP_DIV
),
76 STRING_TOKEN(STR_HEXEDIT_HELP_GO_TO_OFFSET
),
77 STRING_TOKEN(STR_HEXEDIT_HELP_SAVE_BUFFER
),
78 STRING_TOKEN(STR_HEXEDIT_HELP_EXIT
),
79 STRING_TOKEN(STR_HEXEDIT_HELP_SELECT_START
),
80 STRING_TOKEN(STR_HEXEDIT_HELP_SELECT_END
),
81 STRING_TOKEN(STR_HEXEDIT_HELP_CUT
),
82 STRING_TOKEN(STR_HEXEDIT_HELP_PASTE
),
83 STRING_TOKEN(STR_HEXEDIT_HELP_OPEN_FILE
),
84 STRING_TOKEN(STR_HEXEDIT_HELP_OPEN_DISK
),
85 STRING_TOKEN(STR_HEXEDIT_HELP_OPEN_MEMORY
),
86 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
87 STRING_TOKEN(STR_HEXEDIT_HELP_EXIT_HELP
),
88 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
89 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
90 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
91 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
92 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
93 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
94 STRING_TOKEN(STR_HEXEDIT_HELP_DIV
),
102 @retval EFI_SUCCESS The operation was successful.
105 HMainCommandDisplayHelp (
111 EFI_KEY_DATA KeyData
;
118 for (CurrentLine
= 0; 0 != HexMainMenuHelpInfo
[CurrentLine
]; CurrentLine
++) {
119 InfoString
= HiiGetString(gShellDebug1HiiHandle
, HexMainMenuHelpInfo
[CurrentLine
]
121 ShellPrintEx (0,CurrentLine
+1,L
"%E%s%N",InfoString
);
128 Status
= gBS
->WaitForEvent (1, &HMainEditor
.TextInputEx
->WaitForKeyEx
, &EventIndex
);
129 if (EFI_ERROR (Status
) || (EventIndex
!= 0)) {
132 Status
= HMainEditor
.TextInputEx
->ReadKeyStrokeEx (HMainEditor
.TextInputEx
, &KeyData
);
133 if (EFI_ERROR (Status
)) {
137 if (((KeyData
.KeyState
.KeyShiftState
& EFI_SHIFT_STATE_VALID
) == 0) ||
138 (KeyData
.KeyState
.KeyShiftState
== EFI_SHIFT_STATE_VALID
)) {
140 // For consoles that don't support/report shift state,
141 // CTRL+W is translated to L'W' - L'A' + 1.
143 if (KeyData
.Key
.UnicodeChar
== L
'W' - L
'A' + 1) {
146 } else if (((KeyData
.KeyState
.KeyShiftState
& EFI_SHIFT_STATE_VALID
) != 0) &&
147 ((KeyData
.KeyState
.KeyShiftState
& (EFI_LEFT_CONTROL_PRESSED
| EFI_RIGHT_CONTROL_PRESSED
)) != 0) &&
148 ((KeyData
.KeyState
.KeyShiftState
& ~(EFI_SHIFT_STATE_VALID
| EFI_LEFT_CONTROL_PRESSED
| EFI_RIGHT_CONTROL_PRESSED
)) == 0)) {
150 // For consoles that supports/reports shift state,
151 // make sure that only CONTROL shift key is pressed.
153 if ((KeyData
.Key
.UnicodeChar
== 'w') || (KeyData
.Key
.UnicodeChar
== 'W')) {
159 // update screen with buffer's info
160 HBufferImageNeedRefresh
= TRUE
;
161 HBufferImageOnlyLineNeedRefresh
= FALSE
;
162 HBufferImageRefresh ();
168 Move cursor to specified lines.
170 @retval EFI_SUCCESS The operation was successful.
173 HMainCommandGoToOffset (
184 // variable initialization
194 Status
= InputBarSetPrompt (L
"Go To Offset: ");
195 if (EFI_ERROR (Status
)) {
199 Status
= InputBarSetStringSize (8);
200 if (EFI_ERROR (Status
)) {
205 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
210 if (Status
== EFI_NOT_READY
) {
215 // THE input string length should > 0
217 if (StrLen (InputBarGetString()) > 0) {
218 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Offset
, TRUE
, FALSE
);
219 if (EFI_ERROR (Status
)) {
220 StatusBarSetStatusString (L
"Invalid Offset");
228 Size
= HBufferImageGetTotalSize ();
229 if (Offset
>= Size
) {
230 StatusBarSetStatusString (L
"Invalid Offset");
234 FRow
= (UINTN
)DivU64x32(Offset
, 0x10) + 1;
235 FCol
= (UINTN
)ModU64x32(Offset
, 0x10) + 1;
237 HBufferImageMovePosition (FRow
, FCol
, TRUE
);
239 HBufferImageNeedRefresh
= TRUE
;
240 HBufferImageOnlyLineNeedRefresh
= FALSE
;
241 HBufferImageMouseNeedRefresh
= TRUE
;
247 Save current opened buffer.
248 If is file buffer, you can save to current file name or
249 save to another file name.
251 @retval EFI_SUCCESS The operation was successful.
252 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
253 @retval EFI_LOAD_ERROR A load error occured.
256 HMainCommandSaveBuffer (
266 SHELL_FILE_HANDLE ShellFileHandle
;
268 if (HMainEditor
.BufferImage
->BufferType
!= FileTypeFileBuffer
) {
269 if (!HMainEditor
.BufferImage
->Modified
) {
273 Status
= InputBarSetPrompt (L
"Dangerous to save disk/mem buffer. Save (Yes/No/Cancel) ? ");
274 if (EFI_ERROR (Status
)) {
278 // the answer is just one character
280 Status
= InputBarSetStringSize (1);
281 if (EFI_ERROR (Status
)) {
285 // loop for user's answer
286 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
289 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
294 if (Status
== EFI_NOT_READY
) {
298 switch (InputBarGetString()[0]) {
302 // want to save this buffer first
304 Status
= HBufferImageSave (
306 HMainEditor
.BufferImage
->DiskImage
->Name
,
307 HMainEditor
.BufferImage
->DiskImage
->Offset
,
308 HMainEditor
.BufferImage
->DiskImage
->Size
,
309 HMainEditor
.BufferImage
->MemImage
->Offset
,
310 HMainEditor
.BufferImage
->MemImage
->Size
,
311 HMainEditor
.BufferImage
->BufferType
314 if (EFI_ERROR (Status
)) {
315 StatusBarSetStatusString (L
"BufferSave: Problems Writing");
324 // the file won't be saved
341 // ENDOF != FILEBUFFER
343 // This command will save currently opened file to disk.
344 // You can choose save to another file name or just save to
345 // current file name.
346 // Below is the scenario of Save File command: (
347 // Suppose the old file name is A )
348 // 1. An Input Bar will be prompted: "File To Save: [ old file name]"
349 // IF user press ESC, Save File command ends .
350 // IF user press Enter, input file name will be A.
351 // IF user inputs a new file name B, input file name will be B.
353 // 2. IF input file name is A, go to do Step 3.
354 // IF input file name is B, go to do Step 4.
356 // 3. IF A is read only, Status Bar will show "Access Denied"
357 // and Save File commands ends.
358 // IF A is not read only, save file buffer to disk
359 // and remove Modified flag in Title Bar , then Save File command ends.
361 // 4. IF B does not exist, create this file and save file buffer to it.
363 // IF B exits, do Step 5.
365 // 5. An Input Bar will be prompted:
366 // "File Exists. Overwrite ( Yes/No/Cancel ) ?"
367 // IF user press 'y' or 'Y', do Step 6.
368 // IF user press 'n' or 'N', Save File commands ends.
369 // IF user press 'c' or 'C' or ESC, Save File commands ends.
371 // 6. IF B is a read-only file, Status Bar will show "Access Denied"
372 // and Save File commands ends.
373 // IF B can be read and write, save file buffer to B.
375 // 7. Update File Name field in Title Bar to B
376 // and remove the Modified flag in Title Bar.
378 Str
= CatSPrint(NULL
,
379 L
"File to Save: [%s]",
380 HMainEditor
.BufferImage
->FileImage
->FileName
383 return EFI_OUT_OF_RESOURCES
;
386 if (StrLen (Str
) >= 50) {
388 // replace the long file name with "..."
397 Status
= InputBarSetPrompt (Str
);
398 if (EFI_ERROR (Status
)) {
402 Status
= InputBarSetStringSize (100);
403 if (EFI_ERROR (Status
)) {
409 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
412 // if user pressed ESC
414 if (Status
== EFI_NOT_READY
) {
415 SHELL_FREE_NON_NULL (Str
);
419 SHELL_FREE_NON_NULL (Str
);
422 // if just enter pressed, so think save to current file name
424 if (StrLen (InputBarGetString()) == 0) {
425 FileName
= CatSPrint(NULL
,
427 HMainEditor
.BufferImage
->FileImage
->FileName
430 FileName
= CatSPrint(NULL
, L
"%s", InputBarGetString());
433 if (FileName
== NULL
) {
434 return EFI_OUT_OF_RESOURCES
;
437 if (!IsValidFileName (FileName
)) {
438 StatusBarSetStatusString (L
"Invalid File Name");
439 SHELL_FREE_NON_NULL (FileName
);
446 // save to the old file
448 if (StringNoCaseCompare (
450 &HMainEditor
.BufferImage
->FileImage
->FileName
457 // if the file is read only, so can not write back to it.
459 if (HMainEditor
.BufferImage
->FileImage
->ReadOnly
) {
460 StatusBarSetStatusString (L
"Access Denied");
461 SHELL_FREE_NON_NULL (FileName
);
465 Status
= ShellOpenFileByName (FileName
, &ShellFileHandle
, EFI_FILE_MODE_READ
, 0);
467 if (!EFI_ERROR (Status
)) {
469 Info
= ShellGetFileInfo(ShellFileHandle
);
471 ShellCloseFile(&ShellFileHandle
);
473 // check if read only
475 if (Info
->Attribute
& EFI_FILE_READ_ONLY
) {
476 StatusBarSetStatusString (L
"Access Denied");
477 SHELL_FREE_NON_NULL (FileName
);
481 SHELL_FREE_NON_NULL(Info
);
483 // ask user whether to overwrite this file
485 Status
= InputBarSetPrompt (L
"File exists. Overwrite (Yes/No/Cancel) ? ");
486 if (EFI_ERROR (Status
)) {
487 SHELL_FREE_NON_NULL (FileName
);
491 Status
= InputBarSetStringSize (1);
492 if (EFI_ERROR (Status
)) {
493 SHELL_FREE_NON_NULL (FileName
);
499 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
501 if (Status
== EFI_NOT_READY
) {
502 SHELL_FREE_NON_NULL (FileName
);
506 switch (InputBarGetString()[0]) {
513 SHELL_FREE_NON_NULL (FileName
);
517 SHELL_FREE_NON_NULL (FileName
);
521 } // if opened existing file
525 // save file back to disk
527 Status
= HBufferImageSave (
529 HMainEditor
.BufferImage
->DiskImage
->Name
,
530 HMainEditor
.BufferImage
->DiskImage
->Offset
,
531 HMainEditor
.BufferImage
->DiskImage
->Size
,
532 HMainEditor
.BufferImage
->MemImage
->Offset
,
533 HMainEditor
.BufferImage
->MemImage
->Size
,
536 SHELL_FREE_NON_NULL (FileName
);
538 if (EFI_ERROR (Status
)) {
539 return EFI_LOAD_ERROR
;
546 Load a disk buffer editor.
548 @retval EFI_SUCCESS The operation was successful.
549 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
550 @retval EFI_LOAD_ERROR A load error occured.
553 HMainCommandSelectStart (
559 Start
= (HMainEditor
.BufferImage
->BufferPosition
.Row
- 1) * 0x10 + HMainEditor
.BufferImage
->BufferPosition
.Column
;
564 if (HMainEditor
.BufferImage
->CurrentLine
->Link
.ForwardLink
== HMainEditor
.BufferImage
->ListHead
) {
565 if (HMainEditor
.BufferImage
->BufferPosition
.Column
> HMainEditor
.BufferImage
->CurrentLine
->Size
) {
566 StatusBarSetStatusString (L
"Invalid Block Start");
567 return EFI_LOAD_ERROR
;
571 if (HMainEditor
.SelectEnd
!= 0 && Start
> HMainEditor
.SelectEnd
) {
572 StatusBarSetStatusString (L
"Invalid Block Start");
573 return EFI_LOAD_ERROR
;
576 HMainEditor
.SelectStart
= Start
;
578 HBufferImageNeedRefresh
= TRUE
;
584 Load a disk buffer editor.
586 @retval EFI_SUCCESS The operation was successful.
587 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
588 @retval EFI_LOAD_ERROR A load error occured.
591 HMainCommandSelectEnd (
597 End
= (HMainEditor
.BufferImage
->BufferPosition
.Row
- 1) * 0x10 + HMainEditor
.BufferImage
->BufferPosition
.Column
;
602 if (HMainEditor
.BufferImage
->CurrentLine
->Link
.ForwardLink
== HMainEditor
.BufferImage
->ListHead
) {
603 if (HMainEditor
.BufferImage
->BufferPosition
.Column
> HMainEditor
.BufferImage
->CurrentLine
->Size
) {
604 StatusBarSetStatusString (L
"Invalid Block End");
605 return EFI_LOAD_ERROR
;
609 if (HMainEditor
.SelectStart
!= 0 && End
< HMainEditor
.SelectStart
) {
610 StatusBarSetStatusString (L
"Invalid Block End");
614 HMainEditor
.SelectEnd
= End
;
616 HBufferImageNeedRefresh
= TRUE
;
622 Cut current line to clipboard.
624 @retval EFI_SUCCESS The operation was successful.
625 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
626 @retval EFI_LOAD_ERROR A load error occured.
639 // not select, so not allowed to cut
641 if (HMainEditor
.SelectStart
== 0) {
642 StatusBarSetStatusString (L
"No Block is Selected");
646 // not select, so not allowed to cut
648 if (HMainEditor
.SelectEnd
== 0) {
649 StatusBarSetStatusString (L
"No Block is Selected");
653 Link
= HMainEditor
.BufferImage
->ListHead
->ForwardLink
;
654 for (Index
= 0; Index
< (HMainEditor
.SelectEnd
- 1) / 0x10; Index
++) {
655 Link
= Link
->ForwardLink
;
658 Count
= HMainEditor
.SelectEnd
- HMainEditor
.SelectStart
+ 1;
659 Buffer
= AllocateZeroPool (Count
);
660 if (Buffer
== NULL
) {
661 return EFI_OUT_OF_RESOURCES
;
664 // cut the selected area
666 HBufferImageDeleteCharacterFromBuffer (
667 HMainEditor
.SelectStart
- 1,
675 HClipBoardSet (Buffer
, Count
);
677 HBufferImageNeedRefresh
= TRUE
;
678 HBufferImageOnlyLineNeedRefresh
= FALSE
;
680 if (!HMainEditor
.BufferImage
->Modified
) {
681 HMainEditor
.BufferImage
->Modified
= TRUE
;
685 // now no select area
687 HMainEditor
.SelectStart
= 0;
688 HMainEditor
.SelectEnd
= 0;
694 Paste line to file buffer.
696 @retval EFI_SUCCESS The operation was successful.
697 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
698 @retval EFI_LOAD_ERROR A load error occured.
706 BOOLEAN OnlyLineRefresh
;
707 HEFI_EDITOR_LINE
*Line
;
712 Count
= HClipBoardGet (&Buffer
);
713 if (Count
== 0 || Buffer
== NULL
) {
714 StatusBarSetStatusString (L
"Nothing to Paste");
718 Line
= HMainEditor
.BufferImage
->CurrentLine
;
720 OnlyLineRefresh
= FALSE
;
721 if (Line
->Link
.ForwardLink
== HMainEditor
.BufferImage
->ListHead
&& Line
->Size
+ Count
< 0x10) {
723 // is at last line, and after paste will not exceed
724 // so only this line need to be refreshed
726 // if after add, the line is 0x10, then will append a new line
727 // so the whole page will need be refreshed
729 OnlyLineRefresh
= TRUE
;
733 FPos
= 0x10 * (HMainEditor
.BufferImage
->BufferPosition
.Row
- 1) + HMainEditor
.BufferImage
->BufferPosition
.Column
- 1;
735 HBufferImageAddCharacterToBuffer (FPos
, Count
, Buffer
);
737 if (OnlyLineRefresh
) {
738 HBufferImageNeedRefresh
= FALSE
;
739 HBufferImageOnlyLineNeedRefresh
= TRUE
;
741 HBufferImageNeedRefresh
= TRUE
;
742 HBufferImageOnlyLineNeedRefresh
= FALSE
;
745 if (!HMainEditor
.BufferImage
->Modified
) {
746 HMainEditor
.BufferImage
->Modified
= TRUE
;
756 @retval EFI_SUCCESS The operation was successful.
757 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
758 @retval EFI_LOAD_ERROR A load error occured.
768 // Below is the scenario of Exit command:
769 // 1. IF currently opened file is not modified, exit the editor and
770 // Exit command ends.
771 // IF currently opened file is modified, do Step 2
773 // 2. An Input Bar will be prompted:
774 // "File modified. Save ( Yes/No/Cancel )?"
775 // IF user press 'y' or 'Y', currently opened file will be saved and
777 // IF user press 'n' or 'N', currently opened file will not be saved
779 // IF user press 'c' or 'C' or ESC, Exit command ends.
782 // if file has been modified, so will prompt user
783 // whether to save the changes
785 if (HMainEditor
.BufferImage
->Modified
) {
787 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
788 if (EFI_ERROR (Status
)) {
792 Status
= InputBarSetStringSize (1);
793 if (EFI_ERROR (Status
)) {
798 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
803 if (Status
== EFI_NOT_READY
) {
807 switch (InputBarGetString()[0]) {
811 // write file back to disk
813 Status
= HBufferImageSave (
814 HMainEditor
.BufferImage
->FileImage
->FileName
,
815 HMainEditor
.BufferImage
->DiskImage
->Name
,
816 HMainEditor
.BufferImage
->DiskImage
->Offset
,
817 HMainEditor
.BufferImage
->DiskImage
->Size
,
818 HMainEditor
.BufferImage
->MemImage
->Offset
,
819 HMainEditor
.BufferImage
->MemImage
->Size
,
820 HMainEditor
.BufferImage
->BufferType
822 if (!EFI_ERROR (Status
)) {
847 Load a file from disk to editor.
849 @retval EFI_SUCCESS The operation was successful.
850 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
851 @retval EFI_LOAD_ERROR A load error occured.
854 HMainCommandOpenFile (
860 EDIT_FILE_TYPE BufferType
;
862 BufferType
= HMainEditor
.BufferImage
->BufferType
;
865 // This command will open a file from current working directory.
866 // Read-only file can also be opened. But it can not be modified.
867 // Below is the scenario of Open File command:
868 // 1. IF currently opened file has not been modified, directly go to step .
869 // IF currently opened file has been modified, an Input Bar will be
871 // "File Modified. Save ( Yes/No/Cancel) ?"
872 // IF user press 'y' or 'Y', currently opened file will be saved.
873 // IF user press 'n' or 'N', currently opened file will
875 // IF user press 'c' or 'C' or ESC, Open File command ends and
876 // currently opened file is still opened.
878 // 2. An Input Bar will be prompted as : "File Name to Open: "
879 // IF user press ESC, Open File command ends and
880 // currently opened file is still opened.
881 // Any other inputs with a Return will cause
882 // currently opened file close.
884 // 3. IF user input file name is an existing file ,
885 // this file will be read and opened.
886 // IF user input file name is a new file, this file will be created
887 // and opened. This file's type ( UNICODE or ASCII ) is the same with
891 // if current file is modified, so you need to choose whether to
894 if (HMainEditor
.BufferImage
->Modified
) {
896 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
897 if (EFI_ERROR (Status
)) {
901 // the answer is just one character
903 Status
= InputBarSetStringSize (1);
904 if (EFI_ERROR (Status
)) {
908 // loop for user's answer
909 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
913 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
918 if (Status
== EFI_NOT_READY
) {
922 switch (InputBarGetString()[0]) {
926 // want to save this buffer first
928 Status
= HBufferImageSave (
929 HMainEditor
.BufferImage
->FileImage
->FileName
,
930 HMainEditor
.BufferImage
->DiskImage
->Name
,
931 HMainEditor
.BufferImage
->DiskImage
->Offset
,
932 HMainEditor
.BufferImage
->DiskImage
->Size
,
933 HMainEditor
.BufferImage
->MemImage
->Offset
,
934 HMainEditor
.BufferImage
->MemImage
->Size
,
935 HMainEditor
.BufferImage
->BufferType
937 if (EFI_ERROR (Status
)) {
941 MainTitleBarRefresh (
942 HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
?HMainEditor
.BufferImage
->FileImage
->FileName
:HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Name
:NULL
,
943 HMainEditor
.BufferImage
->BufferType
,
944 HMainEditor
.BufferImage
->FileImage
->ReadOnly
,
946 HMainEditor
.ScreenSize
.Column
,
947 HMainEditor
.ScreenSize
.Row
,
948 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Offset
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Offset
:0,
949 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Size
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Size
:0
957 // the file won't be saved
969 // TO get the open file name
971 Status
= InputBarSetPrompt (L
"File Name to Open: ");
972 if (EFI_ERROR (Status
)) {
974 HMainEditor
.BufferImage
->FileImage
->FileName
,
975 HMainEditor
.BufferImage
->DiskImage
->Name
,
976 HMainEditor
.BufferImage
->DiskImage
->Offset
,
977 HMainEditor
.BufferImage
->DiskImage
->Size
,
978 HMainEditor
.BufferImage
->MemImage
->Offset
,
979 HMainEditor
.BufferImage
->MemImage
->Size
,
986 Status
= InputBarSetStringSize (100);
987 if (EFI_ERROR (Status
)) {
988 Status
= HBufferImageRead (
989 HMainEditor
.BufferImage
->FileImage
->FileName
,
990 HMainEditor
.BufferImage
->DiskImage
->Name
,
991 HMainEditor
.BufferImage
->DiskImage
->Offset
,
992 HMainEditor
.BufferImage
->DiskImage
->Size
,
993 HMainEditor
.BufferImage
->MemImage
->Offset
,
994 HMainEditor
.BufferImage
->MemImage
->Size
,
1002 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1007 if (Status
== EFI_NOT_READY
) {
1008 Status
= HBufferImageRead (
1009 HMainEditor
.BufferImage
->FileImage
->FileName
,
1010 HMainEditor
.BufferImage
->DiskImage
->Name
,
1011 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1012 HMainEditor
.BufferImage
->DiskImage
->Size
,
1013 HMainEditor
.BufferImage
->MemImage
->Offset
,
1014 HMainEditor
.BufferImage
->MemImage
->Size
,
1022 // THE input string length should > 0
1024 if (StrLen (InputBarGetString()) > 0) {
1026 // CHECK if filename's valid
1028 if (!IsValidFileName (InputBarGetString())) {
1030 HMainEditor
.BufferImage
->FileImage
->FileName
,
1031 HMainEditor
.BufferImage
->DiskImage
->Name
,
1032 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1033 HMainEditor
.BufferImage
->DiskImage
->Size
,
1034 HMainEditor
.BufferImage
->MemImage
->Offset
,
1035 HMainEditor
.BufferImage
->MemImage
->Size
,
1040 StatusBarSetStatusString (L
"Invalid File Name");
1050 Status
= HBufferImageRead (
1051 InputBarGetString(),
1052 HMainEditor
.BufferImage
->DiskImage
->Name
,
1053 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1054 HMainEditor
.BufferImage
->DiskImage
->Size
,
1055 HMainEditor
.BufferImage
->MemImage
->Offset
,
1056 HMainEditor
.BufferImage
->MemImage
->Size
,
1061 if (EFI_ERROR (Status
)) {
1063 HMainEditor
.BufferImage
->FileImage
->FileName
,
1064 HMainEditor
.BufferImage
->DiskImage
->Name
,
1065 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1066 HMainEditor
.BufferImage
->DiskImage
->Size
,
1067 HMainEditor
.BufferImage
->MemImage
->Offset
,
1068 HMainEditor
.BufferImage
->MemImage
->Size
,
1073 return EFI_LOAD_ERROR
;
1080 Load a disk buffer editor.
1082 @retval EFI_SUCCESS The operation was successful.
1083 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
1084 @retval EFI_LOAD_ERROR A load error occured.
1085 @retval EFI_NOT_FOUND The disk was not found.
1088 HMainCommandOpenDisk (
1098 EDIT_FILE_TYPE BufferType
;
1101 // variable initialization
1105 BufferType
= HMainEditor
.BufferImage
->BufferType
;
1108 // if current file is modified, so you need to choose
1109 // whether to save it first.
1111 if (HMainEditor
.BufferImage
->Modified
) {
1113 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
1114 if (EFI_ERROR (Status
)) {
1118 // the answer is just one character
1120 Status
= InputBarSetStringSize (1);
1121 if (EFI_ERROR (Status
)) {
1125 // loop for user's answer
1126 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
1130 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1135 if (Status
== EFI_NOT_READY
) {
1139 switch (InputBarGetString()[0]) {
1143 // want to save this buffer first
1145 Status
= HBufferImageSave (
1146 HMainEditor
.BufferImage
->FileImage
->FileName
,
1147 HMainEditor
.BufferImage
->DiskImage
->Name
,
1148 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1149 HMainEditor
.BufferImage
->DiskImage
->Size
,
1150 HMainEditor
.BufferImage
->MemImage
->Offset
,
1151 HMainEditor
.BufferImage
->MemImage
->Size
,
1154 if (EFI_ERROR (Status
)) {
1158 MainTitleBarRefresh (
1159 HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
?HMainEditor
.BufferImage
->FileImage
->FileName
:HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Name
:NULL
,
1160 HMainEditor
.BufferImage
->BufferType
,
1161 HMainEditor
.BufferImage
->FileImage
->ReadOnly
,
1163 HMainEditor
.ScreenSize
.Column
,
1164 HMainEditor
.ScreenSize
.Row
,
1165 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Offset
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Offset
:0,
1166 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Size
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Size
:0
1174 // the file won't be saved
1186 // get disk block device name
1188 Status
= InputBarSetPrompt (L
"Block Device to Open: ");
1189 if (EFI_ERROR (Status
)) {
1193 Status
= InputBarSetStringSize (100);
1194 if (EFI_ERROR (Status
)) {
1199 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1204 if (Status
== EFI_NOT_READY
) {
1209 // THE input string length should > 0
1211 if (StrLen (InputBarGetString()) > 0) {
1216 DeviceName
= CatSPrint(NULL
, L
"%s", InputBarGetString());
1217 if (DeviceName
== NULL
) {
1218 return EFI_OUT_OF_RESOURCES
;
1221 // get starting offset
1223 Status
= InputBarSetPrompt (L
"First Block No.: ");
1224 if (EFI_ERROR (Status
)) {
1228 Status
= InputBarSetStringSize (16);
1229 if (EFI_ERROR (Status
)) {
1234 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1239 if (Status
== EFI_NOT_READY
) {
1244 // THE input string length should > 0
1246 if (StrLen (InputBarGetString()) > 0) {
1247 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Offset
, TRUE
, FALSE
);
1248 if (EFI_ERROR (Status
)) {
1256 // get Number of Blocks:
1258 Status
= InputBarSetPrompt (L
"Number of Blocks: ");
1259 if (EFI_ERROR (Status
)) {
1263 Status
= InputBarSetStringSize (8);
1264 if (EFI_ERROR (Status
)) {
1269 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1274 if (Status
== EFI_NOT_READY
) {
1279 // THE input string length should > 0
1281 if (StrLen (InputBarGetString()) > 0) {
1282 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Size
, TRUE
, FALSE
);
1283 if (EFI_ERROR (Status
)) {
1295 Status
= HBufferImageRead (
1306 if (EFI_ERROR (Status
)) {
1309 HMainEditor
.BufferImage
->FileImage
->FileName
,
1310 HMainEditor
.BufferImage
->DiskImage
->Name
,
1311 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1312 HMainEditor
.BufferImage
->DiskImage
->Size
,
1313 HMainEditor
.BufferImage
->MemImage
->Offset
,
1314 HMainEditor
.BufferImage
->MemImage
->Size
,
1318 return EFI_NOT_FOUND
;
1325 Load memory content to editor
1327 @retval EFI_SUCCESS The operation was successful.
1328 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
1329 @retval EFI_LOAD_ERROR A load error occured.
1330 @retval EFI_NOT_FOUND The disk was not found.
1333 HMainCommandOpenMemory (
1341 EDIT_FILE_TYPE BufferType
;
1344 // variable initialization
1348 BufferType
= HMainEditor
.BufferImage
->BufferType
;
1351 // if current buffer is modified, so you need to choose
1352 // whether to save it first.
1354 if (HMainEditor
.BufferImage
->Modified
) {
1356 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
1357 if (EFI_ERROR (Status
)) {
1361 // the answer is just one character
1363 Status
= InputBarSetStringSize (1);
1364 if (EFI_ERROR (Status
)) {
1368 // loop for user's answer
1369 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
1373 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1378 if (Status
== EFI_NOT_READY
) {
1382 switch (InputBarGetString()[0]) {
1386 // want to save this buffer first
1388 Status
= HBufferImageSave (
1389 HMainEditor
.BufferImage
->FileImage
->FileName
,
1390 HMainEditor
.BufferImage
->DiskImage
->Name
,
1391 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1392 HMainEditor
.BufferImage
->DiskImage
->Size
,
1393 HMainEditor
.BufferImage
->MemImage
->Offset
,
1394 HMainEditor
.BufferImage
->MemImage
->Size
,
1397 if (EFI_ERROR (Status
)) {
1401 MainTitleBarRefresh (
1402 HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
?HMainEditor
.BufferImage
->FileImage
->FileName
:HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Name
:NULL
,
1403 HMainEditor
.BufferImage
->BufferType
,
1404 HMainEditor
.BufferImage
->FileImage
->ReadOnly
,
1406 HMainEditor
.ScreenSize
.Column
,
1407 HMainEditor
.ScreenSize
.Row
,
1408 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Offset
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Offset
:0,
1409 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Size
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Size
:0
1417 // the file won't be saved
1429 // get starting offset
1431 Status
= InputBarSetPrompt (L
"Starting Offset: ");
1432 if (EFI_ERROR (Status
)) {
1436 Status
= InputBarSetStringSize (8);
1437 if (EFI_ERROR (Status
)) {
1442 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1447 if (Status
== EFI_NOT_READY
) {
1452 // THE input string length should > 0
1454 if (StrLen (InputBarGetString()) > 0) {
1455 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Offset
, TRUE
, FALSE
);
1456 if (EFI_ERROR (Status
)) {
1464 // get Number of Blocks:
1466 Status
= InputBarSetPrompt (L
"Buffer Size: ");
1467 if (EFI_ERROR (Status
)) {
1471 Status
= InputBarSetStringSize (8);
1472 if (EFI_ERROR (Status
)) {
1477 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1482 if (Status
== EFI_NOT_READY
) {
1487 // THE input string length should > 0
1489 if (StrLen (InputBarGetString()) > 0) {
1490 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Size
, TRUE
, FALSE
);
1491 if (EFI_ERROR (Status
)) {
1503 if ((Offset
+ Size
- 1)> 0xffffffff) {
1504 StatusBarSetStatusString (L
"Invalid parameter");
1505 return EFI_LOAD_ERROR
;
1508 Status
= HBufferImageRead (
1519 if (EFI_ERROR (Status
)) {
1520 StatusBarSetStatusString (L
"Read Device Error!");
1522 HMainEditor
.BufferImage
->FileImage
->FileName
,
1523 HMainEditor
.BufferImage
->DiskImage
->Name
,
1524 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1525 HMainEditor
.BufferImage
->DiskImage
->Size
,
1526 HMainEditor
.BufferImage
->MemImage
->Offset
,
1527 HMainEditor
.BufferImage
->MemImage
->Size
,
1531 return EFI_NOT_FOUND
;
1537 MENU_ITEM_FUNCTION HexMainControlBasedMenuFunctions
[] = {
1539 NULL
, /* Ctrl - A */
1540 NULL
, /* Ctrl - B */
1541 NULL
, /* Ctrl - C */
1542 HMainCommandSelectEnd
, /* Ctrl - D */
1543 HMainCommandDisplayHelp
, /* Ctrl - E */
1544 NULL
, /* Ctrl - F */
1545 HMainCommandGoToOffset
, /* Ctrl - G */
1546 NULL
, /* Ctrl - H */
1547 HMainCommandOpenDisk
, /* Ctrl - I */
1548 NULL
, /* Ctrl - J */
1549 NULL
, /* Ctrl - K */
1550 NULL
, /* Ctrl - L */
1551 HMainCommandOpenMemory
, /* Ctrl - M */
1552 NULL
, /* Ctrl - N */
1553 HMainCommandOpenFile
, /* Ctrl - O */
1554 NULL
, /* Ctrl - P */
1555 HMainCommandExit
, /* Ctrl - Q */
1556 NULL
, /* Ctrl - R */
1557 HMainCommandSaveBuffer
, /* Ctrl - S */
1558 HMainCommandSelectStart
, /* Ctrl - T */
1559 NULL
, /* Ctrl - U */
1560 HMainCommandPaste
, /* Ctrl - V */
1561 NULL
, /* Ctrl - W */
1562 HMainCommandCut
, /* Ctrl - X */
1563 NULL
, /* Ctrl - Y */
1564 NULL
, /* Ctrl - Z */
1567 CONST EDITOR_MENU_ITEM HexEditorMenuItems
[] = {
1569 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_GO_TO_OFFSET
),
1570 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F1
),
1571 HMainCommandGoToOffset
1574 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_SAVE_BUFFER
),
1575 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F2
),
1576 HMainCommandSaveBuffer
1579 STRING_TOKEN(STR_EDIT_LIBMENUBAR_EXIT
),
1580 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F3
),
1585 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_SELECT_START
),
1586 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F4
),
1587 HMainCommandSelectStart
1590 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_SELECT_END
),
1591 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F5
),
1592 HMainCommandSelectEnd
1595 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_CUT
),
1596 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F6
),
1600 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_PASTE
),
1601 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F7
),
1606 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_OPEN_FILE
),
1607 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F8
),
1608 HMainCommandOpenFile
1611 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_OPEN_DISK
),
1612 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F9
),
1613 HMainCommandOpenDisk
1616 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_OPEN_MEMORY
),
1617 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F10
),
1618 HMainCommandOpenMemory
1629 Init function for MainEditor
1631 @retval EFI_SUCCESS The operation was successful.
1632 @retval EFI_LOAD_ERROR A load error occured.
1640 EFI_HANDLE
*HandleBuffer
;
1645 // basic initialization
1647 CopyMem (&HMainEditor
, &HMainEditorConst
, sizeof (HMainEditor
));
1650 // set screen attributes
1652 HMainEditor
.ColorAttributes
.Colors
.Foreground
= gST
->ConOut
->Mode
->Attribute
& 0x000000ff;
1654 HMainEditor
.ColorAttributes
.Colors
.Background
= (UINT8
) (gST
->ConOut
->Mode
->Attribute
>> 4);
1656 HOriginalColors
= HMainEditor
.ColorAttributes
.Colors
;
1658 HOriginalMode
= gST
->ConOut
->Mode
->Mode
;
1661 // query screen size
1663 gST
->ConOut
->QueryMode (
1665 gST
->ConOut
->Mode
->Mode
,
1666 &(HMainEditor
.ScreenSize
.Column
),
1667 &(HMainEditor
.ScreenSize
.Row
)
1671 // Find TextInEx in System Table ConsoleInHandle
1672 // Per UEFI Spec, TextInEx is required for a console capable platform.
1674 Status
= gBS
->HandleProtocol (
1675 gST
->ConsoleInHandle
,
1676 &gEfiSimpleTextInputExProtocolGuid
,
1677 (VOID
**)&HMainEditor
.TextInputEx
1679 if (EFI_ERROR (Status
)) {
1684 // Find mouse in System Table ConsoleInHandle
1686 Status
= gBS
->HandleProtocol (
1687 gST
->ConsoleInHandle
,
1688 &gEfiSimplePointerProtocolGuid
,
1689 (VOID
**)&HMainEditor
.MouseInterface
1691 if (EFI_ERROR (Status
)) {
1693 // If there is no Simple Pointer Protocol on System Table
1695 HandleBuffer
= NULL
;
1696 HMainEditor
.MouseInterface
= NULL
;
1697 Status
= gBS
->LocateHandleBuffer (
1699 &gEfiSimplePointerProtocolGuid
,
1704 if (!EFI_ERROR (Status
) && HandleCount
> 0) {
1706 // Try to find the first available mouse device
1708 for (Index
= 0; Index
< HandleCount
; Index
++) {
1709 Status
= gBS
->HandleProtocol (
1710 HandleBuffer
[Index
],
1711 &gEfiSimplePointerProtocolGuid
,
1712 (VOID
**)&HMainEditor
.MouseInterface
1714 if (!EFI_ERROR (Status
)) {
1719 if (HandleBuffer
!= NULL
) {
1720 FreePool (HandleBuffer
);
1724 if (!EFI_ERROR (Status
) && HMainEditor
.MouseInterface
!= NULL
) {
1725 HMainEditor
.MouseAccumulatorX
= 0;
1726 HMainEditor
.MouseAccumulatorY
= 0;
1727 HMainEditor
.MouseSupported
= TRUE
;
1731 // below will call the five components' init function
1733 Status
= MainTitleBarInit (L
"UEFI HEXEDIT");
1734 if (EFI_ERROR (Status
)) {
1735 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_TITLE
), gShellDebug1HiiHandle
);
1736 return EFI_LOAD_ERROR
;
1739 Status
= ControlHotKeyInit (HexMainControlBasedMenuFunctions
);
1740 if (EFI_ERROR (Status
)) {
1741 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_MAINMENU
), gShellDebug1HiiHandle
);
1742 return EFI_LOAD_ERROR
;
1744 Status
= MenuBarInit (HexEditorMenuItems
);
1745 if (EFI_ERROR (Status
)) {
1746 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_MAINMENU
), gShellDebug1HiiHandle
);
1747 return EFI_LOAD_ERROR
;
1750 Status
= StatusBarInit ();
1751 if (EFI_ERROR (Status
)) {
1752 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_STATUS
), gShellDebug1HiiHandle
);
1753 return EFI_LOAD_ERROR
;
1756 InputBarInit (HMainEditor
.TextInputEx
);
1758 Status
= HBufferImageInit ();
1759 if (EFI_ERROR (Status
)) {
1760 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_BUFFERIMAGE
), gShellDebug1HiiHandle
);
1761 return EFI_LOAD_ERROR
;
1764 Status
= HClipBoardInit ();
1765 if (EFI_ERROR (Status
)) {
1766 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_CLIPBOARD
), gShellDebug1HiiHandle
);
1767 return EFI_LOAD_ERROR
;
1770 // clear whole screen and enable cursor
1772 gST
->ConOut
->ClearScreen (gST
->ConOut
);
1773 gST
->ConOut
->EnableCursor (gST
->ConOut
, TRUE
);
1776 // initialize EditorFirst and EditorExit
1778 HEditorFirst
= TRUE
;
1779 HEditorExit
= FALSE
;
1780 HEditorMouseAction
= FALSE
;
1786 Cleanup function for MainEditor.
1788 @retval EFI_SUCCESS The operation was successful.
1789 @retval EFI_LOAD_ERROR A load error occured.
1792 HMainEditorCleanup (
1799 // call the five components' cleanup function
1801 MainTitleBarCleanup ();
1805 StatusBarCleanup ();
1809 Status
= HBufferImageCleanup ();
1810 if (EFI_ERROR (Status
)) {
1811 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_BUFFERIMAGE_CLEAN
), gShellDebug1HiiHandle
);
1814 Status
= HClipBoardCleanup ();
1815 if (EFI_ERROR (Status
)) {
1816 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_CLIPBOARD_CLEAN
), gShellDebug1HiiHandle
);
1821 if (HOriginalMode
!= gST
->ConOut
->Mode
->Mode
) {
1822 gST
->ConOut
->SetMode (gST
->ConOut
, HOriginalMode
);
1825 gST
->ConOut
->SetAttribute (
1827 EFI_TEXT_ATTR (HOriginalColors
.Foreground
, HOriginalColors
.Background
)
1829 gST
->ConOut
->ClearScreen (gST
->ConOut
);
1835 Refresh function for MainEditor.
1837 @retval EFI_SUCCESS The operation was successful.
1840 HMainEditorRefresh (
1850 if (HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
) {
1851 if (HMainEditor
.BufferImage
->DiskImage
!= NULL
&&
1852 HBufferImageBackupVar
.DiskImage
!= NULL
&&
1853 (HMainEditor
.BufferImage
->DiskImage
->Offset
!= HBufferImageBackupVar
.DiskImage
->Offset
||
1854 HMainEditor
.BufferImage
->DiskImage
->Size
!= HBufferImageBackupVar
.DiskImage
->Size
) ){
1857 } else if (HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
) {
1858 if (HMainEditor
.BufferImage
->MemImage
!= NULL
&&
1859 HBufferImageBackupVar
.MemImage
!= NULL
&&
1860 (HMainEditor
.BufferImage
->MemImage
->Offset
!= HBufferImageBackupVar
.MemImage
->Offset
||
1861 HMainEditor
.BufferImage
->MemImage
->Size
!= HBufferImageBackupVar
.MemImage
->Size
) ){
1864 } else if (HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
) {
1865 if ( HMainEditor
.BufferImage
->FileImage
!= NULL
&&
1866 HMainEditor
.BufferImage
->FileImage
->FileName
!= NULL
&&
1867 HBufferImageBackupVar
.FileImage
!= NULL
&&
1868 HBufferImageBackupVar
.FileImage
->FileName
!= NULL
&&
1869 StrCmp (HMainEditor
.BufferImage
->FileImage
->FileName
, HBufferImageBackupVar
.FileImage
->FileName
) != 0 ) {
1873 if ( HMainEditor
.BufferImage
->FileImage
!= NULL
&&
1874 HBufferImageBackupVar
.FileImage
!= NULL
&&
1875 HMainEditor
.BufferImage
->FileImage
->ReadOnly
!= HBufferImageBackupVar
.FileImage
->ReadOnly
) {
1880 // to aVOID screen flicker
1881 // the stall value is from experience
1886 // call the components refresh function
1890 || HMainEditor
.BufferImage
->BufferType
!= HBufferImageBackupVar
.BufferType
1891 || HBufferImageBackupVar
.Modified
!= HMainEditor
.BufferImage
->Modified
1894 MainTitleBarRefresh (
1895 HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
&&HMainEditor
.BufferImage
->FileImage
!=NULL
?HMainEditor
.BufferImage
->FileImage
->FileName
:HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
&&HMainEditor
.BufferImage
->DiskImage
!=NULL
?HMainEditor
.BufferImage
->DiskImage
->Name
:NULL
,
1896 HMainEditor
.BufferImage
->BufferType
,
1897 (BOOLEAN
)(HMainEditor
.BufferImage
->FileImage
!=NULL
?HMainEditor
.BufferImage
->FileImage
->ReadOnly
:FALSE
),
1898 HMainEditor
.BufferImage
->Modified
,
1899 HMainEditor
.ScreenSize
.Column
,
1900 HMainEditor
.ScreenSize
.Row
,
1901 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
&&HMainEditor
.BufferImage
->DiskImage
!=NULL
?HMainEditor
.BufferImage
->DiskImage
->Offset
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
&&HMainEditor
.BufferImage
->MemImage
!=NULL
?HMainEditor
.BufferImage
->MemImage
->Offset
:0,
1902 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
&&HMainEditor
.BufferImage
->DiskImage
!=NULL
?HMainEditor
.BufferImage
->DiskImage
->Size
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
&&HMainEditor
.BufferImage
->MemImage
!=NULL
?HMainEditor
.BufferImage
->MemImage
->Size
:0
1904 HBufferImageRefresh ();
1907 || HBufferImageBackupVar
.DisplayPosition
.Row
!= HMainEditor
.BufferImage
->DisplayPosition
.Row
1908 || HBufferImageBackupVar
.DisplayPosition
.Column
!= HMainEditor
.BufferImage
->DisplayPosition
.Column
1909 || StatusBarGetRefresh()) {
1913 HMainEditor
.ScreenSize
.Row
,
1914 HMainEditor
.ScreenSize
.Column
,
1919 HBufferImageRefresh ();
1923 HBufferImageRefresh ();
1927 // EditorFirst is now set to FALSE
1929 HEditorFirst
= FALSE
;
1935 Handle the mouse input.
1937 @param[in] MouseState The current mouse state.
1938 @param[out] BeforeLeftButtonDown helps with selections.
1940 @retval EFI_SUCCESS The operation was successful.
1941 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
1942 @retval EFI_LOAD_ERROR A load error occured.
1943 @retval EFI_NOT_FOUND The disk was not found.
1946 HMainEditorHandleMouseInput (
1947 IN EFI_SIMPLE_POINTER_STATE MouseState
,
1948 OUT BOOLEAN
*BeforeLeftButtonDown
1958 HEFI_EDITOR_LINE
*Line
;
1965 // have mouse movement
1967 if (MouseState
.RelativeMovementX
|| MouseState
.RelativeMovementY
) {
1971 TextX
= HGetTextX (MouseState
.RelativeMovementX
);
1972 TextY
= HGetTextY (MouseState
.RelativeMovementY
);
1974 HBufferImageAdjustMousePosition (TextX
, TextY
);
1980 if (MouseState
.LeftButton
) {
1981 HighBits
= HBufferImageIsAtHighBits (
1982 HMainEditor
.BufferImage
->MousePosition
.Column
,
1987 // not at an movable place
1991 // now just move mouse pointer to legal position
1994 // move mouse position to legal position
1996 HMainEditor
.BufferImage
->MousePosition
.Column
-= 10;
1997 if (HMainEditor
.BufferImage
->MousePosition
.Column
> 24) {
1998 HMainEditor
.BufferImage
->MousePosition
.Column
--;
1999 FCol
= HMainEditor
.BufferImage
->MousePosition
.Column
/ 3 + 1 + 1;
2001 if (HMainEditor
.BufferImage
->MousePosition
.Column
< 24) {
2002 FCol
= HMainEditor
.BufferImage
->MousePosition
.Column
/ 3 + 1 + 1;
2015 FRow
= HMainEditor
.BufferImage
->BufferPosition
.Row
+
2016 HMainEditor
.BufferImage
->MousePosition
.Row
-
2017 HMainEditor
.BufferImage
->DisplayPosition
.Row
;
2019 if (HMainEditor
.BufferImage
->NumLines
< FRow
) {
2024 // now just move mouse pointer to legal position
2026 FRow
= HMainEditor
.BufferImage
->NumLines
;
2030 Link
= HMainEditor
.BufferImage
->ListHead
->ForwardLink
;
2031 for (Index
= 0; Index
< FRow
- 1; Index
++) {
2032 Link
= Link
->ForwardLink
;
2035 Line
= CR (Link
, HEFI_EDITOR_LINE
, Link
, EFI_EDITOR_LINE_LIST
);
2041 // now just move mouse pointer to legal position
2043 if (FCol
> Line
->Size
) {
2044 if (*BeforeLeftButtonDown
) {
2047 if (Line
->Size
== 0) {
2060 FCol
= Line
->Size
+ 1;
2065 HBufferImageMovePosition (FRow
, FCol
, HighBits
);
2067 HMainEditor
.BufferImage
->MousePosition
.Row
= HMainEditor
.BufferImage
->DisplayPosition
.Row
;
2069 HMainEditor
.BufferImage
->MousePosition
.Column
= HMainEditor
.BufferImage
->DisplayPosition
.Column
;
2071 *BeforeLeftButtonDown
= TRUE
;
2076 // else of if LButton
2080 if (*BeforeLeftButtonDown
) {
2086 *BeforeLeftButtonDown
= FALSE
;
2093 return EFI_NOT_FOUND
;
2097 Handle user key input. will route it to other components handle function.
2099 @retval EFI_SUCCESS The operation was successful.
2100 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
2101 @retval EFI_LOAD_ERROR A load error occured.
2104 HMainEditorKeyInput (
2108 EFI_KEY_DATA KeyData
;
2110 EFI_SIMPLE_POINTER_STATE MouseState
;
2111 BOOLEAN NoShiftState
;
2112 BOOLEAN LengthChange
;
2115 BOOLEAN BeforeMouseIsDown
;
2116 BOOLEAN MouseIsDown
;
2121 UINTN SelectStartBackup
;
2122 UINTN SelectEndBackup
;
2125 // variable initialization
2130 LengthChange
= FALSE
;
2132 MouseIsDown
= FALSE
;
2138 Status
= EFI_SUCCESS
;
2140 HEditorMouseAction
= FALSE
;
2143 // backup some key elements, so that can aVOID some refresh work
2145 HMainEditorBackup ();
2148 // wait for user key input
2151 // change priority of checking mouse/keyboard activity dynamically
2152 // so prevent starvation of keyboard.
2153 // if last time, mouse moves then this time check keyboard
2155 if (HMainEditor
.MouseSupported
) {
2156 Status
= HMainEditor
.MouseInterface
->GetState (
2157 HMainEditor
.MouseInterface
,
2160 if (!EFI_ERROR (Status
)) {
2162 BeforeMouseIsDown
= MouseIsDown
;
2164 Status
= HMainEditorHandleMouseInput (MouseState
, &MouseIsDown
);
2166 if (!EFI_ERROR (Status
)) {
2167 if (!BeforeMouseIsDown
) {
2172 FRow
= HBufferImage
.BufferPosition
.Row
;
2173 FCol
= HBufferImage
.BufferPosition
.Column
;
2174 SelectStartBackup
= HMainEditor
.SelectStart
;
2175 SelectEndBackup
= HMainEditor
.SelectEnd
;
2181 SelectStartBackup
= HMainEditor
.SelectStart
;
2182 SelectEndBackup
= HMainEditor
.SelectEnd
;
2189 if (MouseState
.RelativeMovementX
|| MouseState
.RelativeMovementY
) {
2190 HMainEditor
.SelectStart
= 0;
2191 HMainEditor
.SelectEnd
= 0;
2192 HMainEditor
.SelectStart
= (FRow
- 1) * 0x10 + FCol
;
2199 (HBufferImage
.BufferPosition
.Row
- 1) *
2201 HBufferImage
.BufferPosition
.Column
2202 ) >= HMainEditor
.SelectStart
2204 HMainEditor
.SelectEnd
= (HBufferImage
.BufferPosition
.Row
- 1) *
2206 HBufferImage
.BufferPosition
.Column
;
2208 HMainEditor
.SelectEnd
= 0;
2212 // end of if RelativeX/Y
2219 if (HBufferImageGetTotalSize () == 0) {
2220 HMainEditor
.SelectStart
= 0;
2221 HMainEditor
.SelectEnd
= 0;
2227 (HBufferImage
.BufferPosition
.Row
- 1) *
2229 HBufferImage
.BufferPosition
.Column
2230 ) >= HMainEditor
.SelectStart
2232 HMainEditor
.SelectEnd
= (HBufferImage
.BufferPosition
.Row
- 1) *
2234 HBufferImage
.BufferPosition
.Column
;
2236 HMainEditor
.SelectEnd
= 0;
2239 if (HMainEditor
.SelectEnd
== 0) {
2240 HMainEditor
.SelectStart
= 0;
2248 if (SelectStartBackup
!= HMainEditor
.SelectStart
|| SelectEndBackup
!= HMainEditor
.SelectEnd
) {
2249 if ((SelectStartBackup
- 1) / 0x10 != (HMainEditor
.SelectStart
- 1) / 0x10) {
2250 HBufferImageNeedRefresh
= TRUE
;
2252 if ((SelectEndBackup
- 1) / 0x10 != (HMainEditor
.SelectEnd
- 1) / 0x10) {
2253 HBufferImageNeedRefresh
= TRUE
;
2255 HBufferImageOnlyLineNeedRefresh
= TRUE
;
2261 HEditorMouseAction
= TRUE
;
2262 HBufferImageMouseNeedRefresh
= TRUE
;
2264 } else if (Status
== EFI_LOAD_ERROR
) {
2265 StatusBarSetStatusString (L
"Invalid Mouse Movement ");
2271 // CheckEvent() returns Success when non-partial key is pressed.
2273 Status
= gBS
->CheckEvent (HMainEditor
.TextInputEx
->WaitForKeyEx
);
2274 if (!EFI_ERROR (Status
)) {
2275 Status
= HMainEditor
.TextInputEx
->ReadKeyStrokeEx (HMainEditor
.TextInputEx
, &KeyData
);
2276 if (!EFI_ERROR (Status
)) {
2278 // dispatch to different components' key handling function
2279 // so not everywhere has to set this variable
2281 HBufferImageMouseNeedRefresh
= TRUE
;
2284 // clear previous status string
2286 StatusBarSetRefresh();
2288 // NoShiftState: TRUE when no shift key is pressed.
2290 NoShiftState
= ((KeyData
.KeyState
.KeyShiftState
& EFI_SHIFT_STATE_VALID
) == 0) || (KeyData
.KeyState
.KeyShiftState
== EFI_SHIFT_STATE_VALID
);
2292 // dispatch to different components' key handling function
2294 if (EFI_SUCCESS
== MenuBarDispatchControlHotKey(&KeyData
)) {
2295 Status
= EFI_SUCCESS
;
2296 } else if (NoShiftState
&& KeyData
.Key
.ScanCode
== SCAN_NULL
) {
2297 Status
= HBufferImageHandleInput (&KeyData
.Key
);
2298 } else if (NoShiftState
&& ((KeyData
.Key
.ScanCode
>= SCAN_UP
) && (KeyData
.Key
.ScanCode
<= SCAN_PAGE_DOWN
))) {
2299 Status
= HBufferImageHandleInput (&KeyData
.Key
);
2300 } else if (NoShiftState
&& ((KeyData
.Key
.ScanCode
>= SCAN_F1
) && KeyData
.Key
.ScanCode
<= SCAN_F12
)) {
2301 Status
= MenuBarDispatchFunctionKey (&KeyData
.Key
);
2303 StatusBarSetStatusString (L
"Unknown Command");
2305 HBufferImageMouseNeedRefresh
= FALSE
;
2308 if (Status
!= EFI_SUCCESS
&& Status
!= EFI_OUT_OF_RESOURCES
) {
2310 // not already has some error status
2312 if (StrCmp (L
"", StatusBarGetString()) == 0) {
2313 StatusBarSetStatusString (L
"Disk Error. Try Again");
2318 // decide if has to set length warning
2320 if (HBufferImage
.BufferType
!= HBufferImageBackupVar
.BufferType
) {
2321 LengthChange
= FALSE
;
2324 // still the old buffer
2326 if (HBufferImage
.BufferType
!= FileTypeFileBuffer
) {
2327 Size
= HBufferImageGetTotalSize ();
2329 switch (HBufferImage
.BufferType
) {
2330 case FileTypeDiskBuffer
:
2331 OldSize
= HBufferImage
.DiskImage
->Size
* HBufferImage
.DiskImage
->BlockSize
;
2334 case FileTypeMemBuffer
:
2335 OldSize
= HBufferImage
.MemImage
->Size
;
2343 if (!LengthChange
) {
2344 if (OldSize
!= Size
) {
2345 StatusBarSetStatusString (L
"Disk/Mem Buffer Length should not be changed");
2349 if (OldSize
!= Size
) {
2350 LengthChange
= TRUE
;
2352 LengthChange
= FALSE
;
2358 // after handling, refresh editor
2360 HMainEditorRefresh ();
2362 } while (Status
!= EFI_OUT_OF_RESOURCES
&& !HEditorExit
);
2368 Backup function for MainEditor.
2375 HMainEditorBackupVar
.SelectStart
= HMainEditor
.SelectStart
;
2376 HMainEditorBackupVar
.SelectEnd
= HMainEditor
.SelectEnd
;
2377 HBufferImageBackup ();